扫描二维码关注官方公众号
返回列表
+ 发新帖
查看: 70|回复: 0

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

[复制链接]
累计送礼:
0 个
累计收礼:
1 个
  • TA的每日心情
    开心
    昨天 05:36
  • 签到天数: 190 天

    连续签到: 2 天

    [LV.7]常住居民III

    2592

    主题

    767

    回帖

    2万

    积分

    管理员

    Rank: 9Rank: 9Rank: 9

    VIP
    7
    卡币
    17352
    OK点
    16
    推广点
    0
    同能卷
    50
    积分
    20741

    灌水之王

    发表于 昨天 02: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. $imported = {}if$imported.nil?
    22. $imported["ShieldSystem"] = true
    23. #==============================================================================
    24. # ■ 配置模块
    25. #==============================================================================
    26. module SHIELD_CONFIG
    27.   # 护盾受击音效(RPG::SE.new("文件名", 音量, 音调))
    28.   # 可修改为其他音效文件名,例如: "Shield", "Absorb", "Ice8"
    29.   SHIELD_HIT_SE = RPG::SE.new("Heal1", 80, 100)
    30.   # 护盾值备注关键词(如非必要请不要修改)
    31.   SHIELD_NOTE_TAG = "护盾值:"
    32.   # 护盾条颜色(RGB格式,范围0-255)
    33.   SHIELD_GAUGE_COLOR1 = Color.new(150, 150, 150)  # 渐变起始色(灰色)
    34.   SHIELD_GAUGE_COLOR2 = Color.new(100, 100, 100)  # 渐变结束色(深灰色)
    35.   # 护盾破碎音效(护盾值归零时播放,设为nil则不播放)
    36.   SHIELD_BREAK_SE = RPG::SE.new("Collapse3", 80, 100)
    37. end
    38. #==============================================================================
    39. # ■ Game_BattlerBase
    40. #==============================================================================
    41. class Game_BattlerBase
    42.   #--------------------------------------------------------------------------
    43.   # ● 别名: 初始化对象
    44.   #--------------------------------------------------------------------------
    45.   alias shield_initialize initialize
    46.   def initialize
    47.     shield_initialize
    48.     @shield = 0          # 当前护盾值
    49.     @shield_max = 0      # 最大护盾值
    50.   end
    51.   #--------------------------------------------------------------------------
    52.   # ● 获取护盾值
    53.   #--------------------------------------------------------------------------
    54.   def shield
    55.     @shield ||= 0
    56.   end
    57.   #--------------------------------------------------------------------------
    58.   # ● 获取最大护盾值
    59.   #--------------------------------------------------------------------------
    60.   def shield_max
    61.     @shield_max ||= 0
    62.   end
    63.   #--------------------------------------------------------------------------
    64.   # ● 设置护盾值
    65.   #--------------------------------------------------------------------------
    66.   def shield=(value)
    67.     @shield = [[value, shield_max].min, 0].max
    68.   end
    69.   #--------------------------------------------------------------------------
    70.   # ● 设置最大护盾值
    71.   #--------------------------------------------------------------------------
    72.   def shield_max=(value)
    73.     @shield_max = value
    74.     @shield = @shield_maxif@shield_max > 0
    75.   end
    76.   #--------------------------------------------------------------------------
    77.   # ● 护盾是否激活?
    78.   #--------------------------------------------------------------------------
    79.   def shield_active?
    80.     shield > 0
    81.   end
    82.   #--------------------------------------------------------------------------
    83.   # ● 护盾率(用于显示)
    84.   #--------------------------------------------------------------------------
    85.   def shield_rate
    86.     shield_max > 0 ? shield.to_f / shield_max : 0.0
    87.   end
    88.   #--------------------------------------------------------------------------
    89.   # ● 刷新护盾值(重置为最大值)
    90.   #--------------------------------------------------------------------------
    91.   def refresh_shield
    92.     if shield_max > 0
    93.       @shield = shield_max
    94.     end
    95.   end
    96. end
    97. #==============================================================================
    98. # ■ Game_Battler
    99. #==============================================================================
    100. class Game_Battler < Game_BattlerBase
    101.   #--------------------------------------------------------------------------
    102.   # ● 别名: 执行伤害
    103.   #--------------------------------------------------------------------------
    104.   alias shield_execute_damage execute_damage
    105.   def execute_damage(user)
    106.     # 仅对角色(玩家)生效护盾系统
    107.     ifself.is_a?(Game_Actor) && shield_active?
    108.       # 如果是HP伤害
    109.       if@result.hp_damage > 0
    110.         # 保存原始伤害值
    111.         original_damage = @result.hp_damage
    112.         # 扣除1点护盾值(无论敌人攻击有多高)
    113.         self.shield -= 1
    114.         # 清除HP伤害(护盾保护下不扣HP)
    115.         @result.hp_damage = 0
    116.         # 播放护盾受击音效
    117.         SHIELD_CONFIG::SHIELD_HIT_SE.play
    118.         # 护盾归零时播放破碎音效并刷新HP显示
    119.         if !shield_active?
    120.           SHIELD_CONFIG::SHIELD_BREAK_SE.playifSHIELD_CONFIG::SHIELD_BREAK_SE
    121.           # 护盾消失,恢复原始HP系统
    122.         end
    123.       end
    124.       # 执行原始伤害处理(此时hp_damage已为0,不影响HP)
    125.       shield_execute_damage(user)
    126.     else
    127.       # 没有护盾时,正常执行伤害
    128.       shield_execute_damage(user)
    129.     end
    130.   end
    131.   #--------------------------------------------------------------------------
    132.   # ● 别名: 应用伤害效果
    133.   #--------------------------------------------------------------------------
    134.   alias shield_make_damage_value make_damage_value
    135.   def make_damage_value(user, item)
    136.     # 正常计算伤害值(护盾减伤在execute_damage中处理)
    137.     shield_make_damage_value(user, item)
    138.   end
    139. end
    140. #==============================================================================
    141. # ■ Game_Actor
    142. #==============================================================================
    143. class Game_Actor < Game_Battler
    144.   #--------------------------------------------------------------------------
    145.   # ● 别名: 初始化
    146.   #--------------------------------------------------------------------------
    147.   alias shield_actor_initialize initialize
    148.   def initialize(actor_id)
    149.     shield_actor_initialize(actor_id)
    150.     @shield = 0
    151.     @shield_max = 0
    152.     # 初始化时计算护盾值
    153.     refresh_shield_from_armors
    154.   end
    155.   #--------------------------------------------------------------------------
    156.   # ● 从装备计算护盾值
    157.   #--------------------------------------------------------------------------
    158.   def refresh_shield_from_armors
    159.     total_shield = 0
    160.     # 遍历所有已装备的防具
    161.     armors.eachdo |armor|
    162.       nextif armor.nil?
    163.       # 从备注中提取护盾值
    164.       if armor.note =~ /#{SHIELD_CONFIG::SHIELD_NOTE_TAG}(\d+)/
    165.         total_shield += $1.to_i
    166.       end
    167.     end
    168.     # 设置最大护盾值并刷新当前护盾
    169.     self.shield_max = total_shield
    170.   end
    171.   #--------------------------------------------------------------------------
    172.   # ● 别名: 更换装备
    173.   #--------------------------------------------------------------------------
    174.   alias shield_change_equip change_equip
    175.   def change_equip(slot_id, item)
    176.     shield_change_equip(slot_id, item)
    177.     # 更换装备后重新计算护盾值
    178.     refresh_shield_from_armors
    179.   end
    180.   #--------------------------------------------------------------------------
    181.   # ● 别名: 优化装备
    182.   #--------------------------------------------------------------------------
    183.   alias shield_optimize_equipments optimize_equipments
    184.   def optimize_equipments
    185.     shield_optimize_equipments
    186.     refresh_shield_from_armors
    187.   end
    188.   #--------------------------------------------------------------------------
    189.   # ● 别名: 清除装备
    190.   #--------------------------------------------------------------------------
    191.   alias shield_clear_equipments clear_equipments
    192.   def clear_equipments
    193.     shield_clear_equipments
    194.     refresh_shield_from_armors
    195.   end
    196.   #--------------------------------------------------------------------------
    197.   # ● 获取当前显示用的HP值(用于血条绘制)
    198.   #--------------------------------------------------------------------------
    199.   def display_hp
    200.     shield_active? ? shield : hp
    201.   end
    202.   #--------------------------------------------------------------------------
    203.   # ● 获取当前显示用的最大HP值(用于血条绘制)
    204.   #--------------------------------------------------------------------------
    205.   def display_mhp
    206.     shield_active? ? shield_max : mhp
    207.   end
    208.   #--------------------------------------------------------------------------
    209.   # ● 护盾是否激活?
    210.   #--------------------------------------------------------------------------
    211.   def shield_active?
    212.     shield > 0
    213.   end
    214.   #--------------------------------------------------------------------------
    215.   # ● 战斗开始时刷新护盾
    216.   #--------------------------------------------------------------------------
    217.   def on_battle_start
    218.     refresh_shield if shield_max > 0
    219.   end
    220. end
    221. #==============================================================================
    222. # ■ Game_Party
    223. #==============================================================================
    224. class Game_Party < Game_Unit
    225.   #--------------------------------------------------------------------------
    226.   # ● 别名: 战斗开始时
    227.   #--------------------------------------------------------------------------
    228.   alias shield_on_battle_start on_battle_start
    229.   def on_battle_start
    230.     shield_on_battle_start
    231.     # 战斗开始时刷新所有角色的护盾
    232.     members.eachdo |actor|
    233.       actor.on_battle_startif actor.respond_to?(:on_battle_start)
    234.     end
    235.   end
    236. end
    237. #==============================================================================
    238. # ■ Window_Base
    239. #==============================================================================
    240. class Window_Base < Window
    241.   #--------------------------------------------------------------------------
    242.   # ● 绘制角色护盾条(覆盖HP条)
    243.   #--------------------------------------------------------------------------
    244.   def draw_actor_shield_gauge(actor, x, y, width = 124)
    245.     returnif actor.shield_max  0
    246.     end
    247.     shield_battle_start
    248.   end
    249. end
    250. #==============================================================================
    251. # ■ RPG::Armor
    252. #==============================================================================
    253. classRPG::Armor < RPG::EquipItem
    254.   #--------------------------------------------------------------------------
    255.   # ● 获取护盾值(从备注中读取)
    256.   #--------------------------------------------------------------------------
    257.   def shield_value
    258.     if@shield_value.nil?
    259.       ifself.note =~ /#{SHIELD_CONFIG::SHIELD_NOTE_TAG}(\d+)/
    260.         @shield_value = $1.to_i
    261.       else
    262.         @shield_value = 0
    263.       end
    264.     end
    265.     @shield_value
    266.   end
    267. end
    复制代码






    RUBY 代码
    1. #==============================================================================
    2. # ★ 护盾值系统 - Yanfly Battle Command List 兼容版
    3. #==============================================================================
    4. # 版本: 2.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. 完美兼容 Yanfly Engine Ace - Battle Command List(不丢失MP/TP显示)
    20. #==============================================================================
    21. $imported = {}if$imported.nil?
    22. $imported["ShieldSystem"] = true
    23. #==============================================================================
    24. # ■ 配置模块
    25. #==============================================================================
    26. module SHIELD_CONFIG
    27.   # 护盾受击音效
    28.   SHIELD_HIT_SE = RPG::SE.new("Heal1", 80, 100)
    29.   # 护盾破碎音效(设为 nil 则不播放)
    30.   SHIELD_BREAK_SE = RPG::SE.new("Collapse3", 80, 100)
    31.   # 护盾值备注关键词
    32.   SHIELD_NOTE_TAG = "护盾值:"
    33.   # 护盾条颜色(RGB格式)
    34.   SHIELD_GAUGE_COLOR1 = Color.new(150, 150, 150)
    35.   SHIELD_GAUGE_COLOR2 = Color.new(100, 100, 100)
    36. end
    37. #==============================================================================
    38. # ■ Game_BattlerBase
    39. #==============================================================================
    40. class Game_BattlerBase
    41.   attr_reader :shield
    42.   attr_reader :shield_max
    43.   alias shield_initialize initialize
    44.   def initialize
    45.     shield_initialize
    46.     @shield = 0
    47.     @shield_max = 0
    48.   end
    49.   def shield=(value)
    50.     @shield = [[value, shield_max].min, 0].max
    51.   end
    52.   def shield_max=(value)
    53.     @shield_max = value
    54.     @shield = @shield_maxif@shield_max > 0
    55.   end
    56.   def shield_active?
    57.     shield > 0
    58.   end
    59.   def shield_rate
    60.     shield_max > 0 ? shield.to_f / shield_max : 0.0
    61.   end
    62.   def refresh_shield
    63.     if shield_max > 0
    64.       @shield = shield_max
    65.     end
    66.   end
    67. end
    68. #==============================================================================
    69. # ■ Game_Battler(核心伤害拦截)
    70. #==============================================================================
    71. class Game_Battler < Game_BattlerBase
    72.   #--------------------------------------------------------------------------
    73.   # ● 覆盖:执行伤害(确保护盾优先处理,不依赖别名链顺序)
    74.   #--------------------------------------------------------------------------
    75.   def execute_damage(user)
    76.     # 仅对玩家角色且护盾激活时进行拦截
    77.     ifself.is_a?(Game_Actor) && shield_active?
    78.       if@result.hp_damage > 0
    79.         # 固定扣1点护盾
    80.         self.shield -= 1
    81.         # 清除HP伤害
    82.         @result.hp_damage = 0
    83.         # 播放护盾受击音效
    84.         SHIELD_CONFIG::SHIELD_HIT_SE.play
    85.         # 护盾破碎音效
    86.         if !shield_active? && SHIELD_CONFIG::SHIELD_BREAK_SE
    87.           SHIELD_CONFIG::SHIELD_BREAK_SE.play
    88.         end
    89.       end
    90.     end
    91.     # 应用最终伤害(HP伤害可能已为0)
    92.     on_damage(@result.hp_damage)if@result.hp_damage > 0
    93.     self.hp -= @result.hp_damage
    94.     self.mp -= @result.mp_damage
    95.     self.tp += @result.tp_damage
    96.     # 其他效果处理(状态、吸收等)
    97.     process_damage_effects(user)
    98.   end
    99.   # 保留原版的其他效果处理(原方法内容)
    100.   def process_damage_effects(user)
    101.     user.hp += @result.hp_drain
    102.     user.mp += @result.mp_drain
    103.     user.tp += @result.tp_drain
    104.     user.charge_tpif user.is_a?(Game_Actor) && @result.tp_drain > 0
    105.     add_state(@result.added_states)
    106.     rem_state(@result.removed_states)
    107.     @result.clear
    108.   end
    109. end
    110. #==============================================================================
    111. # ■ Game_Actor
    112. #==============================================================================
    113. class Game_Actor < Game_Battler
    114.   alias shield_actor_initialize initialize
    115.   def initialize(actor_id)
    116.     shield_actor_initialize(actor_id)
    117.     @shield = 0
    118.     @shield_max = 0
    119.     refresh_shield_from_armors
    120.   end
    121.   def refresh_shield_from_armors
    122.     total_shield = 0
    123.     armors.eachdo |armor|
    124.       nextif armor.nil?
    125.       if armor.note =~ /#{SHIELD_CONFIG::SHIELD_NOTE_TAG}(\d+)/
    126.         total_shield += $1.to_i
    127.       end
    128.     end
    129.     self.shield_max = total_shield
    130.   end
    131.   alias shield_change_equip change_equip
    132.   def change_equip(slot_id, item)
    133.     shield_change_equip(slot_id, item)
    134.     refresh_shield_from_armors
    135.   end
    136.   alias shield_optimize_equipments optimize_equipments
    137.   def optimize_equipments
    138.     shield_optimize_equipments
    139.     refresh_shield_from_armors
    140.   end
    141.   alias shield_clear_equipments clear_equipments
    142.   def clear_equipments
    143.     shield_clear_equipments
    144.     refresh_shield_from_armors
    145.   end
    146.   # 战斗开始时刷新护盾
    147.   def on_battle_start
    148.     refresh_shield if shield_max > 0
    149.   end
    150. end
    151. #==============================================================================
    152. # ■ Game_Party
    153. #==============================================================================
    154. class Game_Party < Game_Unit
    155.   alias shield_on_battle_start on_battle_start
    156.   def on_battle_start
    157.     shield_on_battle_start
    158.     members.eachdo |actor|
    159.       actor.on_battle_startif actor.respond_to?(:on_battle_start)
    160.     end
    161.   end
    162. end
    163. #==============================================================================
    164. # ■ Window_Base(绘制护盾条)
    165. #==============================================================================
    166. class Window_Base < Window
    167.   # 护盾条绘制(供各窗口调用)
    168.   def draw_actor_shield_gauge(actor, x, y, width = 124)
    169.     returnif actor.shield_max  0}
    170.     shield_battle_start
    171.   end
    172. end
    复制代码


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

    使用道具 举报

    文明发言,和谐互动
    文明发言,和谐互动
    高级模式
    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    关闭

    幸运抽奖

    社区每日抽奖来袭,快来试试你是欧皇还是非酋~

    立即查看

    聊天机器人
    Loading...

    QQ|Archiver|手机版|小黑屋|同能RPG制作大师 ( 沪ICP备12027754号-3 )

    GMT+8, 2026-4-9 00:57 , Processed in 0.098158 second(s), 57 queries .

    Powered by Discuz! X3.4

    Copyright © 2001-2020, Tencent Cloud.

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