Project1

标题: 请教10号角色和20号角色同时在战斗队伍中时平分伤害的写法 [打印本页]

作者: taeckle    时间: 2019-7-1 15:11
标题: 请教10号角色和20号角色同时在战斗队伍中时平分伤害的写法
本帖最后由 taeckle 于 2019-7-1 16:13 编辑

目前想到的是要考虑4种情况:
①10号角色或20号角色受到单体攻击伤害平分
②群体攻击技能造成的伤害平分
③10号角色或20号角色受到反弹来的伤害平分
④敌普通攻击造成的伤害平分

然后就不会写了。。。





作者: 芯☆淡茹水    时间: 2019-7-2 00:40
瞎写的一段,未测试
  1. #==============================================================================
  2. class Game_Actor
  3.   #--------------------------------------------------------------------------
  4.   alias :xr_sd_set_hp :hp=
  5.   def hp=(hp)
  6.     hp = self.damage.is_a?(Numeric) && self.damage > 0 ? share_damage : hp
  7.     xr_sd_set_hp(hp)
  8.     @recipient = false
  9.   end
  10.   #--------------------------------------------------------------------------
  11.   def share_damage
  12.     return @hp - self.damage if ![10, 20].include?(@actor_id)
  13.     actor = $game_party.actors.find{|a| a.id == (@actor_id == 10 ? 20 : 10) }
  14.     return @hp - self.damage if !actor || actor.is_recipient?
  15.     @recipient = true
  16.     self.damage = self.damage / 2
  17.     actor.damage = self.damage
  18.     actor.hp -= self.damage
  19.     return @hp - self.damage
  20.   end
  21.   #--------------------------------------------------------------------------
  22.   def is_recipient?
  23.     return @recipient
  24.   end
  25. end
  26. #==============================================================================
  27. class Scene_Battle
  28.   #--------------------------------------------------------------------------
  29.   alias xr_sd_update_phase4_step5 update_phase4_step5
  30.   def update_phase4_step5
  31.     $game_party.actors.each{|a| a.damage_pop = !a.damage.nil?}
  32.     xr_sd_update_phase4_step5
  33.   end
  34. end
  35. #==============================================================================
复制代码

作者: taeckle    时间: 2019-7-2 07:16
芯☆淡茹水 发表于 2019-7-2 00:40
瞎写的一段,未测试


刚测了一下,受到单体攻击时伤害的确平分了,但受到群体攻击时显示的伤害和真实扣除的HP值就不符了

作者: 芯☆淡茹水    时间: 2019-7-2 08:23
本帖最后由 芯☆淡茹水 于 2019-7-2 08:31 编辑

上面的脚本没有考虑到 分摊伤害对象 死亡的情况。

  1. #==============================================================================
  2. class Game_Actor
  3.   #--------------------------------------------------------------------------
  4.   alias :xr_sd_set_hp :hp=
  5.   def hp=(hp)
  6.     hp = self.damage.is_a?(Numeric) && self.damage > 0 ? share_damage : hp
  7.     xr_sd_set_hp(hp)
  8.     @recipient = false
  9.   end
  10.   #--------------------------------------------------------------------------
  11.   def share_damage
  12.     target_actor = share_object
  13.     result = !!target_actor && target_actor.can_take_damage?
  14.     if result
  15.       @recipient = true
  16.       self.damage = self.damage / 2
  17.       target_actor.damage = self.damage
  18.       target_actor.hp -= self.damage
  19.     end
  20.     return @hp - self.damage
  21.   end
  22.   #--------------------------------------------------------------------------
  23.   def share_object
  24.     return nil if ![10, 20].include?(@actor_id)
  25.     return $game_party.actors.find{|a| a.id == (@actor_id == 10 ? 20 : 10) }
  26.   end
  27.   #--------------------------------------------------------------------------
  28.   def can_take_damage?
  29.     return !@recipient && exist?
  30.   end
  31. end
  32. #==============================================================================
  33. class Scene_Battle
  34.   #--------------------------------------------------------------------------
  35.   alias xr_sd_update_phase4_step5 update_phase4_step5
  36.   def update_phase4_step5
  37.     $game_party.actors.each{|a| a.damage_pop = !a.damage.nil?}
  38.     xr_sd_update_phase4_step5
  39.   end
  40. end
  41. #==============================================================================
复制代码


这是忙里偷闲瞎写的,其他的也不需要什么了!
至于全体攻击问题:
A 受到伤害分一半给 B , 同时 B 受到伤害分一半给 A
A 的伤害 = A 总伤害一半 + B 总伤害一半
B 的伤害与 A 相同。
但显示的伤害只有 A或B 其中一个的总伤害的一半,谁后计算伤害就是谁的一半。
这个问题自己解决。
作者: taeckle    时间: 2019-7-3 09:58
芯☆淡茹水 发表于 2019-7-2 08:23
上面的脚本没有考虑到 分摊伤害对象 死亡的情况。


大神我在想这个问题是不是要分四种情况来写:
①仅角色10受到伤害为true时
②仅角色20受到伤害为true时
③角色10和角色20同时受到的伤害为true时
④角色10和角色20都没受到伤害


大神可否以第3种情况为例随手写一下呐,咱也好自己研究研究啦



