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

Project1

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

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

[复制链接]

Lv2.观梦者

梦石
0
星屑
635
在线时间
24 小时
注册时间
2020-4-22
帖子
29
跳转到指定楼层
1
发表于 2020-10-6 19:39:09 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

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

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

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

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

护盾系统,是一种rm里不存在,在其他游戏里却又非常常见的东西
萌新拙作,还望大佬提出指导意见

评分

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

查看全部评分

Lv3.寻梦者

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

使用道具 举报

Lv2.观梦者

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

是一个bug
下个版本和其他bug一起修吧
回复 支持 反对

使用道具 举报

Lv3.寻梦者

梦石
0
星屑
2668
在线时间
357 小时
注册时间
2015-1-29
帖子
13
4
发表于 2020-10-10 20:31:34 | 只看该作者
本帖最后由 SmallDrop 于 2022-7-17 17:22 编辑

牛啤
回复 支持 反对

使用道具 举报

Lv2.观梦者

梦石
0
星屑
635
在线时间
24 小时
注册时间
2020-4-22
帖子
29
5
 楼主| 发表于 2020-10-17 10:38:58 | 只看该作者
本帖最后由 一般通过鸦天狗 于 2020-11-14 21:52 编辑

11月14日更新

>修复了若干bug
回复 支持 反对

使用道具 举报

Lv3.寻梦者

梦石
0
星屑
2487
在线时间
214 小时
注册时间
2017-9-27
帖子
613
6
发表于 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
浅尝辄止,宜乎众矣。
回复 支持 反对

使用道具 举报

Lv3.寻梦者

梦石
0
星屑
2323
在线时间
274 小时
注册时间
2017-7-25
帖子
163
7
发表于 2020-11-5 13:33:41 | 只看该作者
好东西……不过护盾颜色设置能不能给个例子,我这盾数据是正常的就是怎样都看不见盾条

点评

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

使用道具 举报

Lv2.观梦者

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

测试用的
因为比较直观
回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
55
在线时间
2 小时
注册时间
2020-1-23
帖子
7
9
发表于 2021-5-27 01:48:49 | 只看该作者
附件不见了,希望补档,直观验证效果。
回复 支持 反对

使用道具 举报

Lv3.寻梦者

梦石
0
星屑
1718
在线时间
395 小时
注册时间
2017-11-24
帖子
108
10
发表于 2021-5-27 14:29:45 | 只看该作者
66666666666666666
回复 支持 反对

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2024-4-24 05:10

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

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