| 赞 | 5 |
| VIP | |
| 好人卡 | |
| 积分 | 22 |
| 经验 | |
| 最后登录 | 2026-7-19 |
| 在线时间 | 59 小时 |
- 梦石
- 1
- 星屑
- 1184
- 在线时间
- 59 小时
- 注册时间
- 2023-9-8
- 回帖
- 19
|
加入我们,或者,欢迎回来。
您需要 登录 才可以下载或查看,没有账号?注册会员
×
本帖最后由 Ruigi 于 2026-4-18 01:06 编辑
[pre lang="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_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[/pre]
[pre lang="ruby"]#==============================================================================
# ★ 护盾值系统 - 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[/pre]
[pre lang="ruby"]#==============================================================================
# ★ 护盾系统 - 伤害拦截底层补丁 (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[/pre]
[pre lang="ruby"]#==============================================================================
# ★ 护盾系统 - 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"][/pre] |
评分
-
查看全部评分
|