- 累计送礼:
- 0 个
- 累计收礼:
- 0 个
TA的每日心情 | 开心 昨天 23:55 |
---|
签到天数: 160 天 连续签到: 1 天 [LV.7]常住居民III

管理员
  
- VIP
- 6
- 卡币
- 13543
- OK点
- 16
- 推广点
- 0
- 同能卷
- 0
- 积分
- 16548


|
由于没有找到合适的格挡脚本,怒了,遂自写.(推荐与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 =~ //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 =~ //i record_ratio = $1.to_f end # 计算并记录伤害 recorded_damage = (original_damage * record_ratio).floor $game_variables[var_id] += recorded_damage endend# 添加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 endend复制代码
复制代码反伤技能可使用变量写入伤害公式,这里不再赘述.
本帖来自P1论坛作者晨风1,因Project1站服务器在国外有时候访问缓慢不方便作者交流学习,经联系P1站长fux2同意署名转载一起分享游戏制作经验,共同为国内独立游戏作者共同创造良好交流环境,原文地址: https://rpg.blue/forum.php?mod=viewthread&tid=497777 若有侵权,发帖作者可联系底部站长QQ在线咨询功能删除,谢谢。 |
|