# ————————————————————————————————————
 
# ▼▲▼ XRXS13. パーティ列車移動 ver.1.02 ▼▲▼
#
# Train_Actor
#
#
 
module Train_Actor
 
 
 
 
#是否使用停止跟随的方法,也就是说,这里false改为true的时候,如果TRANSPARENT_SWITCHES_INDEX
#开关打开,跟随的人物就消失了(其实只是变成透明而已)
TRANSPARENT_SWITCH = false
TRANSPARENT_SWITCHES_INDEX = 20
#举例:第一个为true,第二个为20,则打开20号开关,后面的人都没了。
 
 
 
 
 
#跟随人数的最大数目,可以更改为2、3什么的。
TRAIN_ACTOR_SIZE_MAX = 5
 
 
 
 
 
# 定数
#Input::DOWN = 2
#Input::LEFT = 4
#Input::RIGHT = 6
#Input::UP = 6
DOWN_LEFT = 1
DOWN_RIGHT = 3
UP_LEFT = 7
UP_RIGHT = 9
JUMP = 5
#==============================================================================
# ■ Game_Party_Actor
#------------------------------------------------------------------------------
#  
#==============================================================================
class Game_Party_Actor < Game_Character
attr :name
def initialize
 
super()
@x = $game_player.x
@y = $game_player.y
@through = true
end
def setup(actor)
# キャラクターのファイル名と色相を設定
if actor != nil
if $game_player.moving?
@character_name = actor.character_name
else
if actor.id < 30
@character_name = actor.character_name + "_W1"
else
@character_name = actor.character_name
end
end
@character_hue = actor.character_hue
@tempneme = actor.name 
else
@character_name = ""
@character_hue = 0
@tempneme = ""
end
# 不透明度と合成方法を初期化
[url=home.php?mod=space&uid=316553]@opacity[/url] = 255
@blend_type = 0
end
def screen_z(height = 0)
if $game_player.x == @x and $game_player.y == @y
return $game_player.screen_z(height) - 1
end
super(height)
end
    def name
        return @tempneme
      end
#--------------------------------------------------------------------------
# ● 下に移動
# turn_enabled : その場での向き変更を許可するフラグ
#--------------------------------------------------------------------------
def move_down(turn_enabled = true)
  # 下を向く
  if turn_enabled
    turn_down
  end
  # 通行可能な場合
  if passable?(@x, @y, Input::DOWN)
    # 下を向く
    turn_down
    # 座標を更新
    @y += 1
    increase_steps
  end
end
#--------------------------------------------------------------------------
# ● 左に移動
# turn_enabled : その場での向き変更を許可するフラグ
#--------------------------------------------------------------------------
def move_left(turn_enabled = true)
  # 左を向く
  if turn_enabled
    turn_left
  end
  # 通行可能な場合
  if passable?(@x, @y, Input::LEFT)
    # 左を向く
    turn_left
    # 座標を更新
    @x -= 1
    increase_steps
  end
end
#--------------------------------------------------------------------------
# ● 右に移動
# turn_enabled : その場での向き変更を許可するフラグ
#--------------------------------------------------------------------------
def move_right(turn_enabled = true)
  # 右を向く
  if turn_enabled
    turn_right
  end
  # 通行可能な場合
  if passable?(@x, @y, Input::RIGHT)
    # 右を向く
    turn_right
    # 座標を更新
    @x += 1
    increase_steps
  end
end
#--------------------------------------------------------------------------
# ● 上に移動
# turn_enabled : その場での向き変更を許可するフラグ
#--------------------------------------------------------------------------
def move_up(turn_enabled = true)
  # 上を向く
  if turn_enabled
    turn_up
  end
  # 通行可能な場合
  if passable?(@x, @y, Input::UP)
    # 上を向く
    turn_up
    # 座標を更新
    @y -= 1
    increase_steps
  end
end
#--------------------------------------------------------------------------
# ● 左下に移動
#--------------------------------------------------------------------------
def move_lower_left
  # 向き固定でない場合
  unless @direction_fix
    # 右向きだった場合は左を、上向きだった場合は下を向く
    @direction = 1
  end
  # 下→左、左→下 のどちらかのコースが通行可能な場合
  if (passable?(@x, @y, Input::DOWN) and passable?(@x, @y + 1, Input::LEFT)) or
     (passable?(@x, @y, Input::LEFT) and passable?(@x - 1, @y, Input::DOWN))
    # 座標を更新
    @x -= 1
    @y += 1
    increase_steps
  end
end
#--------------------------------------------------------------------------
# ● 右下に移動
#--------------------------------------------------------------------------
def move_lower_right
  # 向き固定でない場合
  unless @direction_fix
    # 左向きだった場合は右を、上向きだった場合は下を向く
    @direction = 3
  end
  # 下→右、右→下 のどちらかのコースが通行可能な場合
  if (passable?(@x, @y, Input::DOWN) and passable?(@x, @y + 1, Input::RIGHT)) or
     (passable?(@x, @y, Input::RIGHT) and passable?(@x + 1, @y, Input::DOWN))
    # 座標を更新
    @x += 1
    @y += 1
    increase_steps
  end
