查看: 11709|回复: 17

[原创发布] 【脚本】护盾系统插件

[复制链接]
梦石
0
星屑
635
在线时间
24 小时
注册时间
2020-4-22
回帖
23
发表于 2020-10-6 19:39:09 | 显示全部楼层 |阅读模式

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

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

×
本帖最后由 一般通过鸦天狗 于 2021-7-26 13:10 编辑

由于找了好久都找不到合适的,于是就只能自己写了
就是那个大家都很熟悉的东西,星灵同款的那种
推荐使用yanfly引擎以获得更好的体验
https://yanflychannel.wordpress.com/rmvxa/
[pre lang="ruby"]=begin
护盾系统
by 炽天之咸鱼裁决
本插件基于yanfly引擎编写,没有yanfly也可运行,但是视觉效果会大打折扣

使用方法:此页面手动创建护盾类型,在技能或物品的备注栏调用
<addshield: x(,y,z...)> 为目标添加以下id的护盾
<shielddamage: "(技能公式)"> 用self替换b,用user替换a.技能仅对目标护盾造成此数值的伤害
<realdamage: "(技能公式)"> 用self替换b,用user替换a,技能对目标造成无视护盾的此数值的伤害
<shield_cancel: x&y-z(,a&b-c)>
x表示消除的护盾编号,使用&隔开,可以输入all无视类型消除
z表示单次消除护盾数量的上限,用inf表示无限次
(新)现在可以使用技能驱散护盾
(新)增加了画面的刷新

护盾参数,除数值外,不需要则无需填写

value:护盾数值,不能为空
status:数组,附加状态,代码来自Ninjamida
fade:护盾每回合增长数值(负数为减少数值)
max:护盾自然增长的最大值
cansave:若为false,脱战后不可保留
protect:若为true,则在破碎后防止额外的伤害
no:编号,拥有编号的护盾生成时会顶替掉同编号的
life:护盾持续最大回合数
death参数已被移除
disappear:字符串,护盾由于击破以外的原因消失后执行以下代码
broken:字符串,护盾被击破后执行以下代码
battlecry:字符串,护盾生成后执行以下代码
element:数组,护盾只对以下属性的伤害有作用
color1/2:color 盾条颜色
heal:布尔,若值为true则治疗量会被转化为盾量
add:布尔,若值为true则新护盾会继承原有同编号护盾的所有属性
hp_heal:(支持使用技能公式)每回合为持有者恢复此数值的hp,负数则为减少
mp_heal:(支持使用技能公式)每回合为持有者恢复此数值的mp,负数则为减少
tp_heal:(支持使用技能公式)每回合为持有者恢复此数值的tp,负数则为减少
onlyattack:若值为true,则无法防御状态造成的伤害
icon:护盾图像的编号
(新)uncancel:开启时不能被驱散
=end

