XP パーティ行列歩行システム

# 設定項目
module TKS
  The_Number_of_PMembers = 4  # パーティメンバの最大人数
end

#----------------------------------------------------------------------------
# ● パーティメンバをプレイヤーの元に集めるコマンド
# 書式:◆スクリプト:gather_party
#----------------------------------------------------------------------------
def gather_party
  # dir→commandID変換配列の作成
  dir_to_number = [0, 5, 1, 6, 2, 0, 3, 7, 4, 8]
  # commandIDテーブルの初期化
  direction = []
  for i in 0 .. $game_pmembers.size - 1
    direction[i] = 0
  end
  # パーティメンバの移動ルートの作成
  for i in 1 .. $game_pmembers.size
    direction[i - 1] = dir_to_number[$game_pmembers[i].dir]
    # グラフィックが透明の場合
    if $game_pmembers[i].character_name == ""
      # ダイレクトに移動させる
      $game_pmembers[i].moveto($game_player.x, $game_player.y)
      $game_pmembers[i].direction = $game_player.direction
    # グラフィックが透明でない場合
    else
      # 移動ルートを作成する
      move_route = RPG::MoveRoute.new
      move_route.repeat = false
      move_route.skippable = false
      move_route.list = []
      max = $game_pmembers.size
      i2 = 0
      for dir in direction.reverse
        if dir != 0
          move_route.list[i2] = RPG::MoveCommand.new(dir)
          i2 += 1
        end
      end
      move_route.list[i2] = RPG::MoveCommand.new(15 + $game_player.direction / 2)
      move_route.list[i2 + 1] = RPG::MoveCommand.new(0)
      $game_pmembers[i].force_move_route(move_route)
    end
  end
  # パーティメンバの予約歩行進路をクリア
  for member in $game_pmembers.values
    member.dir = 0
  end
  # 継続
  return true
end
#----------------------------------------------------------------------------
# ● ドラホコシステムをON/OFFにするイベント
# 書式:◆スクリプト:dorahoko_system(true)
#       ◆スクリプト:dorahoko_system(false)
#----------------------------------------------------------------------------
def dorahoko_system(value)
  # システムフラグを更新
  $game_system.dorahoko_system = value
  # 継続
  return true
end

#==============================================================================
# ■ Game_PMembers
#------------------------------------------------------------------------------
#  マップ移動中の後続パーティメンバのクラスです。
#==============================================================================

class Game_PMembers < Game_Character
  #--------------------------------------------------------------------------
  # ● 公開インスタンス変数
  #--------------------------------------------------------------------------
  attr_accessor :dir                      # 歩かせる方向
  attr_accessor :move_speed               # 移動速度
  attr_accessor :move_frequency           # 移動頻度
  attr_accessor :direction                # 向き
  #--------------------------------------------------------------------------
  # ● オブジェクト初期化
  #     mamber_id : メンバID
  #--------------------------------------------------------------------------
  def initialize(member_id)
    # Game_Characterクラスのinitializeメソッドを呼び出す
    super()
    # 特有・例外部分を設定する
    @member_id = member_id
    @through = false
    @dir = 0
  end
  #--------------------------------------------------------------------------
  # ● フレーム更新
  #--------------------------------------------------------------------------
  def update
    # Game_Characterクラスのupdateメソッドを呼び出す
    super()
    # 特有・例外部分を更新する
    # パーティメンバが一人でもいる場合
    if $game_party.actors[0] != nil
      # ドラホコシステムがオンで
      # プレイヤーのグラフィックと戦闘のグラフィックが一致していて
      # プレイヤーが透明状態ではなく
      # このパーティメンバが有効なとき
      if ($game_system.dorahoko_system == true and
        $game_player.character_name == $game_party.actors[0].character_name and
        $game_player.transparent == false and
        $game_party.actors[@member_id] != nil)
        # グラフィックと色調をデータと一致させる
        @character_name = $game_party.actors[@member_id].character_name
        @character_hue = $game_party.actors[@member_id].character_hue
      # それ以外のとき
      else
        # グラフィックを透明にして、見えなくする
        @character_name = ""
        @character_hue = 0
      end
    end
  end
  #--------------------------------------------------------------------------
  # ● @dirの方向に移動
  #--------------------------------------------------------------------------
  def walk
    # 停止中でなければ中断
    if jumping? or moving?
      return
    end
    # 予約された方向で分岐
    case @dir
    when 1 # 左下
      move_lower_left
    when 2 # 下
      move_down
    when 3 # 右下
      move_lower_right
    when 4 # 左
      move_left
    when 6 # 右
      move_right
    when 7 # 左上
      move_upper_left
    when 8 # 上
      move_up
    when 9 # 右上
      move_upper_right
    end
  end
  #--------------------------------------------------------------------------
  # ● 通行可能判定
  #     x : X 座標
  #     y : Y 座標
  #     d : 方向 (0,2,4,6,8)  ※ 0 = 全方向通行不可の場合を判定 (ジャンプ用)
  #--------------------------------------------------------------------------
  def passable?(x, y, d)
    # 通行可
    return true
  end
