赞 | 0 |
VIP | 0 |
好人卡 | 0 |
积分 | 2 |
经验 | 0 |
最后登录 | 2025-7-25 |
在线时间 | 15 小时 |
Lv1.梦旅人
- 梦石
- 0
- 星屑
- 239
- 在线时间
- 15 小时
- 注册时间
- 2022-12-22
- 帖子
- 17
|
加入我们,或者,欢迎回来。
您需要 登录 才可以下载或查看,没有帐号?注册会员
x
由于没有找到合适的格挡脚本,怒了,遂自写.(推荐与Yanfly的战斗脚本搭配,并且调整Yanfly的战斗脚本中的ENABLE_POPUPS = true)
- class Game_Battler < Game_BattlerBase
- # ========== 全局配置 ==========
-
- # 系统总开关ID(当该开关开启时,抵挡系统生效)
- SYSTEM_SWITCH_ID = 10
-
- # 角色系统配置(状态ID => [存储变量ID, 默认比例, 抵挡比例])
- ACTOR_STATES = {
- 10 => [11, 0.50, 0.30], # 状态10: 存储50%伤害, 抵挡30%伤害
- 15 => [15, 0.30, 0.20], # 状态15: 存储30%伤害, 抵挡20%伤害
- 20 => [13, 0.25, 0.15] # 状态20: 存储25%伤害, 抵挡15%伤害
- }
-
- # 敌人系统配置(状态ID => [存储变量ID, 默认比例, 抵挡比例])
- ENEMY_STATES = {
- 25 => [21, 0.40, 0.25], # 状态25: 存储40%伤害, 抵挡25%伤害
- 30 => [22, 0.60, 0.40], # 状态30: 存储60%伤害, 抵挡40%伤害
- 35 => [23, 0.75, 0.50] # 状态35: 存储75%伤害, 抵挡50%伤害
- }
-
- # ========== 脚本核心 ==========
-
- # 别名原伤害处理方法
- alias damage_block_and_record_execute_damage execute_damage
- def execute_damage(user)
- # 保存原始伤害值
- original_damage = @result.hp_damage
-
- # 仅处理实际伤害(正值)
- if original_damage > 0
- # 检查系统总开关是否开启
- if $game_switches[SYSTEM_SWITCH_ID]
- # 计算抵挡伤害
- blocked_damage = calculate_blocked_damage(original_damage)
-
- # 应用抵挡效果
- @result.hp_damage = [original_damage - blocked_damage, 0].max
-
- # 处理伤害记录
- process_damage_recording(original_damage)
-
- # 显示格挡伤害弹窗
- if blocked_damage > 0 && $imported["YEA-BattleEngine"]
- text = sprintf("格挡 %d", blocked_damage)
- create_popup(text, "BLOCK_DAMAGE")
- end
- else
- # 系统开关关闭时,不进行任何抵挡处理
- @result.hp_damage = original_damage
- end
- end
-
- # 调用原始伤害处理(传递正确的参数)
- damage_block_and_record_execute_damage(user)
- end
-
- # 计算抵挡伤害
- def calculate_blocked_damage(original_damage)
- total_blocked = 0
-
- # 处理角色抵挡
- if actor?
- ACTOR_STATES.each_key do |state_id|
- next unless state?(state_id)
- config = ACTOR_STATES[state_id]
- block_ratio = get_block_ratio(state_id, config)
- total_blocked += (original_damage * block_ratio).floor
- end
- end
-
- # 处理敌人抵挡
- if enemy?
- ENEMY_STATES.each_key do |state_id|
- next unless state?(state_id)
- config = ENEMY_STATES[state_id]
- block_ratio = get_block_ratio(state_id, config)
- total_blocked += (original_damage * block_ratio).floor
- end
- end
-
- # 确保抵挡不超过原始伤害
- [total_blocked, original_damage].min
- end
-
- # 处理伤害记录
- def process_damage_recording(original_damage)
- # 处理角色伤害记录
- if actor?
- ACTOR_STATES.each_key do |state_id|
- next unless state?(state_id)
- record_damage_for_state(original_damage, state_id, ACTOR_STATES[state_id])
- end
- end
-
- # 处理敌人伤害记录
- if enemy?
- ENEMY_STATES.each_key do |state_id|
- next unless state?(state_id)
- record_damage_for_state(original_damage, state_id, ENEMY_STATES[state_id])
- end
- end
- end
-
- # 获取抵挡比例
- def get_block_ratio(state_id, config)
- state = states.find { |s| s.id == state_id }
-
- # 优先使用状态备注中的自定义抵挡比例
- if state.note =~ /<block_ratio:\s*(\d+\.?\d*)>/i
- $1.to_f
- else
- config[2] # 默认抵挡比例
- end
- end
-
- # 状态伤害记录核心方法
- def record_damage_for_state(original_damage, state_id, config)
- # 解构配置 [变量ID, 记录比例, 抵挡比例]
- var_id, record_ratio, _ = config
-
- # 从状态获取自定义记录比例
- state = states.find { |s| s.id == state_id }
-
- # 优先使用状态备注中的自定义记录比例
- if state.note =~ /<damage_ratio:\s*(\d+\.?\d*)>/i
- record_ratio = $1.to_f
- end
-
- # 计算并记录伤害
- recorded_damage = (original_damage * record_ratio).floor
- $game_variables[var_id] += recorded_damage
- end
- end
- # 添加YEA弹窗规则(如果YEA引擎存在)
- if $imported && $imported["YEA-BattleEngine"]
- module YEA
- module BATTLE
- # 添加格挡伤害弹窗规则
- POPUP_RULES["BLOCK_DAMAGE"] = [2.0, 1.0, 24, true, false, 180, 180, 255, DEFAULT]
- end
- end
- end
复制代码
反伤技能可使用变量写入伤害公式,这里不再赘述. |
|