module SHIELD
    TAKE_DAM= "吸收"
    HP_HEAL = "护盾恢复"
    HP_DAM = "护盾反噬"
    MP_HEAL = "护盾恢复"
    MP_DAM = "护盾反噬"
    TP_HEAL = "护盾恢复"
    TP_DAM = "护盾反噬"
    FADE = "护盾衰减"
    BREAK = "护盾破碎"
    DISAPPEAR = "护盾消失"
    REFRESH  = "护盾刷新"
    NEW  = "护盾"
    ADD  = "护盾补充"
    PROTECT = "保护"
    GET_DAM= "吸收"
    S_DAM = "碎盾"
    R_DAM = "真实伤害"
    CANCEL = "驱散"
  end
  class Battler_shield
    attr_accessor :value
    attr_accessor :status
    attr_accessor :fade
    attr_accessor :cansave
    attr_accessor :protect
    attr_accessor :no
    attr_accessor :max
    attr_accessor :life
    attr_accessor :disappear
    attr_accessor :broken
    attr_accessor :color1
    attr_accessor :color2
    attr_accessor :battlecry
    attr_accessor :element
    attr_accessor :heal
    attr_accessor :add
    attr_accessor :hp_heal
    attr_accessor :mp_heal
    attr_accessor :tp_heal
    attr_accessor :onlyattack
    attr_accessor :icon
    attr_accessor :uncancel
   
    def initialize(type,user,target)
      @user = user
      @target = target
      case type
      #以如下格式创建自定义的护盾
      when 1
        @value = user.mhp - user.hp + 30
        @max = 0
        @cansave = false
        @protect = false
        @no = 1
        @life = 5
        @add = true
        @onlyattack = true
      when 2
        @value = user.mhp * 0.25 - user.hp * 0.25 + 200 .to_i
        @max = 0
        @cansave = false
        @protect = false
        @no = 1
        @life = 5
        @add = true
        @onlyattack = true
      when 3
        @value = 10
        @max = 0
        @cansave = false
        @protect = false
        @no = 1
        @life = 999
        @add = true
        @onlyattack = true
      when 4
        @value = 1000
        @max = 0
        @cansave = false
        @protect = true
        @no = 1
        @life = 7
        @add = true
        @onlyattack = true
      when 5
        @value = 30
        @max = 0
        @cansave = false
        @protect = true
        @no = 1
        @life = 3
        @add = true
        @onlyattack = true
      when 6
        @value = 1
        @max = 0
        @cansave = false
        @protect = true
        @no = 1
        @life = 2
        @add = true
        @onlyattack = true
      when 7
        @value = @user.hp/4
        @cansave = false
      when 8
        @value = 1
        @protect = true
        @cansave = false
      end
      ##################################
      msgbox("护盾值不能为空") if @value == nil
      @value = @value.to_i
    end
  end
  class Sprite_Seed#伴生精灵参数
    attr_accessor :icon#图像与色调
    attr_accessor :dx#相对战斗者的x值
    attr_accessor :dy#相对战斗者的y值
    attr_accessor :dz#相对战斗者的z值
    attr_accessor :opacity#透明度
    attr_accessor :begin#入场动画id
    attr_accessor :exist#持续时播放的动画id
    attr_accessor :end#退场动画id
    def initialize(n)
      case n
      when 1
        @icon = ["terry.png",0]
        @dx = 0
        @dy = 0
        @dz = 0
        @opacity = 100
      end
    end
  end
  
  #############################################################################
  class RPG::BaseItem
    attr_accessor :shield
    attr_accessor :s_damage
    attr_accessor :r_damage
    def shield
      if @shield.nil?
        @shield = []
        if @note =~ /<addshield:[ ](.*)>/i
          for x in $1.split(",")
            @shield += [x.to_i]
          end
        end
      end
      @shield
    end
   
   
    def shield_damage
      if @s_damage.nil?
        @s_damage = 0
        if @note =~ /<shielddamage:[ ](.*)>/i
            @s_damage = $1.to_s
        end
      end
      @s_damage
    end
   def real_damage
      if @r_damage.nil?
        @r_damage = 0
        if @note =~ /<realdamage:[ ](.*)>/i
            @r_damage = $1.to_s
        end
      end
      @r_damage
    end
    def shield_cancel

        if @shield_cancel.nil?
          @shield_cancel = {}
          if @note =~ /<shield_cancel:[ ](.*)>/i
            lines = $1.to_s.split(",")
            lines.each{|s|
                list =  s.split("-")
                if list.size == 2
                  k = list[0].delete(" ").split("&")
                  v = list[1].delete(" ")
                  @shield_cancel[k] = v
                end
            
            
            }
          end
        end
        @shield_cancel
      end
  end
  
  
  
  
  ###############来自Ninjamida#######################
  class RPG::BaseItem
   
    def auto_states
      if @auto_states.nil?
        @auto_states = []
        if @note =~ /<auto state:[ ](.*)>/i
          for x in $1.split(",")
            @auto_states += [x.to_i]
          end
        end
      end
      @auto_states
    end
   
  end
  
  class Game_Actor < Game_Battler
    def auto_states
      autostates = self.class.auto_states + actor.auto_states
      equips.each do |eq|
        autostates += eq.auto_states unless eq.nil?
      end
      states.each do |st|
        autostates += st.auto_states
    end
      @shield.each{|i|
      autostates += i.status if i.status != nil
      
      
      }
      autostates = autostates.uniq
      return autostates
    end
   def shield_init
      return if @shield
      @shield = []
      @ex_sprite = {}
      @s = 0
    end  
  end
  class Game_Enemy < Game_Battler
    def auto_states
      autostates = enemy.auto_states
      states.each do |st|
        autostates += st.auto_states
      end
      @shield.each{|i|
      autostates += i.status if i.status != nil
      }
      autostates = autostates.uniq
      return autostates
    end
  
  end
  
  class Scene_Battle
   
    alias s_auto_state_battle_start battle_start
    def battle_start
      s_auto_state_battle_start
      $game_party.members.each{|mem|
        mem.add_auto_states
      status_redraw_target(mem) if $imported["YEA-BattleEngine"]
      }
        
      
    end
  
  end
  
  class Game_Battler
   
    alias s_auto_states_initialize initialize
    def initialize
      s_auto_states_initialize
      @old_auto_states = []
    end
   
    def add_auto_states
      return if state?(death_state_id)
      auto_states.each do |st|
        if not state?(st)
          add_state(st)
          @state_turns[st] = -1
        end
      end
    end
   
    def remove_old_auto_states
      auto_states.each do |as|
        @old_auto_states.delete(as)
      end
      @old_auto_states.each do |oas|
        remove_state(oas)
      end
      @old_auto_states = auto_states
    end
   
    alias s_auto_state_item_effect_remove_state item_effect_remove_state
    def item_effect_remove_state(user, item, effect)
      s_auto_state_item_effect_remove_state(user, item, effect) unless auto_states.include?(effect.data_id)
    end
   
    alias s_auto_state_refresh refresh
    def refresh
      s_auto_state_refresh
      add_auto_states
      remove_old_auto_states
    end
  
  end
  ###############################################################
  
  
  
  class Game_ActionResult
    attr_accessor :s_damage
    attr_accessor :r_damage
    attr_accessor :shield_cancel
    alias s_clear_damage_values clear_damage_values
    def clear_damage_values
      s_clear_damage_values
      @s_damage = 0
      @r_damage = 0
      @shield_cancel = {}
    end
    alias s_make_damage make_damage
    def make_damage(value, item)
      s_make_damage(value, item)
      @s_damage = item.shield_damage
      @r_damage = item.r_damage
      @shield_cancel = item.shield_cancel
    end
   
   
   
   
   
   
  end
  
  
  
  
  class Game_BattlerBase
    attr_accessor :shield
    attr_accessor :ex_sprite
      $imported = {} if $imported.nil?
      if $imported["YEA-BattleEngine"]
      alias shieldmake_damage_popups make_damage_popups
      def make_damage_popups(user)
        if @useshield != nil
          if @t_damage > 0
            if @protect != nil
              text =   SHIELD::PROTECT
              rules = "HP_HEL"
              @protect = nil
            else
              text = SHIELD::GET_DAM
              rules = "HP_DMG"
            end
            create_popup(text, rules)
            value = @t_damage.abs
            rules = "MP_DMG"
            text = sprintf("%s", value.group)
            create_popup(text, rules)
          elsif @t_damage < 0
            text = SHIELD::ADD
            rules = "HP_HEL"
            @protect = nil
            create_popup(text, rules)
            value = @t_damage.abs
            rules = "MP_DMG"
            text = sprintf(+"%s", value.group)
            create_popup(text, rules)
          end
        end
        if @result.s_damage != 0
          text = SHIELD::S_DAM
          rules = "HP_DMG"
          create_popup(text, rules)
          value = @result.s_damage
          text = sprintf("%s", value)
          create_popup(text, rules)
          @result.s_damage = 0
        end
        if @result.r_damage != 0
          text = SHIELD::R_DAM
          rules = "HP_DMG"
          create_popup(text, rules)
          value = @result.r_damage
          text = sprintf("%s", value)
          create_popup(text, rules)
          @result.r_damage = 0
        end
        shieldmake_damage_popups(user)
        @t_damage = 0
      end
      def make_miss_popups(user, item)
        return if dead?
        if @result.missed && item.shield == []
          text = YEA::BATTLE::POPUP_SETTINGS[:missed]
          rules = "DEFAULT"
          create_popup(text, rules)
        end
        if @result.evaded && item.shield == []
          text = YEA::BATTLE::POPUP_SETTINGS[:evaded]
          rules = "DEFAULT"
          create_popup(text, rules)
        end
        if @result.hit? && !@result.success && item.shield == []
          text = YEA::BATTLE::POPUP_SETTINGS[:failed]
          rules = "DEFAULT"
          create_popup(text, rules)
        end
        if @result.hit? && item.damage.to_hp? && @useshield == nil && item.shield == []
          if @result.hp_damage == 0 && @result.hp_damage == 0
            text = YEA::BATTLE::POPUP_SETTINGS[:nulled]
            rules = "DEFAULT"
            create_popup(text, rules)
          end
        end
        @useshield = nil
      end
    end
    def shield_add(a,b)
      b.value += a.value
      b.status += a.status if b.status != nil and a.status != nil
      b.status =  a.status if b.status == nil
      b.element += a.element if b.element != nil and a.element != nil
      b.element =  a.element if b.element == nil
      b.fade += a.fade if b.fade != nil and a.fade != nil
      b.fade =  a.fade if b.fade == nil
      b.cansave = false if a.cansave == false
      b.protect = true if a.protect == true
      b.max = a.max if b.max == nil
      b.life += a.life if b.life != nil and a.life != nil
      b.life =  a.life if b.life == nil
      b.disappear = "#{a.disappear};#{b.disappear}" if b.disappear != nil and a.disappear != nil
      b.disappear = a.disappear if b.disappear == nil
      b.broken = "#{a.broken};#{b.broken}" if b.broken != nil and a.broken != nil
      b.broken = a.broken if b.broken == nil
      b.color1 = a.color1 if a.color1
      b.color2 = a.color2 if a.color2
      b.heal = true if a.heal == true
      b.hp_heal += a.hp_heal if b.hp_heal != nil and a.hp_heal != nil
      b.hp_heal =  a.hp_heal if b.hp_heal == nil
      b.mp_heal += a.mp_heal if b.mp_heal != nil and a.mp_heal != nil
      b.mp_heal =  a.mp_heal if b.mp_heal == nil
      b.tp_heal += a.tp_heal if b.tp_heal != nil and a.tp_heal != nil
      b.tp_heal =  a.tp_heal if b.tp_heal == nil
    end
    def s
      sv = 0
      @shield.each{|i|
      sv += i.value
      }
      return sv
    end
    def shield_init
      return if @shield
      @shield = []
      @ex_sprite = {}
      @s = 0
    end  
    alias initializewithshield initialize
    def initialize
      initializewithshield
      shield_init
    end
   
    def nocheck(no)
      @shield.each_index{|i|
      if @shield.no == no
        @shield.delete_at(i)
        break
      end
      }
      
    end
   
  
  
    def shieldtotal
      n = 0
      @shield.each{|i|
      n += i.value}
      return n
    end
  
    def draw_bar_rate
      a = []
      b = draw_hp_rate
      a << b
      s = 1 - b
      t = shieldtotal
      @shield.each{|i|
      r = s * i.value.to_f / t
      a << r }
      return a
    end
    def shield_bar_rate
      a = []
      b = draw_hp_rate
      s = 1 - b
      t = shieldtotal
      @shield.each{|i|
      r = s * i.value.to_f / t
      a << r }
      return a
    end
   
    def shield_rate
      s = shieldtotal
      if @hp + s <= mhp
        return s.to_f / mhp
      else
        return s.to_f / (s + @hp).to_f
      end
   
    end
    def draw_hp_rate
      s = shieldtotal
      if @hp + s <= mhp
        return @hp.to_f / mhp
      else
        return @hp.to_f / (s + @hp).to_f
      end
    end
    def draw_shield_rate
      s = shieldtotal
      if @hp + s <= mhp
        return s.to_f / (mhp - @hp)
      else
        return 1
      end
   
    end
  
   
   
  end
  
  
  
  
  
  
  class Game_Battler < Game_BattlerBase
    def shield_heal
      shield_hp_heal
      shield_mp_heal
      shield_tp_heal
    end
    def shield_hp_heal
      @shield.each_index{|i|
          if @shield.hp_heal != nil
            value = @shield.hp_heal
            value = self.mhp - @hp if (@hp + value) > self.mhp
            value = @hp if (@hp + value) < 0
            if $imported["YEA-BattleEngine"]
                if value > 0
                rules = "HP_HEL"
                text = SHIELD::HP_HEAL
                create_popup(text, rules)
                text = "+#{value}"
                create_popup(text, rules)
                elsif value < 0
                rules = "HP_DMG"
                text = SHIELD::HP_DAM
                create_popup(text, rules)
                text = "-#{-value}"
                create_popup(text, rules)
                end
            end
            @hp += value
          end
        }
     end
     def shield_mp_heal
      @shield.each_index{|i|
          if @shield.mp_heal != nil
            value = @shield.mp_heal
            value = @self.mmp - @mp if (@mp + value) > self.mmp
            value = @mp if (@mp + value) < 0
            if $imported["YEA-BattleEngine"]
                if value > 0
                rules = "MP_HEL"
                text = SHIELD::MP_HEAL
                create_popup(text, rules)
                text = "+#{value}"
                create_popup(text, rules)
                elsif value < 0
                rules = "MP_DMG"
                text = SHIELD::MP_DAM
                create_popup(text, rules)
                text = "-#{-value}"
                create_popup(text, rules)
                end
            end
            @mp += value
          end
        }
      end
      def shield_tp_heal
      @shield.each_index{|i|
          if @shield.tp_heal != nil
            value = @shield.tp_heal
            value = 100 - @tp if (@tp + value) > 100
            value = @tp if (@tp + value) < 0
            if $imported["YEA-BattleEngine"]
                if value > 0
                rules = "MP_HEL"
                text = SHIELD::TP_HEAL
                create_popup(text, rules)
                text = "+#{value}"
                create_popup(text, rules)
                elsif value < 0
                rules = "MP_DMG"
                text = SHIELD::TP_DAM
                create_popup(text, rules)
                text = "-#{-value}"
                create_popup(text, rules)
                end
            end
            @tp += value
          end
        }
     end
    alias shieldon_turn_end on_turn_end
    def on_turn_end
      shield_heal
      s =  @shield.size - 1
      i = 0
      while i <= s
        fade = @shield.fade
        if fade != nil and fade != 0
         
          if @shield.max != nil
            ts = @shield.value + fade
            if @shield.max > @shield.value
              fade = @shield.max - @shield.value if ts > @shield.max
            else
              fade = 0
            end
          end
          rules = "MP_DMG"
          text = SHIELD::FADE
          create_popup(text, rules) if $imported["YEA-BattleEngine"]
          text = sprintf(+"%s", fade) if fade > 0
          text = sprintf("%s", fade) if fade < 0
          create_popup(text, rules) if $imported["YEA-BattleEngine"]
          @shield.value += fade
        end
        life = @shield.life
        if life != nil
          @shield.life -= 1
        end
        if @shield.value <= 0 or @shield.life == 0
          shielddisappear(i)
          i -= 1
          s =  @shield.size - 1
        end
        i += 1
      end
      shieldon_turn_end
    end
    def addshield(item,user,target)
      return if item.shield == nil
      item.shield.each{|i|
      s = Battler_shield.new(i,user,target)
      
      if s.no != nil
       @shield.each_index{|i|
          if @shield.no == s.no
            shield_add(@shield,s) if @shield.add == true or s.add == true
            @ex_sprite[@shield].kill unless @shield.icon.nil?
            @shield.delete_at(i)
            @s_fresh = true
            break
          end
        }
      end
      if self.class == Game_Enemy
        scene = SceneManager.scene.spriteset.viewport1
      else
        scene = nil
      end
      @ex_sprite=Sprite_Battler_Ex.new(scene,Sprite_Seed.new(s.icon),self) unless s.icon.nil?
  
      
      
      
      
      @s_value << s.value
      @shield << s
     
      eval s.battlecry if s.battlecry != nil
      }
      if $imported["YEA-BattleEngine"]
        if @s_value != [] and @s_value != nil
            if @s_fresh != nil
            text = SHIELD::REFRESH
   
   
            rules = "HP_HEL"
            create_popup(text, rules)
            @s_fresh = nil
            else
            text = SHIELD::NEW
            rules = "HP_DMG"
            create_popup(text, rules)
            end
            @s_value.each{|i|
            value = i.abs
            text = sprintf("%s", value.group)
            create_popup(text, rules)
            }
            @s_value = []
        end

      end
      shield_refresh
    end
    def shield_refresh
      SceneManager.scene.update_basic
      refresh
    end
   
    def shielddisappear(i)
      $imported = {} if $imported.nil?
      if $imported["YEA-BattleEngine"]
        if @shield.value == 0
          rules = "HP_DMG"
          text = SHIELD::BREAK
          create_popup(text, rules) if $imported["YEA-BattleEngine"]
        else
          rules = "HP_DMG"
          text = SHIELD::DISAPPEAR
          create_popup(text, rules) if $imported["YEA-BattleEngine"]
        end
      end
      if @shield.value == 0
         eval  @shield.broken if @shield.broken != nil
      else
        eval  @shield.disappear if @shield.disappear != nil
      end
      @ex_sprite[@shield].kill unless @shield.icon.nil?
      @shield.delete_at(i)
    end
   
   
   
    def regenerate_hp #状态伤害
      damage = -(mhp * hrg).to_i
      perform_map_damage_effect if $game_party.in_battle && damage > 0
      @result.hp_damage = [damage, max_slip_damage].min
      state_shielduse
      self.hp -= @result.hp_damage
    end
    def state_shielduse
      return if @result.hp_damage == 0
      if @result.hp_damage < 0
        healshield
        return
      end
      unless @shield.empty?
        size = @shield.size
        n = size - 1
        while n >= 0
          if @s_invalid.include?(n)
            n -= 1
            next
          end
          if  @shield[n].onlyattack == true
            n -= 1
            next
          end
         
          @result.hp_damage -= @shield[n].value
          if @result.hp_damage >= 0  #碎盾
            if @shield[n].protect == true
              @result.hp_damage = 0
              @protect = true
            end  #碎盾保护
            @t_damage += @shield[n].value
            shielddisappear(n)
          else #未碎盾
            @t_damage += @shield[n].value
            @t_damage += @result.hp_damage
            @shield[n].value = -@result.hp_damage
            @result.hp_damage = 0
          end
          break if  @result.hp_damage == 0
          n -= 1
        end
        @useshield = true if @t_damage != 0
      end
    end
    def shielddamage
      return if @result.s_damage == 0
      @result.s_damage = 0 if @shield.empty?
      unless @shield.empty?
        dam = @result.s_damage
        size = @shield.size
        n = size - 1
        while n >= 0
          @result.s_damage -= @shield[n].value
          if @result.s_damage >= 0  #碎盾
            @s_damage += @shield[n].value
            @shield.delete_at(n)
          else #未碎盾
            @s_damage += @shield[n].value
            @s_damage += @result.s_damage
            @shield[n].value = -@result.s_damage
            @result.s_damage = 0
          end
          break if  @result.s_damage == 0
          n -= 1
        end
        @result.s_damage = 0 if @result.s_damage < 0
        @result.s_damage = dam - @result.s_damage
      end
    end
    def healshield
      unless @shield.empty?
        size = @shield.size
        n = size - 1
        while n >= 0
          if @shield[n].heal == true
            @shield[n].value -= @result.hp_damage
            @t_damage = -@result.hp_damage
            @result.hp_damage = 0
            return
          end
          n -= 1
        end
      end
    end
    def useshield
      shielddamage
      return if @result.hp_damage == 0
      if @result.hp_damage < 0
        healshield
        return
      end
      unless @shield.empty?
        size = @shield.size
        n = size - 1
        while n >= 0
          if @s_invalid.include?(n)
            n -= 1
            next
          end
         
          @result.hp_damage -= @shield[n].value
          if @result.hp_damage >= 0  #碎盾
            if @shield[n].protect == true
              @result.hp_damage = 0
              @protect = true
            end  #碎盾保护
            @t_damage += @shield[n].value
            shielddisappear(n)
          else #未碎盾
            @t_damage += @shield[n].value
            @t_damage += @result.hp_damage
            @shield[n].value = -@result.hp_damage
            @result.hp_damage = 0
          end
          break if  @result.hp_damage == 0
          n -= 1
        end
        @useshield = true if @t_damage != 0
      end
      
      
    end
   
    def s_invalid(user, item)
      @s_invalid = []
      return if item.damage == nil
      @shield.each_index{|n|
      if @shield[n].element != nil
        @shield[n].element.each{|i|
        @s_invalid << n unless user.atk_elements.include?(i) or item.damage.element_id == i
        }
        
            
      end
      }
    end
   
   
   
    def item_element(i)
      if item.damage.element_id < 0
        user.atk_elements
      else
        item.damage.element_id
      end
    end
   
    alias item_applyshield item_apply
    def item_apply(user, item)
      @s_value = []
      cancel_shield(user, item)
      s_invalid(user, item)
      addshield(item,user,self)
      #make_damage_popups(user)
      item_applyshield(user, item)
      
    end
    def cancel_shield(user, item)
        
        list = item.shield_cancel
        return if list.empty?
        list.each{|k,v|
        counter = 0
        ok = false
        while !ok
            shield = find_shield_to_cancel(k)
            if shield
                @shield.delete(shield)
                popup_cancel_shield
                counter += 1
                if v != "inf"
                    ok = true if counter >= v.to_i
                end
            else
                ok = true
            end
        end
        
        
        
        }
    end
    def popup_cancel_shield
        return unless $imported["YEA-BattleEngine"]
        text = SHIELD::CANCEL
        rules = "CRITICAL"
        create_popup(text,rules)
    end
    def find_shield_to_cancel(list)
        @shield.each{|s|
            return s if check_shield_cancel(s,list)
            
        
        }
        return false
    end
    def check_shield_cancel(shield,list)
        return false if shield.uncancel
        list.each{|l|
        return true if l == "all"
        next unless shield.no
        return true if l.to_i == shield.no
        }
    end
    alias s_make_damage_value make_damage_value
    def make_damage_value(user, item)
      s_make_damage_value(user, item)
      r = eval(item.real_damage.to_s)
      @result.r_damage = r.to_i
      s = eval(item.s_damage.to_s)
      @result.s_damage = s.to_i
    end
   
   
   
    alias execute_damagewithshield execute_damage
    def execute_damage(user)
      @t_damage = 0
      @s_damage = 0
      useshield
      self.hp -= [@result.r_damage,self.hp].min
      execute_damagewithshield(user)
         
    end
  
    alias shieldon_battle_end on_battle_end
    def on_battle_end
      shieldon_battle_end
      s =  @shield.size - 1
      i = 0
      while i <= s
        if @shield.cansave == false
          shielddisappear(i)
          i -= 1
          s =  @shield.size - 1
        end
        i += 1
      end
    end
  end
  
  
  
  
  
  class Window_BattleStatus
    def shield_gauge_color1;   text_color(0);   end;
    def shield_gauge_color2;   text_color(8);   end;
   
   
   
   
   
   
   def draw_actor_hp(actor, dx, dy, width = 124)
      s = actor.shieldtotal
      draw_gauge(dx, dy, width, actor.draw_hp_rate, hp_gauge_color1, hp_gauge_color2)
      draw_actor_shield(actor, dx + width * actor.draw_hp_rate , dy, width)
      cy = (Font.default_size - contents.font.size) / 2 + 1
      
      draw_text(dx+2, dy+cy, 30, line_height, Vocab::hp_a)
      draw_current_and_max_values(dx, dy+cy, width, actor.hp, actor.mhp,
      hp_color(actor), normal_color)
    end
   
   
    def draw_actor_shield(actor, dx, dy, width = 124)
      actor.shield.each{|i|
      w = width.to_f * (1- actor.draw_hp_rate) * actor.draw_shield_rate * i.value / actor.shieldtotal
      c1 = i.color1 ? i.color1 : shield_gauge_color1
      c2 = i.color2 ? i.color2 : shield_gauge_color2
      draw_gauge(dx, dy, w , 1, c1, c2)
      dx += w
      }
      
      change_color(system_color)
    end
  end
  class Window_Base
    def shield_gauge_color1;   text_color(0);   end;
    def shield_gauge_color2;   text_color(8);   end;
   
   
   
   
   
   
    def draw_actor_hp(actor, dx, dy, width = 124)
      s = actor.shieldtotal
      draw_gauge(dx, dy, width, actor.draw_hp_rate, hp_gauge_color1, hp_gauge_color2)
      draw_actor_shield(actor, dx + width * actor.draw_hp_rate , dy, width)
      cy = (Font.default_size - contents.font.size) / 2 + 1
      
      draw_text(dx+2, dy+cy, 30, line_height, Vocab::hp_a)
      draw_current_and_max_values(dx, dy+cy, width, actor.hp, actor.mhp,
      hp_color(actor), normal_color)
    end
   
   
    def draw_actor_shield(actor, dx, dy, width = 124)
      actor.shield.each{|i|
      w = width.to_f * (1- actor.draw_hp_rate) * actor.draw_shield_rate * i.value / actor.shieldtotal
      c1 = i.color1 ? i.color1 : shield_gauge_color1
      c2 = i.color2 ? i.color2 : shield_gauge_color2
      draw_gauge(dx, dy, w , 1, c1, c2)
      dx += w
      }
      
      change_color(system_color)
    end
  
  end
  
  
  #######来自yanfly与DoubleX#############
  $imported = {} if $imported.nil?
  if $imported["YEA-EnemyHPBars"] and $imported["DoubleX RMVXA Percentage Addon to YEA-EnemyHPBars"]
  class Enemy_HP_Gauge_Viewport < Viewport
    def initialize(battler, sprite, type)
      @battler = battler
      @base_sprite = sprite
      @type = type
      dw = YEA::BATTLE::ENEMY_GAUGE_WIDTH
      if @type == :percent && FIX_LARGE_TEXT
        dh = [TEXT_SIZE, YEA::BATTLE::ENEMY_GAUGE_HEIGHT].max
      else
        dh = YEA::BATTLE::ENEMY_GAUGE_HEIGHT
      end
      if @type != :hp and @type != :shield
        dw += 2
        dh += 2
      end
      @start_width = dw
      rect = Rect.new(0, 0, dw, dh)
      @current_hp = @battler.hp
      @current_mhp = @battler.mhp
      @current_hr = @battler.draw_hp_rate
      @current_sr = @battler.shield_bar_rate
      @target_gauge_width = target_gauge_width
      @gauge_rate = @current_hr
      setup_original_hide_gauge
      super(rect)
      self.z = 125
      create_gauge_sprites
      self.visible = false
      update_position
      self.rect.width = @gauge_width if @type == :hp
    end
   
   
   
    def target_gauge_rate
      return @current_hr
    end
    def target_gauge_width
      return [@current_hr * @start_width, @start_width].min
    end
   
    def update_gauge
      unless @gauge_width == @target_gauge_width
        rate = 3
        @target_gauge_width = target_gauge_width
        if @gauge_width > @target_gauge_width
          @gauge_width = [@gauge_width - rate, @target_gauge_width].max
        elsif @gauge_width < @target_gauge_width
          @gauge_width = [@gauge_width + rate, @target_gauge_width].min
        end
        @visible_counter = @gauge_width == 0 ? 10 : 60
        rect.width = @gauge_width if @type == :hp
      end
      shield_update
    end
   
    def new_hp_updates
      return if @current_hr == @battler.draw_hp_rate and @current_sr == @battler.shield_bar_rate
      @current_hp = @battler.hp
      @current_mhp = @battler.mhp
      @current_hr = @battler.draw_hp_rate
      return if @gauge_rate == target_gauge_rate
      @gauge_rate = target_gauge_rate
      @target_gauge_width = target_gauge_width
      @visible_counter = 60
    end
  
   
  
    def update_percentage
      return if @last_hp == @current_hp
      @last_hp = @current_hp
      set_percentage_font
      if ACTUAL_NUMBER
        percent = @current_hp.to_i.to_s
      else
        percent = "#{(@current_hp.to_f / @current_mhp.to_f * 100).to_i.to_s}%"
      end
      dw = @sprite.bitmap.text_size(percent).width
      @sprite.bitmap.clear
      @sprite.bitmap.draw_text(YEA::BATTLE::ENEMY_GAUGE_WIDTH + 2 - dw, 1, dw,
      @sprite.bitmap.text_size(percent).height, percent)
    end
   
    def create_gauge_sprites
      @sprite = Plane.new(self)
      @sprite.bitmap = Bitmap.new(rect.width * 4, rect.height)
      enemy = @battler.enemy
      if @type == :back
        colour = Colour.text_colour(enemy.back_gauge_colour)
        colour1 = colour2 = colour
      elsif @type == :hp
        colour1 = Colour.text_colour(enemy.hp_gauge_colour1)
        colour2 = Colour.text_colour(enemy.hp_gauge_colour2)
      elsif @type == :percent
        colour1 = colour2 = Color.new(0, 0, 0, 0)
      end
      dw = rect.width
      dw *= @battler.draw_hp_rate
      dh = rect.height
      @gauge_width = target_gauge_width
      if @type == :shield
        new_shield
      else
        @sprite.bitmap.gradient_fill_rect(0, 0, dw, dh, colour1, colour2)
        @sprite.bitmap.gradient_fill_rect(dw, 0, dw, dh, colour2, colour1)
      end
      @visible_counter = 0
    end
    def new_shield
      return if @battler.shield == []
      dh = rect.height
      dx = @gauge_width
      shield = @battler.shield
      shield.each_index{|i|
      dw = @start_width * @current_sr
      dw = @start_width - dx + 3 if i == shield.size - 1
      c1 = shield.color1 ? shield.color1 : Colour.text_colour(0)
      c2 = shield.color2 ? shield.color2 : Colour.text_colour(8)
      @sprite.bitmap.gradient_fill_rect(dx, 0, dw, dh, c1, c2)
      dx += dw
      }
    end
  
    def shield_update
      if @type == :shield and @battler.shield_bar_rate == []
        @sprite.bitmap.clear
      end
      return if @current_sr == @battler.shield_bar_rate and @gauge_width == @target_gauge_width
      @current_sr = @battler.shield_bar_rate
      if @type == :shield
        dx = @gauge_width
        dh = rect.height
        shield = @battler.shield
        shield.each_index{|i|
        dw = @start_width * @current_sr
        dw = @start_width - dx + 3 if i == shield.size - 1
        c1 = shield.color1 ? shield.color1 : Colour.text_colour(0)
        c2 = shield.color2 ? shield.color2 : Colour.text_colour(8)
        @sprite.bitmap.gradient_fill_rect(dx, 0, dw, dh, c1, c2)
        dx += dw
        }
        
      end
      @visible_counter = 60
      
    end
   
   
    def update_position
      dx = @battler.screen_x
      dy = @battler.screen_y
      @update_position = false
      return if @last_x == dx && @last_y == dy
      @last_x = dx
      @last_y = dy
      @update_position = true
      dx -= @start_width / 2
      if @type == :percent
        dx += TEXT_X_OFFSET
        dy += TEXT_Y_OFFSET
      end
      rect.x = dx
      rect.y = dy
      dh = rect.height + 1
      dh += 2 if @type == :hp or @type == :shield
      dy = [dy, Graphics.height - dh - 120].min
      dy += 1 if @type == :hp or @type == :shield
      #
      rect.y = dy
    end
   
   
   
   
   
   
   
  end
  
  
  
  
  
  
  
  class Sprite_Battler < Sprite_Base
  
   
    def create_enemy_gauges
      return if @battler.nil?
      return if @battler.actor?
      return unless @battler.enemy.show_gauge
      @back_gauge_viewport = Enemy_HP_Gauge_Viewport.new(@battler, self, :back)
      @hp_gauge_viewport = Enemy_HP_Gauge_Viewport.new(@battler, self, :hp)
      @shield_gauge_viewport = Enemy_HP_Gauge_Viewport.new(@battler, self, :shield)
      return unless @battler && !@battler.actor? && @battler.enemy.show_gauge
      @percent_gauge_viewport = Enemy_HP_Gauge_Viewport.new(@battler, self,
      :percent)
    end
   
    def dispose_enemy_gauges
      @back_gauge_viewport.dispose unless @back_gauge_viewport.nil?
      @hp_gauge_viewport.dispose unless @hp_gauge_viewport.nil?
      @shield_gauge_viewport.dispose unless @shield_gauge_viewport.nil?
      @percent_gauge_viewport.dispose if @percent_gauge_viewport
    end
   
    def update_enemy_gauges
      @back_gauge_viewport.update unless @back_gauge_viewport.nil?
      @hp_gauge_viewport.update unless @hp_gauge_viewport.nil?
      @shield_gauge_viewport.update unless @shield_gauge_viewport.nil?
      @percent_gauge_viewport.update if @percent_gauge_viewport
    end
   
    def update_enemy_gauge_value
      @back_gauge_viewport.new_hp_updates unless @back_gauge_viewport.nil?
      @hp_gauge_viewport.new_hp_updates unless @hp_gauge_viewport.nil?
      @shield_gauge_viewport.new_hp_updates unless @shield_gauge_viewport.nil?
      @percent_gauge_viewport.new_hp_updates if @percent_gauge_viewport
    end
   
  end
  
  end
  
  
  
  
  
  class Sprite_Battler
    alias ex_initialize initialize
    def initialize(viewport, battler = nil)
      ex_initialize(viewport, battler)
    end
    alias ex_update update
    def update
      ex_update
      return if self.class == Sprite_Battler_Ex
      return if @battler == nil
      return if @battler.ex_sprite == {}
      @battler.ex_sprite.each_value  {|sprite| sprite.update}
    end
    alias s_start_effect start_effect
    def start_effect(effect_type)
      s_start_effect(effect_type)
      return if self.class == Sprite_Battler_Ex
      return if @battler == nil
      @battler.ex_sprite.each_value  {|sprite| sprite.start_effect(effect_type) } unless @battler.ex_sprite == []
    end
    alias s_dispose dispose
    def dispose
      s_dispose
      return if self.class == Sprite_Battler_Ex
      return if @battler == nil
      @battler.ex_sprite.each_value  {|sprite| sprite.dispose }  unless @battler.ex_sprite == []
      
    end
  end
  
  
  class Sprite_Battler_Ex < Sprite_Battler
    def initialize(viewport,sprite,battler)
      super(viewport)
      @battler = battler
      @sprite = sprite
      @icon = @sprite.icon
      @opacity = @sprite.opacity
      @dx = @sprite.dx
      @dy = @sprite.dy
      @dz = @sprite.dz
      @begin = @sprite.begin
      @exist = @sprite.exist
      @end = @sprite.end
      @visible = false
      @live = true
      @path = "Graphics/Battlers/"
      appear
    end
    def appear
      if @sprite.begin != nil
        start_animation(@sprite.begin[0], @sprite.begin[1])
      else
        start_effect(:appear)
      end
    end
    def dispose
      bitmap.dispose if bitmap
      super
    end
    def update
      super
      update_exist
      update_bitmap
      update_origin
      update_position
      update_effect
      update_kill
    end
    def update_exist
      if @sprite.exist != nil
        start_animation(@sprite.exist[0], @sprite.exist[1]) unless animation?
      end
    end
    def update_kill
      return if @live == true
      @live -= 1
      dispose if @live == 0
    end
    def kill
      @life = 60
      if @end != nil
        start_animation(@end[0], @end[1])
      end
      start_effect(:disappear)
    end
    def update_bitmap
      new_bitmap = Cache.load_bitmap(@path,@icon[0],@icon[1])
      if bitmap != new_bitmap
        self.bitmap = new_bitmap
        init_visibility
      end
    end
    def init_visibility
      @battler_visible = @battler.alive?
      self.opacity = 0 unless @battler_visible
    end
    def update_position
      self.x = @battler.screen_x + @sprite.dx
      self.y = @battler.screen_y + @sprite.dy
      self.z = @battler.screen_z + @sprite.dz
    end
    def revert_to_normal
      self.blend_type = 0
      self.color.set(0, 0, 0, 0)
      self.opacity = @sprite.opacity
      self.ox = bitmap.width / 2 if bitmap
      self.src_rect.y = 0
    end
  
  
  end
