Project1

标题: 无用之物 [打印本页]

作者: y967    时间: 2026-5-23 07:33
标题: 无用之物
本帖最后由 y967 于 2026-5-27 08:09 编辑



1,金钟罩,任何伤害为0,包括一切无视效果都为0
RUBY 代码复制
  1. #==============================================================================
  2. # ■ 金钟罩状态:拥有此状态时,受到的伤害恒为0
  3. #==============================================================================
  4. module GoldenBell
  5.   # ★ 金钟罩对应的状态ID(根据你在数据库里设置的状态编号修改)
  6.   STATE_ID = 52
  7. end
  8.  
  9. class Game_Battler
  10.   #--------------------------------------------------------------------------
  11.   # ● 拦截攻击造成的伤害
  12.   #--------------------------------------------------------------------------
  13.   alias goldenbell_attack_effect attack_effect unless method_defined?(:goldenbell_attack_effect)
  14.   def attack_effect(attacker)
  15.     result = goldenbell_attack_effect(attacker)
  16.     # 如果伤害数值大于0,并且自身拥有金钟罩状态
  17.     if @damage.is_a?(Numeric) && @damage > 0 && state?(GoldenBell::STATE_ID)
  18.       @hp += @damage   # 撤销已经扣减的HP
  19.       @damage = 1      # 显示伤害改为0
  20.     end
  21.     return result
  22.   end
  23.  
  24.   #--------------------------------------------------------------------------
  25.   # ● 拦截技能造成的伤害
  26.   #--------------------------------------------------------------------------
  27.   alias goldenbell_skill_effect skill_effect unless method_defined?(:goldenbell_skill_effect)
  28.   def skill_effect(user, skill)
  29.     result = goldenbell_skill_effect(user, skill)
  30.     if @damage.is_a?(Numeric) && @damage > 0 && state?(GoldenBell::STATE_ID)
  31.       @hp += @damage
  32.       @damage = 0
  33.     end
  34.     return result
  35.   end
  36. end


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

RUBY 代码复制
  1. # ============================================================
  2. # 自定义技能:我方血量 < 50% 时造成敌人当前血量一半伤害
  3. # 技能ID、动画ID 请根据你的数据库修改
  4. # ============================================================
  5. class Game_Battler
  6.   CUSTOM_SKILL_ID = 57    # 你的技能编号
  7.   CUSTOM_ANIM_ID  = 34    # 动画编号
  8.  
  9.   alias custom_skill_effect skill_effect unless method_defined?(:custom_skill_effect)
  10.   def skill_effect(user, skill)
  11.     # 如果是目标技能,并且使用者为我方角色且血量低于一半
  12.     if skill.id == CUSTOM_SKILL_ID &&
  13.        user.is_a?(Game_Actor) &&
  14.        user.hp < user.maxhp / 2
  15.  
  16.       # 伤害 = 目标当前生命值的一半
  17.       self.damage = self.hp / 2
  18.       self.hp -= self.damage
  19.       # 播放指定动画
  20.       self.animation_id = CUSTOM_ANIM_ID
  21.  
  22.       # 如果你还需要技能原本的状态附加、公共事件等,
  23.       # 可以在这里自行添加,例如:
  24.       #   skill.plus_state_set.each { |id| self.add_state(id) }
  25.       #   $game_temp.common_event_id = skill.common_event_id if skill.common_event_id > 0
  26.  
  27.       return true   # 技能成功
  28.     else
  29.       # 非指定技能或其他情况,执行原方法
  30.       return custom_skill_effect(user, skill)
  31.     end
  32.   end
  33. end


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

