じ☆ve冰风 发表于 2025-7-24 20:28:31

格挡状态加反伤技能

由于没有找到合适的格挡脚本,怒了,遂自写.(推荐与Yanfly的战斗脚本搭配,并且调整Yanfly的战斗脚本中的ENABLE_POPUPS = true)
class Game_Battler < Game_BattlerBase# ========== 全局配置 ==========    # 系统总开关ID(当该开关开启时,抵挡系统生效)SYSTEM_SWITCH_ID = 10    # 角色系统配置(状态ID => [存储变量ID, 默认比例, 抵挡比例])ACTOR_STATES = {    10 => ,# 状态10: 存储50%伤害, 抵挡30%伤害    15 => ,# 状态15: 存储30%伤害, 抵挡20%伤害    20 =>    # 状态20: 存储25%伤害, 抵挡15%伤害}    # 敌人系统配置(状态ID => [存储变量ID, 默认比例, 抵挡比例])ENEMY_STATES = {    25 => ,# 状态25: 存储40%伤害, 抵挡25%伤害    30 => ,# 状态30: 存储60%伤害, 抵挡40%伤害    35 =>    # 状态35: 存储75%伤害, 抵挡50%伤害}    # ========== 脚本核心 ==========    # 别名原伤害处理方法alias damage_block_and_record_execute_damage execute_damagedef execute_damage(user)    # 保存原始伤害值    original_damage = @result.hp_damage      # 仅处理实际伤害(正值)    if original_damage > 0      # 检查系统总开关是否开启      if $game_switches      # 计算抵挡伤害      blocked_damage = calculate_blocked_damage(original_damage)                # 应用抵挡效果      @result.hp_damage = .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      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      block_ratio = get_block_ratio(state_id, config)      total_blocked += (original_damage * block_ratio).floor      end    end      # 确保抵挡不超过原始伤害    .minend    # 处理伤害记录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)      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)      end    endend    # 获取抵挡比例def get_block_ratio(state_id, config)    state = states.find { |s| s.id == state_id }      # 优先使用状态备注中的自定义抵挡比例    if state.note =~ //i      $1.to_f    else      config# 默认抵挡比例    endend    # 状态伤害记录核心方法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 += recorded_damageendend# 添加YEA弹窗规则(如果YEA引擎存在)if $imported && $imported["YEA-BattleEngine"]module YEA    module BATTLE      # 添加格挡伤害弹窗规则      POPUP_RULES["BLOCK_DAMAGE"] =     endendend复制代码
反伤技能可使用变量写入伤害公式,这里不再赘述.
            本帖来自P1论坛作者晨风1,因Project1站服务器在国外有时候访问缓慢不方便作者交流学习,经联系P1站长fux2同意署名转载一起分享游戏制作经验,共同为国内独立游戏作者共同创造良好交流环境,原文地址:https://rpg.blue/forum.php?mod=viewthread&tid=497777若有侵权,发帖作者可联系底部站长QQ在线咨询功能删除,谢谢。
页: [1]
查看完整版本: 格挡状态加反伤技能