end

#----------------------------------------------------------------------------
# ▼ 以下、再定義
#----------------------------------------------------------------------------
class Game_System
  attr_accessor :dorahoko_system
  alias tks_initialize initialize
  def initialize
    @dorahoko_system = true
    tks_initialize
  end
end

class Game_Character
  #--------------------------------------------------------------------------
  # ● 通行可能判定
  #     x : X 座標
  #     y : Y 座標
  #     d : 方向 (0,2,4,6,8)  ※ 0 = 全方向通行不可の場合を判定 (ジャンプ用)
  #--------------------------------------------------------------------------
  def passable?(x, y, d)
    # 新しい座標を求める
    new_x = x + (d == 6 ? 1 : d == 4 ? -1 : 0)
    new_y = y + (d == 2 ? 1 : d == 8 ? -1 : 0)
    # 座標がマップ外の場合
    unless $game_map.valid?(new_x, new_y)
      # 通行不可
      return false
    end
    # すり抜け ON の場合
    if @through
      # 通行可
      return true
    end
    # 移動元のタイルから指定方向に出られない場合
    unless $game_map.passable?(x, y, d, self)
      # 通行不可
      return false
    end
    # 移動先のタイルに指定方向から入れない場合
    unless $game_map.passable?(new_x, new_y, 10 - d)
      # 通行不可
      return false
    end
#>---------------------------------------------------------------------------
    # 全パーティメンバのループ
    for member in $game_pmembers.values
      # パーティメンバの座標が移動先と一致した場合
      if member.x == new_x and member.y == new_y
        # すり抜け OFF なら
        unless member.through
          # 自分がイベントで、相手のグラフィックがキャラクターの場合
          if self != $game_player and member.character_name != ""
            return false
          end
        end
      end
    end
#<---------------------------------------------------------------------------
    # 全イベントのループ
    for event in $game_map.events.values
      # イベントの座標が移動先と一致した場合
      if event.x == new_x and event.y == new_y
        # すり抜け OFF なら
        unless event.through
          # 自分がイベントの場合
          if self != $game_player
            # 通行不可
            return false
          end
          # 自分がプレイヤーで、相手のグラフィックがキャラクターの場合
          if event.character_name != ""
            # 通行不可
            return false
          end
        end
      end
    end
    # プレイヤーの座標が移動先と一致した場合
    if $game_player.x == new_x and $game_player.y == new_y
      # すり抜け OFF なら
      unless $game_player.through
        # 自分のグラフィックがキャラクターの場合
        if @character_name != ""
          # 通行不可
          return false
        end
      end
    end
    # 通行可
    return true
  end
end