end
#--------------------------------------------------------------------------
# ● 左上に移動
#--------------------------------------------------------------------------
def move_upper_left
  # 向き固定でない場合
  unless @direction_fix
    # 右向きだった場合は左を、下向きだった場合は上を向く
    @direction = 7
  end
  # 上→左、左→上 のどちらかのコースが通行可能な場合
  if (passable?(@x, @y, Input::UP) and passable?(@x, @y - 1, Input::LEFT)) or
     (passable?(@x, @y, Input::LEFT) and passable?(@x - 1, @y, Input::UP))
    # 座標を更新
    @x -= 1
    @y -= 1
    increase_steps
  end
end
#--------------------------------------------------------------------------
# ● 右上に移動
#--------------------------------------------------------------------------
def move_upper_right
  # 向き固定でない場合
  unless @direction_fix
    # 左向きだった場合は右を、下向きだった場合は上を向く
    @direction = 9
  end
  # 上→右、右→上 のどちらかのコースが通行可能な場合
  if (passable?(@x, @y, Input::UP) and passable?(@x, @y - 1, Input::RIGHT)) or
     (passable?(@x, @y, Input::RIGHT) and passable?(@x + 1, @y, Input::UP))
    # 座標を更新
    @x += 1
    @y -= 1
    increase_steps
  end
end
attr_writer :move_speed
attr_writer :step_anime
end
#==============================================================================
# ■ Spriteset_Map_Module
#------------------------------------------------------------------------------
#  
#==============================================================================
module Spriteset_Map_Module
def setup_actor_character_sprites?
  return @setup_actor_character_sprites_flag != nil
end
def setup_actor_character_sprites(characters)
  if !setup_actor_character_sprites?
    index_game_player = 0
    @character_sprites.each_index do |i|
      if @character_sprites[i].character.instance_of?(Game_Player)
        index_game_player = i
        break
      end
    end
    for character in characters.reverse
      @character_sprites.unshift(
       Sprite_Character.new(@viewport1, character)
       )
    end
    @setup_actor_character_sprites_flag = true
  end
end
end
#==============================================================================
# ■ Scene_Map_Module
#------------------------------------------------------------------------------
#  
#==============================================================================
module Scene_Map_Module
def setup_actor_character_sprites(characters)
  @spriteset.setup_actor_character_sprites(characters)
end
end
#==============================================================================
# ■ Game_Party_Module
#------------------------------------------------------------------------------
#  
#==============================================================================
module Game_Party_Module
def return_char(i)
 return @characters[i]
end
def set_transparent_actors(transparent)
  @transparent = transparent
end
def setup_actor_character_sprites
  if @characters == nil
    @characters = []
    for i in 1 ... TRAIN_ACTOR_SIZE_MAX
      @characters.push(Game_Party_Actor.new)
    end
  end
  for i in 1 ... TRAIN_ACTOR_SIZE_MAX
    @characters[i - 1].setup(actors[i])
  end
  if $scene.class.method_defined?('setup_actor_character_sprites')
    $scene.setup_actor_character_sprites(@characters)
  end
end
def update_party_actors
  setup_actor_character_sprites
  transparent = $game_player.transparent
  if transparent == false
    if TRANSPARENT_SWITCH
      transparent = $game_switches[TRANSPARENT_SWITCHES_INDEX]
    end
  end
  for character in @characters
    character.transparent = transparent
    character.move_speed = $game_player.move_speed
      character.step_anime = $game_player.step_anime
    character.update
  end
end
def moveto_party_actors( x, y )
  setup_actor_character_sprites
  for character in @characters
    character.moveto( x, y )
  end
  if @move_list == nil
    @move_list = []
  end
  move_list_setup
end
def move_party_actors
  if @move_list == nil
    @move_list = []
    move_list_setup
  end
  @move_list.each_index do |i|
  if @characters[i] != nil
    case @move_list[i].type
    when Input::DOWN
      @characters[i].move_down(@move_list[i].args[0])
    when Input::LEFT
      @characters[i].move_left(@move_list[i].args[0])
    when Input::RIGHT
      @characters[i].move_right(@move_list[i].args[0])
    when Input::UP
      @characters[i].move_up(@move_list[i].args[0])
    when DOWN_LEFT
      @characters[i].move_lower_left
    when DOWN_RIGHT
      @characters[i].move_lower_right
    when UP_LEFT
      @characters[i].move_upper_left
    when UP_RIGHT
      @characters[i].move_upper_right
    when JUMP
      @characters[i].jump(@move_list[i].args[0],@move_list[i].args[1])
    end
  end
end
end
#==============================================================================
# ■ Move_List_Element
#------------------------------------------------------------------------------
#  
#==============================================================================
class Move_List_Element
  def initialize(type,args)
    @type = type
    @args = args
  end
  def type() 
    return @type
  end
  def args()
    return @args 
  end
end
def move_list_setup
  for i in 0 .. TRAIN_ACTOR_SIZE_MAX
    @move_list[i] = nil
  end
end
def add_move_list(type,*args)
  @move_list.unshift(Move_List_Element.new(type,args)).pop
