RUBY 代码
- #==============================================================================
- # ★ 仿《南方公园;真理之杖》护盾值系统- RPG Maker VX Ace
- #==============================================================================
- # 版本: 1.0
- # 作者: MrRuigi
- #
- # 使用方法:
- # 在防具(铠甲、盾牌、头盔、饰品)的备注栏中写入:
- # 护盾值:数值
- # 例如: 护盾值:100
- #
- # 功能说明:
- # 1. 装备带有护盾值的防具后,角色的HP会被护盾值覆盖
- # 2. 护盾存在时,HP条显示为灰色
- # 3. 敌人攻击玩家时,不扣除生命值,而是先扣除1点护盾值(无论伤害多高)
- # 4. 护盾值归零后,变回原版生命值系统,正常受到伤害
- # 5. 护盾存在时受击音效变为特定音效(可在脚本中自定义)
- # 6. 进入新战斗时护盾值会自动刷新至最大值
- # 7. 更换装备时护盾值会自动刷新
- #==============================================================================
- $imported = {}if$imported.nil?
- $imported["ShieldSystem"] = true
- #==============================================================================
- # ■ 配置模块
- #==============================================================================
- module SHIELD_CONFIG
- # 护盾受击音效(RPG::SE.new("文件名", 音量, 音调))
- # 可修改为其他音效文件名,例如: "Shield", "Absorb", "Ice8"
- SHIELD_HIT_SE = RPG::SE.new("Heal1", 80, 100)
- # 护盾值备注关键词(如非必要请不要修改)
- SHIELD_NOTE_TAG = "护盾值:"
- # 护盾条颜色(RGB格式,范围0-255)
- SHIELD_GAUGE_COLOR1 = Color.new(150, 150, 150) # 渐变起始色(灰色)
- SHIELD_GAUGE_COLOR2 = Color.new(100, 100, 100) # 渐变结束色(深灰色)
- # 护盾破碎音效(护盾值归零时播放,设为nil则不播放)
- SHIELD_BREAK_SE = RPG::SE.new("Collapse3", 80, 100)
- end
- #==============================================================================
- # ■ Game_BattlerBase
- #==============================================================================
- class Game_BattlerBase
- #--------------------------------------------------------------------------
- # ● 别名: 初始化对象
- #--------------------------------------------------------------------------
- alias shield_initialize initialize
- def initialize
- shield_initialize
- @shield = 0 # 当前护盾值
- @shield_max = 0 # 最大护盾值
- end
- #--------------------------------------------------------------------------
- # ● 获取护盾值
- #--------------------------------------------------------------------------
- def shield
- @shield ||= 0
- end
- #--------------------------------------------------------------------------
- # ● 获取最大护盾值
- #--------------------------------------------------------------------------
- def shield_max
- @shield_max ||= 0
- end
- #--------------------------------------------------------------------------
- # ● 设置护盾值
- #--------------------------------------------------------------------------
- def shield=(value)
- @shield = [[value, shield_max].min, 0].max
- end
- #--------------------------------------------------------------------------
- # ● 设置最大护盾值
- #--------------------------------------------------------------------------
- def shield_max=(value)
- @shield_max = value
- @shield = @shield_maxif@shield_max > 0
- end
- #--------------------------------------------------------------------------
- # ● 护盾是否激活?
- #--------------------------------------------------------------------------
- def shield_active?
- shield > 0
- end
- #--------------------------------------------------------------------------
- # ● 护盾率(用于显示)
- #--------------------------------------------------------------------------
- def shield_rate
- shield_max > 0 ? shield.to_f / shield_max : 0.0
- end
- #--------------------------------------------------------------------------
- # ● 刷新护盾值(重置为最大值)
- #--------------------------------------------------------------------------
- def refresh_shield
- if shield_max > 0
- @shield = shield_max
- end
- end
- end
- #==============================================================================
- # ■ Game_Battler
- #==============================================================================
- class Game_Battler < Game_BattlerBase
- #--------------------------------------------------------------------------
- # ● 别名: 执行伤害
- #--------------------------------------------------------------------------
- alias shield_execute_damage execute_damage
- def execute_damage(user)
- # 仅对角色(玩家)生效护盾系统
- ifself.is_a?(Game_Actor) && shield_active?
- # 如果是HP伤害
- if@result.hp_damage > 0
- # 保存原始伤害值
- original_damage = @result.hp_damage
- # 扣除1点护盾值(无论敌人攻击有多高)
- self.shield -= 1
- # 清除HP伤害(护盾保护下不扣HP)
- @result.hp_damage = 0
- # 播放护盾受击音效
- SHIELD_CONFIG::SHIELD_HIT_SE.play
- # 护盾归零时播放破碎音效并刷新HP显示
- if !shield_active?
- SHIELD_CONFIG::SHIELD_BREAK_SE.playifSHIELD_CONFIG::SHIELD_BREAK_SE
- # 护盾消失,恢复原始HP系统
- end
- end
- # 执行原始伤害处理(此时hp_damage已为0,不影响HP)
- shield_execute_damage(user)
- else
- # 没有护盾时,正常执行伤害
- shield_execute_damage(user)
- end
- end
- #--------------------------------------------------------------------------
- # ● 别名: 应用伤害效果
- #--------------------------------------------------------------------------
- alias shield_make_damage_value make_damage_value
- def make_damage_value(user, item)
- # 正常计算伤害值(护盾减伤在execute_damage中处理)
- shield_make_damage_value(user, item)
- end
- end
- #==============================================================================
- # ■ Game_Actor
- #==============================================================================
- class Game_Actor < Game_Battler
- #--------------------------------------------------------------------------
- # ● 别名: 初始化
- #--------------------------------------------------------------------------
- alias shield_actor_initialize initialize
- def initialize(actor_id)
- shield_actor_initialize(actor_id)
- @shield = 0
- @shield_max = 0
- # 初始化时计算护盾值
- refresh_shield_from_armors
- end
- #--------------------------------------------------------------------------
- # ● 从装备计算护盾值
- #--------------------------------------------------------------------------
- def refresh_shield_from_armors
- total_shield = 0
- # 遍历所有已装备的防具
- armors.eachdo |armor|
- nextif armor.nil?
- # 从备注中提取护盾值
- if armor.note =~ /#{SHIELD_CONFIG::SHIELD_NOTE_TAG}(\d+)/
- total_shield += $1.to_i
- end
- end
- # 设置最大护盾值并刷新当前护盾
- self.shield_max = total_shield
- end
- #--------------------------------------------------------------------------
- # ● 别名: 更换装备
- #--------------------------------------------------------------------------
- alias shield_change_equip change_equip
- def change_equip(slot_id, item)
- shield_change_equip(slot_id, item)
- # 更换装备后重新计算护盾值
- refresh_shield_from_armors
- end
- #--------------------------------------------------------------------------
- # ● 别名: 优化装备
- #--------------------------------------------------------------------------
- alias shield_optimize_equipments optimize_equipments
- def optimize_equipments
- shield_optimize_equipments
- refresh_shield_from_armors
- end
- #--------------------------------------------------------------------------
- # ● 别名: 清除装备
- #--------------------------------------------------------------------------
- alias shield_clear_equipments clear_equipments
- def clear_equipments
- shield_clear_equipments
- refresh_shield_from_armors
- end
- #--------------------------------------------------------------------------
- # ● 获取当前显示用的HP值(用于血条绘制)
- #--------------------------------------------------------------------------
- def display_hp
- shield_active? ? shield : hp
- end
- #--------------------------------------------------------------------------
- # ● 获取当前显示用的最大HP值(用于血条绘制)
- #--------------------------------------------------------------------------
- def display_mhp
- shield_active? ? shield_max : mhp
- end
- #--------------------------------------------------------------------------
- # ● 护盾是否激活?
- #--------------------------------------------------------------------------
- def shield_active?
- shield > 0
- end
- #--------------------------------------------------------------------------
- # ● 战斗开始时刷新护盾
- #--------------------------------------------------------------------------
- def on_battle_start
- refresh_shield if shield_max > 0
- end
- end
- #==============================================================================
- # ■ Game_Party
- #==============================================================================
- class Game_Party < Game_Unit
- #--------------------------------------------------------------------------
- # ● 别名: 战斗开始时
- #--------------------------------------------------------------------------
- alias shield_on_battle_start on_battle_start
- def on_battle_start
- shield_on_battle_start
- # 战斗开始时刷新所有角色的护盾
- members.eachdo |actor|
- actor.on_battle_startif actor.respond_to?(:on_battle_start)
- end
- end
- end
- #==============================================================================
- # ■ Window_Base
- #==============================================================================
- class Window_Base < Window
- #--------------------------------------------------------------------------
- # ● 绘制角色护盾条(覆盖HP条)
- #--------------------------------------------------------------------------
- def draw_actor_shield_gauge(actor, x, y, width = 124)
- returnif actor.shield_max 0
- end
- shield_battle_start
- end
- end
- #==============================================================================
- # ■ RPG::Armor
- #==============================================================================
- classRPG::Armor < RPG::EquipItem
- #--------------------------------------------------------------------------
- # ● 获取护盾值(从备注中读取)
- #--------------------------------------------------------------------------
- def shield_value
- if@shield_value.nil?
- ifself.note =~ /#{SHIELD_CONFIG::SHIELD_NOTE_TAG}(\d+)/
- @shield_value = $1.to_i
- else
- @shield_value = 0
- end
- end
- @shield_value
- end
- end
复制代码
RUBY 代码
- #==============================================================================
- # ★ 护盾值系统 - Yanfly Battle Command List 兼容版
- #==============================================================================
- # 版本: 2.0
- # 作者: MrRuigi
- #
- # 使用方法:
- # 在防具(铠甲、盾牌、头盔、饰品)的备注栏中写入:
- # 护盾值:数字
- # 例如: 护盾值:100
- #
- # 功能说明:
- # 1. 装备带有护盾值的防具后,角色的HP会被护盾值覆盖
- # 2. 护盾存在时,HP条显示为灰色
- # 3. 敌人攻击玩家时,不扣除生命值,而是先扣除1点护盾值(无论伤害多高)
- # 4. 护盾值归零后,变回原版生命值系统
- # 5. 护盾受击音效、破碎音效可自定义
- # 6. 进入新战斗时护盾值自动刷新至最大值
- # 7. 完美兼容 Yanfly Engine Ace - Battle Command List(不丢失MP/TP显示)
- #==============================================================================
- $imported = {}if$imported.nil?
- $imported["ShieldSystem"] = true
- #==============================================================================
- # ■ 配置模块
- #==============================================================================
- module SHIELD_CONFIG
- # 护盾受击音效
- SHIELD_HIT_SE = RPG::SE.new("Heal1", 80, 100)
- # 护盾破碎音效(设为 nil 则不播放)
- SHIELD_BREAK_SE = RPG::SE.new("Collapse3", 80, 100)
- # 护盾值备注关键词
- SHIELD_NOTE_TAG = "护盾值:"
- # 护盾条颜色(RGB格式)
- SHIELD_GAUGE_COLOR1 = Color.new(150, 150, 150)
- SHIELD_GAUGE_COLOR2 = Color.new(100, 100, 100)
- end
- #==============================================================================
- # ■ Game_BattlerBase
- #==============================================================================
- class Game_BattlerBase
- attr_reader :shield
- attr_reader :shield_max
- alias shield_initialize initialize
- def initialize
- shield_initialize
- @shield = 0
- @shield_max = 0
- end
- def shield=(value)
- @shield = [[value, shield_max].min, 0].max
- end
- def shield_max=(value)
- @shield_max = value
- @shield = @shield_maxif@shield_max > 0
- end
- def shield_active?
- shield > 0
- end
- def shield_rate
- shield_max > 0 ? shield.to_f / shield_max : 0.0
- end
- def refresh_shield
- if shield_max > 0
- @shield = shield_max
- end
- end
- end
- #==============================================================================
- # ■ Game_Battler(核心伤害拦截)
- #==============================================================================
- class Game_Battler < Game_BattlerBase
- #--------------------------------------------------------------------------
- # ● 覆盖:执行伤害(确保护盾优先处理,不依赖别名链顺序)
- #--------------------------------------------------------------------------
- def execute_damage(user)
- # 仅对玩家角色且护盾激活时进行拦截
- ifself.is_a?(Game_Actor) && shield_active?
- if@result.hp_damage > 0
- # 固定扣1点护盾
- self.shield -= 1
- # 清除HP伤害
- @result.hp_damage = 0
- # 播放护盾受击音效
- SHIELD_CONFIG::SHIELD_HIT_SE.play
- # 护盾破碎音效
- if !shield_active? && SHIELD_CONFIG::SHIELD_BREAK_SE
- SHIELD_CONFIG::SHIELD_BREAK_SE.play
- end
- end
- end
- # 应用最终伤害(HP伤害可能已为0)
- on_damage(@result.hp_damage)if@result.hp_damage > 0
- self.hp -= @result.hp_damage
- self.mp -= @result.mp_damage
- self.tp += @result.tp_damage
- # 其他效果处理(状态、吸收等)
- process_damage_effects(user)
- end
- # 保留原版的其他效果处理(原方法内容)
- def process_damage_effects(user)
- user.hp += @result.hp_drain
- user.mp += @result.mp_drain
- user.tp += @result.tp_drain
- user.charge_tpif user.is_a?(Game_Actor) && @result.tp_drain > 0
- add_state(@result.added_states)
- rem_state(@result.removed_states)
- @result.clear
- end
- end
- #==============================================================================
- # ■ Game_Actor
- #==============================================================================
- class Game_Actor < Game_Battler
- alias shield_actor_initialize initialize
- def initialize(actor_id)
- shield_actor_initialize(actor_id)
- @shield = 0
- @shield_max = 0
- refresh_shield_from_armors
- end
- def refresh_shield_from_armors
- total_shield = 0
- armors.eachdo |armor|
- nextif armor.nil?
- if armor.note =~ /#{SHIELD_CONFIG::SHIELD_NOTE_TAG}(\d+)/
- total_shield += $1.to_i
- end
- end
- self.shield_max = total_shield
- end
- alias shield_change_equip change_equip
- def change_equip(slot_id, item)
- shield_change_equip(slot_id, item)
- refresh_shield_from_armors
- end
- alias shield_optimize_equipments optimize_equipments
- def optimize_equipments
- shield_optimize_equipments
- refresh_shield_from_armors
- end
- alias shield_clear_equipments clear_equipments
- def clear_equipments
- shield_clear_equipments
- refresh_shield_from_armors
- end
- # 战斗开始时刷新护盾
- def on_battle_start
- refresh_shield if shield_max > 0
- end
- end
- #==============================================================================
- # ■ Game_Party
- #==============================================================================
- class Game_Party < Game_Unit
- alias shield_on_battle_start on_battle_start
- def on_battle_start
- shield_on_battle_start
- members.eachdo |actor|
- actor.on_battle_startif actor.respond_to?(:on_battle_start)
- end
- end
- end
- #==============================================================================
- # ■ Window_Base(绘制护盾条)
- #==============================================================================
- class Window_Base < Window
- # 护盾条绘制(供各窗口调用)
- def draw_actor_shield_gauge(actor, x, y, width = 124)
- returnif actor.shield_max 0}
- shield_battle_start
- end
- end
复制代码
RUBY 代码
- #==============================================================================
- # ★ 护盾系统 - 伤害拦截底层补丁 (Yanfly Battle Command List 兼容版专用)
- #==============================================================================
- # 说明:将护盾扣除逻辑直接嵌入 hp= 方法,确保在任何战斗脚本下都能正确扣盾且不掉血。
- # 将此脚本放在护盾系统主脚本之后、Main 之前。
- #==============================================================================
- class Game_Battler < Game_BattlerBase
- #--------------------------------------------------------------------------
- # ● 覆盖:设置 HP(护盾激活时拦截扣血并扣盾)
- #--------------------------------------------------------------------------
- alias shield_final_hp_set hp=
- def hp=(value)
- # 只对玩家角色且护盾激活时处理
- ifself.is_a?(Game_Actor) && shield_active?
- # 判断本次是否为扣血操作(新值小于当前HP)
- if value < self.hp
- damage_amount = self.hp - value # 原本要扣的血量
- # 无论伤害多高,固定扣除 1 点护盾值
- self.shield -= 1
- # 播放护盾受击音效
- SHIELD_CONFIG::SHIELD_HIT_SE.play
- # 护盾破碎音效
- if !shield_active? && SHIELD_CONFIG::SHIELD_BREAK_SE
- SHIELD_CONFIG::SHIELD_BREAK_SE.play
- end
- # 阻止 HP 变化(直接返回,不调用原 hp= 方法)
- return
- end
- end
- # 其他情况(回血、无护盾、敌人等)正常调用原方法
- shield_final_hp_set(value)
- end
- end
- #==============================================================================
- # ■ 确保在 execute_damage 中不重复扣盾(可选优化)
- #==============================================================================
- class Game_Battler < Game_BattlerBase
- # 如果之前有 execute_damage 的拦截,将其清空或确保不重复扣除
- # 这里直接覆盖,不再扣除护盾,因为 hp= 已经处理了
- alias shield_clean_execute_damage execute_damage
- def execute_damage(user)
- # 如果护盾激活,原本的 hp_damage 会在 hp= 中被拦截,无需额外处理
- # 但为了音效不重复,这里不清除 hp_damage,让 hp= 自然触发
- shield_clean_execute_damage(user)
- end
- end
- #==============================================================================
- # ■ 场景战斗开始时刷新护盾(保留)
- #==============================================================================
- class Scene_Battle < Scene_Base
- alias shield_final_battle_start battle_start
- def battle_start
- $game_party.members.each{ |actor| actor.refresh_shieldif actor.shield_max > 0}
- shield_final_battle_start
- end
- end
复制代码
RUBY 代码
[code]#==============================================================================
# ★ 护盾系统 - Falcao 宝石镶嵌联动补丁
#==============================================================================
# 功能:使镶嵌在装备上的宝石如果备注了“护盾值:数字”,也会累加到角色的护盾值中。
# 注意:宝石物品必须至少有一个属性标签(如)才能被镶嵌系统识别。
#==============================================================================
ifdefined?(FalMana) && $imported["ShieldSystem"]
#============================================================================
# ■ 扩展 RPG::Item:添加护盾值读取方法
#============================================================================
classRPG::Item < RPG::UsableItem
def shield_value
if@shield_value.nil?
ifself.note =~ /#{SHIELD_CONFIG::SHIELD_NOTE_TAG}(\d+)/
@shield_value = $1.to_i
else
@shield_value = 0
end
end
@shield_value
end
end
#============================================================================
# ■ Game_Actor 护盾计算扩展(包含宝石护盾)
#============================================================================
class Game_Actor < Game_Battler
# 完全覆盖护盾计算,确保宝石护盾被累加
def refresh_shield_from_armors
total_shield = 0
# 遍历所有已装备物品(武器 + 防具)
equips.eachdo |equip|
nextif equip.nil?
# 1. 装备自身护盾值
if equip.note =~ /#{SHIELD_CONFIG::SHIELD_NOTE_TAG}(\d+)/
total_shield += $1.to_i
end
# 2. 镶嵌宝石的护盾值
slots = equip.manaslots
nextunless slots.is_a?(Array)
slots.eachdo |gem|
nextif gem.nil?
# 读取宝石的护盾值
total_shield += gem.shield_valueif gem.respond_to?(:shield_value)
end
end
# 应用总护盾值
self.shield_max = total_shield
end
# 确保更换装备、镶嵌宝石后自动刷新护盾
alias shield_gem_change_equip change_equip
def change_equip(slot_id, item)
shield_gem_change_equip(slot_id, item)
refresh_shield_from_armors
end
end
#============================================================================
# ■ 宝石操作后立即刷新护盾
#============================================================================
module FalMana
class