设为首页收藏本站|繁體中文

Project1

 找回密码
 注册会员
搜索
查看: 926|回复: 18
打印 上一主题 下一主题

[原创发布] 仿《南方公园;真理之杖》护盾值系统

[复制链接]

Lv3.寻梦者

梦石
1
星屑
1174
在线时间
58 小时
注册时间
2023-9-8
帖子
35
跳转到指定楼层
1
发表于 2026-4-8 01:35:31 | 只看该作者 |只看大图 回帖奖励 |正序浏览 |阅读模式

加入我们,或者,欢迎回来。

您需要 登录 才可以下载或查看,没有帐号?注册会员

x
本帖最后由 Ruigi 于 2026-4-18 01:06 编辑

RUBY 代码复制
  1. #==============================================================================
  2. # ★ 仿《南方公园;真理之杖》护盾值系统- RPG Maker VX Ace
  3. #==============================================================================
  4. # 版本: 1.0
  5. # 作者: MrRuigi
  6. #
  7. # 使用方法:
  8. #   在防具(铠甲、盾牌、头盔、饰品)的备注栏中写入:
  9. #     护盾值:数值
  10. #   例如: 护盾值:100
  11. #
  12. # 功能说明:
  13. #   1. 装备带有护盾值的防具后,角色的HP会被护盾值覆盖
  14. #   2. 护盾存在时,HP条显示为灰色
  15. #   3. 敌人攻击玩家时,不扣除生命值,而是先扣除1点护盾值(无论伤害多高)
  16. #   4. 护盾值归零后,变回原版生命值系统,正常受到伤害
  17. #   5. 护盾存在时受击音效变为特定音效(可在脚本中自定义)
  18. #   6. 进入新战斗时护盾值会自动刷新至最大值
  19. #   7. 更换装备时护盾值会自动刷新
  20. #==============================================================================
  21.  
  22. $imported = {} if $imported.nil?
  23. $imported["ShieldSystem"] = true
  24.  
  25. #==============================================================================
  26. # ■ 配置模块
  27. #==============================================================================
  28.  
  29. module SHIELD_CONFIG
  30.   # 护盾受击音效(RPG::SE.new("文件名", 音量, 音调))
  31.   # 可修改为其他音效文件名,例如: "Shield", "Absorb", "Ice8"
  32.   SHIELD_HIT_SE = RPG::SE.new("Heal1", 80, 100)
  33.  
  34.   # 护盾值备注关键词(如非必要请不要修改)
  35.   SHIELD_NOTE_TAG = "护盾值:"
  36.  
  37.   # 护盾条颜色(RGB格式,范围0-255)
  38.   SHIELD_GAUGE_COLOR1 = Color.new(150, 150, 150)  # 渐变起始色(灰色)
  39.   SHIELD_GAUGE_COLOR2 = Color.new(100, 100, 100)  # 渐变结束色(深灰色)
  40.  
  41.   # 护盾破碎音效(护盾值归零时播放,设为nil则不播放)
  42.   SHIELD_BREAK_SE = RPG::SE.new("Collapse3", 80, 100)
  43. end
  44.  
  45. #==============================================================================
  46. # ■ Game_BattlerBase
  47. #==============================================================================
  48.  
  49. class Game_BattlerBase
  50.   #--------------------------------------------------------------------------
  51.   # ● 别名: 初始化对象
  52.   #--------------------------------------------------------------------------
  53.   alias shield_initialize initialize
  54.   def initialize
  55.     shield_initialize
  56.     @shield = 0          # 当前护盾值
  57.     @shield_max = 0      # 最大护盾值
  58.   end
  59.  
  60.   #--------------------------------------------------------------------------
  61.   # ● 获取护盾值
  62.   #--------------------------------------------------------------------------
  63.   def shield
  64.     @shield ||= 0
  65.   end
  66.  
  67.   #--------------------------------------------------------------------------
  68.   # ● 获取最大护盾值
  69.   #--------------------------------------------------------------------------
  70.   def shield_max
  71.     @shield_max ||= 0
  72.   end
  73.  
  74.   #--------------------------------------------------------------------------
  75.   # ● 设置护盾值
  76.   #--------------------------------------------------------------------------
  77.   def shield=(value)
  78.     @shield = [[value, shield_max].min, 0].max
  79.   end
  80.  
  81.   #--------------------------------------------------------------------------
  82.   # ● 设置最大护盾值
  83.   #--------------------------------------------------------------------------
  84.   def shield_max=(value)
  85.     @shield_max = value
  86.     @shield = @shield_max if @shield_max > 0
  87.   end
  88.  
  89.   #--------------------------------------------------------------------------
  90.   # ● 护盾是否激活?
  91.   #--------------------------------------------------------------------------
  92.   def shield_active?
  93.     shield > 0
  94.   end
  95.  
  96.   #--------------------------------------------------------------------------
  97.   # ● 护盾率(用于显示)
  98.   #--------------------------------------------------------------------------
  99.   def shield_rate
  100.     shield_max > 0 ? shield.to_f / shield_max : 0.0
  101.   end
  102.  
  103.   #--------------------------------------------------------------------------
  104.   # ● 刷新护盾值(重置为最大值)
  105.   #--------------------------------------------------------------------------
  106.   def refresh_shield
  107.     if shield_max > 0
  108.       @shield = shield_max
  109.     end
  110.   end
  111. end
  112.  
  113. #==============================================================================
  114. # ■ Game_Battler
  115. #==============================================================================
  116.  
  117. class Game_Battler < Game_BattlerBase
  118.   #--------------------------------------------------------------------------
  119.   # ● 别名: 执行伤害
  120.   #--------------------------------------------------------------------------
  121.   alias shield_execute_damage execute_damage
  122.   def execute_damage(user)
  123.     # 仅对角色(玩家)生效护盾系统
  124.     if self.is_a?(Game_Actor) && shield_active?
  125.       # 如果是HP伤害
  126.       if @result.hp_damage > 0
  127.         # 保存原始伤害值
  128.         original_damage = @result.hp_damage
  129.         # 扣除1点护盾值(无论敌人攻击有多高)
  130.         self.shield -= 1
  131.         # 清除HP伤害(护盾保护下不扣HP)
  132.         @result.hp_damage = 0
  133.         # 播放护盾受击音效
  134.         SHIELD_CONFIG::SHIELD_HIT_SE.play
  135.         # 护盾归零时播放破碎音效并刷新HP显示
  136.         if !shield_active?
  137.           SHIELD_CONFIG::SHIELD_BREAK_SE.play if SHIELD_CONFIG::SHIELD_BREAK_SE
  138.           # 护盾消失,恢复原始HP系统
  139.         end
  140.       end
  141.       # 执行原始伤害处理(此时hp_damage已为0,不影响HP)
  142.       shield_execute_damage(user)
  143.     else
  144.       # 没有护盾时,正常执行伤害
  145.       shield_execute_damage(user)
  146.     end
  147.   end
  148.  
  149.   #--------------------------------------------------------------------------
  150.   # ● 别名: 应用伤害效果
  151.   #--------------------------------------------------------------------------
  152.   alias shield_make_damage_value make_damage_value
  153.   def make_damage_value(user, item)
  154.     # 正常计算伤害值(护盾减伤在execute_damage中处理)
  155.     shield_make_damage_value(user, item)
  156.   end
  157. end
  158.  
  159. #==============================================================================
  160. # ■ Game_Actor
  161. #==============================================================================
  162.  
  163. class Game_Actor < Game_Battler
  164.   #--------------------------------------------------------------------------
  165.   # ● 别名: 初始化
  166.   #--------------------------------------------------------------------------
  167.   alias shield_actor_initialize initialize
  168.   def initialize(actor_id)
  169.     shield_actor_initialize(actor_id)
  170.     @shield = 0
  171.     @shield_max = 0
  172.     # 初始化时计算护盾值
  173.     refresh_shield_from_armors
  174.   end
  175.  
  176.   #--------------------------------------------------------------------------
  177.   # ● 从装备计算护盾值
  178.   #--------------------------------------------------------------------------
  179.   def refresh_shield_from_armors
  180.     total_shield = 0
  181.     # 遍历所有已装备的防具
  182.     armors.each do |armor|
  183.       next if armor.nil?
  184.       # 从备注中提取护盾值
  185.       if armor.note =~ /#{SHIELD_CONFIG::SHIELD_NOTE_TAG}(\d+)/
  186.         total_shield += $1.to_i
  187.       end
  188.     end
  189.     # 设置最大护盾值并刷新当前护盾
  190.     self.shield_max = total_shield
  191.   end
  192.  
  193.   #--------------------------------------------------------------------------
  194.   # ● 别名: 更换装备
  195.   #--------------------------------------------------------------------------
  196.   alias shield_change_equip change_equip
  197.   def change_equip(slot_id, item)
  198.     shield_change_equip(slot_id, item)
  199.     # 更换装备后重新计算护盾值
  200.     refresh_shield_from_armors
  201.   end
  202.  
  203.   #--------------------------------------------------------------------------
  204.   # ● 别名: 优化装备
  205.   #--------------------------------------------------------------------------
  206.   alias shield_optimize_equipments optimize_equipments
  207.   def optimize_equipments
  208.     shield_optimize_equipments
  209.     refresh_shield_from_armors
  210.   end
  211.  
  212.   #--------------------------------------------------------------------------
  213.   # ● 别名: 清除装备
  214.   #--------------------------------------------------------------------------
  215.   alias shield_clear_equipments clear_equipments
  216.   def clear_equipments
  217.     shield_clear_equipments
  218.     refresh_shield_from_armors
  219.   end
  220.  
  221.   #--------------------------------------------------------------------------
  222.   # ● 获取当前显示用的HP值(用于血条绘制)
  223.   #--------------------------------------------------------------------------
  224.   def display_hp
  225.     shield_active? ? shield : hp
  226.   end
  227.  
  228.   #--------------------------------------------------------------------------
  229.   # ● 获取当前显示用的最大HP值(用于血条绘制)
  230.   #--------------------------------------------------------------------------
  231.   def display_mhp
  232.     shield_active? ? shield_max : mhp
  233.   end
  234.  
  235.   #--------------------------------------------------------------------------
  236.   # ● 护盾是否激活?
  237.   #--------------------------------------------------------------------------
  238.   def shield_active?
  239.     shield > 0
  240.   end
  241.  
  242.   #--------------------------------------------------------------------------
  243.   # ● 战斗开始时刷新护盾
  244.   #--------------------------------------------------------------------------
  245.   def on_battle_start
  246.     refresh_shield if shield_max > 0
  247.   end
  248. end
  249.  
  250. #==============================================================================
  251. # ■ Game_Party
  252. #==============================================================================
  253.  
  254. class Game_Party < Game_Unit
  255.   #--------------------------------------------------------------------------
  256.   # ● 别名: 战斗开始时
  257.   #--------------------------------------------------------------------------
  258.   alias shield_on_battle_start on_battle_start
  259.   def on_battle_start
  260.     shield_on_battle_start
  261.     # 战斗开始时刷新所有角色的护盾
  262.     members.each do |actor|
  263.       actor.on_battle_start if actor.respond_to?(:on_battle_start)
  264.     end
  265.   end
  266. end
  267.  
  268. #==============================================================================
  269. # ■ Window_Base
  270. #==============================================================================
  271.  
  272. class Window_Base < Window
  273.   #--------------------------------------------------------------------------
  274.   # ● 绘制角色护盾条(覆盖HP条)
  275.   #--------------------------------------------------------------------------
  276.   def draw_actor_shield_gauge(actor, x, y, width = 124)
  277.     return if actor.shield_max <= 0
  278.     rate = actor.shield_rate
  279.     # 绘制背景(黑色)
  280.     contents.fill_rect(x, y, width, 6, gauge_back_color)
  281.     # 计算填充宽度
  282.     fill_w = (width * rate).to_i
  283.     # 绘制护盾条(灰色渐变)
  284.     contents.gradient_fill_rect(x, y, fill_w, 6,
  285.       SHIELD_CONFIG::SHIELD_GAUGE_COLOR1,
  286.       SHIELD_CONFIG::SHIELD_GAUGE_COLOR2)
  287.   end
  288.  
  289.   #--------------------------------------------------------------------------
  290.   # ● 别名: 绘制角色HP
  291.   #--------------------------------------------------------------------------
  292.   alias shield_draw_actor_hp draw_actor_hp
  293.   def draw_actor_hp(actor, x, y, width = 124)
  294.     if actor.shield_active?
  295.       # 护盾激活时绘制护盾条(替代HP条)
  296.       draw_actor_shield_gauge(actor, x, y, width)
  297.       # 绘制护盾数值文本
  298.       draw_actor_shield_value(actor, x, y, width)
  299.     else
  300.       # 无护盾时正常绘制HP条
  301.       shield_draw_actor_hp(actor, x, y, width)
  302.     end
  303.   end
  304.  
  305.   #--------------------------------------------------------------------------
  306.   # ● 绘制护盾数值
  307.   #--------------------------------------------------------------------------
  308.   def draw_actor_shield_value(actor, x, y, width)
  309.     contents.font.color = system_color
  310.     contents.draw_text(x, y, 30, line_height, Vocab::hp_a)
  311.     contents.font.color = shield_gauge_color
  312.     contents.draw_text(x + width - 60, y, 60, line_height,
  313.       "#{actor.shield}/#{actor.shield_max}", 2)
  314.   end
  315.  
  316.   #--------------------------------------------------------------------------
  317.   # ● 护盾条颜色
  318.   #--------------------------------------------------------------------------
  319.   def shield_gauge_color
  320.     text_color(24)  # 灰色系
  321.   end
  322. end
  323.  
  324. #==============================================================================
  325. # ■ Scene_Battle
  326. #==============================================================================
  327.  
  328. class Scene_Battle < Scene_Base
  329.   #--------------------------------------------------------------------------
  330.   # ● 别名: 战斗开始
  331.   #--------------------------------------------------------------------------
  332.   alias shield_battle_start battle_start
  333.   def battle_start
  334.     # 战斗开始前刷新所有角色的护盾
  335.     $game_party.members.each do |actor|
  336.       actor.refresh_shield if actor.shield_max > 0
  337.     end
  338.     shield_battle_start
  339.   end
  340. end
  341.  
  342. #==============================================================================
  343. # ■ RPG::Armor
  344. #==============================================================================
  345.  
  346. class RPG::Armor < RPG::EquipItem
  347.   #--------------------------------------------------------------------------
  348.   # ● 获取护盾值(从备注中读取)
  349.   #--------------------------------------------------------------------------
  350.   def shield_value
  351.     if @shield_value.nil?
  352.       if self.note =~ /#{SHIELD_CONFIG::SHIELD_NOTE_TAG}(\d+)/
  353.         @shield_value = $1.to_i
  354.       else
  355.         @shield_value = 0
  356.       end
  357.     end
  358.     @shield_value
  359.   end
  360. end