3,法术反弹
RUBY 代码复制
  1. #==============================================================================
  2. # ★ 反弹伤害技能 (RMXP)
  3. # 功能:拥有指定状态的角色/敌人在受到技能伤害时,将伤害的 50% 反弹给攻击方。
  4. #       反弹伤害的数字会在原伤害显示结束后独立弹出。
  5. #==============================================================================
  6.  
  7. module ReboundConfig
  8.   # 拥有此状态的 battler 将获得伤害反弹效果
  9.   REBOUND_STATE_ID = 21   # <<<< 请改成你游戏中实际的状态 ID
  10.  
  11.   # 反弹伤害的比例(0.5 表示 50%,可修改为 0.3、0.7 等)
  12.   REBOUND_RATE = 0.5
  13. end
  14.  
  15. #==============================================================================
  16. # ■ Game_Battler (修改技能效果方法,添加反弹逻辑)
  17. #==============================================================================
  18. class Game_Battler
  19.   # 用于临时存放待显示的反弹伤害
  20.   attr_accessor :pending_rebound_damage
  21.  
  22.   alias rebound_skill_effect skill_effect
  23.   def skill_effect(user, skill)
  24.     # 先调用原始效果,确保伤害计算正常进行
  25.     effective = rebound_skill_effect(user, skill)
  26.  
  27.     # 仅在技能有效、目标存活、且自身拥有反弹状态时触发
  28.     if effective and self.hp > 0 and user.hp > 0 and self.state?(ReboundConfig::REBOUND_STATE_ID)
  29.       # 仅当最终伤害大于 0 时才反弹
  30.       if self.damage.is_a?(Numeric) && self.damage > 0
  31.         rebound = (self.damage * ReboundConfig::REBOUND_RATE).to_i
  32.         rebound = 1 if rebound < 1   # 至少有 1 点伤害
  33.         # 将反弹伤害直接扣除攻击者的 HP
  34.         user.hp -= rebound
  35.         # 把反弹伤害存入攻击者的临时变量,等待延迟显示
  36.         user.pending_rebound_damage = rebound
  37.       end
  38.     end
  39.  
  40.     effective
  41.   end
  42. end
  43.  
  44. #==============================================================================
  45. # ■ Scene_Battle (在伤害显示步骤中追加反弹伤害的弹出)
  46. #==============================================================================
  47. class Scene_Battle
  48.   # 保存原有的 update_phase4_step5 方法
  49.   alias rebound_update_phase4_step5 update_phase4_step5
  50.   def update_phase4_step5
  51.     # 1. 先执行原版的伤害显示逻辑(目标受到的伤害会先弹出)
  52.     rebound_update_phase4_step5
  53.  
  54.     # 2. 在所有正常伤害显示完毕后,处理反弹伤害
  55.     # 遍历所有队伍成员和敌人
  56.     all_battlers = $game_party.actors + $game_troop.enemies
  57.     all_battlers.each do |battler|
  58.       if battler.pending_rebound_damage != nil && battler.pending_rebound_damage > 0
  59.         # 设置伤害显示用的变量
  60.         battler.damage = battler.pending_rebound_damage
  61.         battler.damage_pop = true
  62.         # 临时保存反弹伤害值,通过覆写伤害显示颜色可以区分(此处用普通伤害颜色)
  63.         battler.critical = false  # 非暴击,保持普通颜色
  64.         # 立即强制该 battler 进入伤害动画显示流程
  65.         battler.damage_pop = true
  66.         # 清除临时变量,确保只显示一次
  67.         battler.pending_rebound_damage = nil
  68.  
  69.         # 因为原版 refresh 后可能不会立即绘制伤害,这里手动触发一次伤害动画
  70.         if battler.is_a?(Game_Actor)
  71.           @status_window.refresh
  72.           @active_battler = battler  # 暂时设为活动战斗者,确保 sprite 刷新
  73.           # 重置 phase4 步骤以重新进入显示流程(简单有效)
  74.           @phase4_step = 5
  75.         end
  76.       end
  77.     end
  78.   end
  79. end


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

作者: 无忧谷主幻    时间: 2026-5-23 07:54
我记得我的工程应该有技能书脚本吧

100%免伤,直接这样就可以了
RUBY 代码复制
  1. # 防御修正
  2.         self.damage /= 2 if self.guarding?
  3.         self.damage = 0 if self.state?(101)  # 101号状态触发100%免伤
  4.        end

或者你想要无敌再加无视敌方状态,我记得也发过无敌脚本

魔法盾的话,你看看这是不是你要的
https://rpg.blue/thread-285921-1-1.html
作者: 灯笼菜刀王    时间: 2026-5-23 09:47
本帖最后由 灯笼菜刀王 于 2026-5-23 10:03 编辑