class Game_Enemy
  def shield_refresh
    sprite.update_enemy_gauge_value
    super
  end
end
class Game_Actor
  def shield_refresh
    SceneManager.scene.refresh_status if $game_party.in_battle
    super
  end
end[/pre]
护盾系统,是一种rm里不存在,在其他游戏里却又非常常见的东西
萌新拙作,还望大佬提出指导意见

评分

参与人数 1赞 +1 收起 理由
sdgn + 1 精品文章

查看全部评分

梦石
0
星屑
4970
在线时间
489 小时
注册时间
2017-5-30
回帖
27
发表于 2020-10-8 09:37:27 | 显示全部楼层
大佬辛苦了!这种血条上的白盾一直是我想找但是没有人做的效果!实测下来盾的效果也非常好!
……但是好像有一些小BUG,就是在目标满血的情况下,受到治疗会将溢出治疗量转为护盾;或者当目标已有护盾的情况下受到治疗,将不会回血而是叠加护盾。
……也可能是我什么地方设置错了。
回复

使用道具 举报

梦石
0
星屑
635
在线时间
24 小时
注册时间
2020-4-22
回帖
23
 楼主| 发表于 2020-10-8 12:21:46 | 显示全部楼层
船走听雨眠 发表于 2020-10-8 09:37
大佬辛苦了!这种血条上的白盾一直是我想找但是没有人做的效果!实测下来盾的效果也非常好!
……但是好像 ...