class Spriteset_Map
  #--------------------------------------------------------------------------
  # ● オブジェクト初期化
  #--------------------------------------------------------------------------
  def initialize
    # ビューポートを作成
    @viewport1 = Viewport.new(0, 0, 640, 480)
    @viewport2 = Viewport.new(0, 0, 640, 480)
    @viewport3 = Viewport.new(0, 0, 640, 480)
    @viewport2.z = 200
    @viewport3.z = 5000
    # タイルマップを作成
    @tilemap = Tilemap.new(@viewport1)
    @tilemap.tileset = RPG::Cache.tileset($game_map.tileset_name)
    for i in 0..6
      autotile_name = $game_map.autotile_names[i]
      @tilemap.autotiles[i] = RPG::Cache.autotile(autotile_name)
    end
    @tilemap.map_data = $game_map.data
    @tilemap.priorities = $game_map.priorities
    # パノラマプレーンを作成
    @panorama = Plane.new(@viewport1)
    @panorama.z = -1000
    # フォグプレーンを作成
    @fog = Plane.new(@viewport1)
    @fog.z = 3000
    # キャラクタースプライトを作成
    @character_sprites = []
    for i in $game_map.events.keys.sort
      sprite = Sprite_Character.new(@viewport1, $game_map.events[i])
      @character_sprites.push(sprite)
    end
#>---------------------------------------------------------------------------
    # パーティメンバ用のスプライトを作成
    for i in $game_pmembers.keys.sort.reverse
      sprite = Sprite_Character.new(@viewport1, $game_pmembers[i])
      @character_sprites.push(sprite)
    end
#<---------------------------------------------------------------------------
    @character_sprites.push(Sprite_Character.new(@viewport1, $game_player))
    # 天候を作成
    @weather = RPG::Weather.new(@viewport1)
    # ピクチャを作成
    @picture_sprites = []
    for i in 1..50
      @picture_sprites.push(Sprite_Picture.new(@viewport2,
        $game_screen.pictures[i]))
    end
    # タイマースプライトを作成
    @timer_sprite = Sprite_Timer.new
    # フレーム更新
    update
  end
end

