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

Project1

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

[已经解决] 受到攻击触发反伤

[复制链接]

Lv2.观梦者

梦石
0
星屑
345
在线时间
20 小时
注册时间
2018-10-13
帖子
16
跳转到指定楼层
1
发表于 2019-4-8 19:29:32 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式

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

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

x
啊,最近问的比较多
和上个问的差不多,在拥有x号状态下受到xxx点伤害,反伤x%的伤害这种orz

Lv5.捕梦者

梦石
10
星屑
39587
在线时间
1920 小时
注册时间
2010-11-14
帖子
3320

R考场第七期纪念奖

2
发表于 2019-4-8 22:32:14 | 只看该作者
试着写了一个,伤害确实能反,不过似乎没有效果的演示。
看看有没有人接着完善一下吧。

RUBY 代码复制
  1. #  在状态备注中写<反伤 0.1>则拥有该状态时,反弹所受伤害的10%给使用者。
  2.  
  3. class RPG::State
  4.   def reflect?
  5.     self.reflect > 0.0
  6.   end
  7.  
  8.   def reflect
  9.     tag = "(?:反伤|reflect)"
  10.     int = "[ :=]*"
  11.     cap = "([0-9.]+)"
  12.     m = self.note.match(/<#{tag}#{int}#{cap}>/)
  13.     m ? m[1].to_f : 0.0
  14.   end
  15. end
  16.  
  17. class Game_Battler
  18.   #--------------------------------------------------------------------------
  19.   # ● [别名修改]伤害效果
  20.   #--------------------------------------------------------------------------
  21.   alias execute_damage_for_reflect execute_damage
  22.   def execute_damage(user)
  23.     execute_damage_for_reflect(user)
  24.     if self.states.any?{|s| s.reflect?}
  25.       rt = self.states.map{|s| s.reflect}.max
  26.       if @hp_damage > 0
  27.         user.hp -= (@hp_damage * rt).to_i
  28.       end
  29.     end
  30.   end
  31. end

评分

参与人数 1星屑 +90 收起 理由
正太君 + 90 认可答案

查看全部评分

用头画头像,用脚写脚本
回复 支持 1 反对 0

使用道具 举报

Lv2.观梦者

梦石
0
星屑
345
在线时间
20 小时
注册时间
2018-10-13
帖子
16
3
 楼主| 发表于 2019-4-10 21:06:40 | 只看该作者
KB.Driver 发表于 2019-4-8 22:32
试着写了一个,伤害确实能反,不过似乎没有效果的演示。
看看有没有人接着完善一下吧。

哇哇!这个太棒啦~,有空学了脚本后我看看能不能完善~
回复 支持 反对

使用道具 举报

Lv2.观梦者

梦石
0
星屑
353
在线时间
15 小时
注册时间
2019-4-14
帖子
31
4
发表于 2019-4-16 21:13:16 | 只看该作者
本帖最后由 活气寒露 于 2019-4-16 21:16 编辑


使用正则表达式很简单就能实现了。
附上脚本:
  1. #==============================================================================
  2. # ■ State
  3. #==============================================================================
  4. module State
  5.       State_Reflect = /\<反彈傷害[ ]([\+\-]?\d+)\>/
  6. end
  7. #==============================================================================
  8. # ■ RPG::State
  9. #==============================================================================
  10. class RPG::State
  11.   #--------------------------------------------------------------------------
  12.   # * create_state_angel_cache
  13.   #--------------------------------------------------------------------------
  14.   def create_state_angel_cache
  15.     @state_reflect = 0
  16.     self.note.each_line { |line|
  17.       case line
  18.       when State::State_Reflect
  19.         @state_reflect = ($1 != nil ? $1.to_i : 0)
  20.       end
  21.         }
  22.   end
  23.   #--------------------------------------------------------------------------
  24.   # * state_reflect
  25.   #--------------------------------------------------------------------------
  26.   def state_reflect
  27.     create_state_angel_cache if @state_reflect == nil
  28.     return @state_reflect
  29.   end
  30. end
  31. #==============================================================================
  32. # ** Vocab
  33. #==============================================================================
  34. module Vocab
  35.   ReflectDamage = "%s受到了%s點反彈傷害。"
  36. end
  37. #==============================================================================
  38. # ** Game_Battler
  39. #==============================================================================
  40. class Game_Battler
  41.   #--------------------------------------------------------------------------
  42.   # * reflect
  43.   #--------------------------------------------------------------------------
  44.   def reflect
  45.     n = 0
  46.     states.compact.each { |state| n += state.state_reflect }
  47.     return n
  48.   end
  49.   #--------------------------------------------------------------------------
  50.   # * execute_damage
  51.   #--------------------------------------------------------------------------
  52.   alias angel_execute_damage execute_damage
  53.   def execute_damage(user)
  54.      $reflect = 0
  55.      angel_execute_damage(user)
  56.      if self.reflect > 0
  57.        if @hp_damage > 0
  58.          $reflect = (@hp_damage * self.reflect) / 100
  59.          user.hp -= $reflect
  60.        end
  61.       end   
  62.   end
  63. end
  64. #==============================================================================
  65. # ** Scene_Battle
  66. #==============================================================================
  67. class Scene_Battle < Scene_Base
  68.   #--------------------------------------------------------------------------
  69.   # * 顯示HP傷害資訊  display_hp_damage
  70.   #--------------------------------------------------------------------------
  71.   def display_hp_damage(target, obj = nil)
  72.     if target.hp_damage == 0                # 無HP傷害
  73.       return if obj != nil and obj.damage_to_mp
  74.       return if obj != nil and obj.base_damage == 0
  75.       fmt = target.actor? ? Vocab::ActorNoDamage : Vocab::EnemyNoDamage
  76.       text = sprintf(fmt, target.name)
  77.     elsif target.absorbed                   # HP被汲取
  78.       fmt = target.actor? ? Vocab::ActorDrain : Vocab::EnemyDrain
  79.       text = sprintf(fmt, target.name, Vocab::hp, target.hp_damage)
  80.     elsif target.hp_damage > 0              # HP傷害
  81.       if target.actor?
  82.         text = sprintf(Vocab::ActorDamage, target.name, target.hp_damage)
  83.         Sound.play_actor_damage
  84.         $game_troop.screen.start_shake(5, 5, 10)
  85.       else
  86.         text = sprintf(Vocab::EnemyDamage, target.name, target.hp_damage)
  87.         Sound.play_enemy_damage
  88.         target.blink = true
  89.       end
  90.         if $reflect > 0
  91.         @message_window.add_instant_text(text)
  92.         wait(30)
  93.         text = sprintf(Vocab::ReflectDamage, @active_battler.name, "#{$reflect}")
  94.         end
  95.     else                                    # HP恢復
  96.       fmt = target.actor? ? Vocab::ActorRecovery : Vocab::EnemyRecovery
  97.       text = sprintf(fmt, target.name, Vocab::hp, -target.hp_damage)
  98.       Sound.play_recovery
  99.     end
  100.     @message_window.add_instant_text(text)
  101.     wait(30)
  102.   end
  103. end
复制代码

使用方法:在所需装备的备注里填写<反彈傷害 数值>
则处于该状态时就会反弹数值/100 的伤害指数。
回复 支持 反对

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2024-11-10 20:45

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

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