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

Project1

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

[有事请教] 写相关的吸收伤害反弹伤害的脚本出了很多问题

[复制链接]

Lv2.观梦者

梦石
0
星屑
759
在线时间
122 小时
注册时间
2024-4-13
帖子
70
跳转到指定楼层
1
发表于 2024-9-7 01:20:53 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

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

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

x
本帖最后由 chen12311 于 2024-9-7 15:06 编辑

比如开开关时自己对自己没有造成伤害,还有取消敌人相关的buff然后开关关不掉了,就会一直没有伤害等等,所以求帮助
以下为代码(注:是给敌人使用的技能,我知道我写的代码很抽象,所以见谅
RUBY 代码复制
  1. module Absorb_text
  2.   TEXT_TE=""
  3.   TEXT_TEXT="%s吸收了%d点伤害。"
  4. end
  5. class Game_Battler < Game_BattlerBase
  6.   alias make_damage_value_absorb make_damage_value
  7.   def make_damage_value(user, item)
  8.     if $game_switches[122]==true
  9.       @value_absorb=0
  10.       value = item.damage.eval(user, self, $game_variables)
  11.       value *= item_element_rate(user, item)
  12.       value *= pdr if item.physical?
  13.       value *= mdr if item.magical?
  14.       value *= rec if item.damage.recover?
  15.       value = apply_critical(value) if @result.critical
  16.       value = apply_variance(value, item.damage.variance)
  17.       value = apply_guard(value)
  18.       @value_absorb=value
  19.       $game_variables[92]+=@value_absorb
  20.       @result.make_damage(value.to_i, item)
  21.     elsif $game_switches[122]==false
  22.       make_damage_value_absorb(user,item)
  23.     end
  24.   end
  25. end
  26. class Game_ActionResult
  27.   alias make_damage_absorb make_damage
  28.   def make_damage(value, item)
  29.     if $game_switches[121]==true
  30.       @value_absorb_1=value
  31.       value=0
  32.       @critical = false if value == 0
  33.       @hp_damage = value if item.damage.to_hp?
  34.       @mp_damage = value if item.damage.to_mp?
  35.       @mp_damage = [@battler.mp, @mp_damage].min
  36.       @hp_drain = @hp_damage if item.damage.drain?
  37.       @mp_drain = @mp_damage if item.damage.drain?
  38.       @hp_drain = [@battler.hp, @hp_drain].min
  39.       @success = true if item.damage.to_hp? || @mp_damage != 0
  40.     elsif $game_switches[121]==false
  41.       make_damage_absorb(value, item)
  42.     end
  43.   end
  44.   def enemy_absorb_text
  45.     if $game_switches[121]==true
  46.       fmt = @battler.actor? ? Absorb_text::TEXT_TE : Absorb_text::TEXT_TEXT
  47.       sprintf(fmt,@battler.name, @value_absorb_1)
  48.     end
  49.   end
  50.   alias hp_damage_text_absorb hp_damage_text
  51.   def hp_damage_text
  52.     if $game_switches[121]==true
  53.       if @hp_drain > 0
  54.         fmt = @battler.actor? ? Vocab::ActorDrain : Absorb_text::TEXT_TE
  55.         sprintf(fmt, @battler.name, Vocab::hp, @hp_drain)
  56.       elsif @hp_damage > 0
  57.         fmt = @battler.actor? ? Vocab::ActorDamage : Absorb_text::TEXT_TE
  58.         sprintf(fmt, @battler.name, @hp_damage)
  59.       elsif @hp_damage < 0
  60.         fmt = @battler.actor? ? Vocab::ActorRecovery : Absorb_text::TEXT_TE
  61.         sprintf(fmt, @battler.name, Vocab::hp, -hp_damage)
  62.       else
  63.         fmt = @battler.actor? ? Vocab::ActorNoDamage : Absorb_text::TEXT_TE
  64.         sprintf(fmt, @battler.name)
  65.       end
  66.     elsif $game_switches[121]==false
  67.       hp_damage_text_absorb
  68.     end
  69.   end
  70. end
  71. class Window_BattleLog
  72.   alias display_damage_enemy_absorb display_damage
  73.   def display_damage(target, item)
  74.     display_hp_absorb(target, item)# if target.result.barrier?#
  75.     display_damage_enemy_absorb(target, item)
  76.   end
  77.   def display_hp_absorb(target, item)
  78.     add_text(target.result.enemy_absorb_text)
  79.     wait
  80.   end
  81. end

好累啊,今天又是不睡觉的一天

Lv6.析梦学徒

老鹰

梦石
40
星屑
34740
在线时间
6740 小时
注册时间
2012-5-26
帖子
3259

极短24评委极短23参与极短22参与极短21评委老司机慢点开短篇十吟唱者组别冠军开拓者剧作品鉴家

2
发表于 2024-9-7 09:15:03 | 只看该作者
额每个战斗角色都会走这一套流程,居然用全局开关共用吗?
建议在 game battler 里面增加各个角色自己的实例变量
然后在受到伤害前判断,之后在别的地方调用这个角色的实例变量,在伤害处理结束后关闭该实例变量
回复 支持 反对

使用道具 举报

Lv2.观梦者

梦石
0
星屑
759
在线时间
122 小时
注册时间
2024-4-13
帖子
70
3
 楼主| 发表于 2024-9-7 10:16:08 | 只看该作者
本帖最后由 chen12311 于 2024-9-7 12:27 编辑
百里_飞柳 发表于 2024-9-7 09:15
额每个战斗角色都会走这一套流程,居然用全局开关共用吗?
建议在 game battler 里面增加各个角色自己的实 ...


但我这个是要给敌人用的技能,那应该怎么做

点评

解决了谢谢鹰大哥  发表于 2024-9-7 23:06
可以查下 ruby 实例变量,网上很多相关教程的  发表于 2024-9-7 19:56
好了解了  发表于 2024-9-7 19:54
你看下game battler里面带@符号的变量,就是各个对象都有,但是自己存自己的值,互不干扰  发表于 2024-9-7 19:45
能举个例子吗,没搞明白该怎么做  发表于 2024-9-7 19:24
好累啊,今天又是不睡觉的一天
回复 支持 反对

使用道具 举报

Lv2.观梦者

梦石
0
星屑
759
在线时间
122 小时
注册时间
2024-4-13
帖子
70
4
 楼主| 发表于 2024-9-7 22:17:02 | 只看该作者
本帖最后由 chen12311 于 2024-9-7 23:20 编辑

还是有个问题,就是给敌人附加效果依旧没法关闭开关,我想要的效果是给敌人附加无法行动的状态时开关关闭,我知道问题但不知道怎么解决,求解答
RUBY 代码复制
  1. module Absorb_text
  2.   TEXT_TE=""
  3.   TEXT_TEXT="%s吸收了%d点伤害。"
  4. end
  5. class Game_Battler < Game_BattlerBase
  6.   alias make_damage_value_absorb make_damage_value
  7.   def make_damage_value(user, item)
  8.     if $game_switches[122]==true
  9.       @value_absorb=0
  10.       value = item.damage.eval(user, self, $game_variables)
  11.       value *= item_element_rate(user, item)
  12.       value *= pdr if item.physical?
  13.       value *= mdr if item.magical?
  14.       value *= rec if item.damage.recover?
  15.       value = apply_critical(value) if @result.critical
  16.       value = apply_variance(value, item.damage.variance)
  17.       value = apply_guard(value)
  18.       @result.make_damage(value.to_i, item)
  19.       if @battler.actor? ==false
  20.         @value_absorb=value
  21.         $game_variables[92]+=@value_absorb
  22.       end
  23.     elsif $game_switches[122]==false
  24.       make_damage_value_absorb(user,item)
  25.     end
  26.   end
  27. end
  28. class Game_ActionResult
  29.   alias make_damage_absorb make_damage
  30.   def make_damage(value, item)
  31.     if $game_switches[121]==true && @battler.actor? ==false
  32.       if value==0
  33.         value_absorb_1=0
  34.       elsif value>0
  35.         @value_absorb_1=value
  36.         value=0
  37.       end
  38.       @critical = false if value == 0
  39.       @hp_damage = value if item.damage.to_hp?
  40.       @mp_damage = value if item.damage.to_mp?
  41.       @mp_damage = [@battler.mp, @mp_damage].min
  42.       @hp_drain = @hp_damage if item.damage.drain?
  43.       @mp_drain = @mp_damage if item.damage.drain?
  44.       @hp_drain = [@battler.hp, @hp_drain].min
  45.       @success = true if item.damage.to_hp? || @mp_damage != 0
  46.     elsif $game_switches[121]==false || @battler.actor? ==true
  47.       make_damage_absorb(value, item)
  48.     end
  49.   end
  50.   def enemy_absorb_text
  51.     if $game_switches[121]==true && @value_absorb_1>0
  52.       fmt = @battler.actor? ? Absorb_text::TEXT_TE : Absorb_text::TEXT_TEXT
  53.       sprintf(fmt,@battler.name, @value_absorb_1)
  54.     end
  55.   end
  56.   alias hp_damage_text_absorb hp_damage_text
  57.   def hp_damage_text
  58.     if $game_switches[121]==true
  59.       if @hp_drain > 0
  60.         fmt = @battler.actor? ? Vocab::ActorDrain : Absorb_text::TEXT_TE
  61.         sprintf(fmt, @battler.name, Vocab::hp, @hp_drain)
  62.       elsif @hp_damage > 0
  63.         fmt = @battler.actor? ? Vocab::ActorDamage : Absorb_text::TEXT_TE
  64.         sprintf(fmt, @battler.name, @hp_damage)
  65.       elsif @hp_damage < 0
  66.         fmt = @battler.actor? ? Vocab::ActorRecovery : Absorb_text::TEXT_TE
  67.         sprintf(fmt, @battler.name, Vocab::hp, -hp_damage)
  68.       else
  69.         fmt = @battler.actor? ? Vocab::ActorNoDamage : Absorb_text::TEXT_TE
  70.         sprintf(fmt, @battler.name)
  71.       end
  72.     elsif $game_switches[121]==false
  73.       hp_damage_text_absorb
  74.     end
  75.   end
  76. end
  77. class Window_BattleLog
  78.   alias display_damage_enemy_absorb display_damage
  79.   def display_damage(target, item)
  80.     display_hp_absorb(target, item)# if target.result.barrier?#
  81.     display_damage_enemy_absorb(target, item)
  82.   end
  83.   def display_hp_absorb(target, item)
  84.     add_text(target.result.enemy_absorb_text)
  85.     wait
  86.   end
  87. end

点评

解决了,感谢且也辛苦老鹰大哥  发表于 2024-9-8 00:46
好了解了  发表于 2024-9-7 23:55
你在 game_battler 的 add_state 里写判定,如果自己是 enemy? 并且 state_id 是指定ID(或判定该$data_states[id]的备注)则关闭这个实例变量开关  发表于 2024-9-7 23:44
好累啊,今天又是不睡觉的一天
回复 支持 反对

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2024-11-23 22:18

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

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