class Game_Player
  #--------------------------------------------------------------------------
  # ● フレーム更新
  #--------------------------------------------------------------------------
  alias tks_update update
  def update
    tks_update
    # パーティメンバの速度と頻度を合わせる
    for member in $game_pmembers.values
      member.move_speed = @move_speed
      member.move_frequency = @move_frequency
      member.update
    end
  end
  #--------------------------------------------------------------------------
  # ● 指定位置に移動
  #     x : X 座標
  #     y : Y 座標
  #--------------------------------------------------------------------------
  alias tks_moveto moveto
  def moveto(x, y)
    tks_moveto(x, y)
    # パーティメンバも同じ位置に移動
    for member in $game_pmembers.values
      member.moveto(x, y)
      member.dir = 0
    end
  end
  #--------------------------------------------------------------------------
  # ● 下に移動
  #     turn_enabled : その場での向き変更を許可するフラグ
  #--------------------------------------------------------------------------
  def move_down(turn_enabled = true)
    # 下を向く
    if turn_enabled
      turn_down
    end
    # 通行可能な場合
    if passable?(@x, @y, 2)
      # 後続メンバーを歩かせる
      for member in $game_pmembers.values
        member.walk
      end
      max = $game_pmembers.size
      for i in 0 .. max - 2
        $game_pmembers[max - i].dir = $game_pmembers[max - i - 1].dir
      end
      $game_pmembers[1].dir = 2
      # 下を向く
      turn_down
      # 座標を更新
      @y += 1
      # 歩数増加
      increase_steps
    # 通行不可能な場合
    else
      # 接触イベントの起動判定
      check_event_trigger_touch(@x, @y+1)
    end
  end
  #--------------------------------------------------------------------------
  # ● 左に移動
  #     turn_enabled : その場での向き変更を許可するフラグ
  #--------------------------------------------------------------------------
  def move_left(turn_enabled = true)
    # 左を向く
    if turn_enabled
      turn_left
    end
    # 通行可能な場合
    if passable?(@x, @y, 4)
      # 後続メンバーを歩かせる
      for member in $game_pmembers.values
        member.walk
      end
      max = $game_pmembers.size
      for i in 0 .. max - 2
        $game_pmembers[max - i].dir = $game_pmembers[max - i - 1].dir
      end
      $game_pmembers[1].dir = 4
      # 左を向く
      turn_left
      # 座標を更新
      @x -= 1
      # 歩数増加
      increase_steps
    # 通行不可能な場合
    else
      # 接触イベントの起動判定
      check_event_trigger_touch(@x-1, @y)
    end
  end
  #--------------------------------------------------------------------------
  # ● 右に移動
  #     turn_enabled : その場での向き変更を許可するフラグ
  #--------------------------------------------------------------------------
  def move_right(turn_enabled = true)
    # 右を向く
    if turn_enabled
      turn_right
    end
    # 通行可能な場合
    if passable?(@x, @y, 6)
      # 後続メンバーを歩かせる
      for member in $game_pmembers.values
        member.walk
      end
      max = $game_pmembers.size
      for i in 0 .. max - 2
        $game_pmembers[max - i].dir = $game_pmembers[max - i - 1].dir
      end
      $game_pmembers[1].dir = 6
      # 右を向く
      turn_right
      # 座標を更新
      @x += 1
      # 歩数増加
      increase_steps
    # 通行不可能な場合
    else
      # 接触イベントの起動判定
      check_event_trigger_touch(@x+1, @y)
    end
  end
  #--------------------------------------------------------------------------
  # ● 上に移動
  #     turn_enabled : その場での向き変更を許可するフラグ
  #--------------------------------------------------------------------------
  def move_up(turn_enabled = true)
    # 上を向く
    if turn_enabled
      turn_up
    end
    # 通行可能な場合
    if passable?(@x, @y, 8)
      # 後続メンバーを歩かせる
      for member in $game_pmembers.values
        member.walk
      end
      max = $game_pmembers.size
      for i in 0 .. max - 2
        $game_pmembers[max - i].dir = $game_pmembers[max - i - 1].dir
      end
      $game_pmembers[1].dir = 8
      # 上を向く
      turn_up
      # 座標を更新
      @y -= 1
      # 歩数増加
      increase_steps
    # 通行不可能な場合
    else
      # 接触イベントの起動判定
      check_event_trigger_touch(@x, @y-1)
    end
  end
  #--------------------------------------------------------------------------
  # ● 左下に移動
  #--------------------------------------------------------------------------
  def move_lower_left
    # 向き固定でない場合
    unless @direction_fix
      # 右向きだった場合は左を、上向きだった場合は下を向く
      @direction = (@direction == 6 ? 4 : @direction == 8 ? 2 : @direction)
    end
    # 下→左、左→下 のどちらかのコースが通行可能な場合
    if (passable?(@x, @y, 2) and passable?(@x, @y + 1, 4)) or
       (passable?(@x, @y, 4) and passable?(@x - 1, @y, 2))
      # 後続メンバーを歩かせる
      for member in $game_pmembers.values
        member.walk
      end
      max = $game_pmembers.size
      for i in 0 .. max - 2
        $game_pmembers[max - i].dir = $game_pmembers[max - i - 1].dir
      end
      $game_pmembers[1].dir = 1
      # 座標を更新
      @x -= 1
      @y += 1
      # 歩数増加
      increase_steps
    end
  end
  #--------------------------------------------------------------------------
  # ● 右下に移動
  #--------------------------------------------------------------------------
  def move_lower_right
    # 向き固定でない場合
    unless @direction_fix
      # 左向きだった場合は右を、上向きだった場合は下を向く
      @direction = (@direction == 4 ? 6 : @direction == 8 ? 2 : @direction)
    end
    # 下→右、右→下 のどちらかのコースが通行可能な場合
    if (passable?(@x, @y, 2) and passable?(@x, @y + 1, 6)) or
       (passable?(@x, @y, 6) and passable?(@x + 1, @y, 2))
      # 後続メンバーを歩かせる
      for member in $game_pmembers.values
        member.walk
      end
      max = $game_pmembers.size
      for i in 0 .. max - 2
        $game_pmembers[max - i].dir = $game_pmembers[max - i - 1].dir
      end
      $game_pmembers[1].dir = 3
      # 座標を更新
      @x += 1
      @y += 1
      # 歩数増加
      increase_steps
    end
  end
  #--------------------------------------------------------------------------
  # ● 左上に移動
  #--------------------------------------------------------------------------
  def move_upper_left
    # 向き固定でない場合
    unless @direction_fix
      # 右向きだった場合は左を、下向きだった場合は上を向く
      @direction = (@direction == 6 ? 4 : @direction == 2 ? 8 : @direction)
    end
    # 上→左、左→上 のどちらかのコースが通行可能な場合
    if (passable?(@x, @y, 8) and passable?(@x, @y - 1, 4)) or
       (passable?(@x, @y, 4) and passable?(@x - 1, @y, 8))
      # 後続メンバーを歩かせる
      for member in $game_pmembers.values
        member.walk
      end
      max = $game_pmembers.size
      for i in 0 .. max - 2
        $game_pmembers[max - i].dir = $game_pmembers[max - i - 1].dir
      end
      $game_pmembers[1].dir = 7
      # 座標を更新
      @x -= 1
      @y -= 1
      # 歩数増加
      increase_steps
    end
  end
  #--------------------------------------------------------------------------
  # ● 右上に移動
  #--------------------------------------------------------------------------
  def move_upper_right
    # 向き固定でない場合
    unless @direction_fix
      # 左向きだった場合は右を、下向きだった場合は上を向く
      @direction = (@direction == 4 ? 6 : @direction == 2 ? 8 : @direction)
    end
    # 上→右、右→上 のどちらかのコースが通行可能な場合
    if (passable?(@x, @y, 8) and passable?(@x, @y - 1, 6)) or
       (passable?(@x, @y, 6) and passable?(@x + 1, @y, 8))
      # 後続メンバーを歩かせる
      for member in $game_pmembers.values
        member.walk
      end
      max = $game_pmembers.size
      for i in 0 .. max - 2
        $game_pmembers[max - i].dir = $game_pmembers[max - i - 1].dir
      end
      $game_pmembers[1].dir = 9
      # 座標を更新
      @x += 1
      @y -= 1
      # 歩数増加
      increase_steps
    end
  end