是一个bug
下个版本和其他bug一起修吧
回复

使用道具 举报

梦石
0
星屑
3037
在线时间
388 小时
注册时间
2015-1-29
回帖
12
发表于 2020-10-10 20:31:34 | 显示全部楼层
本帖最后由 SmallDrop 于 2022-7-17 17:22 编辑

牛啤
回复

使用道具 举报

梦石
0
星屑
635
在线时间
24 小时
注册时间
2020-4-22
回帖
23
 楼主| 发表于 2020-10-17 10:38:58 | 显示全部楼层
本帖最后由 一般通过鸦天狗 于 2020-11-14 21:52 编辑

11月14日更新

>修复了若干bug
回复

使用道具 举报

梦石
0
星屑
2497
在线时间
215 小时
注册时间
2017-9-27
回帖
563
发表于 2020-11-5 10:44:37 | 显示全部楼层
我倒是有类似的······我理解的护盾是抵挡所受的下一次伤害,这样的东西我觉得更适合称之为“护甲值”
  1. #==============================================================================
  2. # 魔法障壁  刹那铃音
  3. #==============================================================================
  4. # 使用方法:
  5. # 1.备注:
  6. # 在角色或敌人的技能备注下写入<hp_def x>,战斗开始时角色或敌人获得x点障壁值。
  7. # 在技能备注下写入 <up_def x>,释放技能为角色或敌人增加x点障壁值。
  8. # 在技能备注下写入 <def_ignore>,释放带有无视障壁值的效果的技能。
  9. # 在技能备注下写入 <def_break>,该技能将直接击破障壁。
  10. # 2.事件脚本:
  11. #(1)通过战斗中事件的脚本指令调整障壁值的增加和减少。
  12. # add_battler_hp_def(actor,id,x)
  13. #actor:为true时指代角色,为false时指代敌人。
  14. #id:指第id个角色或敌人。
  15. # x:指定角色或敌人的障壁值增加x(x为负数时则为减少)。
  16. #(2)通过战斗中事件的脚本指令调整障壁值的倍数。
  17. # rate_battler_hp_def(actor,id,x)
  18. #actor:为true时指代玩角色,为false时指代敌人。
  19. #id:指第id个角色或敌人。
  20. #x:指定角色或敌人的障壁值在其基础值上乘以x。
  21. #==============================================================================
  22. # 显示的文字:
  23. #==============================================================================
  24. module Vocab
  25.   ActorDef     = "%s的障壁抵挡了%s点伤害!"
  26.   EnemyDef     = "%s的障壁抵挡了%s点伤害!"
  27.   ActorCurrentDef     = "%s当前障壁:%s!"
  28.   EnemyCurrentDef     = "%s当前障壁:%s!"
  29. end
  30. class RPG::Skill
  31.   def hp_def
  32.     if /<hp_def (\d+)>/i =~ @note;return $1.to_i;else;return 0;end
  33.   end  
  34.   def up_def
  35.     if /<up_def (\d+)>/i =~ @note;return $1.to_i;else;return 0;end
  36.   end   
  37.   def def_ignore
  38.     if /<def_ignore>/i =~ @note;return true;else;return false;end
  39.   end  
  40.   def def_break
  41.     if /<def_break>/i =~ @note;return true;else;return false;end
  42.   end   
  43. end
  44. class RPG::Enemy
  45.   def hp_def
  46.     if /<hp_def (\d+)>/i =~ @note;return $1.to_i;else;return 0;end
  47.   end  
  48. end

  49. class Game_ActionResult
  50.   attr_accessor   :hp_def
  51.   #--------------------------------------------------------------------------
  52.   # ● 清除伤害值
  53.   #--------------------------------------------------------------------------
  54.   alias old_804173948_clear_damage_values clear_damage_values
  55.   def clear_damage_values
  56.     old_804173948_clear_damage_values
  57.     @hp_def = 0
  58.   end
  59.   #--------------------------------------------------------------------------
  60.   # ● 获取 HP 抵伤的文字
  61.   #--------------------------------------------------------------------------
  62.   def hp_def_text
  63.     if @hp_def > 0
  64.       fmt = @battler.actor? ? Vocab::ActorDef : Vocab::EnemyDef
  65.       sprintf(fmt, @battler.name, @hp_def)
  66.     end
  67.   end
  68.   #--------------------------------------------------------------------------
  69.   # ● 获取 当前障壁 文字
  70.   #--------------------------------------------------------------------------
  71.   def hp_current_def_text
  72.     fmt = @battler.actor? ? Vocab::ActorCurrentDef : Vocab::ActorCurrentDef
  73.     sprintf(fmt, @battler.name, @battler.hp_def)
  74.   end
  75. end

  76. class Window_BattleLog  < Window_Selectable
  77.   #--------------------------------------------------------------------------
  78.   # ● 显示 HP 伤害
  79.   #--------------------------------------------------------------------------
  80.   alias old_804173948_display_hp_damage display_hp_damage
  81.   def display_hp_damage(target, item)
  82.     if target.result.hp_def > 0 && item && item.damage.to_hp?
  83.       add_text(target.result.hp_def_text)
  84.       add_text(target.result.hp_current_def_text)
  85.       wait
  86.     end
  87.     old_804173948_display_hp_damage(target,item);
  88.   end
  89.   
  90.   alias old_display_failure display_failure
  91.   def display_failure(target, item)
  92.     if item.is_a?(RPG::Skill) && item.up_def < 0
  93.       old_display_failure(target, item)
  94.     end
  95.   end
  96.   
  97.   alias old_display_action_results display_action_results
  98.   def display_action_results(target, item)
  99.     old_display_action_results(target, item)
  100.     if item.is_a?(RPG::Skill) && item.up_def > 0
  101.       add_text(target.name + "增加了#{item.up_def}点障壁值")
  102.       add_text(target.result.hp_current_def_text)
  103.       wait
  104.       wait
  105.     end
  106.   end

  107. end
  108. class Game_BattlerBase
  109.   attr_accessor   :hp_def
  110.   #--------------------------------------------------------------------------
  111.   # ● 初始化对象
  112.   #--------------------------------------------------------------------------
  113.   alias old_804173948_initialize initialize
  114.   def initialize
  115.     old_804173948_initialize
  116.     @hp_def = 0
  117.     @tab_ignore = false
  118.     @tab_break = false
  119.   end
  120. end
  121. class Game_Battler
  122.   #--------------------------------------------------------------------------
  123.   # ● 处理伤害
  124.   #    调用前需要设置好
  125.   #    @result.hp_damage   @result.mp_damage
  126.   #    @result.hp_drain    @result.mp_drain
  127.   #--------------------------------------------------------------------------
  128.   def execute_damage(user)
  129.     if !@tab_ignore
  130.      self.hp_def = 0 if @tab_break
  131.      if @result.hp_damage > 0
  132.        if @result.hp_damage < self.hp_def
  133.          self.hp_def -= @result.hp_damage
  134.          @result.hp_def = @result.hp_damage
  135.          @result.hp_damage = 0
  136.        else
  137.          @result.hp_damage -= self.hp_def
  138.          @result.hp_def = self.hp_def
  139.          self.hp_def = 0
  140.        end
  141.      end
  142.     end
  143.     on_damage(@result.hp_damage) if @result.hp_damage > 0
  144.     self.hp -= @result.hp_damage
  145.     self.mp -= @result.mp_damage
  146.     user.hp += @result.hp_drain
  147.     user.mp += @result.mp_drain
  148.   end
  149.   alias old_make_damage_value make_damage_value
  150.   def make_damage_value(user, item)
  151.     @tab_ignore = false
  152.     @tab_break = false
  153.     if item.is_a?(RPG::Skill)
  154.        @tab_ignore = item.def_ignore
  155.        @tab_break = item.def_break
  156.     end
  157.     old_make_damage_value(user, item)
  158.   end
  159. end
  160. class Game_Actor  
  161.   #--------------------------------------------------------------------------
  162.   # ● 战斗开始处理
  163.   #--------------------------------------------------------------------------
  164.   def on_battle_start
  165.     super
  166.     self.hp_def = battle_hp_def
  167.   end
  168.   def battle_hp_def
  169.     sum = 0
  170.     skills.each{|skill| sum+=skill.hp_def}
  171.     return sum
  172.   end
  173. end
  174. class Game_Enemy
  175.   #--------------------------------------------------------------------------
  176.   # ● 战斗开始处理
  177.   #--------------------------------------------------------------------------
  178.   def on_battle_start
  179.     super
  180.     self.hp_def = battle_hp_def
  181.   end
  182.   def skills
  183.     enemy.actions.collect{|action|$data_skills[action.skill_id]}
  184.   end
  185.   def battle_hp_def
  186.     sum = enemy.hp_def
  187.     skills.each{|skill| sum+=skill.hp_def}
  188.     return sum
  189.   end
  190. end

  191. class Game_Interpreter
  192.   def change_battler_hp_def(actor,id,value)
  193.     battler = (actor ? $game_party.members[id-1] : $game_troop.members[id-1])
  194.     battler.hp_def = value
  195.   end
  196.   def add_battler_hp_def(actor,id,value)
  197.     battler = (actor ? $game_party.members[id-1] : $game_troop.members[id-1])
  198.     battler.hp_def += value
  199.   end
  200.   def rate_battler_hp_def(actor,id,value)
  201.     battler = (actor ? $game_party.members[id-1] : $game_troop.members[id-1])
  202.     battler.hp_def = (battler.battle_hp_def * value).round
  203.   end
  204. end


  205. class Scene_Battle < Scene_Base
  206.   def add_battler_hp_def(actor,id,value)
  207.     battler = (actor ? $game_party.members[id-1] : $game_troop.members[id-1])
  208.     battler.hp_def += value
  209.   end
  210.   alias old_apply_item_effects apply_item_effects
  211.   def apply_item_effects(target, item)
  212.     add_battler_hp_def(!target.is_a?(Game_Enemy),target.index,item.up_def)
  213.     old_apply_item_effects(target, item)
  214.   end
  215. end