RUBY 代码复制
  1. #==============================================================================
  2. # ★ 护盾值系统 - Yanfly兼容版 v2.2
  3. #==============================================================================
  4. # 修复:卸下护盾装备后血条消失、攻击敌人报错、残留无敌的问题
  5. #==============================================================================
  6.  
  7. $imported = {} if $imported.nil?
  8. $imported["ShieldSystem"] = true
  9.  
  10. module SHIELD_CONFIG
  11.   SHIELD_HIT_SE   = RPG::SE.new("Heal1", 80, 100)
  12.   SHIELD_BREAK_SE = RPG::SE.new("Collapse3", 80, 100)
  13.   SHIELD_NOTE_TAG = "护盾值:"
  14.   SHIELD_GAUGE_COLOR1 = Color.new(150, 150, 150)
  15.   SHIELD_GAUGE_COLOR2 = Color.new(100, 100, 100)
  16. end
  17.  
  18. #==============================================================================
  19. # ■ Game_BattlerBase
  20. #==============================================================================
  21.  
  22. class Game_BattlerBase
  23.   attr_reader :shield, :shield_max
  24.  
  25.   alias shield_initialize initialize
  26.   def initialize
  27.     shield_initialize
  28.     @shield = 0
  29.     @shield_max = 0
  30.   end
  31.  
  32.   def shield=(value)
  33.     @shield = [[value, shield_max].min, 0].max
  34.   end
  35.  
  36.   def shield_max=(value)
  37.     @shield_max = value
  38.     if @shield_max > 0
  39.       @shield = @shield_max
  40.     else
  41.       @shield = 0   # 最大护盾为0时,当前护盾也清零,防止残留
  42.     end
  43.   end
  44.  
  45.   def shield_active?
  46.     shield > 0 && shield_max > 0
  47.   end
  48.  
  49.   def shield_rate
  50.     shield_max > 0 ? shield.to_f / shield_max : 0.0
  51.   end
  52.  
  53.   def refresh_shield
  54.     if shield_max > 0
  55.       @shield = shield_max
  56.     else
  57.       @shield = 0
  58.     end
  59.   end
  60. end
  61.  
  62. #==============================================================================
  63. # ■ Game_Battler (伤害拦截)
  64. #==============================================================================
  65.  
  66. class Game_Battler < Game_BattlerBase
  67.   alias shield_execute_damage execute_damage
  68.   def execute_damage(user)
  69.     if self.is_a?(Game_Actor) && shield_active? && @result.hp_damage > 0
  70.       self.shield -= 1
  71.       @result.hp_damage = 0
  72.       SHIELD_CONFIG::SHIELD_HIT_SE.play
  73.       if !shield_active? && SHIELD_CONFIG::SHIELD_BREAK_SE
  74.         SHIELD_CONFIG::SHIELD_BREAK_SE.play
  75.       end
  76.     end
  77.     shield_execute_damage(user)
  78.   end
  79.  
  80.   alias shield_hp_set hp=
  81.   def hp=(value)
  82.     if self.is_a?(Game_Actor) && shield_active? && value < self.hp
  83.       return
  84.     end
  85.     shield_hp_set(value)
  86.   end
  87. end
  88.  
  89. #==============================================================================
  90. # ■ Game_Actor
  91. #==============================================================================
  92.  
  93. class Game_Actor < Game_Battler
  94.   alias shield_actor_initialize initialize
  95.   def initialize(actor_id)
  96.     shield_actor_initialize(actor_id)
  97.     @shield = 0
  98.     @shield_max = 0
  99.     refresh_shield_from_armors
  100.   end
  101.  
  102.   def refresh_shield_from_armors
  103.     total_shield = 0
  104.     armors.each do |armor|
  105.       next if armor.nil?
  106.       if armor.note =~ /#{SHIELD_CONFIG::SHIELD_NOTE_TAG}(\d+)/
  107.         total_shield += $1.to_i
  108.       end
  109.     end
  110.     self.shield_max = total_shield
  111.   end
  112.  
  113.   alias shield_change_equip change_equip
  114.   def change_equip(slot_id, item)
  115.     shield_change_equip(slot_id, item)
  116.     refresh_shield_from_armors
  117.   end
  118.  
  119.   alias shield_optimize_equipments optimize_equipments
  120.   def optimize_equipments
  121.     shield_optimize_equipments
  122.     refresh_shield_from_armors
  123.   end
  124.  
  125.   alias shield_clear_equipments clear_equipments
  126.   def clear_equipments
  127.     shield_clear_equipments
  128.     refresh_shield_from_armors
  129.   end
  130.  
  131.   def on_battle_start
  132.     refresh_shield if shield_max > 0
  133.   end
  134. end
  135.  
  136. #==============================================================================
  137. # ■ Game_Party
  138. #==============================================================================
  139.  
  140. class Game_Party < Game_Unit
  141.   alias shield_on_battle_start on_battle_start
  142.   def on_battle_start
  143.     shield_on_battle_start
  144.     members.each { |actor| actor.on_battle_start if actor.respond_to?(:on_battle_start) }
  145.   end
  146. end
  147.  
  148. #==============================================================================
  149. # ■ Window_Base (护盾条绘制)
  150. #==============================================================================
  151.  
  152. class Window_Base < Window
  153.   def draw_actor_shield_gauge(actor, x, y, width = 124)
  154.     return if actor.shield_max <= 0 || !actor.shield_active?
  155.     rate = actor.shield_rate
  156.     contents.fill_rect(x, y, width, 6, gauge_back_color)
  157.     fill_w = (width * rate).to_i
  158.     contents.gradient_fill_rect(x, y, fill_w, 6,
  159.       SHIELD_CONFIG::SHIELD_GAUGE_COLOR1,
  160.       SHIELD_CONFIG::SHIELD_GAUGE_COLOR2)
  161.     draw_actor_shield_value(actor, x, y, width)
  162.   end
  163.  
  164.   def draw_actor_shield_value(actor, x, y, width)
  165.     contents.font.color = system_color
  166.     contents.draw_text(x, y, 30, line_height, Vocab::hp_a)
  167.     contents.font.color = shield_gauge_color
  168.     contents.draw_text(x, y, width, line_height, "#{actor.shield}/#{actor.shield_max}", 2)
  169.   end
  170.  
  171.   def shield_gauge_color
  172.     text_color(24)
  173.   end
  174.  
  175.   def draw_actor_hp(actor, x, y, width = 124)
  176.     if actor.shield_active?
  177.       draw_actor_shield_gauge(actor, x, y, width)
  178.     else
  179.       draw_gauge(x, y, width, actor.hp_rate, hp_gauge_color1, hp_gauge_color2)
  180.       contents.font.color = system_color
  181.       contents.draw_text(x, y, 30, line_height, Vocab::hp_a)
  182.       draw_current_and_max_values(x, y, width, actor.hp, actor.mhp,
  183.         hp_color(actor), normal_color)
  184.     end
  185.   end
  186. end
  187.  
  188. #==============================================================================
  189. # ■ 兼容 Yanfly Battle Command List
  190. #==============================================================================
  191. if $imported["YEA-BattleCommandList"]
  192.   class Window_BattleStatus < Window_Selectable
  193.     alias shield_ybc_draw_actor_hp draw_actor_hp
  194.     def draw_actor_hp(actor, x, y, width = 124)
  195.       if actor.shield_active?
  196.         draw_actor_shield_gauge(actor, x, y, width)
  197.       else
  198.         shield_ybc_draw_actor_hp(actor, x, y, width)
  199.       end
  200.     end
  201.   end
  202. end
  203.  
  204. #==============================================================================
  205. # ■ Scene_Battle
  206. #==============================================================================
  207.  
  208. class Scene_Battle < Scene_Base
  209.   alias shield_battle_start battle_start
  210.   def battle_start
  211.     $game_party.members.each { |actor| actor.refresh_shield if actor.shield_max > 0 }
  212.     shield_battle_start
  213.   end
  214. end


