设为首页收藏本站|繁體中文

Project1

 找回密码
 注册会员
搜索
查看: 1072|回复: 4
打印 上一主题 下一主题

[讨论] RPG状态实现技巧,无需新增脚本

[复制链接]

Lv4.逐梦者

素材区好人

梦石
3
星屑
11154
在线时间
4172 小时
注册时间
2011-7-21
帖子
2528

极短27参与极短26参与极短25参与极短24参与极短23参与极短22参与极短21参与

跳转到指定楼层
1
发表于 2025-12-14 10:58:05 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

加入我们,或者,欢迎回来。

您需要 登录 才可以下载或查看,没有帐号?注册会员

x
本帖最后由 无忧谷主幻 于 2026-5-11 02:50 编辑

分享几个超实用的状态实现技巧——无需新增任何脚本,仅需修改原生脚本的几行代码,就能轻松做出各类战斗状态效果!
本文收录的所有方法,都是基于基础脚本的微调,新手也能快速上手
后续会持续更新不同状态的修改思路,欢迎大家在评论区交流自己的脚本修改小技巧
(状态名称仅供参考)
1,不屈:角色受到致命伤时,保留1HP
Game_Battler 1 第265行
  1.   #--------------------------------------------------------------------------
  2.   # ● 战斗不能判定
  3.   #--------------------------------------------------------------------------
  4.   def dead?
  5.     return (@hp == 0 and not @immortal)
  6.   end
复制代码

将其改为
  1. #--------------------------------------------------------------------------
  2.    # ● 战斗不能判定
  3.   #--------------------------------------------------------------------------
  4.   def dead?
  5.      if @hp == 0 and @states.include?(100)
  6.      @hp+=1
  7.      return false
  8.    else
  9.      return (@hp == 0 and not @immortal)
  10.    end
  11. end
复制代码


1.1,不屈·改:角色受到致命伤时,保留1HP,之后移除该状态
  1. #--------------------------------------------------------------------------
  2.   # ● 战斗不能判定
  3.   #--------------------------------------------------------------------------
  4. def dead?
  5.   if @hp == 0 and @states.include?(100)
  6.     @hp += 1  # 濒死保护:HP+1
  7.     @states.delete(100)  
  8.     return false  # 判定为未死亡
  9.   else
  10.     # 普通死亡判定
  11.     return (@hp == 0 and not @immortal)
  12.   end
  13. end
复制代码


2,减伤:按照百分百,减免部分伤害
Game_Battler 3 62行与147行
  1.         # 防御修正
  2.         if self.guarding?
  3.           self.damage /= 2
  4.         end
  5.       end
复制代码


统统改成
  1. # 防御修正
  2.           self.damage /= 2 if self.guarding?
  3.         # 101号状态减伤30%
  4.           self.damage = (self.damage * 7) / 10 if self.state?(101)
  5.         end
复制代码

PS:253行也有一个防御修正,但这个应该不需要改,毕竟敌人是不会使用道具的,你自己应该也不会用道具打自己

2.1,免伤:将受到的伤害直接降为0
  1.         # 防御修正
  2.         self.damage /= 2 if self.guarding?
  3.         self.damage = 0 if self.state?(101)  # 101号状态触发100%免伤
  4.        end
复制代码


3,增幅:增加特定属性的威力百分百
Game_Battler 3 173行
  1.       # 计算威力
  2.       power = skill.power + user.atk * skill.atk_f / 100
  3.       if power > 0
  4.         power -= self.pdef * skill.pdef_f / 200
  5.         power -= self.mdef * skill.mdef_f / 200
  6.         power = [power, 0].max
  7.       end
复制代码

将其改成
  1.       # 计算威力
  2.       power = skill.power + user.atk * skill.atk_f / 100
  3.       sz = [[11,38,15],[11,39,13]]
  4. # 使用带11号属性的技能,在38号状态的作用下,威力1.5倍,在39号状态的作用下,威力1.3倍
  5.       for i in 0...sz.size
  6.     if skill.element_set.include?(sz[i][0]) and user.state?(sz[i][1])  
  7.      power *= sz[i][2]
  8.      power /= 10
  9.     end
  10.     end
  11.       if power > 0
  12.         power -= self.pdef * skill.pdef_f / 200
  13.         power -= self.mdef * skill.mdef_f / 200
  14.         power = [power, 0].max
  15.       end
复制代码

4,属性护盾:受到特定属性攻击时,按百分比减免伤害
Game_Battler 3 55行与145行
  1.       # 伤害符号正确的情况下
  2.       if self.damage > 0
复制代码

将其改成
  1.       # 伤害符号正确的情况下
  2.       if self.damage > 0
  3.       if self.state?(103)  
  4.     end
  5.       if skill.element_set.include?(14)
  6.      self.damage = self.damage*60/100
  7.       #处于103号状态,受到带有14号属性的攻击时,伤害变成原本的60%
  8.     end
