#==============================================================================
# +++ 角色生命护盾 +++
#==============================================================================
# 作者 By 三途亚梦
# -- 本脚本来自 [url]https://rpg.blue[/url] 使用或转载请保留以上信息。
#==============================================================================
# 本脚本的作用是给玩家人物、敌人添加一个新的能力值“生命护盾”,
# 生命护盾会吸收该角色受到的来自技能造成的体力伤害。
#==============================================================================
#
# ★再次强调,生命护盾仅仅吸收来自“技能”造成的体力伤害!
# 这个脚本是针对SideView战斗系统做出兼容调整的版本,
# 使用请加载在SideView战斗系统的下方。
#
# ★人物的生命护盾是amuhsp,
# 可以以a.amuhsp的形式运用在伤害公式中,
# 也可以通过$game_actors[1].amuhsp之类的方式在事件中改变它的数值。
#
# ★HspClear = true 时,人物的生命护盾将在战斗结束时清零。
# 如果不想清零请将 true改为false
#
# ★HspNoAddition = true 时,
# 生命护盾的恢复将不享受恢复效果、物理及魔法伤害比率的加成,
# 但是会对 make_damage_value 的方法做出变更,略降低脚本的兼容性。
#
# 设定部分所有文字信息的描述方法修改时请保留“”引号。
#
# ★将技能设置成体力值恢复,并在技能备注栏备注“[护盾恢复]”,
# 那么这个技能将变成增加目标角色的生命护盾值
# ★备注的时候不需要写入“”引号
#
# 角色的生命护盾没有上限,下限为0
#
# 如果需要设置一个技能为角色体力值的10%,又不想令护盾无限的加下去
# 技能公式请参照这个写法:
# b.hp * 0.1 - b.amuhsp
#
#==============================================================================
# ★ 设定部分 ★
#==============================================================================
module Amu
module Hsp
HspClear = true #是否在战斗结束时清除掉玩家剩余的生命护盾
HspNoAddition = true #是否采用本脚本的计算伤害的方法
HspName = "生命护盾" #生命护盾的名字
HspABonus = "%s的%s剩余%s点!" #玩家人物的生命护盾损伤后显示剩余值的文字
HspEBonus = "%s的%s还剩%s点!" #敌人的生命护盾损伤后显示剩余值的文字
HspADamage = "%s的%s受到%s点伤害!" #玩家人物的生命护盾受到伤害的文字
HspEDamage = "%s的%s受到%s点伤害!" #敌人的生命护盾受到伤害的文字
HspARecovery = "%s获得了一个%s点的%s保护!" #玩家的生命护盾得到提高的文字
HspERecovery = "%s接受了一个%s点的%s保护!" #敌人的生命护盾得到提高的文字
HspADestory = "%s的%s受到%s点伤害而遭到击破!" #玩家的生命护盾被击破时的文字
HspEDestroy = "%s的%s受到%s点伤害而被击破了!" #敌人的生命护盾被击破时的文字
def self.play_actor_amuhspdamage # 玩家的生命护盾受到伤害的音效
Audio.se_play("Audio/SE/sword1.ogg", 100, 50)
end
def self.play_enemy_amuhspdamage # 敌人的生命护盾受到伤害的音效
Audio.se_play("Audio/SE/sword1.ogg", 100, 50)
end
def self.play_amuhsp_destory # 生命护盾被击破时的音效
Audio.se_play("Audio/SE/Crash.ogg", 60, 90)
end
end
end
class Game_ActionResult
#--------------------------------------------------------------------------
# ● 定义实例变量
#--------------------------------------------------------------------------
attr_accessor :amuhsp_damage # 生命护盾 伤害
#--------------------------------------------------------------------------
# ● 清除伤害值`
#--------------------------------------------------------------------------
alias amu_20141125_clear_damage_values clear_damage_values
def clear_damage_values
amu_20141125_clear_damage_values
@amuhsp_damage = 0
end
#--------------------------------------------------------------------------
# ● 生成伤害
#--------------------------------------------------------------------------
alias amu_20141125_make_damage make_damage
def make_damage(value, item)
amu_20141125_make_damage(value, item)
@amuhsp_damage = value if item.damage.to_hp? && @battler.amuhsp > 0 && value > 0
@amuhsp_damage = value if item.damage.to_hp? && item.damage.recover? && item.note.include?("[护盾恢复]")
end
#--------------------------------------------------------------------------
# ● 获取具有生命护盾时 HP 伤害的文字
#--------------------------------------------------------------------------
def hp_damage_text
if @hp_drain > 0
fmt = @battler.actor? ? Vocab::ActorDrain : Vocab::EnemyDrain
sprintf(fmt, @battler.name, Vocab::hp, @hp_drain)
elsif @hp_damage > 0
fmt = @battler.actor? ? Vocab::ActorDamage : Vocab::EnemyDamage
sprintf(fmt, @battler.name, @hp_damage)
elsif @hp_damage < 0
fmt = @battler.actor? ? Vocab::ActorRecovery : Vocab::EnemyRecovery
sprintf(fmt, @battler.name, Vocab::hp, -hp_damage)
elsif @hp_damage = 0 && @battler.amuhsp > 0
fmt = @battler.actor? ? Amu::Hsp::HspABonus : Amu::Hsp::HspEBonus
sprintf(fmt, @battler.name, Amu::Hsp::HspName, @battler.amuhsp)
else
fmt = @battler.actor? ? Vocab::ActorNoDamage : Vocab::EnemyNoDamage
sprintf(fmt, @battler.name)
end
end
#--------------------------------------------------------------------------
# ● 获取 生命护盾 伤害的文字
#--------------------------------------------------------------------------
def amuhsp_damage_text
if @amuhsp_damage > 0 && @battler.amuhsp > 0
fmt = @battler.actor? ? Amu::Hsp::HspADamage : Amu::Hsp::HspEDamage
sprintf(fmt, @battler.name, Amu::Hsp::HspName, @amuhsp_damage)
elsif @amuhsp_damage > 0 && @battler.amuhsp == 0
fmt = @battler.actor? ? Amu::Hsp::HspADestory : Amu::Hsp::HspEDestroy
sprintf(fmt, @battler.name, Amu::Hsp::HspName, @amuhsp_damage)
elsif @amuhsp_damage < 0
fmt = @battler.actor? ? Amu::Hsp::HspARecovery : Amu::Hsp::HspERecovery
sprintf(fmt, @battler.name, -@amuhsp_damage, Amu::Hsp::HspName)
else
""
end
end
end
class Game_BattlerBase
attr_reader :amuhsp # 生命护盾
#--------------------------------------------------------------------------
# ● 初始化对象
#--------------------------------------------------------------------------
alias amu_20141125_initialize initialize
def initialize
amu_20141125_initialize
@amuhsp = 0
end
#--------------------------------------------------------------------------
# ● 更改 HSP
#--------------------------------------------------------------------------
def amuhsp=(amuhsp)
@amuhsp = amuhsp
refresh
end
#--------------------------------------------------------------------------
# ● 刷新
#--------------------------------------------------------------------------
alias amu_20141125_refresh refresh
def refresh
amu_20141125_refresh
@amuhsp = [@amuhsp, 0].max
end
end
class Game_Battler < Game_BattlerBase
#--------------------------------------------------------------------------
# ● 计算伤害
#--------------------------------------------------------------------------
alias amu_20141125_make_damage_value make_damage_value
def make_damage_value(user, item)
if Amu::Hsp::HspNoAddition
value = item.damage.eval(user, self, $game_variables)
value = 100 if (user.skills.include?($data_skills[51]) if user.is_a?(Game_Actor))
value *= item_element_rate(user, item)
value *= pdr if item.physical? && !make_amuhsp?(item)
value *= mdr if item.magical? && !make_amuhsp?(item)
value *= rec if item.damage.recover? && !make_amuhsp?(item)
value = apply_critical(value) if @result.critical
value = apply_variance(value, item.damage.variance)
value = apply_guard(value)
if make_amuhsp?(item)
def actor_amuhsp?
return true
end
end
@result.make_damage(value.to_i, item)
end
else
amu_20141125_make_damage_value(user, item)
if make_amuhsp?(item)
def actor_amuhsp?
return true
end
end
end
#--------------------------------------------------------------------------
# ● 处理伤害
# 调用前需要设置好
# @result.hp_damage @result.mp_damage
# @result.hp_drain @result.mp_drain
#--------------------------------------------------------------------------
def execute_damage(user)
on_damage(@result.hp_damage) if @result.hp_damage > 0
if self.amuhsp > 0 && @result.hp_damage > 0
eamuhsp = self.amuhsp
self.amuhsp -= @result.hp_damage
self.amuhsp <= 0 ? @result.hp_damage -= eamuhsp : @result.hp_damage = 0
end
if actor_amuhsp?
self.amuhsp -= @result.hp_damage
@result.hp_damage = 0
def actor_amuhsp?
return false
end
else
self.hp -= @result.hp_damage
end
self.mp -= @result.mp_damage
user.hp += @result.hp_drain
user.mp += @result.mp_drain
end
#--------------------------------------------------------------------------
# ● 判断技能是否用来增加生命护盾
#--------------------------------------------------------------------------
def make_amuhsp?(item)
return false unless item.is_a?(RPG::Skill)
return item.note.include?("[护盾恢复]")
end
def actor_amuhsp?
return false
end
#--------------------------------------------------------------------------
# ● 清除 生命护盾
#--------------------------------------------------------------------------
def clear_amuhsp
self.amuhsp = 0
end
#--------------------------------------------------------------------------
# ● 回合结束的处理(SideView)
#--------------------------------------------------------------------------
def on_turn_end
on_turn_end_game_battler_n03
@sv.add_state = []
@sv.result_damage = [@result.hp_damage, @result.mp_damage, @result.amuhsp_damage]
end
#--------------------------------------------------------------------------
# ● 战斗结束处理
#--------------------------------------------------------------------------
alias amu_20141125_on_battle_end on_battle_end
def on_battle_end
amu_20141125_on_battle_end
clear_amuhsp if Amu::Hsp::HspClear == true
end
end
class Game_Actor < Game_Battler
#--------------------------------------------------------------------------
# ● 设置玩家具有生命护盾时被击的效果
#--------------------------------------------------------------------------
def perform_hspdamage_effect
$game_troop.screen.start_shake(5, 5, 10)
@sprite_effect_type = :blink
Amu::Hsp.play_actor_amuhspdamage
end
end
class Game_Enemy < Game_Battler
#--------------------------------------------------------------------------
# ● 设置敌人具有生命护盾时被击的效果
#--------------------------------------------------------------------------
def perform_hspdamage_effect
$game_troop.screen.start_shake(5, 5, 10)
@sprite_effect_type = :blink
Amu::Hsp.play_enemy_amuhspdamage
end
end
class Window_BattleLog < Window_Selectable
#--------------------------------------------------------------------------
# ● 显示伤害
#--------------------------------------------------------------------------
alias amu_20141125_display_damage display_damage
def display_damage(target, item)
if target.result.missed
display_miss(target, item)
elsif target.result.evaded
display_evasion(target, item)
else
display_amuhsp_damage(target, item)
display_hp_damage(target, item)
display_mp_damage(target, item)
display_tp_damage(target, item)
end
end
#--------------------------------------------------------------------------
# ● 显示 生命护盾 伤害
#--------------------------------------------------------------------------
def display_amuhsp_damage(target, item)
return if target.dead? || target.result.amuhsp_damage == 0
if target.result.amuhsp_damage > 0 && target.amuhsp > 0 && target.result.hp_drain == 0
target.perform_hspdamage_effect
end
Amu::Hsp.play_amuhsp_destory if target.result.amuhsp_damage > 0 && target.amuhsp == 0
Sound.play_recovery if target.result.amuhsp_damage < 0
add_text(target.result.amuhsp_damage_text)
wait
end
end
#==============================================================================
# ★ SideView的兼容部分,请勿修改 ★
#==============================================================================
module N03
# MPダメージ数字画像のファイル名(Systemフォルダを参照します)
DAMAGE_AMUHSP = "damage_hsp"
end
class SideView
#--------------------------------------------------------------------------
# ● 初期化
#--------------------------------------------------------------------------
alias amu_20141126_reset reset
def reset
amu_20141126_reset
@result_damage = [0,0,0]
end
#--------------------------------------------------------------------------
# ● 设置 被治疗 的标识
#--------------------------------------------------------------------------
alias amu_20141126_recovery? recovery?
def recovery?
recovery = false
@battler.result.hp_damage = -1 if @battler.result.hp_damage == true
recovery = true if @battler.result.hp_damage < 0
recovery = true if @battler.result.mp_damage < 0
recovery = true if @battler.result.tp_damage < 0
recovery = true if @battler.result.amuhsp_damage < 0
return recovery
end
#--------------------------------------------------------------------------
# ● 判断是否有伤害
#--------------------------------------------------------------------------
def damage_zero?
return @battler.result.amuhsp_damage == 0 && @battler.result.hp_damage == 0 && @battler.result.mp_damage == 0 && @battler.result.tp_damage == 0
end
end
class Sprite_Damage < Sprite
#--------------------------------------------------------------------------
# ● 显示伤害的数值
#--------------------------------------------------------------------------
def set_damage
return @action_end = true if !N03::DAMAGE_POP
damage = @battler.result.hp_damage if @battler.result.hp_damage != 0
damage = @battler.result.hp_drain if @battler.result.hp_drain != 0
damage = @battler.result.mp_damage if @battler.result.mp_damage != 0
damage = @battler.result.mp_drain if @battler.result.mp_drain != 0
damage = @battler.result.tp_damage if @battler.result.tp_damage != 0
damage = @battler.result.amuhsp_damage if @battler.result.amuhsp_damage != 0
if !damage or damage == 0
@action_end = true if @st == nil
return # ステートだけPOPする設定を考慮して@action_endは返さない
end
hit_count
#@hit = @battler.sv.hit
#@battler.sv.hit += 1 if damage != 0
#~ damage = 1 if damage == true
file = N03::DAMAGE_PLUS if damage > 0
file = N03::DAMAGE_MINUS if damage < 0
add_file = N03::DAMAGE_MP if @battler.result.mp_damage != 0
add_file = N03::DAMAGE_TP if @battler.result.tp_damage != 0
add_file = N03::DAMAGE_AMUHSP if @battler.result.amuhsp_damage != 0
adjust_x = N03::DAMAGE_ADJUST
@num = []
@num_base = []
damage = damage.abs
max_num = damage.to_s.size
max_num += 1 if add_file != nil
for i in 0...max_num
@num[i] = Sprite.new
if add_file != nil && i == max_num - 1
@num[i].bitmap = Cache.system(add_file)
cw = (damage % (10 * 10 ** i))/(10 ** i)
sw = 0 if sw == nil
else
@num[i].bitmap = Cache.system(file)
cw = (damage % (10 * 10 ** i))/(10 ** i)
sw = @num[i].bitmap.width / 10
@num[i].src_rect.set(cw * sw, 0, sw, @num[i].bitmap.height)
end
@num_base[i] = []
@num_base[i][0] = (sw + adjust_x) * i * -1 + (@battler.sv.x / 100)
@num_base[i][1] = -(@num[i].bitmap.height / 3) - i * 2 - @hit * 2 + (@battler.sv.y - @battler.sv.h - @battler.sv.j - @battler.sv.oy_adjust)/ 100
@num_base[i][0] -= @num[i].bitmap.width / 2 - adjust_x if add_file != nil && i == max_num - 1
@num[i].z = 1000 + i + @hit * 10
end
@Time = @pop_time = 80
end
end
module N03
#--------------------------------------------------------------------------
# ● ダメージの作成
#--------------------------------------------------------------------------
def self.set_damage(battler, hp_damage, mp_damage, amuhsp_damage)
battler.result.hp_damage = hp_damage
battler.result.mp_damage = mp_damage
battler.result.amuhsp_damage = amuhsp_damage
end
end
class Scene_Battle < Scene_Base
#--------------------------------------------------------------------------
# ● ダメージ戦闘アニメ処理
#--------------------------------------------------------------------------
def damage_anime(targets, target, item)
@log_window.back_to(1) if @log_window.line_number == 5
return if item.scope != 9 && item.scope != 10 && target.dead?
@miSs = false
invoke_item(target,item)
if target.result.missed
target.sv.miss_action(@subject, item)
return @miss = true
elsif target.result.evaded or target.sv.counter_id != 0
target.sv.evasion_action(@subject, item)
return @miss = true
elsif target.sv.reflection_id != 0
N03.set_damage_anime_data(targets, target, [target.sv.reflection_id, false, false, true])
target.sv.reflection_id = 0
@reflection_data = [] if @reflection_data == nil
return @reflection_data.push([N03.get_attack_anime_id(-3, @subject), false, false, true])
end
target.sv.damage_action(@subject, item)
N03.set_damage(@subject, -target.result.hp_drain, -target.result.mp_drain, nil) if target != @subject
@spriteset.set_damage_pop(target)
@spriteset.set_damage_pop(@subject) if target != @subject && (@subject.result.hp_damage != 0 or @subject.result.mp_damage != 0 or @subject.result.amuhsp_damage != 0)
N03.set_damage_anime_data(targets, target, @subject.sv.damage_anime_data) if @subject.sv.damage_anime_data != []
end
#--------------------------------------------------------------------------
# ● ターン終了
#--------------------------------------------------------------------------
def turn_end
turn_end_scene_battle_n03
for member in $game_troop.members + $game_party.members
N03.set_damage(member, member.sv.result_damage[0],member.sv.result_damage[1],member.sv.result_damage[2])
member.sv.result_damage = [0,0,0]
@spriteset.set_damage_pop(member) if member.result.hp_damage != 0 or member.result.mp_damage != 0 or member.result.amuhsp_damage != 0
end
set_camera_wait(N03::TURN_END_WAIT)
N03.camera(nil, N03::BATTLE_CAMERA["ターン開始前"].dup) if $game_party.inputable?
@log_window.clear
end
end