RUBY 代码复制
  1. #==============================================================================
  2. # ★ 护盾系统 - 伤害拦截底层补丁 (Yanfly Battle Command List 兼容版专用)
  3. #==============================================================================
  4. # 说明:将护盾扣除逻辑直接嵌入 hp= 方法,确保在任何战斗脚本下都能正确扣盾且不掉血。
  5. #       将此脚本放在护盾系统主脚本之后、Main 之前。
  6. #==============================================================================
  7.  
  8. class Game_Battler < Game_BattlerBase
  9.   #--------------------------------------------------------------------------
  10.   # ● 覆盖:设置 HP(护盾激活时拦截扣血并扣盾)
  11.   #--------------------------------------------------------------------------
  12.   alias shield_final_hp_set hp=
  13.   def hp=(value)
  14.     # 只对玩家角色且护盾激活时处理
  15.     if self.is_a?(Game_Actor) && shield_active?
  16.       # 判断本次是否为扣血操作(新值小于当前HP)
  17.       if value < self.hp
  18.         damage_amount = self.hp - value  # 原本要扣的血量
  19.         # 无论伤害多高,固定扣除 1 点护盾值
  20.         self.shield -= 1
  21.         # 播放护盾受击音效
  22.         SHIELD_CONFIG::SHIELD_HIT_SE.play
  23.         # 护盾破碎音效
  24.         if !shield_active? && SHIELD_CONFIG::SHIELD_BREAK_SE
  25.           SHIELD_CONFIG::SHIELD_BREAK_SE.play
  26.         end
  27.         # 阻止 HP 变化(直接返回,不调用原 hp= 方法)
  28.         return
  29.       end
  30.     end
  31.     # 其他情况(回血、无护盾、敌人等)正常调用原方法
  32.     shield_final_hp_set(value)
  33.   end
  34. end
  35.  
  36. #==============================================================================
  37. # ■ 确保在 execute_damage 中不重复扣盾(可选优化)
  38. #==============================================================================
  39. class Game_Battler < Game_BattlerBase
  40.   # 如果之前有 execute_damage 的拦截,将其清空或确保不重复扣除
  41.   # 这里直接覆盖,不再扣除护盾,因为 hp= 已经处理了
  42.   alias shield_clean_execute_damage execute_damage
  43.   def execute_damage(user)
  44.     # 如果护盾激活,原本的 hp_damage 会在 hp= 中被拦截,无需额外处理
  45.     # 但为了音效不重复,这里不清除 hp_damage,让 hp= 自然触发
  46.     shield_clean_execute_damage(user)
  47.   end
  48. end
  49.  
  50. #==============================================================================
  51. # ■ 场景战斗开始时刷新护盾(保留)
  52. #==============================================================================
  53. class Scene_Battle < Scene_Base
  54.   alias shield_final_battle_start battle_start
  55.   def battle_start
  56.     $game_party.members.each { |actor| actor.refresh_shield if actor.shield_max > 0 }
  57.     shield_final_battle_start
  58.   end
  59. end