end

class Interpreter
  #--------------------------------------------------------------------------
  # ● フレーム更新
  #--------------------------------------------------------------------------
  def update
    # ループカウントを初期化
    @loop_count = 0
    # ループ
    loop do
      # ループカウントに 1 加算
      @loop_count += 1
      # イベントコマンド 100 個を実行した場合
      if @loop_count > 100
        # フリーズ防止のため、Graphics.update を呼ぶ
        Graphics.update
        @loop_count = 0
      end
      # マップがイベント起動時と異なる場合
      if $game_map.map_id != @map_id
        # イベント ID を 0 にする
        @event_id = 0
      end
      # 子インタプリタが存在する場合
      if @child_interpreter != nil
        # 子インタプリタを更新
        @child_interpreter.update
        # 子インタプリタの実行が終わった場合
        unless @child_interpreter.running?
          # 子インタプリタを消去
          @child_interpreter = nil
        end
        # 子インタプリタがまだ存在する場合
        if @child_interpreter != nil
          return
        end
      end
      # メッセージ終了待機中の場合
      if @message_waiting
        return
      end
      # 移動完了待機中の場合
      if @move_route_waiting
        # プレイヤーが移動ルート強制中の場合
        if $game_player.move_route_forcing
          return
        end
        # ループ (マップイベント)
        for event in $game_map.events.values
          # このイベントが移動ルート強制中の場合
          if event.move_route_forcing
            return
          end
        end