复制代码

若想添加多个属性的减伤也是可以的
  1.       # 伤害符号正确的情况下
  2.       if self.damage > 0
  3.         if self.state?(103)
  4.         if  skill.element_set.include?(6)
  5.         self.damage=self.damage*0/100
  6.     end
  7.         if  skill.element_set.include?(14)
  8.         self.damage=self.damage*60/100
  9.     end
  10.   end
复制代码

5,愈合:每回合自动回复一定比例的HP
Scene_Battle 4 129~133行
  1.     # 连续伤害
  2.     if @active_battler.hp > 0 and @active_battler.slip_damage?
  3.       @active_battler.slip_damage_effect
  4.       @active_battler.damage_pop = true
  5.     end
复制代码

下面(注意!是下面,不是覆盖)
  1.      if @active_battler.state?(105) and @active_battler.hp >0  #105号状态恢复生命
  2.       @active_battler.damage=-@active_battler.maxhp/10 #恢复生命百分比,这里设置为10%,也可设置固定值
  3.       @active_battler.damage=@active_battler.damage.to_i
  4.       @active_battler.hp-=@active_battler.damage
  5.       @active_battler.animation_id = 4 #自动补血动画编号
  6.       @active_battler.damage_pop = true
  7.     end
复制代码

5.5:回蓝:每回合自动回复一定数值的MP
  1.     # 判定105号状态,恢复500点SP
  2.     if @active_battler.is_a?(Game_Actor)
  3.     if @active_battler.hp > 0 and @active_battler.state?(105)
  4.     @active_battler.sp += 500
  5.    end
  6.   end
复制代码


6,狂战:HP越少,攻击力越高
Game_Actor 264行
  1.   #--------------------------------------------------------------------------
  2.   # ● 获取基本攻击力
  3.   #--------------------------------------------------------------------------
  4.   def base_atk
  5.     weapon = $data_weapons[@weapon_id]
  6.     return weapon != nil ? weapon.atk : 0
  7.   end
复制代码

将其改成
  1.   #--------------------------------------------------------------------------
  2.   # ● 获取基本攻击力
  3.   #--------------------------------------------------------------------------
  4. def base_atk
  5.   n = 0
  6.   if @weapon_id > 0
  7.     weapon = $data_weapons[@weapon_id]
  8.     n += weapon.atk  
  9.   end
  10.   if self.state?(106)
  11.     n += n*(100-self.hp*100/self.maxhp)/100
  12.   end
  13.   return n
  14. end
复制代码

7,多种毒( 别问为什么只有3种,我也想多写几个,但是想不到还能写什么效果了)
①风毒:每回合按扣除10%MP
②水毒:每回合扣除剩余HP的10%
③火毒:每回合扣除1000点HP
Game_Battler 3 318行
  1.   #--------------------------------------------------------------------------
  2.   # ● 应用连续伤害效果
  3.   #--------------------------------------------------------------------------
  4.   def slip_damage_effect
  5.     # 设置伤害
  6.     self.damage = self.maxhp / 10
  7.     # 分散
  8.     if self.damage.abs > 0
  9.       amp = [self.damage.abs * 15 / 100, 1].max
  10.       self.damage += rand(amp+1) + rand(amp+1) - amp
  11.     end
  12.     # HP 的伤害减法运算
  13.     self.hp -= self.damage
复制代码

将其改成
  1.    #--------------------------------------------------------------------------
  2.   # ● 应用连续伤害效果
  3.   #--------------------------------------------------------------------------
  4.   def slip_damage_effect
  5.     if self.state?(3) #默认的毒效果
  6.       # 设置伤害
  7.       self.damage = self.maxhp / 10
  8.       # 分散
  9.       if self.damage.abs > 0
  10.         amp = [self.damage.abs * 15 / 100, 1].max
  11.         self.damage += rand(amp+1) + rand(amp+1) - amp
  12.       end
  13.       # HP 的伤害减法运算
  14.       self.hp -= self.damage
  15.     end
  16.     # 风毒:每回合扣除最大SP的10%
  17.     if self.state?(17)
  18.       sp_dmg = self.maxsp * 10 / 100
  19.       self.damage = sp_dmg  # 记录伤害数值(用于战斗界面显示)
  20.       self.sp -= sp_dmg     # 扣减SP
  21.       self.sp = [self.sp, 0].max  # 限制SP下限,避免出现负数
  22.     end
  23.     # 水毒:每回合扣除剩余HP的10%
  24.     if self.state?(18)
  25.       self.damage = self.hp * 1 / 10
  26.       self.hp -= self.damage
  27.     end
  28.     # 火毒:每回合扣除固定1000点HP
  29.     if self.state?(19)
  30.       self.damage = 1000
  31.       self.hp -= self.damage
  32.     end