RUBY 代码复制
  1. #==============================================================================
  2. # ★ 护盾系统 - Falcao 宝石镶嵌联动补丁
  3. #==============================================================================
  4. # 功能:使镶嵌在装备上的宝石如果备注了“护盾值:数字”,也会累加到角色的护盾值中。
  5. # 注意:宝石物品必须至少有一个属性标签(如<提升体力:1>)才能被镶嵌系统识别。
  6. #==============================================================================
  7.  
  8. if defined?(FalMana) && $imported["ShieldSystem"]
  9.  
  10.   #============================================================================
  11.   # ■ 扩展 RPG::Item:添加护盾值读取方法
  12.   #============================================================================
  13.   class RPG::Item < RPG::UsableItem
  14.     def shield_value
  15.       if @shield_value.nil?
  16.         if self.note =~ /#{SHIELD_CONFIG::SHIELD_NOTE_TAG}(\d+)/
  17.           @shield_value = $1.to_i
  18.         else
  19.           @shield_value = 0
  20.         end
  21.       end
  22.       @shield_value
  23.     end
  24.   end
  25.  
  26.   #============================================================================
  27.   # ■ Game_Actor 护盾计算扩展(包含宝石护盾)
  28.   #============================================================================
  29.   class Game_Actor < Game_Battler
  30.     # 完全覆盖护盾计算,确保宝石护盾被累加
  31.     def refresh_shield_from_armors
  32.       total_shield = 0
  33.  
  34.       # 遍历所有已装备物品(武器 + 防具)
  35.       equips.each do |equip|
  36.         next if equip.nil?
  37.  
  38.         # 1. 装备自身护盾值
  39.         if equip.note =~ /#{SHIELD_CONFIG::SHIELD_NOTE_TAG}(\d+)/
  40.           total_shield += $1.to_i
  41.         end
  42.  
  43.         # 2. 镶嵌宝石的护盾值
  44.         slots = equip.manaslots
  45.         next unless slots.is_a?(Array)
  46.  
  47.         slots.each do |gem|
  48.           next if gem.nil?
  49.           # 读取宝石的护盾值
  50.           total_shield += gem.shield_value if gem.respond_to?(:shield_value)
  51.         end
  52.       end
  53.  
  54.       # 应用总护盾值
  55.       self.shield_max = total_shield
  56.     end
  57.  
  58.     # 确保更换装备、镶嵌宝石后自动刷新护盾
  59.     alias shield_gem_change_equip change_equip
  60.     def change_equip(slot_id, item)
  61.       shield_gem_change_equip(slot_id, item)
  62.       refresh_shield_from_armors
  63.     end
  64.   end
  65.  
  66.   #============================================================================
  67.   # ■ 宝石操作后立即刷新护盾
  68.   #============================================================================
  69.   module FalMana
  70.     class << self
  71.       # 镶嵌宝石
  72.       alias shield_socket_manastone socket_manastone
  73.       def socket_manastone(item, index, value, actor)
  74.         shield_socket_manastone(item, index, value, actor)
  75.         actor.refresh_shield_from_armors if actor.respond_to?(:refresh_shield_from_armors)
  76.       end
  77.  
  78.       # 摘除宝石
  79.       alias shield_remove_manastone remove_manastone
  80.       def remove_manastone(item, index, value, actor)
  81.         shield_remove_manastone(item, index, value, actor)
  82.         actor.refresh_shield_from_armors if actor.respond_to?(:refresh_shield_from_armors)
  83.       end
  84.  
  85.       # 清除所有宝石(镶嵌失败时)
  86.       alias shield_clear_manastones clear_manastones
  87.       def clear_manastones(item, actor)
  88.         shield_clear_manastones(item, actor)
  89.         actor.refresh_shield_from_armors if actor.respond_to?(:refresh_shield_from_armors)
  90.       end
  91.     end
  92.   end
  93.  
  94.   #============================================================================
  95.   # ■ 战斗开始时强制刷新护盾(确保宝石护盾生效)
  96.   #============================================================================
  97.   class Scene_Battle < Scene_Base
  98.     alias shield_gem_battle_start battle_start
  99.     def battle_start
  100.       $game_party.members.each do |actor|
  101.         actor.refresh_shield_from_armors if actor.respond_to?(:refresh_shield_from_armors)
  102.       end
  103.       shield_gem_battle_start
  104.     end
  105.   end
  106.  
  107. end # defined?(FalMana) && $imported["ShieldSystem"]

