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

Project1

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

[已经解决] 一般通过鸦天狗大大的护盾插件自动状态的问题

[复制链接]

Lv2.观梦者

梦石
0
星屑
877
在线时间
195 小时
注册时间
2019-4-11
帖子
56
跳转到指定楼层
1
发表于 2021-7-18 03:40:14 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
100星屑
本帖最后由 sxjkjly8010 于 2021-7-18 04:06 编辑

使用的是https://rpg.blue/thread-484905-1-1.html@一般通过鸦天狗 更新的脚本,最近听说有个叫幻书启示录的手游中,其中有个叫所罗门的角色可以驱散(解除)目标的1个护盾状态,我已经实现了可控制个数的解除状态,但发现了护盾插件自动状态出现的问题。

不清楚大大本身设计status的目的,我使用status仅包含一个状态,给那个状态设定持续回合数,通过这个来实现持续数回合的护盾,当回合结束时,状态解除,护盾确实也清除了(虽然可能是因为护盾本身的life),不过这样也可以让玩家知道护盾还有几回合结束

当我解除护盾状态时,奇怪的事情却发生了,当状态解除时,会立即重新赋予一个没有回合数(或者说持续回合数为-1)的护盾状态,每次状态解除时都会重新加上状态

我希望实现的效果是:当解除护盾状态时,相应的护盾(包括护盾值)会消失,但是现在的效果很显然没有符合预期

尝试使用@shield.delete_at(i)并没有效果……很苦恼

最佳答案

查看完整内容

加了一点新功能,解除护盾 持续的最大时间是life变量 status是护盾存在期间持有者会自动带有的状态,别问为什么不是states,问就是起名的时候脑子抽了 =begin 护盾系统 by 炽天之咸鱼裁决 本插件基于yanfly引擎编写,没有yanfly也可运行,但是视觉效果会大打折扣 使用方法:此页面手动创建护盾类型,在技能或物品的备注栏调用 为目标添加以下id的护盾 用self替换b,用user替换a.技能仅对目标护盾造成此数值的伤害 用self替换b ...

Lv2.观梦者

梦石
0
星屑
635
在线时间
24 小时
注册时间
2020-4-22
帖子
29
2
发表于 2021-7-18 03:40:15 | 只看该作者
本帖最后由 一般通过鸦天狗 于 2021-7-27 22:09 编辑