复制代码


8,增伤:提升技能伤害百分百
Game_Battler 3 140~141行
RUBY 代码复制
  1. # 计算基本伤害
  2.       self.damage = power * rate / 20

下面
RUBY 代码复制
  1. # 状态加成 技能伤害增加30%
  2.       if user.state?(107)
  3.        self.damage = self.damage * 130 / 100  # 对使用者的技能伤害加成30%
  4.       end

PS:只对技能有效,若想对普通攻击也有效,在上面的应用通常攻击效果也加一遍

评分

参与人数 3+3 收起 理由
背棺走的骷髅 + 1 又能偷点懒了
miantouchi + 1
扣扣空间 + 1 我很赞同

查看全部评分

Lv5.捕梦者

梦石
0
星屑
41773
在线时间
5970 小时
注册时间
2006-11-10
帖子
6962
2
发表于 2025-12-17 18:31:48 | 只看该作者
本帖最后由 灯笼菜刀王 于 2025-12-17 18:34 编辑

抓个虫,  include?(100)  下面却是 delete(115)

只从@states里delete会有隐患, 因为还有个@states_turn留着, 而且也会让你之前费力问的"自动状态替换相关"失效, 笑, 建议用 remove_state(115)

回蓝也可以 @active_battler.damage = "SP+500" 这样来伤害显示, 不过这种做法会让 同时有中毒,回血,回蓝时只显示回蓝, 当然,你之前的写法会在 回血和中毒同时存在的时候只显示回血, 笑

而赖着不死状态, 玩家第一次碰到, 最多的反应会是"菜刀,又出BUG啦" ,摊手

效果有了, 如何表现最好也考虑下


回复 支持 反对

使用道具 举报

Lv4.逐梦者

素材区好人

梦石
3
星屑
11154
在线时间
4172 小时
注册时间
2011-7-21
帖子
2528

极短27参与极短26参与极短25参与极短24参与极短23参与极短22参与极短21参与

3
 楼主| 发表于 2025-12-19 20:09:22 | 只看该作者
灯笼菜刀王 发表于 2025-12-17 18:31
抓个虫,  include?(100)  下面却是 delete(115)  

只从@states里delete会有隐患, 因为还有个@sta ...


数字填错,已经修改
SP伤害显示因为用久了彩虹神剑,我默认都是不显示的,不过根据情况不同确实可以加上
回复 支持 反对

使用道具 举报

Lv3.寻梦者

梦石
0
星屑
2625
在线时间
302 小时
注册时间
2023-9-12
帖子
17
4
发表于 2026-1-11 02:04:44 | 只看该作者
关于第3点的属性增伤,大佬写的只是技能,我琢磨半天仿照技能的弄了个平A的。
  1.       # 计算基本伤害
  2.       atk = [attacker.atk - self.pdef / 2, 0].max
  3.       self.damage = atk * (20 + attacker.str) / 20
复制代码

通常攻击的这里替换成以下:
  1.       ####################附加状态后属性增伤#########################
  2.       # 计算威力
  3.       power = [attacker.atk - self.pdef / 2, 0].max
  4.       sz = [[1,24,1.5],[11,39,1.3]]
  5. # 使用带1号属性的武器,在24号状态的作用下,威力1.5倍,使用带11号属性的技能,在39号状态的作用下,威力1.3倍
  6.       for i in 0...sz.size
  7.       if attacker.element_set.include?(sz[i][0]) and attacker.state?(sz[i][1])  
  8.        power *= sz[i][2]
  9.       end
  10.       atk = power
  11.       self.damage = atk * (20 + attacker.str) / 20
  12.     end
  13.       ####################附加状态后属性增伤#########################
复制代码
回复 支持 反对

使用道具 举报

Lv3.寻梦者

梦石
0
星屑
2625
在线时间
302 小时
注册时间
2023-9-12
帖子
17
5
发表于 2026-1-11 02:09:33 | 只看该作者
微妙夏伤_ 发表于 2026-1-11 02:04
关于第3点的属性增伤,大佬写的只是技能,我琢磨半天仿照技能的弄了个平A的。
通常攻击的这里替换成以下: ...

至于为什么取消了
【power /=10】这个,是因为我计算伤害的时候,应该打出108的打出了107,应该打出144的打出了142,然后发现是这个的原因。
然后特技里的这个反而要保留,我试着取消,发现如果是回血技能,*1.5倍(取消了/10的这一步),就会变成*150倍。。。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册会员

本版积分规则

拿上你的纸笔,建造一个属于你的梦想世界,加入吧。
 注册会员
找回密码

站长信箱:[email protected]|手机版|小黑屋|无图版|Project1游戏制作

GMT+8, 2026-6-4 15:50

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表