#>---------------------------------------------------------------------------
        # ループ(パーティメンバ)
        for member in $game_pmembers.values
          # このメンバが移動ルート強制中の場合
          if member.move_route_forcing
            return
          end
        end
#<---------------------------------------------------------------------------
        # 移動完了待機中フラグをクリア
        @move_route_waiting = false
      end
      # ボタン入力待機中の場合
      if @button_input_variable_id > 0
        # ボタン入力の処理を実行
        input_button
        return
      end
      # ウェイト中の場合
      if @wait_count > 0
        # ウェイトカウントを減らす
        @wait_count -= 1
        return
      end
      # アクションを強制されているバトラーが存在する場合
      if $game_temp.forcing_battler != nil
        return
      end
      # 各種画面の呼び出しフラグがセットされている場合
      if $game_temp.battle_calling or
         $game_temp.shop_calling or
         $game_temp.name_calling or
         $game_temp.menu_calling or
         $game_temp.save_calling or
         $game_temp.gameover
        return
      end
      # 実行内容リストが空の場合
      if @list == nil
        # メインのマップイベントの場合
        if @main
          # 起動中のイベントをセットアップ
          setup_starting_event
        end
        # 何もセットアップされなかった場合
        if @list == nil
          return
        end
      end
      # イベントコマンドの実行を試み、戻り値が false の場合
      if execute_command == false
        return
      end
      # インデックスを進める
      @index += 1
    end
  end
end

class Scene_Title
  #--------------------------------------------------------------------------
  # ● コマンド : ニューゲーム
  #--------------------------------------------------------------------------
  def command_new_game
    # 決定 SE を演奏
    $game_system.se_play($data_system.decision_se)
    # BGM を停止
    Audio.bgm_stop
    # プレイ時間計測用のフレームカウントをリセット
    Graphics.frame_count = 0
    # 各種ゲームオブジェクトを作成
    $game_temp          = Game_Temp.new
    $game_system        = Game_System.new
    $game_switches      = Game_Switches.new
    $game_variables     = Game_Variables.new
    $game_self_switches = Game_SelfSwitches.new
    $game_screen        = Game_Screen.new
    $game_actors        = Game_Actors.new
    $game_party         = Game_Party.new
    $game_troop         = Game_Troop.new
    $game_map           = Game_Map.new
    $game_player        = Game_Player.new
    # 初期パーティをセットアップ
    $game_party.setup_starting_members
#>---------------------------------------------------------------------------
    # パーティメンバ後続キャラクタを設定
    $game_pmembers = {}
    for i in 1 .. TKS::The_Number_of_PMembers - 1
      $game_pmembers[i] = Game_PMembers.new(i)
    end
#<---------------------------------------------------------------------------
    # 初期位置のマップをセットアップ
    $game_map.setup($data_system.start_map_id)
    # プレイヤーを初期位置に移動
    $game_player.moveto($data_system.start_x, $data_system.start_y)
    # プレイヤーをリフレッシュ
    $game_player.refresh
#>---------------------------------------------------------------------------
    # パーティメンバを更新
    for member in $game_pmembers.values
      member.update
    end
#<---------------------------------------------------------------------------
    # マップに設定されている BGM と BGS の自動切り替えを実行
    $game_map.autoplay
    # マップを更新 (並列イベント実行)
    $game_map.update
    # マップ画面に切り替え
    $scene = Scene_Map.new
  end
end