复制代码

点评

看我在原创发布区最新的更新,有修复这个使用道具就报错的BUG  发表于 2021-12-22 09:51
这脚本战斗中用道具就报错,默认工程试过了。  发表于 2021-11-25 12:13
另外我觉得···为什么不写到战斗日志里而是弹出窗口里写“你盾有了”···  发表于 2020-11-5 10:48
浅尝辄止,宜乎众矣。
回复

使用道具 举报

梦石
0
星屑
2338
在线时间
275 小时
注册时间
2017-7-25
回帖
128
发表于 2020-11-5 13:33:41 | 显示全部楼层
好东西……不过护盾颜色设置能不能给个例子,我这盾数据是正常的就是怎样都看不见盾条

点评

text_color(n) 使用预设颜色 或者直接Color.new(red, green, blue[, alpha])  发表于 2020-11-14 21:52
回复

使用道具 举报

梦石
0
星屑
635
在线时间
24 小时
注册时间
2020-4-22
回帖
23
 楼主| 发表于 2020-11-14 21:49:47 | 显示全部楼层
刹那铃音 发表于 2020-11-5 10:44
我倒是有类似的······我理解的护盾是抵挡所受的下一次伤害,这样的东西我觉得更适合称之为“护甲值” ...

测试用的
因为比较直观
回复

使用道具 举报

梦石
0
星屑
55
在线时间
2 小时
注册时间
2020-1-23
回帖
7
发表于 2021-5-27 01:48:49 | 显示全部楼层
附件不见了,希望补档,直观验证效果。
回复

使用道具 举报

梦石
0
星屑
2179
在线时间
444 小时
注册时间
2017-11-24
回帖
112
发表于 2021-5-27 14:29:45 | 显示全部楼层
66666666666666666
回复

使用道具 举报

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

本版积分规则

Powered by Discuz! X5.0 © 2001-2026 Discuz! Team.

在本版发帖返回顶部