全在  alias skill_effect ,早晚互相打架哦

尽量去默认脚本底下增减吧, 否则容易像你之前那贴, 找不到实际生效的位置在哪里

三个全在默认公式里 , self.hp -= self.damage  之前, 塞入一个判断句就行了

1, 塞入 self.damage = 0 if self.state?(金钟罩ID)  #有三个位置,attack_effect ,skill_effect,item_effect  
2, 塞入 self.damage = self.hp / 2 if skill.id == 10086 and user.hp < self.maxhp / 2  #这句只能用于skill_effect
3, 18-42行去掉, 后面的部分留着用于延迟显示伤害,  然后塞入
(user.hp -= (a=self.damage/2) ;user.pending_rebound_damage = a) if self.state?(反弹ID) and self.hp > self.damage     #这句只能用于skill_effect

这三句可以全塞到一起,  不过1和2的效果是冲突的, 谁写在下面谁的优先度更高, 从理论上来说, 金钟罩的优先度应该是最高的, 所以要把它的判断放最下面

以后还有 self.damage =  这种修改, 就自己按优先度来安排插入顺序即可


-----------------

技能书是啥? 使用后学会对应技能? 这不是道具附带公共事件就可以做到了么?

想谁用给谁学技能?  那就用万能的状态判断法, 使用道具时附带一个没卵用的状态, 然后附带公共事件, 全队一个一个判断,带有这个状态的学会该技能,同时清除状态就行了
作者: 灯笼菜刀王    时间: 2026-5-23 10:41
本帖最后由 灯笼菜刀王 于 2026-5-24 12:53 编辑