加了一点新功能,解除护盾
持续的最大时间是life变量
status是护盾存在期间持有者会自动带有的状态,别问为什么不是states,问就是起名的时候脑子抽了
RUBY 代码复制
  1. =begin
  2. 护盾系统
  3. by 炽天之咸鱼裁决
  4. 本插件基于yanfly引擎编写,没有yanfly也可运行,但是视觉效果会大打折扣
  5.  
  6. 使用方法:此页面手动创建护盾类型,在技能或物品的备注栏调用
  7. <addshield: x(,y,z...)> 为目标添加以下id的护盾
  8. <shielddamage: "(技能公式)"> 用self替换b,用user替换a.技能仅对目标护盾造成此数值的伤害
  9. <realdamage: "(技能公式)"> 用self替换b,用user替换a,技能对目标造成无视护盾的此数值的伤害
  10. <shield_cancel: x&y-z(,a&b-c)>
  11. x表示消除的护盾编号,使用&隔开,可以输入all无视类型消除
  12. z表示单次消除护盾数量的上限,用inf表示无限次
  13. (新)现在可以使用技能驱散护盾
  14. (新)增加了画面的刷新
  15.  
  16. 护盾参数,除数值外,不需要则无需填写
  17.  
  18. value:护盾数值,不能为空
  19. status:数组,附加状态,代码来自Ninjamida
  20. fade:护盾每回合增长数值(负数为减少数值)
  21. max:护盾自然增长的最大值
  22. cansave:若为false,脱战后不可保留
  23. protect:若为true,则在破碎后防止额外的伤害
  24. no:编号,拥有编号的护盾生成时会顶替掉同编号的
  25. life:护盾持续最大回合数
  26. death参数已被移除
  27. disappear:字符串,护盾由于击破以外的原因消失后执行以下代码
  28. broken:字符串,护盾被击破后执行以下代码
  29. battlecry:字符串,护盾生成后执行以下代码
  30. element:数组,护盾只对以下属性的伤害有作用
  31. color1/2:color 盾条颜色
  32. heal:布尔,若值为true则治疗量会被转化为盾量
  33. add:布尔,若值为true则新护盾会继承原有同编号护盾的所有属性
  34. hp_heal:(支持使用技能公式)每回合为持有者恢复此数值的hp,负数则为减少
  35. mp_heal:(支持使用技能公式)每回合为持有者恢复此数值的mp,负数则为减少
  36. tp_heal:(支持使用技能公式)每回合为持有者恢复此数值的tp,负数则为减少
  37. onlyattack:若值为true,则无法防御状态造成的伤害
  38. icon:护盾图像的编号
  39. (新)uncancel:开启时不能被驱散
  40. =end
  41.  
  42. module SHIELD
  43.     TAKE_DAM= "吸收"
  44.     HP_HEAL = "护盾恢复"
  45.     HP_DAM = "护盾反噬"
  46.     MP_HEAL = "护盾恢复"
  47.     MP_DAM = "护盾反噬"
  48.     TP_HEAL = "护盾恢复"
  49.     TP_DAM = "护盾反噬"
  50.     FADE = "护盾衰减"
  51.     BREAK = "护盾破碎"
  52.     DISAPPEAR = "护盾消失"
  53.     REFRESH  = "护盾刷新"
  54.     NEW  = "护盾"
  55.     ADD  = "护盾补充"
  56.     PROTECT = "保护"
  57.     GET_DAM= "吸收"
  58.     S_DAM = "碎盾"
  59.     R_DAM = "真实伤害"
  60.     CANCEL = "驱散"
  61.   end
  62.   class Battler_shield
  63.     attr_accessor :value
  64.     attr_accessor :status
  65.     attr_accessor :fade
  66.     attr_accessor :cansave
  67.     attr_accessor :protect
  68.     attr_accessor :no
  69.     attr_accessor :max
  70.     attr_accessor :life
  71.     attr_accessor :disappear
  72.     attr_accessor :broken
  73.     attr_accessor :color1
  74.     attr_accessor :color2
  75.     attr_accessor :battlecry
  76.     attr_accessor :element
  77.     attr_accessor :heal
  78.     attr_accessor :add
  79.     attr_accessor :hp_heal
  80.     attr_accessor :mp_heal
  81.     attr_accessor :tp_heal
  82.     attr_accessor :onlyattack
  83.     attr_accessor :icon
  84.     attr_accessor :uncancel
  85.  
  86.     def initialize(type,user,target)
  87.       @user = user
  88.       @target = target
  89.       case type
  90.       #以如下格式创建自定义的护盾
  91.       when 1
  92.         @value = user.mhp - user.hp + 30
  93.         @max = 0
  94.         @cansave = false
  95.         @protect = false
  96.         @no = 1
  97.         @life = 5
  98.         @add = true
  99.         @onlyattack = true
  100.       when 2
  101.         @value = user.mhp * 0.25 - user.hp * 0.25 + 200 .to_i
  102.         @max = 0
  103.         @cansave = false
  104.         @protect = false
  105.         @no = 1
  106.         @life = 5
  107.         @add = true
  108.         @onlyattack = true
  109.       when 3
  110.         @value = 10
  111.         @max = 0
  112.         @cansave = false
  113.         @protect = false
  114.         @no = 1
  115.         @life = 999
  116.         @add = true
  117.         @onlyattack = true
  118.       when 4
  119.         @value = 1000
  120.         @max = 0
  121.         @cansave = false
  122.         @protect = true
  123.         @no = 1
  124.         @life = 7
  125.         @add = true
  126.         @onlyattack = true
  127.       when 5
  128.         @value = 30
  129.         @max = 0
  130.         @cansave = false
  131.         @protect = true
  132.         @no = 1
  133.         @life = 3
  134.         @add = true
  135.         @onlyattack = true
  136.       when 6
  137.         @value = 1
  138.         @max = 0
  139.         @cansave = false
  140.         @protect = true
  141.         @no = 1
  142.         @life = 2
  143.         @add = true
  144.         @onlyattack = true
  145.       when 7
  146.         @value = @user.hp/4
  147.         @cansave = false
  148.       when 8
  149.         @value = 1
  150.         @protect = true
  151.         @cansave = false
  152.       end
  153.       ##################################
  154.       msgbox("护盾值不能为空") if @value == nil
  155.       @value = @value.to_i
  156.     end
  157.   end
  158.   class Sprite_Seed#伴生精灵参数
  159.     attr_accessor :icon#图像与色调
  160.     attr_accessor :dx#相对战斗者的x值
  161.     attr_accessor :dy#相对战斗者的y值
  162.     attr_accessor :dz#相对战斗者的z值
  163.     attr_accessor :opacity#透明度
  164.     attr_accessor :begin#入场动画id
  165.     attr_accessor :exist#持续时播放的动画id
  166.     attr_accessor :end#退场动画id
  167.     def initialize(n)
  168.       case n
  169.       when 1
  170.         @icon = ["terry.png",0]
  171.         @dx = 0
  172.         @dy = 0
  173.         @dz = 0
  174.         @opacity = 100
  175.       end
  176.     end
  177.   end
  178.  
  179.   #############################################################################
  180.   class RPG::BaseItem
  181.     attr_accessor :shield
  182.     def shield
  183.       if @shield.nil?
  184.         @shield = []
  185.         if @note =~ /<addshield:[ ](.*)>/i
  186.           for x in $1.split(",")
  187.             @shield += [x.to_i]
  188.           end
  189.         end
  190.       end
  191.       @shield
  192.     end
  193.  
  194.  
  195.     def shield_damage
  196.       if @s_damage.nil?
  197.         @s_damage = 0
  198.         if @note =~ /<shielddamage:[ ](.*)>/i
  199.             @s_damage = $1.to_s
  200.         end
  201.       end
  202.       @s_damage
  203.     end
  204.    def real_damage
  205.       if @r_damage.nil?
  206.         @r_damage = 0
  207.         if @note =~ /<realdamage:[ ](.*)>/i
  208.             @r_damage = $1.to_s
  209.         end
  210.       end
  211.       @r_damage
  212.     end
  213.     def shield_cancel
  214.  
  215.         if @shield_cancel.nil?
  216.           @shield_cancel = {}
  217.           if @note =~ /<shield_cancel:[ ](.*)>/i
  218.             lines = $1.to_s.split(",")
  219.             lines.each{|s|
  220.                 list =  s.split("-")
  221.                 if list.size == 2
  222.                   k = list[0].delete(" ").split("&")
  223.                   v = list[1].delete(" ")
  224.                   @shield_cancel[k] = v
  225.                 end
  226.  
  227.  
  228.             }
  229.           end
  230.         end
  231.         @shield_cancel
  232.       end
  233.   end
  234.  
  235.  
  236.  
  237.  
  238.   ###############来自Ninjamida#######################
  239.   class RPG::BaseItem
  240.  
  241.     def auto_states
  242.       if @auto_states.nil?
  243.         @auto_states = []
  244.         if @note =~ /<auto state:[ ](.*)>/i
  245.           for x in $1.split(",")
  246.             @auto_states += [x.to_i]
  247.           end
  248.         end
  249.       end
  250.       @auto_states
  251.     end
  252.  
  253.   end
  254.  
  255.   class Game_Actor < Game_Battler
  256.     def auto_states
  257.       autostates = self.class.auto_states + actor.auto_states
  258.       equips.each do |eq|
  259.         autostates += eq.auto_states unless eq.nil?
  260.       end
  261.       states.each do |st|
  262.         autostates += st.auto_states
  263.     end
  264.       @shield.each{|i|
  265.       autostates += i.status if i.status != nil
  266.  
  267.  
  268.       }
  269.       autostates = autostates.uniq
  270.       return autostates
  271.     end
  272.    def shield_init
  273.       return if @shield
  274.       @shield = []
  275.       @ex_sprite = {}
  276.       @s = 0
  277.     end  
  278.   end
  279.   class Game_Enemy < Game_Battler
  280.     def auto_states
  281.       autostates = enemy.auto_states
  282.       states.each do |st|
  283.         autostates += st.auto_states
  284.       end
  285.       @shield.each{|i|
  286.       autostates += i.status if i.status != nil
  287.       }
  288.       autostates = autostates.uniq
  289.       return autostates
  290.     end
  291.  
  292.   end
  293.  
  294.   class Scene_Battle
  295.  
  296.     alias s_auto_state_battle_start battle_start
  297.     def battle_start
  298.       s_auto_state_battle_start
  299.       $game_party.members.each{|mem|
  300.         mem.add_auto_states
  301.       status_redraw_target(mem) if $imported["YEA-BattleEngine"]
  302.       }
  303.  
  304.  
  305.     end
  306.  
  307.   end
  308.  
  309.   class Game_Battler
  310.  
  311.     alias s_auto_states_initialize initialize
  312.     def initialize
  313.       s_auto_states_initialize
  314.       @old_auto_states = []
  315.     end
  316.  
  317.     def add_auto_states
  318.       return if state?(death_state_id)
  319.       auto_states.each do |st|
  320.         if not state?(st)
  321.           add_state(st)
  322.           @state_turns[st] = -1
  323.         end
  324.       end
  325.     end
  326.  
  327.     def remove_old_auto_states
  328.       auto_states.each do |as|
  329.         @old_auto_states.delete(as)
  330.       end
  331.       @old_auto_states.each do |oas|
  332.         remove_state(oas)
  333.       end
  334.       @old_auto_states = auto_states
  335.     end
  336.  
  337.     alias s_auto_state_item_effect_remove_state item_effect_remove_state
  338.     def item_effect_remove_state(user, item, effect)
  339.       s_auto_state_item_effect_remove_state(user, item, effect) unless auto_states.include?(effect.data_id)
  340.     end
  341.  
  342.     alias s_auto_state_refresh refresh
  343.     def refresh
  344.       s_auto_state_refresh
  345.       add_auto_states
  346.       remove_old_auto_states
  347.     end
  348.  
  349.   end
  350.   ###############################################################
  351.  
  352.  
  353.  
  354.   class Game_ActionResult
  355.     attr_accessor :s_damage
  356.     attr_accessor :r_damage
  357.     attr_accessor :shield_cancel
  358.     alias s_clear_damage_values clear_damage_values
  359.     def clear_damage_values
  360.       s_clear_damage_values
  361.       @s_damage = 0
  362.       @r_damage = 0
  363.       @shield_cancel = {}
  364.     end
  365.     alias s_make_damage make_damage
  366.     def make_damage(value, item)
  367.       s_make_damage(value, item)
  368.       @s_damage = item.shield_damage
  369.       @r_damage = item.real_damage
  370.       @shield_cancel = item.shield_cancel
  371.     end
  372.  
  373.  
  374.  
  375.  
  376.  
  377.  
  378.   end
  379.  
  380.  
  381.  
  382.  
  383.   class Game_BattlerBase
  384.     attr_accessor :shield
  385.     attr_accessor :ex_sprite
  386.       $imported = {} if $imported.nil?
  387.       if $imported["YEA-BattleEngine"]
  388.       alias shieldmake_damage_popups make_damage_popups
  389.       def make_damage_popups(user)
  390.         if @useshield != nil
  391.           if @t_damage > 0
  392.             if @protect != nil
  393.               text =   SHIELD::PROTECT
  394.               rules = "HP_HEL"
  395.               @protect = nil
  396.             else
  397.               text = SHIELD::GET_DAM
  398.               rules = "HP_DMG"
  399.             end
  400.             create_popup(text, rules)
  401.             value = @t_damage.abs
  402.             rules = "MP_DMG"
  403.             text = sprintf("%s", value.group)
  404.             create_popup(text, rules)
  405.           elsif @t_damage < 0
  406.             text = SHIELD::ADD
  407.             rules = "HP_HEL"
  408.             @protect = nil
  409.             create_popup(text, rules)
  410.             value = @t_damage.abs
  411.             rules = "MP_DMG"
  412.             text = sprintf(+"%s", value.group)
  413.             create_popup(text, rules)
  414.           end
  415.         end
  416.         if @result.s_damage != 0
  417.           text = SHIELD::S_DAM
  418.           rules = "HP_DMG"
  419.           create_popup(text, rules)
  420.           value = @result.s_damage
  421.           text = sprintf("%s", value)
  422.           create_popup(text, rules)
  423.           @result.s_damage = 0
  424.         end
  425.         if @result.r_damage != 0
  426.           text = SHIELD::R_DAM
  427.           rules = "HP_DMG"
  428.           create_popup(text, rules)
  429.           value = @result.r_damage
  430.           text = sprintf("%s", value)
  431.           create_popup(text, rules)
  432.           @result.r_damage = 0
  433.         end
  434.         shieldmake_damage_popups(user)
  435.         @t_damage = 0
  436.       end
  437.       def make_miss_popups(user, item)
  438.         return if dead?
  439.         if @result.missed && item.shield == []
  440.           text = YEA::BATTLE::POPUP_SETTINGS[:missed]
  441.           rules = "DEFAULT"
  442.           create_popup(text, rules)
  443.         end
  444.         if @result.evaded && item.shield == []
  445.           text = YEA::BATTLE::POPUP_SETTINGS[:evaded]
  446.           rules = "DEFAULT"
  447.           create_popup(text, rules)
  448.         end
  449.         if @result.hit? && !@result.success && item.shield == []
  450.           text = YEA::BATTLE::POPUP_SETTINGS[:failed]
  451.           rules = "DEFAULT"
  452.           create_popup(text, rules)
  453.         end
  454.         if @result.hit? && item.damage.to_hp? && @useshield == nil && item.shield == []
  455.           if @result.hp_damage == 0 && @result.hp_damage == 0
  456.             text = YEA::BATTLE::POPUP_SETTINGS[:nulled]
  457.             rules = "DEFAULT"
  458.             create_popup(text, rules)
  459.           end
  460.         end
  461.         @useshield = nil
  462.       end
  463.     end
  464.     def shield_add(a,b)
  465.       b.value += a.value
  466.       b.status += a.status if b.status != nil and a.status != nil
  467.       b.status =  a.status if b.status == nil
  468.       b.element += a.element if b.element != nil and a.element != nil
  469.       b.element =  a.element if b.element == nil
  470.       b.fade += a.fade if b.fade != nil and a.fade != nil
  471.       b.fade =  a.fade if b.fade == nil
  472.       b.cansave = false if a.cansave == false
  473.       b.protect = true if a.protect == true
  474.       b.max = a.max if b.max == nil
  475.       b.life += a.life if b.life != nil and a.life != nil
  476.       b.life =  a.life if b.life == nil
  477.       b.disappear = "#{a.disappear};#{b.disappear}" if b.disappear != nil and a.disappear != nil
  478.       b.disappear = a.disappear if b.disappear == nil
  479.       b.broken = "#{a.broken};#{b.broken}" if b.broken != nil and a.broken != nil
  480.       b.broken = a.broken if b.broken == nil
  481.       b.color1 = a.color1 if a.color1
  482.       b.color2 = a.color2 if a.color2
  483.       b.heal = true if a.heal == true
  484.       b.hp_heal += a.hp_heal if b.hp_heal != nil and a.hp_heal != nil
  485.       b.hp_heal =  a.hp_heal if b.hp_heal == nil
  486.       b.mp_heal += a.mp_heal if b.mp_heal != nil and a.mp_heal != nil
  487.       b.mp_heal =  a.mp_heal if b.mp_heal == nil
  488.       b.tp_heal += a.tp_heal if b.tp_heal != nil and a.tp_heal != nil
  489.       b.tp_heal =  a.tp_heal if b.tp_heal == nil
  490.     end
  491.     def s
  492.       sv = 0
  493.       @shield.each{|i|
  494.       sv += i.value
  495.       }
  496.       return sv
  497.     end
  498.     def shield_init
  499.       return if @shield
  500.       @shield = []
  501.       @ex_sprite = {}
  502.       @s = 0
  503.     end  
  504.     alias initializewithshield initialize
  505.     def initialize
  506.       initializewithshield
  507.       shield_init
  508.     end
  509.  
  510.     def nocheck(no)
  511.       @shield.each_index{|i|
  512.       if @shield[i].no == no
  513.         @shield.delete_at(i)
  514.         break
  515.       end
  516.       }
  517.  
  518.     end
  519.  
  520.  
  521.  
  522.     def shieldtotal
  523.       n = 0
  524.       @shield.each{|i|
  525.       n += i.value}
  526.       return n
  527.     end
  528.  
  529.     def draw_bar_rate
  530.       a = []
  531.       b = draw_hp_rate
  532.       a << b
  533.       s = 1 - b
  534.       t = shieldtotal
  535.       @shield.each{|i|
  536.       r = s * i.value.to_f / t
  537.       a << r }
  538.       return a
  539.     end
  540.     def shield_bar_rate
  541.       a = []
  542.       b = draw_hp_rate
  543.       s = 1 - b
  544.       t = shieldtotal
  545.       @shield.each{|i|
  546.       r = s * i.value.to_f / t
  547.       a << r }
  548.       return a
  549.     end
  550.  
  551.     def shield_rate
  552.       s = shieldtotal
  553.       if @hp + s <= mhp
  554.         return s.to_f / mhp
  555.       else
  556.         return s.to_f / (s + @hp).to_f
  557.       end
  558.  
  559.     end
  560.     def draw_hp_rate
  561.       s = shieldtotal
  562.       if @hp + s <= mhp
  563.         return @hp.to_f / mhp
  564.       else
  565.         return @hp.to_f / (s + @hp).to_f
  566.       end
  567.     end
  568.     def draw_shield_rate
  569.       s = shieldtotal
  570.       if @hp + s <= mhp
  571.         return s.to_f / (mhp - @hp)
  572.       else
  573.         return 1
  574.       end
  575.  
  576.     end
  577.  
  578.  
  579.  
  580.   end
  581.  
  582.  
  583.  
  584.  
  585.  
  586.  
  587.   class Game_Battler < Game_BattlerBase
  588.     def shield_heal
  589.       shield_hp_heal
  590.       shield_mp_heal
  591.       shield_tp_heal
  592.     end
  593.     def shield_hp_heal
  594.       @shield.each_index{|i|
  595.           if @shield[i].hp_heal != nil
  596.             value = @shield[i].hp_heal
  597.             value = self.mhp - @hp if (@hp + value) > self.mhp
  598.             value = @hp if (@hp + value) < 0
  599.             if $imported["YEA-BattleEngine"]
  600.                 if value > 0
  601.                 rules = "HP_HEL"
  602.                 text = SHIELD::HP_HEAL
  603.                 create_popup(text, rules)
  604.                 text = "+#{value}"
  605.                 create_popup(text, rules)
  606.                 elsif value < 0
  607.                 rules = "HP_DMG"
  608.                 text = SHIELD::HP_DAM
  609.                 create_popup(text, rules)
  610.                 text = "-#{-value}"
  611.                 create_popup(text, rules)
  612.                 end
  613.             end
  614.             @hp += value
  615.           end
  616.         }
  617.      end
  618.      def shield_mp_heal
  619.       @shield.each_index{|i|
  620.           if @shield[i].mp_heal != nil
  621.             value = @shield[i].mp_heal
  622.             value = @self.mmp - @mp if (@mp + value) > self.mmp
  623.             value = @mp if (@mp + value) < 0
  624.             if $imported["YEA-BattleEngine"]
  625.                 if value > 0
  626.                 rules = "MP_HEL"
  627.                 text = SHIELD::MP_HEAL
  628.                 create_popup(text, rules)
  629.                 text = "+#{value}"
  630.                 create_popup(text, rules)
  631.                 elsif value < 0
  632.                 rules = "MP_DMG"
  633.                 text = SHIELD::MP_DAM
  634.                 create_popup(text, rules)
  635.                 text = "-#{-value}"
  636.                 create_popup(text, rules)
  637.                 end
  638.             end
  639.             @mp += value
  640.           end
  641.         }
  642.       end
  643.       def shield_tp_heal
  644.       @shield.each_index{|i|
  645.           if @shield[i].tp_heal != nil
  646.             value = @shield[i].tp_heal
  647.             value = 100 - @tp if (@tp + value) > 100
  648.             value = @tp if (@tp + value) < 0
  649.             if $imported["YEA-BattleEngine"]
  650.                 if value > 0
  651.                 rules = "MP_HEL"
  652.                 text = SHIELD::TP_HEAL
  653.                 create_popup(text, rules)
  654.                 text = "+#{value}"
  655.                 create_popup(text, rules)
  656.                 elsif value < 0
  657.                 rules = "MP_DMG"
  658.                 text = SHIELD::TP_DAM
  659.                 create_popup(text, rules)
  660.                 text = "-#{-value}"
  661.                 create_popup(text, rules)
  662.                 end
  663.             end
  664.             @tp += value
  665.           end
  666.         }
  667.      end
  668.     alias shieldon_turn_end on_turn_end
  669.     def on_turn_end
  670.       shield_heal
  671.       s =  @shield.size - 1
  672.       i = 0
  673.       while i <= s
  674.         fade = @shield[i].fade
  675.         if fade != nil and fade != 0
  676.  
  677.           if @shield[i].max != nil
  678.             ts = @shield[i].value + fade
  679.             if @shield[i].max > @shield[i].value
  680.               fade = @shield[i].max - @shield[i].value if ts > @shield[i].max
  681.             else
  682.               fade = 0
  683.             end
  684.           end
  685.           rules = "MP_DMG"
  686.           text = SHIELD::FADE
  687.           create_popup(text, rules) if $imported["YEA-BattleEngine"]
  688.           text = sprintf(+"%s", fade) if fade > 0
  689.           text = sprintf("%s", fade) if fade < 0
  690.           create_popup(text, rules) if $imported["YEA-BattleEngine"]
  691.           @shield[i].value += fade
  692.         end
  693.         life = @shield[i].life
  694.         if life != nil
  695.           @shield[i].life -= 1
  696.         end
  697.         if @shield[i].value <= 0 or @shield[i].life == 0
  698.           shielddisappear(i)
  699.           i -= 1
  700.           s =  @shield.size - 1
  701.         end
  702.         i += 1
  703.       end
  704.       shieldon_turn_end
  705.     end
  706.     def addshield(item,user,target)
  707.       return if item.shield == nil
  708.       item.shield.each{|i|
  709.       s = Battler_shield.new(i,user,target)
  710.  
  711.       if s.no != nil
  712.        @shield.each_index{|i|
  713.           if @shield[i].no == s.no
  714.             shield_add(@shield[i],s) if @shield[i].add == true or s.add == true
  715.             @ex_sprite[@shield[i]].kill unless @shield[i].icon.nil?
  716.             @shield.delete_at(i)
  717.             @s_fresh = true
  718.             break
  719.           end
  720.         }
  721.       end
  722.       if self.class == Game_Enemy
  723.         scene = SceneManager.scene.spriteset.viewport1
  724.       else
  725.         scene = nil
  726.       end
  727.       @ex_sprite[s]=Sprite_Battler_Ex.new(scene,Sprite_Seed.new(s.icon),self) unless s.icon.nil?
  728.  
  729.  
  730.  
  731.  
  732.  
  733.       @s_value << s.value
  734.       @shield << s
  735.  
  736.       eval s.battlecry if s.battlecry != nil
  737.       }
  738.       if $imported["YEA-BattleEngine"]
  739.         if @s_value != [] and @s_value != nil
  740.             if @s_fresh != nil
  741.             text = SHIELD::REFRESH
  742.  
  743.  
  744.             rules = "HP_HEL"
  745.             create_popup(text, rules)
  746.             @s_fresh = nil
  747.             else
  748.             text = SHIELD::NEW
  749.             rules = "HP_DMG"
  750.             create_popup(text, rules)
  751.             end
  752.             @s_value.each{|i|
  753.             value = i.abs
  754.             text = sprintf("%s", value.group)
  755.             create_popup(text, rules)
  756.             }
  757.             @s_value = []
  758.         end
  759.  
  760.       end
  761.       shield_refresh
  762.     end
  763.     def shield_refresh
  764.       SceneManager.scene.update_basic
  765.       refresh
  766.     end
  767.  
  768.     def shielddisappear(i)
  769.       $imported = {} if $imported.nil?
  770.       if $imported["YEA-BattleEngine"]
  771.         if @shield[i].value == 0
  772.           rules = "HP_DMG"
  773.           text = SHIELD::BREAK
  774.           create_popup(text, rules) if $imported["YEA-BattleEngine"]
  775.         else
  776.           rules = "HP_DMG"
  777.           text = SHIELD::DISAPPEAR
  778.           create_popup(text, rules) if $imported["YEA-BattleEngine"]
  779.         end
  780.       end
  781.       if @shield[i].value == 0
  782.          eval  @shield[i].broken if @shield[i].broken != nil
  783.       else
  784.         eval  @shield[i].disappear if @shield[i].disappear != nil
  785.       end
  786.       @ex_sprite[@shield[i]].kill unless @shield[i].icon.nil?
  787.       @shield.delete_at(i)
  788.     end
  789.  
  790.  
  791.  
  792.     def regenerate_hp #状态伤害
  793.       damage = -(mhp * hrg).to_i
  794.       perform_map_damage_effect if $game_party.in_battle && damage > 0
  795.       @result.hp_damage = [damage, max_slip_damage].min
  796.       state_shielduse
  797.       self.hp -= @result.hp_damage
  798.     end
  799.     def state_shielduse
  800.       return if @result.hp_damage == 0
  801.       if @result.hp_damage < 0
  802.         healshield
  803.         return
  804.       end
  805.       unless @shield.empty?
  806.         size = @shield.size
  807.         n = size - 1
  808.         while n >= 0
  809.           if @s_invalid.include?(n)
  810.             n -= 1
  811.             next
  812.           end
  813.           if  @shield[n].onlyattack == true
  814.             n -= 1
  815.             next
  816.           end
  817.  
  818.           @result.hp_damage -= @shield[n].value
  819.           if @result.hp_damage >= 0  #碎盾
  820.             if @shield[n].protect == true
  821.               @result.hp_damage = 0
  822.               @protect = true
  823.             end  #碎盾保护
  824.             @t_damage += @shield[n].value
  825.             shielddisappear(n)
  826.           else #未碎盾
  827.             @t_damage += @shield[n].value
  828.             @t_damage += @result.hp_damage
  829.             @shield[n].value = -@result.hp_damage
  830.             @result.hp_damage = 0
  831.           end
  832.           break if  @result.hp_damage == 0
  833.           n -= 1
  834.         end
  835.         @useshield = true if @t_damage != 0
  836.       end
  837.     end
  838.     def shielddamage
  839.       return if @result.s_damage == 0
  840.       @result.s_damage = 0 if @shield.empty?
  841.       unless @shield.empty?
  842.         dam = @result.s_damage
  843.         size = @shield.size
  844.         n = size - 1
  845.         while n >= 0
  846.           @result.s_damage -= @shield[n].value
  847.           if @result.s_damage >= 0  #碎盾
  848.             @s_damage += @shield[n].value
  849.             @shield.delete_at(n)
  850.           else #未碎盾
  851.             @s_damage += @shield[n].value
  852.             @s_damage += @result.s_damage
  853.             @shield[n].value = -@result.s_damage
  854.             @result.s_damage = 0
  855.           end
  856.           break if  @result.s_damage == 0
  857.           n -= 1
  858.         end
  859.         @result.s_damage = 0 if @result.s_damage < 0
  860.         @result.s_damage = dam - @result.s_damage
  861.       end
  862.     end
  863.     def healshield
  864.       unless @shield.empty?
  865.         size = @shield.size
  866.         n = size - 1
  867.         while n >= 0
  868.           if @shield[n].heal == true
  869.             @shield[n].value -= @result.hp_damage
  870.             @t_damage = -@result.hp_damage
  871.             @result.hp_damage = 0
  872.             return
  873.           end
  874.           n -= 1
  875.         end
  876.       end
  877.     end
  878.     def useshield
  879.       shielddamage
  880.       return if @result.hp_damage == 0
  881.       if @result.hp_damage < 0
  882.         healshield
  883.         return
  884.       end
  885.       unless @shield.empty?
  886.         size = @shield.size
  887.         n = size - 1
  888.         while n >= 0
  889.           if @s_invalid.include?(n)
  890.             n -= 1
  891.             next
  892.           end
  893.  
  894.           @result.hp_damage -= @shield[n].value
  895.           if @result.hp_damage >= 0  #碎盾
  896.             if @shield[n].protect == true
  897.               @result.hp_damage = 0
  898.               @protect = true
  899.             end  #碎盾保护
  900.             @t_damage += @shield[n].value
  901.             shielddisappear(n)
  902.           else #未碎盾
  903.             @t_damage += @shield[n].value
  904.             @t_damage += @result.hp_damage
  905.             @shield[n].value = -@result.hp_damage
  906.             @result.hp_damage = 0
  907.           end
  908.           break if  @result.hp_damage == 0
  909.           n -= 1
  910.         end
  911.         @useshield = true if @t_damage != 0
  912.       end
  913.  
  914.  
  915.     end
  916.  
  917.     def s_invalid(user, item)
  918.       @s_invalid = []
  919.       return if item.damage == nil
  920.       @shield.each_index{|n|
  921.       if @shield[n].element != nil
  922.         @shield[n].element.each{|i|
  923.         @s_invalid << n unless user.atk_elements.include?(i) or item.damage.element_id == i
  924.         }
  925.  
  926.  
  927.       end
  928.       }
  929.     end
  930.  
  931.  
  932.  
  933.     def item_element(i)
  934.       if item.damage.element_id < 0
  935.         user.atk_elements
  936.       else
  937.         item.damage.element_id
  938.       end
  939.     end
  940.  
  941.     alias item_applyshield item_apply
  942.     def item_apply(user, item)
  943.       @s_value = []
  944.       cancel_shield(user, item)
  945.       s_invalid(user, item)
  946.       addshield(item,user,self)
  947.       #make_damage_popups(user)
  948.       item_applyshield(user, item)
  949.  
  950.     end
  951.     def cancel_shield(user, item)
  952.  
  953.         list = item.shield_cancel
  954.         return if list.empty?
  955.         list.each{|k,v|
  956.         counter = 0
  957.         ok = false
  958.         while !ok
  959.             shield = find_shield_to_cancel(k)
  960.             if shield
  961.                 @shield.delete(shield)
  962.                 popup_cancel_shield
  963.                 counter += 1
  964.                 if v != "inf"
  965.                     ok = true if counter >= v.to_i
  966.                 end
  967.             else
  968.                 ok = true
  969.             end
  970.         end
  971.  
  972.  
  973.  
  974.         }
  975.     end
  976.     def popup_cancel_shield
  977.         return unless $imported["YEA-BattleEngine"]
  978.         text = SHIELD::CANCEL
  979.         rules = "CRITICAL"
  980.         create_popup(text,rules)
  981.     end
  982.     def find_shield_to_cancel(list)
  983.         @shield.each{|s|
  984.             return s if check_shield_cancel(s,list)
  985.  
  986.  
  987.         }
  988.         return false
  989.     end
  990.     def check_shield_cancel(shield,list)
  991.         return false if shield.uncancel
  992.         list.each{|l|
  993.         return true if l == "all"
  994.         next unless shield.no
  995.         return true if l.to_i == shield.no
  996.         }
  997.     end
  998.     alias s_make_damage_value make_damage_value
  999.     def make_damage_value(user, item)
  1000.       s_make_damage_value(user, item)
  1001.       r = eval(item.real_damage.to_s)
  1002.       @result.r_damage = r.to_i
  1003.       s = eval(item.s_damage.to_s)
  1004.       @result.s_damage = s.to_i
  1005.     end
  1006.  
  1007.  
  1008.  
  1009.     alias execute_damagewithshield execute_damage
  1010.     def execute_damage(user)
  1011.       @t_damage = 0
  1012.       @s_damage = 0
  1013.       useshield
  1014.       self.hp -= [@result.r_damage,self.hp].min
  1015.       execute_damagewithshield(user)
  1016.  
  1017.     end
  1018.  
  1019.     alias shieldon_battle_end on_battle_end
  1020.     def on_battle_end
  1021.       shieldon_battle_end
  1022.       s =  @shield.size - 1
  1023.       i = 0
  1024.       while i <= s
  1025.         if @shield[i].cansave == false
  1026.           shielddisappear(i)
  1027.           i -= 1
  1028.           s =  @shield.size - 1
  1029.         end
  1030.         i += 1
  1031.       end
  1032.     end
  1033.   end
  1034.  
  1035.  
  1036.  
  1037.  
  1038.  
  1039.   class Window_BattleStatus
  1040.     def shield_gauge_color1;   text_color(0);   end;
  1041.     def shield_gauge_color2;   text_color(8);   end;
  1042.  
  1043.  
  1044.  
  1045.  
  1046.  
  1047.  
  1048.    def draw_actor_hp(actor, dx, dy, width = 124)
  1049.       s = actor.shieldtotal
  1050.       draw_gauge(dx, dy, width, actor.draw_hp_rate, hp_gauge_color1, hp_gauge_color2)
  1051.       draw_actor_shield(actor, dx + width * actor.draw_hp_rate , dy, width)
  1052.       cy = (Font.default_size - contents.font.size) / 2 + 1
  1053.  
  1054.       draw_text(dx+2, dy+cy, 30, line_height, Vocab::hp_a)
  1055.       draw_current_and_max_values(dx, dy+cy, width, actor.hp, actor.mhp,
  1056.       hp_color(actor), normal_color)
  1057.     end
  1058.  
  1059.  
  1060.     def draw_actor_shield(actor, dx, dy, width = 124)
  1061.       actor.shield.each{|i|
  1062.       w = width.to_f * (1- actor.draw_hp_rate) * actor.draw_shield_rate * i.value / actor.shieldtotal
  1063.       c1 = i.color1 ? i.color1 : shield_gauge_color1
  1064.       c2 = i.color2 ? i.color2 : shield_gauge_color2
  1065.       draw_gauge(dx, dy, w , 1, c1, c2)
  1066.       dx += w
  1067.       }
  1068.  
  1069.       change_color(system_color)
  1070.     end
  1071.   end
  1072.   class Window_Base
  1073.     def shield_gauge_color1;   text_color(0);   end;
  1074.     def shield_gauge_color2;   text_color(8);   end;
  1075.  
  1076.  
  1077.  
  1078.  
  1079.  
  1080.  
  1081.     def draw_actor_hp(actor, dx, dy, width = 124)
  1082.       s = actor.shieldtotal
  1083.       draw_gauge(dx, dy, width, actor.draw_hp_rate, hp_gauge_color1, hp_gauge_color2)
  1084.       draw_actor_shield(actor, dx + width * actor.draw_hp_rate , dy, width)
  1085.       cy = (Font.default_size - contents.font.size) / 2 + 1
  1086.  
  1087.       draw_text(dx+2, dy+cy, 30, line_height, Vocab::hp_a)
  1088.       draw_current_and_max_values(dx, dy+cy, width, actor.hp, actor.mhp,
  1089.       hp_color(actor), normal_color)
  1090.     end
  1091.  
  1092.  
  1093.     def draw_actor_shield(actor, dx, dy, width = 124)
  1094.       actor.shield.each{|i|
  1095.       w = width.to_f * (1- actor.draw_hp_rate) * actor.draw_shield_rate * i.value / actor.shieldtotal
  1096.       c1 = i.color1 ? i.color1 : shield_gauge_color1
  1097.       c2 = i.color2 ? i.color2 : shield_gauge_color2
  1098.       draw_gauge(dx, dy, w , 1, c1, c2)
  1099.       dx += w
  1100.       }
  1101.  
  1102.       change_color(system_color)
  1103.     end
  1104.  
  1105.   end
  1106.  
  1107.  
  1108.   #######来自yanfly与DoubleX#############
  1109.   $imported = {} if $imported.nil?
  1110.   if $imported["YEA-EnemyHPBars"] and $imported["DoubleX RMVXA Percentage Addon to YEA-EnemyHPBars"]
  1111.   class Enemy_HP_Gauge_Viewport < Viewport
  1112.     def initialize(battler, sprite, type)
  1113.       @battler = battler
  1114.       @base_sprite = sprite
  1115.       @type = type
  1116.       dw = YEA::BATTLE::ENEMY_GAUGE_WIDTH
  1117.       if @type == :percent && FIX_LARGE_TEXT
  1118.         dh = [TEXT_SIZE, YEA::BATTLE::ENEMY_GAUGE_HEIGHT].max
  1119.       else
  1120.         dh = YEA::BATTLE::ENEMY_GAUGE_HEIGHT
  1121.       end
  1122.       if @type != :hp and @type != :shield
  1123.         dw += 2
  1124.         dh += 2
  1125.       end
  1126.       @start_width = dw
  1127.       rect = Rect.new(0, 0, dw, dh)
  1128.       @current_hp = @battler.hp
  1129.       @current_mhp = @battler.mhp
  1130.       @current_hr = @battler.draw_hp_rate
  1131.       @current_sr = @battler.shield_bar_rate
  1132.       @target_gauge_width = target_gauge_width
  1133.       @gauge_rate = @current_hr
  1134.       setup_original_hide_gauge
  1135.       super(rect)
  1136.       self.z = 125
  1137.       create_gauge_sprites
  1138.       self.visible = false
  1139.       update_position
  1140.       self.rect.width = @gauge_width if @type == :hp
  1141.     end
  1142.  
  1143.  
  1144.  
  1145.     def target_gauge_rate
  1146.       return @current_hr
  1147.     end
  1148.     def target_gauge_width
  1149.       return [@current_hr * @start_width, @start_width].min
  1150.     end
  1151.  
  1152.     def update_gauge
  1153.       unless @gauge_width == @target_gauge_width
  1154.         rate = 3
  1155.         @target_gauge_width = target_gauge_width
  1156.         if @gauge_width > @target_gauge_width
  1157.           @gauge_width = [@gauge_width - rate, @target_gauge_width].max
  1158.         elsif @gauge_width < @target_gauge_width
  1159.           @gauge_width = [@gauge_width + rate, @target_gauge_width].min
  1160.         end
  1161.         @visible_counter = @gauge_width == 0 ? 10 : 60
  1162.         rect.width = @gauge_width if @type == :hp
  1163.       end
  1164.       shield_update
  1165.     end
  1166.  
  1167.     def new_hp_updates
  1168.       return if @current_hr == @battler.draw_hp_rate and @current_sr == @battler.shield_bar_rate
  1169.       @current_hp = @battler.hp
  1170.       @current_mhp = @battler.mhp
  1171.       @current_hr = @battler.draw_hp_rate
  1172.       return if @gauge_rate == target_gauge_rate
  1173.       @gauge_rate = target_gauge_rate
  1174.       @target_gauge_width = target_gauge_width
  1175.       @visible_counter = 60
  1176.     end
  1177.  
  1178.  
  1179.  
  1180.     def update_percentage
  1181.       return if @last_hp == @current_hp
  1182.       @last_hp = @current_hp
  1183.       set_percentage_font
  1184.       if ACTUAL_NUMBER
  1185.         percent = @current_hp.to_i.to_s
  1186.       else
  1187.         percent = "#{(@current_hp.to_f / @current_mhp.to_f * 100).to_i.to_s}%"
  1188.       end
  1189.       dw = @sprite.bitmap.text_size(percent).width
  1190.       @sprite.bitmap.clear
  1191.       @sprite.bitmap.draw_text(YEA::BATTLE::ENEMY_GAUGE_WIDTH + 2 - dw, 1, dw,
  1192.       @sprite.bitmap.text_size(percent).height, percent)
  1193.     end
  1194.  
  1195.     def create_gauge_sprites
  1196.       @sprite = Plane.new(self)
  1197.       @sprite.bitmap = Bitmap.new(rect.width * 4, rect.height)
  1198.       enemy = @battler.enemy
  1199.       if @type == :back
  1200.         colour = Colour.text_colour(enemy.back_gauge_colour)
  1201.         colour1 = colour2 = colour
  1202.       elsif @type == :hp
  1203.         colour1 = Colour.text_colour(enemy.hp_gauge_colour1)
  1204.         colour2 = Colour.text_colour(enemy.hp_gauge_colour2)
  1205.       elsif @type == :percent
  1206.         colour1 = colour2 = Color.new(0, 0, 0, 0)
  1207.       end
  1208.       dw = rect.width
  1209.       dw *= @battler.draw_hp_rate
  1210.       dh = rect.height
  1211.       @gauge_width = target_gauge_width
  1212.       if @type == :shield
  1213.         new_shield
  1214.       else
  1215.         @sprite.bitmap.gradient_fill_rect(0, 0, dw, dh, colour1, colour2)
  1216.         @sprite.bitmap.gradient_fill_rect(dw, 0, dw, dh, colour2, colour1)
  1217.       end
  1218.       @visible_counter = 0
  1219.     end
  1220.     def new_shield
  1221.       return if @battler.shield == []
  1222.       dh = rect.height
  1223.       dx = @gauge_width
  1224.       shield = @battler.shield
  1225.       shield.each_index{|i|
  1226.       dw = @start_width * @current_sr[i]
  1227.       dw = @start_width - dx + 3 if i == shield.size - 1
  1228.       c1 = shield[i].color1 ? shield[i].color1 : Colour.text_colour(0)
  1229.       c2 = shield[i].color2 ? shield[i].color2 : Colour.text_colour(8)
  1230.       @sprite.bitmap.gradient_fill_rect(dx, 0, dw, dh, c1, c2)
  1231.       dx += dw
  1232.       }
  1233.     end
  1234.  
  1235.     def shield_update
  1236.       if @type == :shield and @battler.shield_bar_rate == []
  1237.         @sprite.bitmap.clear
  1238.       end
  1239.       return if @current_sr == @battler.shield_bar_rate and @gauge_width == @target_gauge_width
  1240.       @current_sr = @battler.shield_bar_rate
  1241.       if @type == :shield
  1242.         dx = @gauge_width
  1243.         dh = rect.height
  1244.         shield = @battler.shield
  1245.         shield.each_index{|i|
  1246.         dw = @start_width * @current_sr[i]
  1247.         dw = @start_width - dx + 3 if i == shield.size - 1
  1248.         c1 = shield[i].color1 ? shield[i].color1 : Colour.text_colour(0)
  1249.         c2 = shield[i].color2 ? shield[i].color2 : Colour.text_colour(8)
  1250.         @sprite.bitmap.gradient_fill_rect(dx, 0, dw, dh, c1, c2)
  1251.         dx += dw
  1252.         }
  1253.  
  1254.       end
  1255.       @visible_counter = 60
  1256.  
  1257.     end
  1258.  
  1259.  
  1260.     def update_position
  1261.       dx = @battler.screen_x
  1262.       dy = @battler.screen_y
  1263.       @update_position = false
  1264.       return if @last_x == dx && @last_y == dy
  1265.       @last_x = dx
  1266.       @last_y = dy
  1267.       @update_position = true
  1268.       dx -= @start_width / 2
  1269.       if @type == :percent
  1270.         dx += TEXT_X_OFFSET
  1271.         dy += TEXT_Y_OFFSET
  1272.       end
  1273.       rect.x = dx
  1274.       rect.y = dy
  1275.       dh = rect.height + 1
  1276.       dh += 2 if @type == :hp or @type == :shield
  1277.       dy = [dy, Graphics.height - dh - 120].min
  1278.       dy += 1 if @type == :hp or @type == :shield
  1279.       #
  1280.       rect.y = dy
  1281.     end
  1282.  
  1283.  
  1284.  
  1285.  
  1286.  
  1287.  
  1288.  
  1289.   end
  1290.  
  1291.  
  1292.  
  1293.  
  1294.  
  1295.  
  1296.  
  1297.   class Sprite_Battler < Sprite_Base
  1298.  
  1299.  
  1300.     def create_enemy_gauges
  1301.       return if @battler.nil?
  1302.       return if @battler.actor?
  1303.       return unless @battler.enemy.show_gauge
  1304.       @back_gauge_viewport = Enemy_HP_Gauge_Viewport.new(@battler, self, :back)
  1305.       @hp_gauge_viewport = Enemy_HP_Gauge_Viewport.new(@battler, self, :hp)
  1306.       @shield_gauge_viewport = Enemy_HP_Gauge_Viewport.new(@battler, self, :shield)
  1307.       return unless @battler && !@battler.actor? && @battler.enemy.show_gauge
  1308.       @percent_gauge_viewport = Enemy_HP_Gauge_Viewport.new(@battler, self,
  1309.       :percent)
  1310.     end
  1311.  
  1312.     def dispose_enemy_gauges
  1313.       @back_gauge_viewport.dispose unless @back_gauge_viewport.nil?
  1314.       @hp_gauge_viewport.dispose unless @hp_gauge_viewport.nil?
  1315.       @shield_gauge_viewport.dispose unless @shield_gauge_viewport.nil?
  1316.       @percent_gauge_viewport.dispose if @percent_gauge_viewport
  1317.     end
  1318.  
  1319.     def update_enemy_gauges
  1320.       @back_gauge_viewport.update unless @back_gauge_viewport.nil?
  1321.       @hp_gauge_viewport.update unless @hp_gauge_viewport.nil?
  1322.       @shield_gauge_viewport.update unless @shield_gauge_viewport.nil?
  1323.       @percent_gauge_viewport.update if @percent_gauge_viewport
  1324.     end
  1325.  
  1326.     def update_enemy_gauge_value
  1327.       @back_gauge_viewport.new_hp_updates unless @back_gauge_viewport.nil?
  1328.       @hp_gauge_viewport.new_hp_updates unless @hp_gauge_viewport.nil?
  1329.       @shield_gauge_viewport.new_hp_updates unless @shield_gauge_viewport.nil?
  1330.       @percent_gauge_viewport.new_hp_updates if @percent_gauge_viewport
  1331.     end
  1332.  
  1333.   end
  1334.  
  1335.   end
  1336.  
  1337.  
  1338.  
  1339.  
  1340.  
  1341.   class Sprite_Battler
  1342.     alias ex_initialize initialize
  1343.     def initialize(viewport, battler = nil)
  1344.       ex_initialize(viewport, battler)
  1345.     end
  1346.     alias ex_update update
  1347.     def update
  1348.       ex_update
  1349.       return if self.class == Sprite_Battler_Ex
  1350.       return if @battler == nil
  1351.       return if @battler.ex_sprite == {}
  1352.       @battler.ex_sprite.each_value  {|sprite| sprite.update}
  1353.     end
  1354.     alias s_start_effect start_effect
  1355.     def start_effect(effect_type)
  1356.       s_start_effect(effect_type)
  1357.       return if self.class == Sprite_Battler_Ex
  1358.       return if @battler == nil
  1359.       @battler.ex_sprite.each_value  {|sprite| sprite.start_effect(effect_type) } unless @battler.ex_sprite == []
  1360.     end
  1361.     alias s_dispose dispose
  1362.     def dispose
  1363.       s_dispose
  1364.       return if self.class == Sprite_Battler_Ex
  1365.       return if @battler == nil
  1366.       @battler.ex_sprite.each_value  {|sprite| sprite.dispose }  unless @battler.ex_sprite == []
  1367.  
  1368.     end
  1369.   end
  1370.  
  1371.  
  1372.   class Sprite_Battler_Ex < Sprite_Battler
  1373.     def initialize(viewport,sprite,battler)
  1374.       super(viewport)
  1375.       @battler = battler
  1376.       @sprite = sprite
  1377.       @icon = @sprite.icon
  1378.       @opacity = @sprite.opacity
  1379.       @dx = @sprite.dx
  1380.       @dy = @sprite.dy
  1381.       @dz = @sprite.dz
  1382.       @begin = @sprite.begin
  1383.       @exist = @sprite.exist
  1384.       @end = @sprite.end
  1385.       @visible = false
  1386.       @live = true
  1387.       @path = "Graphics/Battlers/"
  1388.       appear
  1389.     end
  1390.     def appear
  1391.       if @sprite.begin != nil
  1392.         start_animation(@sprite.begin[0], @sprite.begin[1])
  1393.       else
  1394.         start_effect(:appear)
  1395.       end
  1396.     end
  1397.     def dispose
  1398.       bitmap.dispose if bitmap
  1399.       super
  1400.     end
  1401.     def update
  1402.       super
  1403.       update_exist
  1404.       update_bitmap
  1405.       update_origin
  1406.       update_position
  1407.       update_effect
  1408.       update_kill
  1409.     end
  1410.     def update_exist
  1411.       if @sprite.exist != nil
  1412.         start_animation(@sprite.exist[0], @sprite.exist[1]) unless animation?
  1413.       end
  1414.     end
  1415.     def update_kill
  1416.       return if @live == true
  1417.       @live -= 1
  1418.       dispose if @live == 0
  1419.     end
  1420.     def kill
  1421.       @life = 60
  1422.       if @end != nil
  1423.         start_animation(@end[0], @end[1])
  1424.       end
  1425.       start_effect(:disappear)
  1426.     end
  1427.     def update_bitmap
  1428.       new_bitmap = Cache.load_bitmap(@path,@icon[0],@icon[1])
  1429.       if bitmap != new_bitmap
  1430.         self.bitmap = new_bitmap
  1431.         init_visibility
  1432.       end
  1433.     end
  1434.     def init_visibility
  1435.       @battler_visible = @battler.alive?
  1436.       self.opacity = 0 unless @battler_visible
  1437.     end
  1438.     def update_position
  1439.       self.x = @battler.screen_x + @sprite.dx
  1440.       self.y = @battler.screen_y + @sprite.dy
  1441.       self.z = @battler.screen_z + @sprite.dz
  1442.     end
  1443.     def revert_to_normal
  1444.       self.blend_type = 0
  1445.       self.color.set(0, 0, 0, 0)
  1446.       self.opacity = @sprite.opacity
  1447.       self.ox = bitmap.width / 2 if bitmap
  1448.       self.src_rect.y = 0
  1449.     end
  1450.  
  1451.  
  1452.   end
  1453. class Game_Enemy
  1454.   def shield_refresh
  1455.     sprite.update_enemy_gauge_value
  1456.     super
  1457.   end
  1458. end
  1459. class Game_Actor
  1460.   def shield_refresh
  1461.     SceneManager.scene.refresh_status if $game_party.in_battle
  1462.     super
  1463.   end
  1464. end
回复

使用道具 举报

Lv2.观梦者

梦石
0
星屑
877
在线时间
195 小时
注册时间
2019-4-11
帖子
56
3
 楼主| 发表于 2021-7-27 20:15:47 | 只看该作者
一般通过鸦天狗 发表于 2021-7-18 03:40
加了一点新功能,解除护盾
持续的最大时间是life变量
status是护盾存在期间持有者会自动带有的状态,别问为 ...

非常感谢!测试了一下确实成功了,不过好像有一点小bug?我先给自己上护盾,然后让敌人驱散,再到我的回合防御,就会报错了,似乎是因为没有@result.r_damage的值?不过靠unless @result.r_damage.nil?解决了,可能是我使用方法不对吧

点评

不好意思,把函数名写错了 修改后的代码放在二楼了,那个变量是用来计算穿盾伤害的,将369行的r_damage改为real_damage即可  发表于 2021-7-27 22:11
回复

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2024-4-29 08:00

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

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