class Scene_Map
  #--------------------------------------------------------------------------
  # ● プレイヤーの場所移動
  #--------------------------------------------------------------------------
  def transfer_player
    # プレイヤー場所移動フラグをクリア
    $game_temp.player_transferring = false
    # 移動先が現在のマップと異なる場合
    if $game_map.map_id != $game_temp.player_new_map_id
      # 新しいマップをセットアップ
      $game_map.setup($game_temp.player_new_map_id)
    end
    # プレイヤーの位置を設定
    $game_player.moveto($game_temp.player_new_x, $game_temp.player_new_y)
    # プレイヤーとパーティメンバの向きを設定
    case $game_temp.player_new_direction
#>---------------------------------------------------------------------------
    when 0  # 無指定
      for member in $game_pmembers.values
        case $game_player.direction
        when 2
          member.turn_down
        when 4
          member.turn_left
        when 6
          member.turn_right
        when 8
          member.turn_up
        end
      end
#<---------------------------------------------------------------------------
    when 2  # 下
      $game_player.turn_down
#>---------------------------------------------------------------------------
      for member in $game_pmembers.values
        member.turn_down
      end
#<---------------------------------------------------------------------------
    when 4  # 左
      $game_player.turn_left
#>---------------------------------------------------------------------------
      for member in $game_pmembers.values
        member.turn_left
      end
#<---------------------------------------------------------------------------
    when 6  # 右
      $game_player.turn_right
#>---------------------------------------------------------------------------
      for member in $game_pmembers.values
        member.turn_right
      end
#<---------------------------------------------------------------------------
    when 8  # 上
      $game_player.turn_up
#>---------------------------------------------------------------------------
      for member in $game_pmembers.values
        member.turn_up
      end
#<---------------------------------------------------------------------------
    end
    # プレイヤーとパーティメンバの姿勢を矯正
    $game_player.straighten
#>---------------------------------------------------------------------------
    for member in $game_pmembers.values
      member.straighten
    end
#<---------------------------------------------------------------------------
    # マップを更新 (並列イベント実行)
    $game_map.update
    # スプライトセットを再作成
    @spriteset.dispose
    @spriteset = Spriteset_Map.new
    # トランジション処理中の場合
    if $game_temp.transition_processing
      # トランジション処理中フラグをクリア
      $game_temp.transition_processing = false
      # トランジション実行
      Graphics.transition(20)
    end
    # マップに設定されている BGM と BGS の自動切り替えを実行
    $game_map.autoplay
    # フレームリセット
    Graphics.frame_reset
    # 入力情報を更新
    Input.update
  end
end

class Scene_Save
  #--------------------------------------------------------------------------
  # ● セーブデータの書き込み
  #     file : 書き込み用ファイルオブジェクト (オープン済み)
  #--------------------------------------------------------------------------
  alias tks_write_save_data write_save_data
  def write_save_data(file)
    tks_write_save_data(file)
    Marshal.dump($game_pmembers, file)
  end
end

class Scene_Load
  #--------------------------------------------------------------------------
  # ● セーブデータの読み込み
  #     file : 読み込み用ファイルオブジェクト (オープン済み)
  #--------------------------------------------------------------------------
  alias tks_read_save_data read_save_data
  def read_save_data(file)
    tks_read_save_data(file)
    $game_pmembers = Marshal.load(file)
  end
end

スクリプトエディタで、Mainセクションの上に新たなセクションを作り、
そこに貼り付ければ、多分動くと思います。
ただし、セーブファイルがらみの処理を改変していますので
セーブデータからゲームを始めないでください。エラーになります。

動かない場合は、再定義の代わりに#>----から#<----の間のスクリプトを自分で挿入してください。

他のスクリプトと干渉を起こす可能性のある再定義メソッドは以下のとおりです。

Game_Character
passable?

Spriteset_Map
initialize

Game_Player
move_down
move_left
move_right
move_up
move_lower_left
move_lower_right
move_upper_left
move_upper_right

Interpreter
update

Scene_Title
command_new_game

Scene_Map
transfer_player