じ☆ve冰风 发表于 昨天 07:18

手搓了几个AI脚本,我真的恼了

由于冲突不会解决,怒让AI搓了几个脚本,还满好用,白板工程测试可用,就是技能书和魔法盾死活搓不出来,恼了。

1,金钟罩,任何伤害为0,包括一切无视效果都为0
RUBY 代码
#==============================================================================
# ■ 金钟罩状态:拥有此状态时,受到的伤害恒为0
#==============================================================================
module GoldenBell
# ★ 金钟罩对应的状态ID(根据你在数据库里设置的状态编号修改)
STATE_ID = 52
end

class Game_Battler
#--------------------------------------------------------------------------
# ● 拦截攻击造成的伤害
#--------------------------------------------------------------------------
alias goldenbell_attack_effect attack_effect unless method_defined?(:goldenbell_attack_effect)
def attack_effect(attacker)
    result = goldenbell_attack_effect(attacker)
    # 如果伤害数值大于0,并且自身拥有金钟罩状态
    if@damage.is_a?(Numeric) && @damage > 0 && state?(GoldenBell::STATE_ID)
      @hp += @damage   # 撤销已经扣减的HP
      @damage = 1      # 显示伤害改为0
    end
    return result
end

#--------------------------------------------------------------------------
# ● 拦截技能造成的伤害
#--------------------------------------------------------------------------
alias goldenbell_skill_effect skill_effect unless method_defined?(:goldenbell_skill_effect)
def skill_effect(user, skill)
    result = goldenbell_skill_effect(user, skill)
    if@damage.is_a?(Numeric) && @damage > 0 && state?(GoldenBell::STATE_ID)
      @hp += @damage
      @damage = 0
    end
    return result
end
end


2,绝对反击,我方血量 < 50% 时造成敌人当前血量一半伤害

RUBY 代码
# ============================================================
# 自定义技能:我方血量 < 50% 时造成敌人当前血量一半伤害
# 技能ID、动画ID 请根据你的数据库修改
# ============================================================
class Game_Battler
CUSTOM_SKILL_ID = 57    # 你的技能编号
CUSTOM_ANIM_ID= 34    # 动画编号

alias custom_skill_effect skill_effect unless method_defined?(:custom_skill_effect)
def skill_effect(user, skill)
    # 如果是目标技能,并且使用者为我方角色且血量低于一半
    if skill.id == CUSTOM_SKILL_ID &&
       user.is_a?(Game_Actor) &&
       user.hp < user.maxhp / 2

      # 伤害 = 目标当前生命值的一半
      self.damage = self.hp / 2
      self.hp -= self.damage
      # 播放指定动画
      self.animation_id = CUSTOM_ANIM_ID

      # 如果你还需要技能原本的状态附加、公共事件等,
      # 可以在这里自行添加,例如:
      #   skill.plus_state_set.each { |id| self.add_state(id) }
      #   $game_temp.common_event_id = skill.common_event_id if skill.common_event_id > 0

      returntrue   # 技能成功
    else
      # 非指定技能或其他情况,执行原方法
      return custom_skill_effect(user, skill)
    end
end
end


----优点,在反击时还可以播放一个动画,比如一个镜头大吼一声,而且血量大于50%时,伤害按原公式计算,不影响,该脚本短小精悍,冲突小。

3,法术反弹
RUBY 代码
#==============================================================================
# ★ 反弹伤害技能 (RMXP)
# 功能:拥有指定状态的角色/敌人在受到技能伤害时,将伤害的 50% 反弹给攻击方。
#       反弹伤害的数字会在原伤害显示结束后独立弹出。
#==============================================================================

module ReboundConfig
# 拥有此状态的 battler 将获得伤害反弹效果
REBOUND_STATE_ID = 21   #0
      rebound = (self.damage * ReboundConfig::REBOUND_RATE).to_i
      rebound = 1if rebound < 1   # 至少有 1 点伤害
      # 将反弹伤害直接扣除攻击者的 HP
      user.hp -= rebound
      # 把反弹伤害存入攻击者的临时变量,等待延迟显示
      user.pending_rebound_damage = rebound
      end
    end

    effective
end
end

#==============================================================================
# ■ Scene_Battle (在伤害显示步骤中追加反弹伤害的弹出)
#==============================================================================
class Scene_Battle
# 保存原有的 update_phase4_step5 方法
alias rebound_update_phase4_step5 update_phase4_step5
def update_phase4_step5
    # 1. 先执行原版的伤害显示逻辑(目标受到的伤害会先弹出)
    rebound_update_phase4_step5

    # 2. 在所有正常伤害显示完毕后,处理反弹伤害
    # 遍历所有队伍成员和敌人
    all_battlers = $game_party.actors + $game_troop.enemies
    all_battlers.eachdo |battler|
      if battler.pending_rebound_damage != nil && battler.pending_rebound_damage > 0
      # 设置伤害显示用的变量
      battler.damage = battler.pending_rebound_damage
      battler.damage_pop = true
      # 临时保存反弹伤害值,通过覆写伤害显示颜色可以区分(此处用普通伤害颜色)
      battler.critical = false# 非暴击,保持普通颜色
      # 立即强制该 battler 进入伤害动画显示流程
      battler.damage_pop = true
      # 清除临时变量,确保只显示一次
      battler.pending_rebound_damage = nil

      # 因为原版 refresh 后可能不会立即绘制伤害,这里手动触发一次伤害动画
      if battler.is_a?(Game_Actor)
          @status_window.refresh
          @active_battler = battler# 暂时设为活动战斗者,确保 sprite 刷新
          # 重置 phase4 步骤以重新进入显示流程(简单有效)
          @phase4_step = 5
      end
      end
    end
end
end


----该脚本优点在于反弹的法术会略晚于技能伤害,但不能变色,搓不出来变色,略有遗憾,还可以加入延时计时器,没做,可以自定义反弹伤害弹出延时时间,总之三个脚本呢都短小精悍,白板工程都可以用,也可以一起用无冲突,目前为止。

            本帖来自P1论坛作者y967,因Project1站服务器在国外有时候访问缓慢不方便作者交流学习,经联系P1站长fux2同意署名转载一起分享游戏制作经验,共同为国内独立游戏作者共同创造良好交流环境,原文地址:https://rpg.blue/forum.php?mod=viewthread&tid=498969若有侵权,发帖作者可联系底部站长QQ在线咨询功能删除,谢谢。
页: [1]
查看完整版本: 手搓了几个AI脚本,我真的恼了