﻿#==============================================================================
# ★ ExState_StepsRemove
#------------------------------------------------------------------------------
# 　走过特定的步数之后就会解除某个状态。
#==============================================================================

# 使用步数解除的状态指定用文字。
# 在「备注」中填入： 指定用文字列 + [平均步数] 
# 在走了近指定步数后就会自然解除。
# 范例： 平均 120 步解除的状态 => *STEPS_REMOVE[120]
EXSTA_STEPSRMV_SIGNATURE = "*STEPS_REMOVE"

# 状态解除的信息窗口设定。
# [此状态解除时的信息] 的设定会在窗口中显示
# 窗口的背景和显示位置可以在此设定
# 背景设定：(0:普通 1:变暗 2:透明)、
# 显示位置：(0:上 1:中 2:下) 
EXSTA_STEPSRMV_WINDOW = [0, 2]

#------------------------------------------------------------------------------

# 状态附加时生成持续步数，步数增加时则减少持续步数，
# 接触事件时判定是否解除状态，持续步数为0时解除状态。
# (考虑其他事件与地形利用等判定)

class Game_Battler
  alias _exsrstep_add_state add_state
  alias _exsrstep_remove_state remove_state
  #--------------------------------------------------------------------------
  # ● 付加状态 (追加定义)
  #     state_id : ステート ID
  #--------------------------------------------------------------------------
  def add_state(state_id)
    _exsrstep_add_state(state_id)
    $game_party.make_state_steps_count(state_id)
  end
  #--------------------------------------------------------------------------
  # ● 解除状态 (追加定义)
  #     state_id : ステート ID
  #--------------------------------------------------------------------------
  def remove_state(state_id)
    _exsrstep_remove_state(state_id)
    $game_party.clear_state_steps_count(state_id)
  end
end

class Game_Party
  alias _exsrstep_initialize initialize
  alias _exsrstep_on_player_walk on_player_walk
  #--------------------------------------------------------------------------
  # ●初始化对象 (追加定义)
  #--------------------------------------------------------------------------
  def initialize
    _exsrstep_initialize
    @state_steps_count = {} # 状态持续步数 (哈希表)
  end
  #--------------------------------------------------------------------------
  # ● 角色步数增加处理 (追加定义)
  #--------------------------------------------------------------------------
  def on_player_walk
    # 优先处理持续伤害与自动回复
    _exsrstep_on_player_walk
    for i in @state_steps_count.keys
      @state_steps_count[i] -= 1 if @state_steps_count[i] > 0
    end
  end
  #--------------------------------------------------------------------------
  # ☆ 获取状态持续步数
  #--------------------------------------------------------------------------
  def state_steps_count
    return @state_steps_count
  end
  #--------------------------------------------------------------------------
  # ☆ 生成状态随机步数
  #--------------------------------------------------------------------------
  def make_state_steps_count(state_id)
    state = $data_states[state_id]
    sig = EXSTA_STEPSRMV_SIGNATURE
    if state.note[/#{Regexp.quote sig}\[(\d+)\]/].to_a[0]
      n = $1.to_i
      @state_steps_count[state_id] = rand(n) + rand(n) + 1
    end
  end
  #--------------------------------------------------------------------------
  # ☆ 状态持续步数归零
  #--------------------------------------------------------------------------
  def clear_state_steps_count(state_id)
    @state_steps_count.delete(state_id)
  end
  #--------------------------------------------------------------------------
  # ☆ 使用步数解除状态判定
  #--------------------------------------------------------------------------
  def check_steps_state
    for i in @state_steps_count.keys
      if @state_steps_count[i] == 0
        for actor in members
          actor.remove_state(i)
        end
        state = $data_states[i]
        next if state.message4.empty?
        $game_message.background = EXSTA_STEPSRMV_WINDOW[0]
        $game_message.position = EXSTA_STEPSRMV_WINDOW[1]
        $game_message.texts.push(name + state.message4)
      end
    end
  end
end

class Game_Player
  alias _exsrstep_check_touch_event check_touch_event
  #--------------------------------------------------------------------------
  # ● 判断事件是否由接触触发（重叠） (追加定义)
  #--------------------------------------------------------------------------
  def check_touch_event
    # 优先判断步数解除
    $game_party.check_steps_state
    _exsrstep_check_touch_event
  end
end

