#============================================================================== # ★ 仿《南方公园;真理之杖》护盾值系统- 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_max if @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) # 仅对角色(玩家)生效护盾系统 if self.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.play if SHIELD_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.each do |armor| next if 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.each do |actor| actor.on_battle_start if 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) return if actor.shield_max <= 0 rate = actor.shield_rate # 绘制背景(黑色) contents.fill_rect(x, y, width, 6, gauge_back_color) # 计算填充宽度 fill_w = (width * rate).to_i # 绘制护盾条(灰色渐变) contents.gradient_fill_rect(x, y, fill_w, 6, SHIELD_CONFIG::SHIELD_GAUGE_COLOR1, SHIELD_CONFIG::SHIELD_GAUGE_COLOR2) end #-------------------------------------------------------------------------- # ● 别名: 绘制角色HP #-------------------------------------------------------------------------- alias shield_draw_actor_hp draw_actor_hp def draw_actor_hp(actor, x, y, width = 124) if actor.shield_active? # 护盾激活时绘制护盾条(替代HP条) draw_actor_shield_gauge(actor, x, y, width) # 绘制护盾数值文本 draw_actor_shield_value(actor, x, y, width) else # 无护盾时正常绘制HP条 shield_draw_actor_hp(actor, x, y, width) end end #-------------------------------------------------------------------------- # ● 绘制护盾数值 #-------------------------------------------------------------------------- def draw_actor_shield_value(actor, x, y, width) contents.font.color = system_color contents.draw_text(x, y, 30, line_height, Vocab::hp_a) contents.font.color = shield_gauge_color contents.draw_text(x + width - 60, y, 60, line_height, "#{actor.shield}/#{actor.shield_max}", 2) end #-------------------------------------------------------------------------- # ● 护盾条颜色 #-------------------------------------------------------------------------- def shield_gauge_color text_color(24) # 灰色系 end end #============================================================================== # ■ Scene_Battle #============================================================================== class Scene_Battle < Scene_Base #-------------------------------------------------------------------------- # ● 别名: 战斗开始 #-------------------------------------------------------------------------- alias shield_battle_start battle_start def battle_start # 战斗开始前刷新所有角色的护盾 $game_party.members.each do |actor| actor.refresh_shield if actor.shield_max > 0 end shield_battle_start end end #============================================================================== # ■ RPG::Armor #============================================================================== class RPG::Armor < RPG::EquipItem #-------------------------------------------------------------------------- # ● 获取护盾值(从备注中读取) #-------------------------------------------------------------------------- def shield_value if @shield_value.nil? if self.note =~ /#{SHIELD_CONFIG::SHIELD_NOTE_TAG}(\d+)/ @shield_value = $1.to_i else @shield_value = 0 end end @shield_value end end
#============================================================================== # ★ 护盾值系统 - Yanfly兼容版 v2.2 #============================================================================== # 修复:卸下护盾装备后血条消失、攻击敌人报错、残留无敌的问题 #============================================================================== $imported = {} if $imported.nil? $imported["ShieldSystem"] = true module SHIELD_CONFIG SHIELD_HIT_SE = RPG::SE.new("Heal1", 80, 100) SHIELD_BREAK_SE = RPG::SE.new("Collapse3", 80, 100) SHIELD_NOTE_TAG = "护盾值:" 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, :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 if @shield_max > 0 @shield = @shield_max else @shield = 0 # 最大护盾为0时,当前护盾也清零,防止残留 end end def shield_active? shield > 0 && shield_max > 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 else @shield = 0 end end end #============================================================================== # ■ Game_Battler (伤害拦截) #============================================================================== class Game_Battler < Game_BattlerBase alias shield_execute_damage execute_damage def execute_damage(user) if self.is_a?(Game_Actor) && shield_active? && @result.hp_damage > 0 self.shield -= 1 @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 shield_execute_damage(user) end alias shield_hp_set hp= def hp=(value) if self.is_a?(Game_Actor) && shield_active? && value < self.hp return end shield_hp_set(value) 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.each do |armor| next if 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.each { |actor| actor.on_battle_start if actor.respond_to?(:on_battle_start) } end end #============================================================================== # ■ Window_Base (护盾条绘制) #============================================================================== class Window_Base < Window def draw_actor_shield_gauge(actor, x, y, width = 124) return if actor.shield_max <= 0 || !actor.shield_active? rate = actor.shield_rate contents.fill_rect(x, y, width, 6, gauge_back_color) fill_w = (width * rate).to_i contents.gradient_fill_rect(x, y, fill_w, 6, SHIELD_CONFIG::SHIELD_GAUGE_COLOR1, SHIELD_CONFIG::SHIELD_GAUGE_COLOR2) draw_actor_shield_value(actor, x, y, width) end def draw_actor_shield_value(actor, x, y, width) contents.font.color = system_color contents.draw_text(x, y, 30, line_height, Vocab::hp_a) contents.font.color = shield_gauge_color contents.draw_text(x, y, width, line_height, "#{actor.shield}/#{actor.shield_max}", 2) end def shield_gauge_color text_color(24) end def draw_actor_hp(actor, x, y, width = 124) if actor.shield_active? draw_actor_shield_gauge(actor, x, y, width) else draw_gauge(x, y, width, actor.hp_rate, hp_gauge_color1, hp_gauge_color2) contents.font.color = system_color contents.draw_text(x, y, 30, line_height, Vocab::hp_a) draw_current_and_max_values(x, y, width, actor.hp, actor.mhp, hp_color(actor), normal_color) end end end #============================================================================== # ■ 兼容 Yanfly Battle Command List #============================================================================== if $imported["YEA-BattleCommandList"] class Window_BattleStatus < Window_Selectable alias shield_ybc_draw_actor_hp draw_actor_hp def draw_actor_hp(actor, x, y, width = 124) if actor.shield_active? draw_actor_shield_gauge(actor, x, y, width) else shield_ybc_draw_actor_hp(actor, x, y, width) end end end end #============================================================================== # ■ Scene_Battle #============================================================================== class Scene_Battle < Scene_Base alias shield_battle_start battle_start def battle_start $game_party.members.each { |actor| actor.refresh_shield if actor.shield_max > 0 } shield_battle_start end end
#============================================================================== # ★ 护盾系统 - 伤害拦截底层补丁 (Yanfly Battle Command List 兼容版专用) #============================================================================== # 说明:将护盾扣除逻辑直接嵌入 hp= 方法,确保在任何战斗脚本下都能正确扣盾且不掉血。 # 将此脚本放在护盾系统主脚本之后、Main 之前。 #============================================================================== class Game_Battler < Game_BattlerBase #-------------------------------------------------------------------------- # ● 覆盖:设置 HP(护盾激活时拦截扣血并扣盾) #-------------------------------------------------------------------------- alias shield_final_hp_set hp= def hp=(value) # 只对玩家角色且护盾激活时处理 if self.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_shield if actor.shield_max > 0 } shield_final_battle_start end end
#============================================================================== # ★ 护盾系统 - Falcao 宝石镶嵌联动补丁 #============================================================================== # 功能:使镶嵌在装备上的宝石如果备注了“护盾值:数字”,也会累加到角色的护盾值中。 # 注意:宝石物品必须至少有一个属性标签(如<提升体力:1>)才能被镶嵌系统识别。 #============================================================================== if defined?(FalMana) && $imported["ShieldSystem"] #============================================================================ # ■ 扩展 RPG::Item:添加护盾值读取方法 #============================================================================ class RPG::Item < RPG::UsableItem def shield_value if @shield_value.nil? if self.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.each do |equip| next if equip.nil? # 1. 装备自身护盾值 if equip.note =~ /#{SHIELD_CONFIG::SHIELD_NOTE_TAG}(\d+)/ total_shield += $1.to_i end # 2. 镶嵌宝石的护盾值 slots = equip.manaslots next unless slots.is_a?(Array) slots.each do |gem| next if gem.nil? # 读取宝石的护盾值 total_shield += gem.shield_value if 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 << self # 镶嵌宝石 alias shield_socket_manastone socket_manastone def socket_manastone(item, index, value, actor) shield_socket_manastone(item, index, value, actor) actor.refresh_shield_from_armors if actor.respond_to?(:refresh_shield_from_armors) end # 摘除宝石 alias shield_remove_manastone remove_manastone def remove_manastone(item, index, value, actor) shield_remove_manastone(item, index, value, actor) actor.refresh_shield_from_armors if actor.respond_to?(:refresh_shield_from_armors) end # 清除所有宝石(镶嵌失败时) alias shield_clear_manastones clear_manastones def clear_manastones(item, actor) shield_clear_manastones(item, actor) actor.refresh_shield_from_armors if actor.respond_to?(:refresh_shield_from_armors) end end end #============================================================================ # ■ 战斗开始时强制刷新护盾(确保宝石护盾生效) #============================================================================ class Scene_Battle < Scene_Base alias shield_gem_battle_start battle_start def battle_start $game_party.members.each do |actor| actor.refresh_shield_from_armors if actor.respond_to?(:refresh_shield_from_armors) end shield_gem_battle_start end end end # defined?(FalMana) && $imported["ShieldSystem"]
Y~R~@V(W4JJ[2J8R5LIUW6O.png (388.74 KB, 下载次数: 33)
@5OZ}[ET{{@KN55V9J0$1$L.png (49.57 KB, 下载次数: 28)
XG$2MSZ~L3239IR([8{WMBR.png (71.86 KB, 下载次数: 26)
ETTZ8N~8`U~%U83@S@ZE6{D.png (95.3 KB, 下载次数: 28)
DY%T40B79)(SS9GW1HC~9M8.png (70.69 KB, 下载次数: 26)
庫洛魔法使 发表于 2026-4-13 01:05
請問您的腳本【護盾】和【鏡像】的戰鬥系統腳本是? 我使用後好像沒辦法產生效果
...
庫洛魔法使 发表于 2026-4-13 01:05
請問您的腳本【護盾】和【鏡像】的戰鬥系統腳本是? 我使用後好像沒辦法產生效果
...
阿薩男爵 发表于 2026-4-14 06:18
东西确实是好东西,可以实现不少功能,但是我目前的游戏使用会报错。
重新新建了一个工程倒是能用了,可能 ...
阿薩男爵 发表于 2026-4-14 06:18
东西确实是好东西,可以实现不少功能,但是我目前的游戏使用会报错。
重新新建了一个工程倒是能用了,可能 ...
Ruigi 发表于 2026-4-15 00:38
你用的是yanfly兼容版吗?
阿薩男爵 发表于 2026-4-14 06:18
东西确实是好东西,可以实现不少功能,但是我目前的游戏使用会报错。
重新新建了一个工程倒是能用了,可能 ...
Ruigi 发表于 2026-4-16 00:55
兼容版需要配合yanfly的脚本,配合伤害拦截底层补丁
阿薩男爵 发表于 2026-4-16 06:18
加了补丁还是报错。
阿薩男爵 发表于 2026-4-16 06:18
加了补丁还是报错。
阿薩男爵 发表于 2026-4-16 06:18
加了补丁还是报错。
Ruigi 发表于 2026-4-18 01:04
是不是攻击敌人之后报的错
阿薩男爵 发表于 2026-4-18 05:51
进入战斗报错
阿薩男爵 发表于 2026-4-19 09:09
我新开了个纯净工程,不报错了。
实际使用确实可用,有一点点小瑕疵。
开始点开界面可以看到护盾值覆盖了HP ...
| 欢迎光临 Project1 (https://rpg.blue/) | Powered by Discuz! X3.1 |