作者: soulsaga    时间: 2019-7-3 19:53
本帖最后由 soulsaga 于 2019-7-7 09:23 编辑

RUBY 代码复制
  1. class Game_Battler
  2.   alias aoe_skill_effect skill_effect
  3. def skill_effect(user, skill)
  4.    @敌群攻=false
  5.    @敌群攻=true if $game_variables[17] > 1 and user.is_a?(Game_Enemy)
  6.    aoe_skill_effect(user, skill)
  7. end
  8. end

作者: taeckle    时间: 2019-7-4 15:23
本帖最后由 taeckle 于 2019-7-4 15:39 编辑
soulsaga 发表于 2019-7-3 19:53
class Game_Battler
  alias aoe_skill_effect skill_effect
def skill_effect(user, skill)


大神这个脚本我还有个问题:

敌方攻击第10号角色时第20号角色受到的伤害值代入第100号公共变量里该怎么写呐?

这是我自己写的,貌似不对。。。

      if target.is_a?(Game_Actor) && target.id == 10
        if @active_battler.is_a?(Game_Actor)         
         for actor in $game_party.actors
          if actor.id == 20 && actor.hp > 0   
          $game_variables[100] = actor.damage ?????? #这里不会写...
          actor.damage_pop = true
          end
        end        
      end


作者: soulsaga    时间: 2019-7-4 16:59
话说群体攻击伤害怎么平分法?
作者: soulsaga    时间: 2019-7-4 19:03
本帖最后由 soulsaga 于 2019-7-4 22:52 编辑

搞错了............
作者: soulsaga    时间: 2019-7-4 23:09
本帖最后由 soulsaga 于 2019-7-5 09:58 编辑

RUBY 代码复制
  1. #==============================================================================
  2. class Game_Actor
  3.   #--------------------------------------------------------------------------
  4.   alias :xr_sd_set_hp :hp=
  5.   def hp=(hp)
  6.     hp = self.damage.is_a?(Numeric) && self.damage > 0 ? share_damage : hp
  7.     xr_sd_set_hp(hp)
  8.     @recipient = false
  9.   end
  10.   #--------------------------------------------------------------------------
  11. def share_damage
  12.     target_actor = share_object
  13.     result = !!target_actor && target_actor.can_take_damage?
  14.     if result
  15.       @recipient = true
  16.       self.damage = self.damage / 2
  17.       target_actor.damage = self.damage
  18.       @平分伤害=self.damage if @平分伤害.nil?
  19.       if self.index > target_actor.index and @敌群攻
  20.       target_actor.hp -= self.damage;target_actor.damage+=self.damage;self.damage+=@平分伤害;@敌群攻=false
  21.       end
  22.   end
  23.   return @hp - self.damage
  24.   end
  25. #--------------------------------------------------------------------------
  26.   def share_object
  27.     return nil if ![10, 20].include?(@actor_id)
  28.     return $game_party.actors.find{|a| a.id == (@actor_id == 10 ? 20 : 10) }
  29.   end
  30.   #--------------------------------------------------------------------------
  31.   def can_take_damage?
  32.     return !@recipient && exist?
  33.   end
  34. end
  35. #==============================================================================
  36. class Scene_Battle
  37.   #--------------------------------------------------------------------------
  38.   alias xr_sd_update_phase4_step5 update_phase4_step5
  39.   def update_phase4_step5
  40.     $game_party.actors.each{|a| a.damage_pop = !a.damage.nil?}
  41.     xr_sd_update_phase4_step5
  42.   end
  43. end
  44. #=============================================================================


这次3人正常..
作者: taeckle    时间: 2019-7-10 02:22
继续召唤大神。。平分伤害这4个字原来这么难。。
作者: soulsaga    时间: 2019-7-10 10:51
本帖最后由 soulsaga 于 2019-7-15 01:17 编辑
taeckle 发表于 2019-7-10 02:22
继续召唤大神。。平分伤害这4个字原来这么难。。


RUBY 代码复制
  1. #--------------------------------------------------------------------------
  2.   def share_damage
  3.     target_actor = share_object
  4.     result = !!target_actor && target_actor.can_take_damage?
  5.     if result
  6.       @recipient = true
  7.       self.damage = self.damage / 2
  8.       target_actor.damage = self.damage
  9.       @@平分伤害=self.damage if self.index < target_actor.index
  10.       target_actor.hp -= self.damage
  11.       if self.index > target_actor.index and @敌群攻
  12.       target_actor.damage+=@@平分伤害;self.damage+=@@平分伤害;@敌群攻=false
  13.       end
  14.   end
  15.   return @hp - self.damage
  16.   end


更新脚本..测试正常..
作者: taeckle    时间: 2019-7-16 06:47
soulsaga 发表于 2019-7-10 10:51
#--------------------------------------------------------------------------
  def share_damage
    ...


请教大神这个平分伤害的脚本的条件要改为只限于我方(或敌方)队伍中有第100号状态的队友(或敌人)的话那个def share_object该怎么写啊?

原来的条件是这么写的:

  def share_object
    return nil if ![10, 20].include?(@actor_id)
    return $game_party.actors.find{|a| a.id == (@actor_id == 10 ? 20 : 10) }
  end

现条件改为只限于我方(或敌方)队伍中有第100号状态的队友(或敌人)的话那个def share_object该怎么写啊?






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