end
def move_down_party_actors(turn_enabled = true)
  move_party_actors
  add_move_list(Input::DOWN,turn_enabled)
end
def move_left_party_actors(turn_enabled = true)
  move_party_actors
  add_move_list(Input::LEFT,turn_enabled)
end
def move_right_party_actors(turn_enabled = true)
  move_party_actors
  add_move_list(Input::RIGHT,turn_enabled)
end
def move_up_party_actors(turn_enabled = true)
  move_party_actors
  add_move_list(Input::UP,turn_enabled)
end
def move_lower_left_party_actors
  move_party_actors
  add_move_list(DOWN_LEFT)
end
def move_lower_right_party_actors
  move_party_actors
  add_move_list(DOWN_RIGHT)
end
def move_upper_left_party_actors
  move_party_actors
  add_move_list(UP_LEFT)
end
def move_upper_right_party_actors
  move_party_actors
  add_move_list(UP_RIGHT)
end
def jump_party_actors(x_plus, y_plus)
  move_party_actors
  add_move_list(JUMP,x_plus, y_plus)
end
end
module Game_Player_Module
def update
  $game_party.update_party_actors
  super
end
def moveto( x, y )
  $game_party.moveto_party_actors( x, y )
  super( x, y )
end
def move_down(turn_enabled = true)
  if passable?(@x, @y, Input::DOWN)
    $game_party.move_down_party_actors(turn_enabled)
 
  end
  super(turn_enabled)
end
def move_left(turn_enabled = true)
  if passable?(@x, @y, Input::LEFT)
    $game_party.move_left_party_actors(turn_enabled)
  end
  super(turn_enabled)
end
def move_right(turn_enabled = true)
  if passable?(@x, @y, Input::RIGHT)
    $game_party.move_right_party_actors(turn_enabled)
  end
  super(turn_enabled)
end
def move_up(turn_enabled = true)
  if passable?(@x, @y, Input::UP)
    $game_party.move_up_party_actors(turn_enabled)
  end
  super(turn_enabled)
end
def move_lower_left
  # 下→左、左→下 のどちらかのコースが通行可能な場合
  unless @direction_fix
    @direction = 1
  end
  if (passable?(@x, @y, Input::DOWN) and passable?(@x, @y + 1, Input::LEFT)) or
     (passable?(@x, @y, Input::LEFT) and passable?(@x - 1, @y, Input::DOWN))
    $game_party.move_lower_left_party_actors
    increase_steps
  end
  super
end
def move_lower_right
  # 下→右、右→下 のどちらかのコースが通行可能な場合
  unless @direction_fix
    @direction = 3
  end
  if (passable?(@x, @y, Input::DOWN) and passable?(@x, @y + 1, Input::RIGHT)) or
     (passable?(@x, @y, Input::RIGHT) and passable?(@x + 1, @y, Input::DOWN))
    $game_party.move_lower_right_party_actors
    increase_steps
  end
  super
end
def move_upper_left
  # 上→左、左→上 のどちらかのコースが通行可能な場合
  unless @direction_fix
    @direction = 7
  end
  if (passable?(@x, @y, Input::UP) and passable?(@x, @y - 1, Input::LEFT)) or
     (passable?(@x, @y, Input::LEFT) and passable?(@x - 1, @y, Input::UP))
    $game_party.move_upper_left_party_actors
    increase_steps
    end
  super
end
def move_upper_right
  # 上→右、右→上 のどちらかのコースが通行可能な場合
  unless @direction_fix
    @direction = 9
  end
  if (passable?(@x, @y, Input::UP) and passable?(@x, @y - 1, Input::RIGHT)) or
     (passable?(@x, @y, Input::RIGHT) and passable?(@x + 1, @y, Input::UP))
    $game_party.move_upper_right_party_actors
    increase_steps
 
  end
  super
end
def jump(x_plus, y_plus)
  # 新しい座標を計算
  new_x = @x + x_plus
  new_y = @y + y_plus
  # 加算値が (0,0) の場合か、ジャンプ先が通行可能な場合
  if (x_plus == 0 and y_plus == 0) or passable?(new_x, new_y, 0)
    $game_party.jump_party_actors(x_plus, y_plus)
  end
  super(x_plus, y_plus)
end
attr_reader :move_speed
attr_reader :step_anime
end
end # module Train_Actor
#==============================================================================
# ■ Game_Party
#------------------------------------------------------------------------------
#  
#==============================================================================
class Game_Party
  include Train_Actor::Game_Party_Module
end
#==============================================================================
# ■ Game_Player
#------------------------------------------------------------------------------
#  
#==============================================================================
class Game_Player
  include Train_Actor::Game_Player_Module
end
#==============================================================================
# ■ Spriteset_Map
#------------------------------------------------------------------------------
#  
#==============================================================================
class Spriteset_Map
  include Train_Actor::Spriteset_Map_Module
end
#==============================================================================
# ■ Scene_Map
#------------------------------------------------------------------------------
#  
#==============================================================================
class Scene_Map
  include Train_Actor::Scene_Map_Module
end