=begin
护盾系统
by 炽天之咸鱼裁决
本插件基于yanfly引擎编写,没有yanfly也可运行,但是视觉效果会大打折扣
使用方法:此页面手动创建护盾类型,在技能或物品的备注栏调用
<addshield: x(,y,z...)> 为目标添加以下id的护盾
<shielddamage: "(技能公式)"> 用self替换b,用user替换a.技能仅对目标护盾造成此数值的伤害
<realdamage: "(技能公式)"> 用self替换b,用user替换a,技能对目标造成无视护盾的此数值的伤害
<shield_cancel: x&y-z(,a&b-c)>
x表示消除的护盾编号,使用&隔开,可以输入all无视类型消除
z表示单次消除护盾数量的上限,用inf表示无限次
(新)现在可以使用技能驱散护盾
(新)增加了画面的刷新
护盾参数,除数值外,不需要则无需填写
value:护盾数值,不能为空
status:数组,附加状态,代码来自Ninjamida
fade:护盾每回合增长数值(负数为减少数值)
max:护盾自然增长的最大值
cansave:若为false,脱战后不可保留
protect:若为true,则在破碎后防止额外的伤害
no:编号,拥有编号的护盾生成时会顶替掉同编号的
life:护盾持续最大回合数
death参数已被移除
disappear:字符串,护盾由于击破以外的原因消失后执行以下代码
broken:字符串,护盾被击破后执行以下代码
battlecry:字符串,护盾生成后执行以下代码
element:数组,护盾只对以下属性的伤害有作用
color1/2:color 盾条颜色
heal:布尔,若值为true则治疗量会被转化为盾量
add:布尔,若值为true则新护盾会继承原有同编号护盾的所有属性
hp_heal:(支持使用技能公式)每回合为持有者恢复此数值的hp,负数则为减少
mp_heal:(支持使用技能公式)每回合为持有者恢复此数值的mp,负数则为减少
tp_heal:(支持使用技能公式)每回合为持有者恢复此数值的tp,负数则为减少
onlyattack:若值为true,则无法防御状态造成的伤害
icon:护盾图像的编号
(新)uncancel:开启时不能被驱散
=end
module SHIELD
TAKE_DAM= "吸收"
HP_HEAL = "护盾恢复"
HP_DAM = "护盾反噬"
MP_HEAL = "护盾恢复"
MP_DAM = "护盾反噬"
TP_HEAL = "护盾恢复"
TP_DAM = "护盾反噬"
FADE = "护盾衰减"
BREAK = "护盾破碎"
DISAPPEAR = "护盾消失"
REFRESH = "护盾刷新"
NEW = "护盾"
ADD = "护盾补充"
PROTECT = "保护"
GET_DAM= "吸收"
S_DAM = "碎盾"
R_DAM = "真实伤害"
CANCEL = "驱散"
end
class Battler_shield
attr_accessor :value
attr_accessor :status
attr_accessor :fade
attr_accessor :cansave
attr_accessor :protect
attr_accessor :no
attr_accessor :max
attr_accessor :life
attr_accessor :disappear
attr_accessor :broken
attr_accessor :color1
attr_accessor :color2
attr_accessor :battlecry
attr_accessor :element
attr_accessor :heal
attr_accessor :add
attr_accessor :hp_heal
attr_accessor :mp_heal
attr_accessor :tp_heal
attr_accessor :onlyattack
attr_accessor :icon
attr_accessor :uncancel
def initialize(type,user,target)
@user = user
@target = target
case type
#以如下格式创建自定义的护盾
when 1
@value = user.mhp - user.hp + 30
@max = 0
@cansave = false
@protect = false
@no = 1
@life = 5
@add = true
@onlyattack = true
when 2
@value = user.mhp * 0.25 - user.hp * 0.25 + 200 .to_i
@max = 0
@cansave = false
@protect = false
@no = 1
@life = 5
@add = true
@onlyattack = true
when 3
@value = 10
@max = 0
@cansave = false
@protect = false
@no = 1
@life = 999
@add = true
@onlyattack = true
when 4
@value = 1000
@max = 0
@cansave = false
@protect = true
@no = 1
@life = 7
@add = true
@onlyattack = true
when 5
@value = 30
@max = 0
@cansave = false
@protect = true
@no = 1
@life = 3
@add = true
@onlyattack = true
when 6
@value = 1
@max = 0
@cansave = false
@protect = true
@no = 1
@life = 2
@add = true
@onlyattack = true
when 7
@value = @user.hp/4
@cansave = false
when 8
@value = 1
@protect = true
@cansave = false
end
##################################
msgbox("护盾值不能为空") if @value == nil
@value = @value.to_i
end
end
class Sprite_Seed#伴生精灵参数
attr_accessor :icon#图像与色调
attr_accessor :dx#相对战斗者的x值
attr_accessor :dy#相对战斗者的y值
attr_accessor :dz#相对战斗者的z值
attr_accessor :opacity#透明度
attr_accessor :begin#入场动画id
attr_accessor :exist#持续时播放的动画id
attr_accessor :end#退场动画id
def initialize(n)
case n
when 1
@icon = ["terry.png",0]
@dx = 0
@dy = 0
@dz = 0
@opacity = 100
end
end
end
#############################################################################
class RPG::BaseItem
attr_accessor :shield
def shield
if @shield.nil?
@shield = []
if @note =~ /<addshield:[ ](.*)>/i
for x in $1.split(",")
@shield += [x.to_i]
end
end
end
@shield
end
def shield_damage
if @s_damage.nil?
@s_damage = 0
if @note =~ /<shielddamage:[ ](.*)>/i
@s_damage = $1.to_s
end
end
@s_damage
end
def real_damage
if @r_damage.nil?
@r_damage = 0
if @note =~ /<realdamage:[ ](.*)>/i
@r_damage = $1.to_s
end
end
@r_damage
end
def shield_cancel
if @shield_cancel.nil?
@shield_cancel = {}
if @note =~ /<shield_cancel:[ ](.*)>/i
lines = $1.to_s.split(",")
lines.each{|s|
list = s.split("-")
if list.size == 2
k = list[0].delete(" ").split("&")
v = list[1].delete(" ")
@shield_cancel[k] = v
end
}
end
end
@shield_cancel
end
end
###############来自Ninjamida#######################
class RPG::BaseItem
def auto_states
if @auto_states.nil?
@auto_states = []
if @note =~ /<auto state:[ ](.*)>/i
for x in $1.split(",")
@auto_states += [x.to_i]
end
end
end
@auto_states
end
end
class Game_Actor < Game_Battler
def auto_states
autostates = self.class.auto_states + actor.auto_states
equips.each do |eq|
autostates += eq.auto_states unless eq.nil?
end
states.each do |st|
autostates += st.auto_states
end
@shield.each{|i|
autostates += i.status if i.status != nil
}
autostates = autostates.uniq
return autostates
end
def shield_init
return if @shield
@shield = []
@ex_sprite = {}
@s = 0
end
end
class Game_Enemy < Game_Battler
def auto_states
autostates = enemy.auto_states
states.each do |st|
autostates += st.auto_states
end
@shield.each{|i|
autostates += i.status if i.status != nil
}
autostates = autostates.uniq
return autostates
end
end
class Scene_Battle
alias s_auto_state_battle_start battle_start
def battle_start
s_auto_state_battle_start
$game_party.members.each{|mem|
mem.add_auto_states
status_redraw_target(mem) if $imported["YEA-BattleEngine"]
}
end
end
class Game_Battler
alias s_auto_states_initialize initialize
def initialize
s_auto_states_initialize
@old_auto_states = []
end
def add_auto_states
return if state?(death_state_id)
auto_states.each do |st|
if not state?(st)
add_state(st)
@state_turns[st] = -1
end
end
end
def remove_old_auto_states
auto_states.each do |as|
@old_auto_states.delete(as)
end
@old_auto_states.each do |oas|
remove_state(oas)
end
@old_auto_states = auto_states
end
alias s_auto_state_item_effect_remove_state item_effect_remove_state
def item_effect_remove_state(user, item, effect)
s_auto_state_item_effect_remove_state(user, item, effect) unless auto_states.include?(effect.data_id)
end
alias s_auto_state_refresh refresh
def refresh
s_auto_state_refresh
add_auto_states
remove_old_auto_states
end
end
###############################################################
class Game_ActionResult
attr_accessor :s_damage
attr_accessor :r_damage
attr_accessor :shield_cancel
alias s_clear_damage_values clear_damage_values
def clear_damage_values
s_clear_damage_values
@s_damage = 0
@r_damage = 0
@shield_cancel = {}
end
alias s_make_damage make_damage
def make_damage(value, item)
s_make_damage(value, item)
@s_damage = item.shield_damage
@r_damage = item.real_damage
@shield_cancel = item.shield_cancel
end
end
class Game_BattlerBase
attr_accessor :shield
attr_accessor :ex_sprite
$imported = {} if $imported.nil?
if $imported["YEA-BattleEngine"]
alias shieldmake_damage_popups make_damage_popups
def make_damage_popups(user)
if @useshield != nil
if @t_damage > 0
if @protect != nil
text = SHIELD::PROTECT
rules = "HP_HEL"
@protect = nil
else
text = SHIELD::GET_DAM
rules = "HP_DMG"
end
create_popup(text, rules)
value = @t_damage.abs
rules = "MP_DMG"
text = sprintf("%s", value.group)
create_popup(text, rules)
elsif @t_damage < 0
text = SHIELD::ADD
rules = "HP_HEL"
@protect = nil
create_popup(text, rules)
value = @t_damage.abs
rules = "MP_DMG"
text = sprintf(+"%s", value.group)
create_popup(text, rules)
end
end
if @result.s_damage != 0
text = SHIELD::S_DAM
rules = "HP_DMG"
create_popup(text, rules)
value = @result.s_damage
text = sprintf("%s", value)
create_popup(text, rules)
@result.s_damage = 0
end
if @result.r_damage != 0
text = SHIELD::R_DAM
rules = "HP_DMG"
create_popup(text, rules)
value = @result.r_damage
text = sprintf("%s", value)
create_popup(text, rules)
@result.r_damage = 0
end
shieldmake_damage_popups(user)
@t_damage = 0
end
def make_miss_popups(user, item)
return if dead?
if @result.missed && item.shield == []
text = YEA::BATTLE::POPUP_SETTINGS[:missed]
rules = "DEFAULT"
create_popup(text, rules)
end
if @result.evaded && item.shield == []
text = YEA::BATTLE::POPUP_SETTINGS[:evaded]
rules = "DEFAULT"
create_popup(text, rules)
end
if @result.hit? && !@result.success && item.shield == []
text = YEA::BATTLE::POPUP_SETTINGS[:failed]
rules = "DEFAULT"
create_popup(text, rules)
end
if @result.hit? && item.damage.to_hp? && @useshield == nil && item.shield == []
if @result.hp_damage == 0 && @result.hp_damage == 0
text = YEA::BATTLE::POPUP_SETTINGS[:nulled]
rules = "DEFAULT"
create_popup(text, rules)
end
end
@useshield = nil
end
end
def shield_add(a,b)
b.value += a.value
b.status += a.status if b.status != nil and a.status != nil
b.status = a.status if b.status == nil
b.element += a.element if b.element != nil and a.element != nil
b.element = a.element if b.element == nil
b.fade += a.fade if b.fade != nil and a.fade != nil
b.fade = a.fade if b.fade == nil
b.cansave = false if a.cansave == false
b.protect = true if a.protect == true
b.max = a.max if b.max == nil
b.life += a.life if b.life != nil and a.life != nil
b.life = a.life if b.life == nil
b.disappear = "#{a.disappear};#{b.disappear}" if b.disappear != nil and a.disappear != nil
b.disappear = a.disappear if b.disappear == nil
b.broken = "#{a.broken};#{b.broken}" if b.broken != nil and a.broken != nil
b.broken = a.broken if b.broken == nil
b.color1 = a.color1 if a.color1
b.color2 = a.color2 if a.color2
b.heal = true if a.heal == true
b.hp_heal += a.hp_heal if b.hp_heal != nil and a.hp_heal != nil
b.hp_heal = a.hp_heal if b.hp_heal == nil
b.mp_heal += a.mp_heal if b.mp_heal != nil and a.mp_heal != nil
b.mp_heal = a.mp_heal if b.mp_heal == nil
b.tp_heal += a.tp_heal if b.tp_heal != nil and a.tp_heal != nil
b.tp_heal = a.tp_heal if b.tp_heal == nil
end
def s
sv = 0
@shield.each{|i|
sv += i.value
}
return sv
end
def shield_init
return if @shield
@shield = []
@ex_sprite = {}
@s = 0
end
alias initializewithshield initialize
def initialize
initializewithshield
shield_init
end
def nocheck(no)
@shield.each_index{|i|
if @shield[i].no == no
@shield.delete_at(i)
break
end
}
end
def shieldtotal
n = 0
@shield.each{|i|
n += i.value}
return n
end
def draw_bar_rate
a = []
b = draw_hp_rate
a << b
s = 1 - b
t = shieldtotal
@shield.each{|i|
r = s * i.value.to_f / t
a << r }
return a
end
def shield_bar_rate
a = []
b = draw_hp_rate
s = 1 - b
t = shieldtotal
@shield.each{|i|
r = s * i.value.to_f / t
a << r }
return a
end
def shield_rate
s = shieldtotal
if @hp + s <= mhp
return s.to_f / mhp
else
return s.to_f / (s + @hp).to_f
end
end
def draw_hp_rate
s = shieldtotal
if @hp + s <= mhp
return @hp.to_f / mhp
else
return @hp.to_f / (s + @hp).to_f
end
end
def draw_shield_rate
s = shieldtotal
if @hp + s <= mhp
return s.to_f / (mhp - @hp)
else
return 1
end
end
end
class Game_Battler < Game_BattlerBase
def shield_heal
shield_hp_heal
shield_mp_heal
shield_tp_heal
end
def shield_hp_heal
@shield.each_index{|i|
if @shield[i].hp_heal != nil
value = @shield[i].hp_heal
value = self.mhp - @hp if (@hp + value) > self.mhp
value = @hp if (@hp + value) < 0
if $imported["YEA-BattleEngine"]
if value > 0
rules = "HP_HEL"
text = SHIELD::HP_HEAL
create_popup(text, rules)
text = "+#{value}"
create_popup(text, rules)
elsif value < 0
rules = "HP_DMG"
text = SHIELD::HP_DAM
create_popup(text, rules)
text = "-#{-value}"
create_popup(text, rules)
end
end
@hp += value
end
}
end
def shield_mp_heal
@shield.each_index{|i|
if @shield[i].mp_heal != nil
value = @shield[i].mp_heal
value = @self.mmp - @mp if (@mp + value) > self.mmp
value = @mp if (@mp + value) < 0
if $imported["YEA-BattleEngine"]
if value > 0
rules = "MP_HEL"
text = SHIELD::MP_HEAL
create_popup(text, rules)
text = "+#{value}"
create_popup(text, rules)
elsif value < 0
rules = "MP_DMG"
text = SHIELD::MP_DAM
create_popup(text, rules)
text = "-#{-value}"
create_popup(text, rules)
end
end
@mp += value
end
}
end
def shield_tp_heal
@shield.each_index{|i|
if @shield[i].tp_heal != nil
value = @shield[i].tp_heal
value = 100 - @tp if (@tp + value) > 100
value = @tp if (@tp + value) < 0
if $imported["YEA-BattleEngine"]
if value > 0
rules = "MP_HEL"
text = SHIELD::TP_HEAL
create_popup(text, rules)
text = "+#{value}"
create_popup(text, rules)
elsif value < 0
rules = "MP_DMG"
text = SHIELD::TP_DAM
create_popup(text, rules)
text = "-#{-value}"
create_popup(text, rules)
end
end
@tp += value
end
}
end
alias shieldon_turn_end on_turn_end
def on_turn_end
shield_heal
s = @shield.size - 1
i = 0
while i <= s
fade = @shield[i].fade
if fade != nil and fade != 0
if @shield[i].max != nil
ts = @shield[i].value + fade
if @shield[i].max > @shield[i].value
fade = @shield[i].max - @shield[i].value if ts > @shield[i].max
else
fade = 0
end
end
rules = "MP_DMG"
text = SHIELD::FADE
create_popup(text, rules) if $imported["YEA-BattleEngine"]
text = sprintf(+"%s", fade) if fade > 0
text = sprintf("%s", fade) if fade < 0
create_popup(text, rules) if $imported["YEA-BattleEngine"]
@shield[i].value += fade
end
life = @shield[i].life
if life != nil
@shield[i].life -= 1
end
if @shield[i].value <= 0 or @shield[i].life == 0
shielddisappear(i)
i -= 1
s = @shield.size - 1
end
i += 1
end
shieldon_turn_end
end
def addshield(item,user,target)
return if item.shield == nil
item.shield.each{|i|
s = Battler_shield.new(i,user,target)
if s.no != nil
@shield.each_index{|i|
if @shield[i].no == s.no
shield_add(@shield[i],s) if @shield[i].add == true or s.add == true
@ex_sprite[@shield[i]].kill unless @shield[i].icon.nil?
@shield.delete_at(i)
@s_fresh = true
break
end
}
end
if self.class == Game_Enemy
scene = SceneManager.scene.spriteset.viewport1
else
scene = nil
end
@ex_sprite[s]=Sprite_Battler_Ex.new(scene,Sprite_Seed.new(s.icon),self) unless s.icon.nil?
@s_value << s.value
@shield << s
eval s.battlecry if s.battlecry != nil
}
if $imported["YEA-BattleEngine"]
if @s_value != [] and @s_value != nil
if @s_fresh != nil
text = SHIELD::REFRESH
rules = "HP_HEL"
create_popup(text, rules)
@s_fresh = nil
else
text = SHIELD::NEW
rules = "HP_DMG"
create_popup(text, rules)
end
@s_value.each{|i|
value = i.abs
text = sprintf("%s", value.group)
create_popup(text, rules)
}
@s_value = []
end
end
shield_refresh
end
def shield_refresh
SceneManager.scene.update_basic
refresh
end
def shielddisappear(i)
$imported = {} if $imported.nil?
if $imported["YEA-BattleEngine"]
if @shield[i].value == 0
rules = "HP_DMG"
text = SHIELD::BREAK
create_popup(text, rules) if $imported["YEA-BattleEngine"]
else
rules = "HP_DMG"
text = SHIELD::DISAPPEAR
create_popup(text, rules) if $imported["YEA-BattleEngine"]
end
end
if @shield[i].value == 0
eval @shield[i].broken if @shield[i].broken != nil
else
eval @shield[i].disappear if @shield[i].disappear != nil
end
@ex_sprite[@shield[i]].kill unless @shield[i].icon.nil?
@shield.delete_at(i)
end
def regenerate_hp #状态伤害
damage = -(mhp * hrg).to_i
perform_map_damage_effect if $game_party.in_battle && damage > 0
@result.hp_damage = [damage, max_slip_damage].min
state_shielduse
self.hp -= @result.hp_damage
end
def state_shielduse
return if @result.hp_damage == 0
if @result.hp_damage < 0
healshield
return
end
unless @shield.empty?
size = @shield.size
n = size - 1
while n >= 0
if @s_invalid.include?(n)
n -= 1
next
end
if @shield[n].onlyattack == true
n -= 1
next
end
@result.hp_damage -= @shield[n].value
if @result.hp_damage >= 0 #碎盾
if @shield[n].protect == true
@result.hp_damage = 0
@protect = true
end #碎盾保护
@t_damage += @shield[n].value
shielddisappear(n)
else #未碎盾
@t_damage += @shield[n].value
@t_damage += @result.hp_damage
@shield[n].value = -@result.hp_damage
@result.hp_damage = 0
end
break if @result.hp_damage == 0
n -= 1
end
@useshield = true if @t_damage != 0
end
end
def shielddamage
return if @result.s_damage == 0
@result.s_damage = 0 if @shield.empty?
unless @shield.empty?
dam = @result.s_damage
size = @shield.size
n = size - 1
while n >= 0
@result.s_damage -= @shield[n].value
if @result.s_damage >= 0 #碎盾
@s_damage += @shield[n].value
@shield.delete_at(n)
else #未碎盾
@s_damage += @shield[n].value
@s_damage += @result.s_damage
@shield[n].value = -@result.s_damage
@result.s_damage = 0
end
break if @result.s_damage == 0
n -= 1
end
@result.s_damage = 0 if @result.s_damage < 0
@result.s_damage = dam - @result.s_damage
end
end
def healshield
unless @shield.empty?
size = @shield.size
n = size - 1
while n >= 0
if @shield[n].heal == true
@shield[n].value -= @result.hp_damage
@t_damage = -@result.hp_damage
@result.hp_damage = 0
return
end
n -= 1
end
end
end
def useshield
shielddamage
return if @result.hp_damage == 0
if @result.hp_damage < 0
healshield
return
end
unless @shield.empty?
size = @shield.size
n = size - 1
while n >= 0
if @s_invalid.include?(n)
n -= 1
next
end
@result.hp_damage -= @shield[n].value
if @result.hp_damage >= 0 #碎盾
if @shield[n].protect == true
@result.hp_damage = 0
@protect = true
end #碎盾保护
@t_damage += @shield[n].value
shielddisappear(n)
else #未碎盾
@t_damage += @shield[n].value
@t_damage += @result.hp_damage
@shield[n].value = -@result.hp_damage
@result.hp_damage = 0
end
break if @result.hp_damage == 0
n -= 1
end
@useshield = true if @t_damage != 0
end
end
def s_invalid(user, item)
@s_invalid = []
return if item.damage == nil
@shield.each_index{|n|
if @shield[n].element != nil
@shield[n].element.each{|i|
@s_invalid << n unless user.atk_elements.include?(i) or item.damage.element_id == i
}
end
}
end
def item_element(i)
if item.damage.element_id < 0
user.atk_elements
else
item.damage.element_id
end
end
alias item_applyshield item_apply
def item_apply(user, item)
@s_value = []
cancel_shield(user, item)
s_invalid(user, item)
addshield(item,user,self)
#make_damage_popups(user)
item_applyshield(user, item)
end
def cancel_shield(user, item)
list = item.shield_cancel
return if list.empty?
list.each{|k,v|
counter = 0
ok = false
while !ok
shield = find_shield_to_cancel(k)
if shield
@shield.delete(shield)
popup_cancel_shield
counter += 1
if v != "inf"
ok = true if counter >= v.to_i
end
else
ok = true
end
end
}
end
def popup_cancel_shield
return unless $imported["YEA-BattleEngine"]
text = SHIELD::CANCEL
rules = "CRITICAL"
create_popup(text,rules)
end
def find_shield_to_cancel(list)
@shield.each{|s|
return s if check_shield_cancel(s,list)
}
return false
end
def check_shield_cancel(shield,list)
return false if shield.uncancel
list.each{|l|
return true if l == "all"
next unless shield.no
return true if l.to_i == shield.no
}
end
alias s_make_damage_value make_damage_value
def make_damage_value(user, item)
s_make_damage_value(user, item)
r = eval(item.real_damage.to_s)
@result.r_damage = r.to_i
s = eval(item.s_damage.to_s)
@result.s_damage = s.to_i
end
alias execute_damagewithshield execute_damage
def execute_damage(user)
@t_damage = 0
@s_damage = 0
useshield
self.hp -= [@result.r_damage,self.hp].min
execute_damagewithshield(user)
end
alias shieldon_battle_end on_battle_end
def on_battle_end
shieldon_battle_end
s = @shield.size - 1
i = 0
while i <= s
if @shield[i].cansave == false
shielddisappear(i)
i -= 1
s = @shield.size - 1
end
i += 1
end
end
end
class Window_BattleStatus
def shield_gauge_color1; text_color(0); end;
def shield_gauge_color2; text_color(8); end;
def draw_actor_hp(actor, dx, dy, width = 124)
s = actor.shieldtotal
draw_gauge(dx, dy, width, actor.draw_hp_rate, hp_gauge_color1, hp_gauge_color2)
draw_actor_shield(actor, dx + width * actor.draw_hp_rate , dy, width)
cy = (Font.default_size - contents.font.size) / 2 + 1
draw_text(dx+2, dy+cy, 30, line_height, Vocab::hp_a)
draw_current_and_max_values(dx, dy+cy, width, actor.hp, actor.mhp,
hp_color(actor), normal_color)
end
def draw_actor_shield(actor, dx, dy, width = 124)
actor.shield.each{|i|
w = width.to_f * (1- actor.draw_hp_rate) * actor.draw_shield_rate * i.value / actor.shieldtotal
c1 = i.color1 ? i.color1 : shield_gauge_color1
c2 = i.color2 ? i.color2 : shield_gauge_color2
draw_gauge(dx, dy, w , 1, c1, c2)
dx += w
}
change_color(system_color)
end
end
class Window_Base
def shield_gauge_color1; text_color(0); end;
def shield_gauge_color2; text_color(8); end;
def draw_actor_hp(actor, dx, dy, width = 124)
s = actor.shieldtotal
draw_gauge(dx, dy, width, actor.draw_hp_rate, hp_gauge_color1, hp_gauge_color2)
draw_actor_shield(actor, dx + width * actor.draw_hp_rate , dy, width)
cy = (Font.default_size - contents.font.size) / 2 + 1
draw_text(dx+2, dy+cy, 30, line_height, Vocab::hp_a)
draw_current_and_max_values(dx, dy+cy, width, actor.hp, actor.mhp,
hp_color(actor), normal_color)
end
def draw_actor_shield(actor, dx, dy, width = 124)
actor.shield.each{|i|
w = width.to_f * (1- actor.draw_hp_rate) * actor.draw_shield_rate * i.value / actor.shieldtotal
c1 = i.color1 ? i.color1 : shield_gauge_color1
c2 = i.color2 ? i.color2 : shield_gauge_color2
draw_gauge(dx, dy, w , 1, c1, c2)
dx += w
}
change_color(system_color)
end
end
#######来自yanfly与DoubleX#############
$imported = {} if $imported.nil?
if $imported["YEA-EnemyHPBars"] and $imported["DoubleX RMVXA Percentage Addon to YEA-EnemyHPBars"]
class Enemy_HP_Gauge_Viewport < Viewport
def initialize(battler, sprite, type)
@battler = battler
@base_sprite = sprite
@type = type
dw = YEA::BATTLE::ENEMY_GAUGE_WIDTH
if @type == :percent && FIX_LARGE_TEXT
dh = [TEXT_SIZE, YEA::BATTLE::ENEMY_GAUGE_HEIGHT].max
else
dh = YEA::BATTLE::ENEMY_GAUGE_HEIGHT
end
if @type != :hp and @type != :shield
dw += 2
dh += 2
end
@start_width = dw
rect = Rect.new(0, 0, dw, dh)
@current_hp = @battler.hp
@current_mhp = @battler.mhp
@current_hr = @battler.draw_hp_rate
@current_sr = @battler.shield_bar_rate
@target_gauge_width = target_gauge_width
@gauge_rate = @current_hr
setup_original_hide_gauge
super(rect)
self.z = 125
create_gauge_sprites
self.visible = false
update_position
self.rect.width = @gauge_width if @type == :hp
end
def target_gauge_rate
return @current_hr
end
def target_gauge_width
return [@current_hr * @start_width, @start_width].min
end
def update_gauge
unless @gauge_width == @target_gauge_width
rate = 3
@target_gauge_width = target_gauge_width
if @gauge_width > @target_gauge_width
@gauge_width = [@gauge_width - rate, @target_gauge_width].max
elsif @gauge_width < @target_gauge_width
@gauge_width = [@gauge_width + rate, @target_gauge_width].min
end
@visible_counter = @gauge_width == 0 ? 10 : 60
rect.width = @gauge_width if @type == :hp
end
shield_update
end
def new_hp_updates
return if @current_hr == @battler.draw_hp_rate and @current_sr == @battler.shield_bar_rate
@current_hp = @battler.hp
@current_mhp = @battler.mhp
@current_hr = @battler.draw_hp_rate
return if @gauge_rate == target_gauge_rate
@gauge_rate = target_gauge_rate
@target_gauge_width = target_gauge_width
@visible_counter = 60
end
def update_percentage
return if @last_hp == @current_hp
@last_hp = @current_hp
set_percentage_font
if ACTUAL_NUMBER
percent = @current_hp.to_i.to_s
else
percent = "#{(@current_hp.to_f / @current_mhp.to_f * 100).to_i.to_s}%"
end
dw = @sprite.bitmap.text_size(percent).width
@sprite.bitmap.clear
@sprite.bitmap.draw_text(YEA::BATTLE::ENEMY_GAUGE_WIDTH + 2 - dw, 1, dw,
@sprite.bitmap.text_size(percent).height, percent)
end
def create_gauge_sprites
@sprite = Plane.new(self)
@sprite.bitmap = Bitmap.new(rect.width * 4, rect.height)
enemy = @battler.enemy
if @type == :back
colour = Colour.text_colour(enemy.back_gauge_colour)
colour1 = colour2 = colour
elsif @type == :hp
colour1 = Colour.text_colour(enemy.hp_gauge_colour1)
colour2 = Colour.text_colour(enemy.hp_gauge_colour2)
elsif @type == :percent
colour1 = colour2 = Color.new(0, 0, 0, 0)
end
dw = rect.width
dw *= @battler.draw_hp_rate
dh = rect.height
@gauge_width = target_gauge_width
if @type == :shield
new_shield
else
@sprite.bitmap.gradient_fill_rect(0, 0, dw, dh, colour1, colour2)
@sprite.bitmap.gradient_fill_rect(dw, 0, dw, dh, colour2, colour1)
end
@visible_counter = 0
end
def new_shield
return if @battler.shield == []
dh = rect.height
dx = @gauge_width
shield = @battler.shield
shield.each_index{|i|
dw = @start_width * @current_sr[i]
dw = @start_width - dx + 3 if i == shield.size - 1
c1 = shield[i].color1 ? shield[i].color1 : Colour.text_colour(0)
c2 = shield[i].color2 ? shield[i].color2 : Colour.text_colour(8)
@sprite.bitmap.gradient_fill_rect(dx, 0, dw, dh, c1, c2)
dx += dw
}
end
def shield_update
if @type == :shield and @battler.shield_bar_rate == []
@sprite.bitmap.clear
end
return if @current_sr == @battler.shield_bar_rate and @gauge_width == @target_gauge_width
@current_sr = @battler.shield_bar_rate
if @type == :shield
dx = @gauge_width
dh = rect.height
shield = @battler.shield
shield.each_index{|i|
dw = @start_width * @current_sr[i]
dw = @start_width - dx + 3 if i == shield.size - 1
c1 = shield[i].color1 ? shield[i].color1 : Colour.text_colour(0)
c2 = shield[i].color2 ? shield[i].color2 : Colour.text_colour(8)
@sprite.bitmap.gradient_fill_rect(dx, 0, dw, dh, c1, c2)
dx += dw
}
end
@visible_counter = 60
end
def update_position
dx = @battler.screen_x
dy = @battler.screen_y
@update_position = false
return if @last_x == dx && @last_y == dy
@last_x = dx
@last_y = dy
@update_position = true
dx -= @start_width / 2
if @type == :percent
dx += TEXT_X_OFFSET
dy += TEXT_Y_OFFSET
end
rect.x = dx
rect.y = dy
dh = rect.height + 1
dh += 2 if @type == :hp or @type == :shield
dy = [dy, Graphics.height - dh - 120].min
dy += 1 if @type == :hp or @type == :shield
#
rect.y = dy
end
end
class Sprite_Battler < Sprite_Base
def create_enemy_gauges
return if @battler.nil?
return if @battler.actor?
return unless @battler.enemy.show_gauge
@back_gauge_viewport = Enemy_HP_Gauge_Viewport.new(@battler, self, :back)
@hp_gauge_viewport = Enemy_HP_Gauge_Viewport.new(@battler, self, :hp)
@shield_gauge_viewport = Enemy_HP_Gauge_Viewport.new(@battler, self, :shield)
return unless @battler && !@battler.actor? && @battler.enemy.show_gauge
@percent_gauge_viewport = Enemy_HP_Gauge_Viewport.new(@battler, self,
:percent)
end
def dispose_enemy_gauges
@back_gauge_viewport.dispose unless @back_gauge_viewport.nil?
@hp_gauge_viewport.dispose unless @hp_gauge_viewport.nil?
@shield_gauge_viewport.dispose unless @shield_gauge_viewport.nil?
@percent_gauge_viewport.dispose if @percent_gauge_viewport
end
def update_enemy_gauges
@back_gauge_viewport.update unless @back_gauge_viewport.nil?
@hp_gauge_viewport.update unless @hp_gauge_viewport.nil?
@shield_gauge_viewport.update unless @shield_gauge_viewport.nil?
@percent_gauge_viewport.update if @percent_gauge_viewport
end
def update_enemy_gauge_value
@back_gauge_viewport.new_hp_updates unless @back_gauge_viewport.nil?
@hp_gauge_viewport.new_hp_updates unless @hp_gauge_viewport.nil?
@shield_gauge_viewport.new_hp_updates unless @shield_gauge_viewport.nil?
@percent_gauge_viewport.new_hp_updates if @percent_gauge_viewport
end
end
end
class Sprite_Battler
alias ex_initialize initialize
def initialize(viewport, battler = nil)
ex_initialize(viewport, battler)
end
alias ex_update update
def update
ex_update
return if self.class == Sprite_Battler_Ex
return if @battler == nil
return if @battler.ex_sprite == {}
@battler.ex_sprite.each_value {|sprite| sprite.update}
end
alias s_start_effect start_effect
def start_effect(effect_type)
s_start_effect(effect_type)
return if self.class == Sprite_Battler_Ex
return if @battler == nil
@battler.ex_sprite.each_value {|sprite| sprite.start_effect(effect_type) } unless @battler.ex_sprite == []
end
alias s_dispose dispose
def dispose
s_dispose
return if self.class == Sprite_Battler_Ex
return if @battler == nil
@battler.ex_sprite.each_value {|sprite| sprite.dispose } unless @battler.ex_sprite == []
end
end
class Sprite_Battler_Ex < Sprite_Battler
def initialize(viewport,sprite,battler)
super(viewport)
@battler = battler
@sprite = sprite
@icon = @sprite.icon
@opacity = @sprite.opacity
@dx = @sprite.dx
@dy = @sprite.dy
@dz = @sprite.dz
@begin = @sprite.begin
@exist = @sprite.exist
@end = @sprite.end
@visible = false
@live = true
@path = "Graphics/Battlers/"
appear
end
def appear
if @sprite.begin != nil
start_animation(@sprite.begin[0], @sprite.begin[1])
else
start_effect(:appear)
end
end
def dispose
bitmap.dispose if bitmap
super
end
def update
super
update_exist
update_bitmap
update_origin
update_position
update_effect
update_kill
end
def update_exist
if @sprite.exist != nil
start_animation(@sprite.exist[0], @sprite.exist[1]) unless animation?
end
end
def update_kill
return if @live == true
@live -= 1
dispose if @live == 0
end
def kill
@life = 60
if @end != nil
start_animation(@end[0], @end[1])
end
start_effect(:disappear)
end
def update_bitmap
new_bitmap = Cache.load_bitmap(@path,@icon[0],@icon[1])
if bitmap != new_bitmap
self.bitmap = new_bitmap
init_visibility
end
end
def init_visibility
@battler_visible = @battler.alive?
self.opacity = 0 unless @battler_visible
end
def update_position
self.x = @battler.screen_x + @sprite.dx
self.y = @battler.screen_y + @sprite.dy
self.z = @battler.screen_z + @sprite.dz
end
def revert_to_normal
self.blend_type = 0
self.color.set(0, 0, 0, 0)
self.opacity = @sprite.opacity
self.ox = bitmap.width / 2 if bitmap
self.src_rect.y = 0
end
end
class Game_Enemy
def shield_refresh
sprite.update_enemy_gauge_value
super
end
end
class Game_Actor
def shield_refresh
SceneManager.scene.refresh_status if $game_party.in_battle
super
end
end