#============================================================================== # ★ RGSS3 - 传染病状态脚本 #============================================================================== # 功能说明: # 在状态的备注栏中写入 <plague:数字>,即可让该状态每过指定回合传染给一名队友。 # 例如:<plague:3> 表示每3回合传染一次(无限循环,直到状态解除)。 # # 使用说明: # 1. 将此脚本放在 "▼ 插件脚本" 部分,Main 之前。 # 2. 在数据库“状态”选项卡中,为目标状态的备注栏添加 <plague:X>。 # 3. 自定义下方的 PLAGUE_SE 更改传染音效。 #============================================================================== module PlagueState # 传染时播放的音效(文件名,音量,音调) PLAGUE_SE = ["Water5", 80, 100] end #============================================================================== # ■ RPG::State #============================================================================== class RPG::State < RPG::BaseItem #-------------------------------------------------------------------------- # ● 获取瘟疫传染回合数 #-------------------------------------------------------------------------- def plague_turns return @plague_turns unless @plague_turns.nil? load_plague_notetag return @plague_turns end #-------------------------------------------------------------------------- # ● 判断是否为瘟疫状态 #-------------------------------------------------------------------------- def plague_state? return plague_turns > 0 end #-------------------------------------------------------------------------- # ● 从备注中加载瘟疫标签 #-------------------------------------------------------------------------- def load_plague_notetag @plague_turns = 0 if self.note =~ /plague:\s*(\d+)/i @plague_turns = $1.to_i end end end #============================================================================== # ■ Game_Battler #============================================================================== class Game_Battler < Game_BattlerBase #-------------------------------------------------------------------------- # ● 别名:添加状态 #-------------------------------------------------------------------------- alias plague_add_state add_state def add_state(state_id) plague_add_state(state_id) state = $data_states[state_id] if state && state.plague_state? @plague_counters ||= {} @plague_counters[state_id] = state.plague_turns end end #-------------------------------------------------------------------------- # ● 别名:移除状态 #-------------------------------------------------------------------------- alias plague_remove_state remove_state def remove_state(state_id) plague_remove_state(state_id) @plague_counters.delete(state_id) if @plague_counters end #-------------------------------------------------------------------------- # ● 获取瘟疫计数器 #-------------------------------------------------------------------------- def plague_counter(state_id) @plague_counters ||= {} return @plague_counters[state_id] || 0 end #-------------------------------------------------------------------------- # ● 设置瘟疫计数器 #-------------------------------------------------------------------------- def set_plague_counter(state_id, value) @plague_counters ||= {} @plague_counters[state_id] = value end #-------------------------------------------------------------------------- # ● 回合结束时的瘟疫处理 #-------------------------------------------------------------------------- def process_plague_turn_end return unless @plague_counters && !@plague_counters.empty? @plague_counters.each_key do |state_id| next unless state?(state_id) counter = @plague_counters[state_id] if counter > 0 counter -= 1 @plague_counters[state_id] = counter if counter == 0 spread_plague(state_id) end end end end #-------------------------------------------------------------------------- # ● 传播瘟疫给队友(重置计数器实现周期传染) #-------------------------------------------------------------------------- def spread_plague(state_id) return unless actor? targets = $game_party.members.select do |member| member.alive? && !member.state?(state_id) end return if targets.empty? target = targets.sample # 为目标添加状态(目标会获得新计数器) target.add_state(state_id) # 播放传染音效 se = PlagueState::PLAGUE_SE RPG::SE.new(se[0], se[1], se[2]).play # 显示战斗日志 if SceneManager.scene_is?(Scene_Battle) state_name = $data_states[state_id].name text = "#{target.name} 被传染了 #{state_name} !" log_win = nil if SceneManager.scene.respond_to?(:log_window) && SceneManager.scene.log_window log_win = SceneManager.scene.log_window else log_win = SceneManager.scene.instance_variable_get(:@log_window) end log_win.add_text(text) if log_win end state = $data_states[state_id] if state && state.plague_state? @plague_counters[state_id] = state.plague_turns end end #-------------------------------------------------------------------------- # ● 清除所有瘟疫计数器 #-------------------------------------------------------------------------- def clear_plague_counters @plague_counters = {} end #-------------------------------------------------------------------------- # ● 别名:完全恢复时清除计数器 #-------------------------------------------------------------------------- alias plague_recover_all recover_all def recover_all plague_recover_all clear_plague_counters end end #============================================================================== # ■ Scene_Battle #============================================================================== class Scene_Battle < Scene_Base alias plague_turn_end turn_end def turn_end all_battle_members.each do |battler| battler.process_plague_turn_end end plague_turn_end end end #============================================================================== # ■ Game_Party #============================================================================== class Game_Party < Game_Unit alias plague_increase_steps increase_steps def increase_steps plague_increase_steps process_plague_on_map end def process_plague_on_map members.each do |actor| actor.process_plague_turn_end end end end
BXHZEX6E1XGDNM]J4]S201U.png (29.03 KB, 下载次数: 21)
5CH3UDUMGC5O5S6BD68A(KH.png (47.2 KB, 下载次数: 22)
T{ZK2[P$A1D}G7U[99O`(RF.png (27.1 KB, 下载次数: 21)
| 欢迎光临 Project1 (https://rpg.blue/) | Powered by Discuz! X3.1 |