查看: 839|回复: 0

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

[复制链接]
梦石
1
星屑
1184
在线时间
59 小时
注册时间
2023-9-8
回帖
19
发表于 2026-4-21 02:47:14 | 显示全部楼层 |阅读模式

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

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

×
[pre lang="ruby"]#==============================================================================
# ★ 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[/pre]
BXHZEX6E1XGDNM]J4]S201U.png
5CH3UDUMGC5O5S6BD68A(KH.png
T{ZK2[P$A1D}G7U[99O`(RF.png
您需要登录后才可以回帖 登录 | 注册会员

本版积分规则

Powered by Discuz! X5.0 © 2001-2026 Discuz! Team.

在本版发帖返回顶部