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

Project1

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

[原创发布] 传染病状态脚本

[复制链接]

Lv3.寻梦者

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

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

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

x
RUBY 代码复制
  1. #==============================================================================
  2. # ★ RGSS3 - 传染病状态脚本
  3. #==============================================================================
  4. # 功能说明:
  5. #   在状态的备注栏中写入 <plague:数字>,即可让该状态每过指定回合传染给一名队友。
  6. #   例如:<plague:3> 表示每3回合传染一次(无限循环,直到状态解除)。
  7. #
  8. # 使用说明:
  9. #   1. 将此脚本放在 "▼ 插件脚本" 部分,Main 之前。
  10. #   2. 在数据库“状态”选项卡中,为目标状态的备注栏添加 <plague:X>。
  11. #   3. 自定义下方的 PLAGUE_SE 更改传染音效。
  12. #==============================================================================
  13.  
  14. module PlagueState
  15.   # 传染时播放的音效(文件名,音量,音调)
  16.   PLAGUE_SE = ["Water5", 80, 100]
  17. end
  18.  
  19. #==============================================================================
  20. # ■ RPG::State
  21. #==============================================================================
  22. class RPG::State < RPG::BaseItem
  23.   #--------------------------------------------------------------------------
  24.   # ● 获取瘟疫传染回合数
  25.   #--------------------------------------------------------------------------
  26.   def plague_turns
  27.     return @plague_turns unless @plague_turns.nil?
  28.     load_plague_notetag
  29.     return @plague_turns
  30.   end
  31.  
  32.   #--------------------------------------------------------------------------
  33.   # ● 判断是否为瘟疫状态
  34.   #--------------------------------------------------------------------------
  35.   def plague_state?
  36.     return plague_turns > 0
  37.   end
  38.  
  39.   #--------------------------------------------------------------------------
  40.   # ● 从备注中加载瘟疫标签
  41.   #--------------------------------------------------------------------------
  42.   def load_plague_notetag
  43.     @plague_turns = 0
  44.     if self.note =~ /plague:\s*(\d+)/i
  45.       @plague_turns = $1.to_i
  46.     end
  47.   end
  48. end
  49.  
  50. #==============================================================================
  51. # ■ Game_Battler
  52. #==============================================================================
  53. class Game_Battler < Game_BattlerBase
  54.   #--------------------------------------------------------------------------
  55.   # ● 别名:添加状态
  56.   #--------------------------------------------------------------------------
  57.   alias plague_add_state add_state
  58.   def add_state(state_id)
  59.     plague_add_state(state_id)
  60.     state = $data_states[state_id]
  61.     if state && state.plague_state?
  62.       @plague_counters ||= {}
  63.       @plague_counters[state_id] = state.plague_turns
  64.     end
  65.   end
  66.  
  67.   #--------------------------------------------------------------------------
  68.   # ● 别名:移除状态
  69.   #--------------------------------------------------------------------------
  70.   alias plague_remove_state remove_state
  71.   def remove_state(state_id)
  72.     plague_remove_state(state_id)
  73.     @plague_counters.delete(state_id) if @plague_counters
  74.   end
  75.  
  76.   #--------------------------------------------------------------------------
  77.   # ● 获取瘟疫计数器
  78.   #--------------------------------------------------------------------------
  79.   def plague_counter(state_id)
  80.     @plague_counters ||= {}
  81.     return @plague_counters[state_id] || 0
  82.   end
  83.  
  84.   #--------------------------------------------------------------------------
  85.   # ● 设置瘟疫计数器
  86.   #--------------------------------------------------------------------------
  87.   def set_plague_counter(state_id, value)
  88.     @plague_counters ||= {}
  89.     @plague_counters[state_id] = value
  90.   end
  91.  
  92.   #--------------------------------------------------------------------------
  93.   # ● 回合结束时的瘟疫处理
  94.   #--------------------------------------------------------------------------
  95.   def process_plague_turn_end
  96.     return unless @plague_counters && !@plague_counters.empty?
  97.  
  98.     @plague_counters.each_key do |state_id|
  99.       next unless state?(state_id)
  100.       counter = @plague_counters[state_id]
  101.       if counter > 0
  102.         counter -= 1
  103.         @plague_counters[state_id] = counter
  104.         if counter == 0
  105.           spread_plague(state_id)
  106.         end
  107.       end
  108.     end
  109.   end
  110.  
  111.   #--------------------------------------------------------------------------
  112.   # ● 传播瘟疫给队友(重置计数器实现周期传染)
  113.   #--------------------------------------------------------------------------
  114.   def spread_plague(state_id)
  115.     return unless actor?
  116.  
  117.     targets = $game_party.members.select do |member|
  118.       member.alive? && !member.state?(state_id)
  119.     end
  120.  
  121.     return if targets.empty?
  122.  
  123.     target = targets.sample
  124.  
  125.     # 为目标添加状态(目标会获得新计数器)
  126.     target.add_state(state_id)
  127.  
  128.     # 播放传染音效
  129.     se = PlagueState::PLAGUE_SE
  130.     RPG::SE.new(se[0], se[1], se[2]).play
  131.  
  132.     # 显示战斗日志
  133.     if SceneManager.scene_is?(Scene_Battle)
  134.       state_name = $data_states[state_id].name
  135.       text = "#{target.name} 被传染了 #{state_name} !"
  136.       log_win = nil
  137.       if SceneManager.scene.respond_to?(:log_window) && SceneManager.scene.log_window
  138.         log_win = SceneManager.scene.log_window
  139.       else
  140.         log_win = SceneManager.scene.instance_variable_get(:@log_window)
  141.       end
  142.       log_win.add_text(text) if log_win
  143.     end
  144.  
  145.     state = $data_states[state_id]
  146.     if state && state.plague_state?
  147.       @plague_counters[state_id] = state.plague_turns
  148.     end
  149.   end
  150.  
  151.   #--------------------------------------------------------------------------
  152.   # ● 清除所有瘟疫计数器
  153.   #--------------------------------------------------------------------------
  154.   def clear_plague_counters
  155.     @plague_counters = {}
  156.   end
  157.  
  158.   #--------------------------------------------------------------------------
  159.   # ● 别名:完全恢复时清除计数器
  160.   #--------------------------------------------------------------------------
  161.   alias plague_recover_all recover_all
  162.   def recover_all
  163.     plague_recover_all
  164.     clear_plague_counters
  165.   end
  166. end
  167.  
  168. #==============================================================================
  169. # ■ Scene_Battle
  170. #==============================================================================
  171. class Scene_Battle < Scene_Base
  172.   alias plague_turn_end turn_end
  173.   def turn_end
  174.     all_battle_members.each do |battler|
  175.       battler.process_plague_turn_end
  176.     end
  177.     plague_turn_end
  178.   end
  179. end
  180.  
  181. #==============================================================================
  182. # ■ Game_Party
  183. #==============================================================================
  184. class Game_Party < Game_Unit
  185.   alias plague_increase_steps increase_steps
  186.   def increase_steps
  187.     plague_increase_steps
  188.     process_plague_on_map
  189.   end
  190.  
  191.   def process_plague_on_map
  192.     members.each do |actor|
  193.       actor.process_plague_turn_end
  194.     end
  195.   end
  196. end

BXHZEX6E1XGDNM]J4]S201U.png (29.03 KB, 下载次数: 21)

BXHZEX6E1XGDNM]J4]S201U.png

5CH3UDUMGC5O5S6BD68A(KH.png (47.2 KB, 下载次数: 22)

5CH3UDUMGC5O5S6BD68A(KH.png

T{ZK2[P$A1D}G7U[99O`(RF.png (27.1 KB, 下载次数: 21)

T{ZK2[P$A1D}G7U[99O`(RF.png
您需要登录后才可以回帖 登录 | 注册会员

本版积分规则

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

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

GMT+8, 2026-6-4 19:33

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

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