じ☆ve冰风 发表于 2026-4-21 02:37:20

传染病状态脚本

RUBY 代码
#==============================================================================
# ★ RGSS3 - 传染病状态脚本
#==============================================================================
# 功能说明:
#   在状态的备注栏中写入 ,即可让该状态每过指定回合传染给一名队友。
#   例如: 表示每3回合传染一次(无限循环,直到状态解除)。
#
# 使用说明:
#   1. 将此脚本放在 "▼ 插件脚本" 部分,Main 之前。
#   2. 在数据库“状态”选项卡中,为目标状态的备注栏添加 。
#   3. 自定义下方的 PLAGUE_SE 更改传染音效。
#==============================================================================

module PlagueState
# 传染时播放的音效(文件名,音量,音调)
PLAGUE_SE = ["Water5", 80, 100]
end

#==============================================================================
# ■ RPG::State
#==============================================================================
classRPG::State < RPG::BaseItem
#--------------------------------------------------------------------------
# ● 获取瘟疫传染回合数
#--------------------------------------------------------------------------
def plague_turns
    return@plague_turnsunless@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
    ifself.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
    if state && state.plague_state?
      @plague_counters ||= {}
      @plague_counters = 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 || 0
end

#--------------------------------------------------------------------------
# ● 设置瘟疫计数器
#--------------------------------------------------------------------------
def set_plague_counter(state_id, value)
    @plague_counters ||= {}
    @plague_counters = value
end

#--------------------------------------------------------------------------
# ● 回合结束时的瘟疫处理
#--------------------------------------------------------------------------
def process_plague_turn_end
    returnunless@plague_counters && !@plague_counters.empty?

    @plague_counters.each_keydo |state_id|
      nextunless state?(state_id)
      counter = @plague_counters
      if counter > 0
      counter -= 1
      @plague_counters = counter
      if counter == 0
          spread_plague(state_id)
      end
      end
    end
end

#--------------------------------------------------------------------------
# ● 传播瘟疫给队友(重置计数器实现周期传染)
#--------------------------------------------------------------------------
def spread_plague(state_id)
    returnunless actor?

    targets = $game_party.members.selectdo |member|
      member.alive? && !member.state?(state_id)
    end

    returnif targets.empty?

    target = targets.sample

    # 为目标添加状态(目标会获得新计数器)
    target.add_state(state_id)

    # 播放传染音效
    se = PlagueState::PLAGUE_SE
    RPG::SE.new(se, se, se).play

    # 显示战斗日志
    if SceneManager.scene_is?(Scene_Battle)
      state_name = $data_states.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
    if state && state.plague_state?
      @plague_counters = 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.eachdo |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.eachdo |actor|
      actor.process_plague_turn_end
    end
end
end




            本帖来自P1论坛作者Ruigi,因Project1站服务器在国外有时候访问缓慢不方便作者交流学习,经联系P1站长fux2同意署名转载一起分享游戏制作经验,共同为国内独立游戏作者共同创造良好交流环境,原文地址:https://rpg.blue/forum.php?mod=viewthread&tid=498844若有侵权,发帖作者可联系底部站长QQ在线咨询功能删除,谢谢。
页: [1]
查看完整版本: 传染病状态脚本