想自定义设置多个吸血吸蓝技能, 那就在main前塞入这个脚本

  1. module RPG
  2.   class Skill
  3.     def description
  4.       description = @description.split(/#/)[0]
  5.       return description != nil ? description : ''
  6.     end
  7.     def 吸血 ;@description[/XHP\=(\d+)\%(\d*)/] ;return $1 ? [$1,$2] : nil ;end
  8.     def 吸蓝 ;@description[/XSP\=(\d+)\%(\d*)/] ;return $1 ? [$1,$2] : nil ;end
  9.   end
  10. end

  11. class Game_Battler
  12.   attr_accessor :pending_rebound_damage
  13.   alias caidao_skill_effect skill_effect
  14.   def skill_effect(user, skill)
  15.     old_hp = self.hp
  16.     eff = caidao_skill_effect(user, skill)
  17.     $game_variables[1] = self.damage.is_a?(Numeric) ? self.damage : 0
  18.     if eff and (a=self.damage).is_a?(Numeric) and a > 0
  19.       (a=self.damage / 2 ;self.hp -= a ;self.damage += a ;
  20.       self.pending_rebound_damage = "#{self.damage}增伤#{a}") if user.state?(10086) and rand(100) < 50
  21.       if (r=skill.吸血)
  22.         m,n = r[0].to_i,r[1].to_i ;f = [self.damage * m / 100,old_hp]
  23.         f.push(n) if n > 0 ;a = f.min
  24.         user.hp += a ;#user.pending_rebound_damage = "吸血#{a}"
  25.       end
  26.       if (r=skill.吸蓝)
  27.         m,n = r[0].to_i,r[1].to_i ;f = [self.damage * m / 100,old_hp]
  28.         f.push(n) if n > 0 ; a = f.min
  29.         user.sp += a ;#user.pending_rebound_damage = "吸蓝#{a}"
  30.       end
  31.     end ;return eff
  32.   end
  33. end
复制代码



需要用到你3号脚本的伤害显示, 不过因为只能显示一个伤害, 所以后面的会覆盖前面的, 笑, 不想显示吸血吸蓝的伤害, 那就把 user.pending_rebound_damage = "吸血#{a}" 这句删除即可

然后,设置方面, 到数据库, 技能的说明栏里 加上 XHP=50%9999  这样就是吸收造成伤害的50%hp,上限9999, XSP=12% 这样就是吸收造成伤害的12%SP, 后面不写数字时无上限, 吸血吸蓝可以写一起

栗子 十字斩 : 战士的特殊技。不死系怪物特效。#XHP=50%9999 XSP=12%   #号后面的东西不会显示在游戏的技能说明内, 如果你有技能分类脚本, 就把设置夹在 # 和 @ 之间  




作者: 灯笼菜刀王    时间: 2026-5-23 11:18
  1. module RPG
  2.   class Sprite < ::Sprite
  3.     def damage(value, critical)
  4.       dispose_damage
  5.       if value.is_a?(Numeric)
  6.         damage_string = value.abs.to_s ;col = nil
  7.       else
  8.         damage_string = value.to_s.sub(/\[(\d+)\]/,"") ;col = $1
  9.       end
  10.       bitmap = Bitmap.new(160, 48)
  11.       bitmap.font.name = "Arial Black"
  12.       bitmap.font.size = 32
  13.       bitmap.font.color.set(0, 0, 0)
  14.       bitmap.draw_text(-1, 12-1, 160, 36, damage_string, 1)
  15.       bitmap.draw_text(+1, 12-1, 160, 36, damage_string, 1)
  16.       bitmap.draw_text(-1, 12+1, 160, 36, damage_string, 1)
  17.       bitmap.draw_text(+1, 12+1, 160, 36, damage_string, 1)
  18.       if value.is_a?(Numeric) and value < 0
  19.         bitmap.font.color.set(176, 255, 144)
  20.       elsif col != nil ;a = col.to_i ;
  21.         b = a / 1000000 ;c = a / 1000 % 1000 ;d = a % 1000
  22.         bitmap.font.color.set(b,c,d)
  23.       else
  24.         bitmap.font.color.set(255,255,255)
  25.       end
  26.       bitmap.draw_text(0, 12, 160, 36, damage_string, 1)
  27.       if critical
  28.         bitmap.font.size = 20
  29.         bitmap.font.color.set(0, 0, 0)
  30.         bitmap.draw_text(-1, -1, 160, 20, "CRITICAL", 1)
  31.         bitmap.draw_text(+1, -1, 160, 20, "CRITICAL", 1)
  32.         bitmap.draw_text(-1, +1, 160, 20, "CRITICAL", 1)
  33.         bitmap.draw_text(+1, +1, 160, 20, "CRITICAL", 1)
  34.         bitmap.font.color.set(255, 255, 255)
  35.         bitmap.draw_text(0, 0, 160, 20, "CRITICAL", 1)
  36.       end
  37.       @_damage_sprite = ::Sprite.new(self.viewport)
  38.       @_damage_sprite.bitmap = bitmap
  39.       @_damage_sprite.ox = 80
  40.       @_damage_sprite.oy = 20
  41.       @_damage_sprite.x = self.x
  42.       @_damage_sprite.y = self.y - self.oy / 2
  43.       @_damage_sprite.z = 3000
  44.       @_damage_duration = 40
  45.     end
  46.   end
  47. end
复制代码


把它插入main前

然后, 伤害显示里用中括号圈起来的数字就是RGB的设置颜色, 栗子 "[000162222]10086" 这样写就可以改变伤害显示的颜色

比如你要的3号脚本, 把 user.pending_rebound_damage = rebound 这句改成  user.pending_rebound_damage = "[162222]#{rebound}" 就可以改颜色了 , 当然, 引号内也可以写汉字

※ 只能用于默认伤害显示, 和任何修改伤害显示的脚本冲突, 例如彩虹剑
作者: 无忧谷主幻    时间: 2026-5-23 18:43
本帖最后由 无忧谷主幻 于 2026-5-23 18:44 编辑

使用状态法学习技能,其实没必要一个一个做条件分歧
这样就可以了
RUBY 代码复制
  1. # 遍历当前队伍中的所有角色
  2. $game_party.actors.each do |actor|
  3.   # 检查角色是否处于状态 17
  4.   if actor.state?(17)
  5.     # 让角色习得技能 1
  6.     actor.learn_skill(1) unless actor.skill_learn?(1)
  7.   end
  8. end

最后记得让全体角色解除状态17
可以多翻翻我的战斗技能以及关联的公共事件,里面有很多有趣的设定
作者: 灯笼菜刀王    时间: 2026-5-23 18:56


想要同时显示一串伤害, 默认是做不到的, 需要改造伤害显示的逻辑, 把它做成数组, 而且也要另外设计移动方式, 避免它们叠在一起

另外赋值伤害显示的时候也不能用正常方式, 所以说, 脚本熟练度不足的话,你就先别想了
作者: 灯笼菜刀王    时间: 2026-5-23 20:53
本帖最后由 灯笼菜刀王 于 2026-5-23 21:17 编辑



这就是我把 伤害判定, 技能动画, 伤害显示, 技能名称显示 塞在一起的产物

5个技能的连续攻击, MISS或者没触发或者目标挂了的时候就会终止, 可以从任意一个技能开始使用(最后一招必须由第四招触发), 条件满足就会自动连下一招,  这个动画一共有5次伤害判定, 所以后面吸血就会有5次  






这就是我动画的设置方法, 不备注, 搁段时间我自己看都要懵一会.. 要拿出来做成通用脚本, 那工作量可不一般

作者: 灯笼菜刀王    时间: 2026-5-23 23:01
本帖最后由 灯笼菜刀王 于 2026-5-23 23:06 编辑

要增加你的"回头"时间, 需要改动战斗流程

找到下面这段脚本, 强行插入一个 步骤1.5
#--------------------------------------------------------------------------
  # ● 刷新画面 (主回合)
  #--------------------------------------------------------------------------
  def update_phase4
    case @phase4_step
    when 1
      update_phase4_step1
    when 1.5
      update_phase4_step1_5

    when 2
      update_phase4_step2
    when 3
      update_phase4_step3
    when 4
      update_phase4_step4
    when 5
      update_phase4_step5
    when 6
      update_phase4_step6
    end
  end

然后, 找到步骤1, 在新回合之前截断 强行把步骤1分成 1 和 1.5

  #--------------------------------------------------------------------------
  # ● 刷新画面 (主回合步骤 1 : 准备行动)
  #--------------------------------------------------------------------------
  def update_phase4_step1
    # 隐藏帮助窗口
    @help_window.visible = false
    # 判定胜败
    if judge
      # 胜利或者失败的情况下 : 过程结束
      return
    end
    # 强制行动的战斗者不存在的情况下
    if $game_temp.forcing_battler == nil
      # 设置战斗事件
      setup_battle_event
      # 执行战斗事件中的情况下
      if $game_system.battle_interpreter.running?
        return
      end
    end
    # 强制行动的战斗者存在的情况下
    if $game_temp.forcing_battler != nil
      # 在头部添加后移动
      @action_battlers.delete($game_temp.forcing_battler)
      @action_battlers.unshift($game_temp.forcing_battler)
    end
    # 未行动的战斗者不存在的情况下 (全员已经行动)
    if @action_battlers.size == 0
      # 开始同伴命令回合
      start_phase2
      return
    end
    @phase4_step = 1.5
  end
  def update_phase4_step1_5

    # 初始化动画 ID 和公共事件 ID
    @animation1_id = 0
    @animation2_id = 0
    @common_event_id = 0
    # 未行动的战斗者移动到序列的头部
    @active_battler = @action_battlers.shift
    # 如果已经在战斗之外的情况下
    if @active_battler.index == nil
      return
    end
    # 连续伤害
    if @active_battler.hp > 0 and @active_battler.slip_damage?
      @active_battler.slip_damage_effect
      @active_battler.damage_pop = true
    end
    # 自然解除状态
    @active_battler.remove_states_auto
    # 刷新状态窗口
    @status_window.refresh
    # 移至步骤 2
    @phase4_step = 2
  end

这样, 毒就会等吸血的工作结束才会上工了

当然, 以上是默认的脚本, 因为这部分也是热门修改地(比如CP制等就完全不适用), 所以能不能有效, 你自己试吧. 笑
作者: y967    时间: 2026-5-24 10:11
本帖最后由 y967 于 2026-5-27 08:09 编辑

AI无用

1,魔法盾代替品

状态,自身血量大于50%时,抵消伤害30%,血量低于50%无效,显示“抵消:XX”字样

AI搓不出来

2,伪连击

状态,做一个状态,技能有50%几率额外造成50%伤害,额外伤害另外显示

3,真连击   笑

血量低于50%,技能结束后有50%几率立即播放一个动画造成额外50%伤害,



作者: 灯笼菜刀王    时间: 2026-5-24 11:33
本帖最后由 灯笼菜刀王 于 2026-5-24 11:42 编辑

有新问题就去开新贴

1,在 attack_effect ,skill_effect ,item_effect 三个地方, 找到 self.hp -= self.damage  在上面加一句

((a=(self.damage * 0.3).round ;self.damage = (self.damage * 0.7).round ;
self.pending_rebound_damage = "抵消#{a}") if self.state?(10086) and self.hp < self.maxhp / 2

不能用ailas, 要你确实的去找到位置改, 否则会影响基于hp的操作(例如之前的无忧谷的保命符) , 实际上你1号脚本就会有这个问题, 因为它的ailas是把血逆向加回伤害值,从而实现"免伤", 先不说它并没有考虑到伤害值是可以超过剩余血量的, 就说在默认扣血的时候, 保命符的判定就已经启动了, 之后把血加回去并不算"免伤" , 笑

2, 在 skill_effect, 找到 self.hp -= self.damage  在上面加一句

(a=self.damage / 2 ;self.damage += a ;self.pending_rebound_damage = "增伤#{a}") if user.state?(10086) and rand(100) < 50

这个可以ailas 但是用ailas的话, 它和其他ailas的上下顺序会导致效果的不同, 比如它在吸血下面, 那吸血就只会吸正常伤害, 增伤的部分无效

想ailas, 就在我的吸血吸蓝脚本里,第18行下面加上

(a=self.damage / 2 ;self.hp -= a ;self.damage += a ;self.pending_rebound_damage = "增伤#{a}") if user.state?(10086) and rand(100) < 50

3, 去用公共事件做, 在我的吸血吸蓝脚本里,第17行下面加上一句 $game_variables[1] = self.damage.is_a?(Numeric) ? self.damage : 0  这样1号变量就保存了当前伤害值(负数为加血, 0为MISS) 以后需要公共事件调用伤害值的都找这个变量即可

然后, 行动方播放动画写法  
a = $scene.instance_variable_get(
:@active_battler)
a.animation_id = 10086

对象方播放动画的写法
a = $scene.instance_variable_get(
:@target_battlers)
a[0].animation_id = 10086

对象方弹伤害和扣血的写法
a = $scene.instance_variable_get(
:@target_battlers)
b = $game_variables[1] / 2
a[0].hp -= b
a[0].damage= b
a[0].damage_pop = true

自己去用条件分歧, 等待 等方式做效果吧 ,别告诉我用事件都搞不定你的脑洞, 笑





作者: 灯笼菜刀王    时间: 2026-5-24 14:15
本帖最后由 灯笼菜刀王 于 2026-5-24 14:46 编辑

其实, 不需要纠结"显示抵消多少伤害",  你要的是"让玩家知道效果触发"的表演而已,  那可以直接播放一个动画就行了


▲像这样,不用显示什么抵消XX伤害, 你也知道伤害被抵消了吧, 笑


甚至, 可以这样, 战斗前就表演, 这样玩家也知道触发效果了



而且因为公式结算是在动画之前, 所以在攻击动画之前的表演更容易做, 只要直接播放动画即可, 不需要考虑滞后显示

把 1的句子改成   (a=(self.damage * 0.3).round ;self.damage = (self.damage * 0.7).round ;
self.animation_id = 10086) if self.state?(10086) and self.hp < self.maxhp / 2

这样触发效果的时候, 就会先播放10086号动画,然后再播放攻击动画了
作者: y967    时间: 2026-5-25 07:09
1,给敌人附加一个状态,增加敌人受伤害30%,AI不好使


2,七伤拳
伤敌1000,自损800,AI搓出来了,只扣血没有显示数字效果

RUBY 代码复制
  1. #==============================================================================
  2. # ** Game_Battler
  3. #------------------------------------------------------------------------------
  4. #  添加技能反噬效果
  5. #  配置区域:REBOUND_SKILL_IDS 填入需要具有反噬效果的技能ID
  6. #==============================================================================
  7.  
  8. class Game_Battler
  9.  
  10.   # [配置] 在这里填入需要拥有“50%几率反噬0.8倍伤害”效果的技能ID
  11.   # 例如: [15, 23, 40] 表示 ID 为 15, 23, 40 的技能会触发此效果
  12.   REBOUND_SKILL_IDS = [57,58] # 默认设为1,请根据实际情况修改
  13.  
  14.   # 别名化原有的技能效果方法,以便插入额外逻辑
  15.   alias_method :rebound_skill_effect_original, :skill_effect
  16.  
  17.   def skill_effect(user, skill)
  18.     # 先执行原有的技能效果计算(包括伤害计算、状态添加等)
  19.     result = rebound_skill_effect_original(user, skill)
  20.  
  21.     # 只有当技能是攻击性技能(造成HP伤害)且命中时才触发反噬
  22.     # self.damage > 0 表示造成了正向伤害(HP减少)
  23.     if self.damage.is_a?(Integer) && self.damage > 0
  24.       if REBOUND_SKILL_IDS.include?(skill.id)
  25.         # 50% 几率触发
  26.         if rand(100) < 50
  27.           # 计算反噬伤害:当前造成伤害的 0.8 倍
  28.           rebound_damage = (self.damage * 0.8).to_i
  29.  
  30.           # 确保反噬伤害至少为 1,避免显示 0
  31.           if rebound_damage < 1
  32.             rebound_damage = 1
  33.           end
  34.  
  35.           # 对使用者(user)造成伤害
  36.           # 注意:user 可能是敌人也可能是演员,Game_Battler 通用
  37.           user.hp -= rebound_damage
  38.  
  39.          rebound_damage = "[199021133]自伤#{rebound_damage}"
  40.  
  41.           # 可选:在用户头上显示反噬伤害数字(需要场景支持,通常自动处理)
  42.           # 如果希望显示伤害数字,可能需要更复杂的 Scene_Battle 修改
  43.           # 这里仅做数值扣除,保证逻辑正确。
  44.  
  45.           # 记录日志或提示(可选,取决于是否开启战斗日志)
  46.            #$game_temp.battle_messages.push("#{user.name} 受到了反噬!")
  47.         end
  48.       end
  49.     end
  50.  
  51.     return result
  52.   end
  53.  
  54. end



在40行自行添加rebound_damage = "[199021133]自伤#{rebound_damage}",未能显示数字,也未显示文字。打开47行,出错,不打开就可以。

3,变猪

让敌人变成一只猪,属性减半,目前有时候会出错, battle 2,偶尔会,不会经常出现

RUBY 代码复制
  1. #==============================================================================
  2. # ▼ 变形技能(变猪/青蛙) + 属性减半 + 战斗图替换
  3. #==============================================================================
  4. module Polymorph
  5.   # 技能ID
  6.   SKILL_ID = 57
  7.   # 变形状态ID
  8.   PIG_STATE_ID   = 21
  9.   FROG_STATE_ID  = 22
  10.   # 战斗图文件名(位于 Graphics/Battlers/ 目录,不含后缀)
  11.   PIG_BATTLER    = "pig"
  12.   FROG_BATTLER   = "frog"
  13. end
  14.  
  15. #--------------------------------------------------------------------------
  16. # ● 技能使用效果:命中时随机附加变猪或变青蛙状态
  17. #--------------------------------------------------------------------------
  18. class Game_Battler
  19.   alias poly_skill_effect skill_effect
  20.   def skill_effect(user, skill)
  21.     effective = poly_skill_effect(user, skill)
  22.     return effective unless effective
  23.     return effective unless skill.id == Polymorph::SKILL_ID
  24.  
  25.     # 随机选择变形状态
  26.     state_id = rand(2) == 0 ? Polymorph::PIG_STATE_ID : Polymorph::FROG_STATE_ID
  27.     self.add_state(state_id) unless self.state_full?(state_id)
  28.     effective
  29.   end
  30. end
  31.  
  32. #--------------------------------------------------------------------------
  33. # ● 基本属性减半(若处于变形状态)
  34. #--------------------------------------------------------------------------
  35. class Game_Battler
  36.   [:str, :dex, :agi, :int, :atk, :pdef, :mdef, :eva].each do |stat|
  37.     alias_method("poly_base_#{stat}", stat)
  38.     define_method(stat) do
  39.       val = send("poly_base_#{stat}")
  40.       if [Polymorph::PIG_STATE_ID, Polymorph::FROG_STATE_ID].any? { |id| self.state?(id) }
  41.         val / 2
  42.       else
  43.         val
  44.       end
  45.     end
  46.   end
  47. end
  48.  
  49. #--------------------------------------------------------------------------
  50. # ● 敌方战斗图替换(处于变形状态时显示猪/蛙图)
  51. #--------------------------------------------------------------------------
  52. class Game_Enemy < Game_Battler
  53.   alias poly_battler_name battler_name
  54.   def battler_name
  55.     if state?(Polymorph::PIG_STATE_ID)
  56.       Polymorph::PIG_BATTLER
  57.     elsif state?(Polymorph::FROG_STATE_ID)
  58.       Polymorph::FROG_BATTLER
  59.     else
  60.       poly_battler_name
  61.     end
  62.   end
  63. end

作者: 灯笼菜刀王    时间: 2026-5-25 10:04
本帖最后由 灯笼菜刀王 于 2026-5-25 11:33 编辑

1. self.hp -= self.damage 之前加上 self.damage = (self.damage * 1.3).round if self.state?(10086)   # 对伤害进行增减变化的做法我已经教过很多次了, 不会举一反三, 下次再问我就无视了

2, 和反弹的做法一样, 判断对象不同
给你成品脚本, 吸血脚本更新  

设置方法 FS=50%0.8   50%表示50%概率,0.8表示反噬0.8倍伤害

RUBY 代码复制
  1. module RPG
  2.   class Skill
  3.     def description
  4.       description = @description.split(/#/)[0]
  5.       return description != nil ? description : ''
  6.     end
  7.     def 吸血 ;@description[/XHP\=(\d+)\%(\d*)/] ;return $1 ? [$1,$2] : nil ;end
  8.     def 吸蓝 ;@description[/XSP\=(\d+)\%(\d*)/] ;return $1 ? [$1,$2] : nil ;end
  9.     def 反噬 ;@description[/FS\=(\d+)\%([.0-9]+)/] ;return $1 ? [$1,$2] : nil ;end
  10.   end
  11. end
  12.  
  13. class Game_Battler
  14.   attr_accessor :pending_rebound_damage
  15.   alias caidao_skill_effect skill_effect
  16.   def skill_effect(user, skill)
  17.     old_hp = self.hp
  18.     eff = caidao_skill_effect(user, skill)
  19.     $game_variables[1] = self.damage.is_a?(Numeric) ? self.damage : 0
  20.     if eff and (a=self.damage).is_a?(Numeric) and a > 0
  21.       (a=self.damage / 2 ;self.hp -= a ;self.damage += a ;
  22.       self.pending_rebound_damage = "#{self.damage}增伤#{a}") if user.state?(10086) and rand(100) < 50
  23.       if (r=skill.反噬) ; m,n = r[0].to_i,r[1].to_f
  24.         (a=(self.damage * n).round ;user.hp -= a ;
  25.          user.pending_rebound_damage = "反噬#{a}") if rand(100) < m
  26.       end
  27.       if (r=skill.吸血)
  28.         m,n = r[0].to_i,r[1].to_i ;f = [self.damage * m / 100,old_hp]
  29.         f.push(n) if n > 0 ;a = f.min
  30.         user.hp += a ;#user.pending_rebound_damage = "吸血#{a}"
  31.       end
  32.       if (r=skill.吸蓝)
  33.         m,n = r[0].to_i,r[1].to_i ;f = [self.damage * m / 100,old_hp]
  34.         f.push(n) if n > 0 ; a = f.min
  35.         user.sp += a ;#user.pending_rebound_damage = "吸蓝#{a}"
  36.       end
  37.     end ;return eff
  38.   end
  39. end


3, 数据库,状态设置,  定量10, 其他50%  动画: 对象方隐藏, 贴个猪 , 解决




欢迎光临 Project1 (https://rpg.blue/) Powered by Discuz! X3.1