Y~R~@V(W4JJ[2J8R5LIUW6O.png (388.74 KB, 下载次数: 32)

Y~R~@V(W4JJ[2J8R5LIUW6O.png

@5OZ}[ET{{@KN55V9J0$1$L.png (49.57 KB, 下载次数: 27)

@5OZ}[ET{{@KN55V9J0$1$L.png

XG$2MSZ~L3239IR([8{WMBR.png (71.86 KB, 下载次数: 26)

XG$2MSZ~L3239IR([8{WMBR.png

ETTZ8N~8`U~%U83@S@ZE6{D.png (95.3 KB, 下载次数: 27)

ETTZ8N~8`U~%U83@S@ZE6{D.png

DY%T40B79)(SS9GW1HC~9M8.png (70.69 KB, 下载次数: 25)

DY%T40B79)(SS9GW1HC~9M8.png

评分

参与人数 2星屑 +200 +1 收起 理由
阿薩男爵 + 1 精品文章
fux2 + 200 精品文章

查看全部评分

Lv3.寻梦者

梦石
1
星屑
1174
在线时间
58 小时
注册时间
2023-9-8
帖子
35
17
 楼主| 发表于 2026-4-20 00:20:20 | 只看该作者
阿薩男爵 发表于 2026-4-19 09:09
我新开了个纯净工程,不报错了。
实际使用确实可用,有一点点小瑕疵。
开始点开界面可以看到护盾值覆盖了HP ...

okok,我会试图解决的

点评

辛苦了  发表于 2026-4-20 06:35
回复 支持 反对

使用道具 举报

Lv5.捕梦者

梦石
10
星屑
12071
在线时间
1466 小时
注册时间
2010-8-31
帖子
604

开拓者

16
发表于 2026-4-19 09:09:34 | 只看该作者
我新开了个纯净工程,不报错了。
实际使用确实可用,有一点点小瑕疵。
开始点开界面可以看到护盾值覆盖了HP

进入战斗也正常

故意让敌人击穿盾牌

恢复成原本血量

结束战斗后,打开界面便看不到护盾值了,需要解除相应的装备再装备上才会显示护盾值

至于会和那些脚本冲突,我以后再试吧。
相比起做游戏,更热衷于素材的加工呢。
回复 支持 反对

使用道具 举报

Lv3.寻梦者

梦石
1
星屑
1174
在线时间
58 小时
注册时间
2023-9-8
帖子
35
15
 楼主| 发表于 2026-4-18 13:58:56 | 只看该作者

修复了,这一次再试试
回复 支持 反对

使用道具 举报

Lv5.捕梦者

梦石
10
星屑
12071
在线时间
1466 小时
注册时间
2010-8-31
帖子
604

开拓者

14
发表于 2026-4-18 05:51:12 | 只看该作者
Ruigi 发表于 2026-4-18 01:04
是不是攻击敌人之后报的错

进入战斗报错
相比起做游戏,更热衷于素材的加工呢。
回复 支持 反对

使用道具 举报

Lv3.寻梦者

梦石
1
星屑
1174
在线时间
58 小时
注册时间
2023-9-8
帖子
35
13
 楼主| 发表于 2026-4-18 01:04:56 | 只看该作者
阿薩男爵 发表于 2026-4-16 06:18
加了补丁还是报错。

是不是攻击敌人之后报的错
回复 支持 反对

使用道具 举报

Lv3.寻梦者

梦石
1
星屑
1174
在线时间
58 小时
注册时间
2023-9-8
帖子
35
12
 楼主| 发表于 2026-4-18 01:03:53 | 只看该作者
阿薩男爵 发表于 2026-4-16 06:18
加了补丁还是报错。

我发现问题所在了
回复 支持 反对

使用道具 举报

Lv3.寻梦者

梦石
1
星屑
1174
在线时间
58 小时
注册时间
2023-9-8
帖子
35
11
 楼主| 发表于 2026-4-17 00:03:01 | 只看该作者
阿薩男爵 发表于 2026-4-16 06:18
加了补丁还是报错。

那就不知道了,应该是和别的脚本有冲突吧。。。。
回复 支持 反对

使用道具 举报

Lv5.捕梦者

梦石
10
星屑
12071
在线时间
1466 小时
注册时间
2010-8-31
帖子
604

开拓者

10
发表于 2026-4-16 06:18:20 | 只看该作者
Ruigi 发表于 2026-4-16 00:55
兼容版需要配合yanfly的脚本,配合伤害拦截底层补丁

加了补丁还是报错。
相比起做游戏,更热衷于素材的加工呢。
回复 支持 反对

使用道具 举报

Lv3.寻梦者

梦石
1
星屑
1174
在线时间
58 小时
注册时间
2023-9-8
帖子
35
9
 楼主| 发表于 2026-4-16 00:55:05 | 只看该作者
阿薩男爵 发表于 2026-4-14 06:18
东西确实是好东西,可以实现不少功能,但是我目前的游戏使用会报错。

重新新建了一个工程倒是能用了,可能 ...

兼容版需要配合yanfly的脚本,配合伤害拦截底层补丁
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册会员

本版积分规则

拿上你的纸笔,建造一个属于你的梦想世界,加入吧。
 注册会员
找回密码

站长信箱:[email protected]|手机版|小黑屋|无图版|Project1游戏制作

GMT+8, 2026-6-4 16:11

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表