=begin
      RGSS3
      
      ★ イベント座標保持 ★
 
      指定イベントの座標を保存することで、
      マップ切り替え後のイベント座標リセットが発生しなくなります。
      
      ● 使い方 ●========================================================
      座標を保持しておきたいイベントの名前に
      「#KEEP」という文字列を含ませてください。
      ====================================================================
      
      ● イベントコマンド ●==============================================
      イベントコマンドのスクリプトからイベント座標保持のクリアを行えます。
      --------------------------------------------------------------------
      keep_event_clear(map_id)
      --------------------------------------------------------------------
      map_idにはリセット対象のマップID。
      引数は省略可能で、省略時は全てのマップが対象になります。
      ====================================================================
      
      ver1.00
 
      Last Update : 2011/12/18
      12/18 : 新規
      
      ろかん   [url]http://kaisou-ryouiki.sakura.ne.jp/[/url]
=end
 
$rsi ||= {}
$rsi["イベント座標保持"] = true
 
class RPG::Event
  def keep_position?
    self.name.include?("#KEEP")
  end
end
 
class Game_System
  #--------------------------------------------------------------------------
  # ● 座標を保持するイベントの登録
  #--------------------------------------------------------------------------
  def set_keep_event_position(map_id, event)
    @keep_event_position ||= {}
    @keep_event_position[map_id] ||= {}
    @keep_event_position[map_id][event.event.id] = [event.x, event.y, event.direction]
  end
  #--------------------------------------------------------------------------
  # ● 保持されているイベントの座標取得
  #--------------------------------------------------------------------------
  def get_keep_event_position(map_id, event_id, keep)
    return nil unless @keep_event_position
    return nil unless @keep_event_position[map_id]
    if keep
      @keep_event_position[map_id][event_id]
    else
      @keep_event_position[map_id].delete(event_id)
      nil
    end
  end
  #--------------------------------------------------------------------------
  # ● 指定マップのイベント座標の登録情報をクリア
  #--------------------------------------------------------------------------
  def clear_keep_position(map_id)
    if @keep_event_position
      if map_id.zero?
        @keep_event_position.clear
      elsif @keep_event_position[map_id]
        @keep_event_position[map_id].clear
      end
    end
  end
end
 
class Game_Event < Game_Character
  #--------------------------------------------------------------------------
  # ● 公開インスタンス変数
  #--------------------------------------------------------------------------
  attr_reader   :event                 # イベント
  #--------------------------------------------------------------------------
  # ● オブジェクト初期化
  #--------------------------------------------------------------------------
  alias _revision_position initialize
  def initialize(map_id, event)
    @keep = event.keep_position?
    get_position = get_save_position(map_id, event)
    event.x = get_position[0]
    event.y = get_position[1]
    _revision_position(map_id, event)
    @direction = get_position[2] if get_position[2]
  end
  #--------------------------------------------------------------------------
  # ● 現在座標を保持する
  #--------------------------------------------------------------------------
  def save_position
    $game_system.set_keep_event_position(@map_id, self) if @keep
  end
  #--------------------------------------------------------------------------
  # ● 保持座標を返す(保持されていないイベントの場合は初期座標を返します)
  #--------------------------------------------------------------------------
  def get_save_position(map_id, event)
    sp = $game_system.get_keep_event_position(map_id, event.id, @keep)
    sp ? sp : [event.x, event.y, nil]
  end
end
 
class Game_Map
  #--------------------------------------------------------------------------
  # ● セットアップ
  #--------------------------------------------------------------------------
  alias _keep_event_setup setup
  def setup(map_id)
    save_event_position
    _keep_event_setup(map_id)
  end
  #--------------------------------------------------------------------------
  # ● イベント座標の保持
  #--------------------------------------------------------------------------
  def save_event_position
    @events.each_value{|event| event.save_position}
  end
end
 
class Game_Interpreter
  #--------------------------------------------------------------------------
  # ● 保持しているイベント座標のクリア
  #--------------------------------------------------------------------------
  def keep_event_clear(map_id = 0)
    $game_system.clear_keep_position(map_id)
  end
end