Posts: 168
Threads: 13
Joined: Nov 2024
I use Fukuyama's original train actors script and it's been solid for regular gameplay.
However, for some cutscenes with dialogue, I would love to make the whole party face the same direction and perhaps change direction together via a script call.
I intend to make a move command at the start of some cutscenes to make the player move (e.g. down, left, up, right, down, turn right) so the train becomes a 2x2 square of the party and the main player is in the bottom front corner facing forward, and I'd love a script to make the three train actors face the same way as the player actor.
(Alternatively, a script to make the three train actors form the square themselves, though this one could be a bit tricky to work with in some cutscenes)
Could anyone help?
Posts: 11,750
Threads: 684
Joined: May 2009
03-29-2026, 03:56 PM
(This post was last modified: 03-29-2026, 03:57 PM by DerVVulfman.)
Fukuyama's you say? Yeah, I know. No one thought about adding such features into Fukuyama's script despite it being the oldest known, preferring to make their own systems.
HOWEVER... That's just on them being too lazy to do any investigation to see what the heck could be done!!!
Code: #==============================================================================
# ** Train_Actor : Game_Party_Module
#------------------------------------------------------------------------------
# This module within the Train_Actor module controls on-screen party members
# that follow the player. It is included within the $game_party class.
#==============================================================================
module Train_Actor::Game_Party_Module
#--------------------------------------------------------------------------
# * Move Left
# id: party member ID
#--------------------------------------------------------------------------
def make_me_move_left(id)
#
character = @characters[id]
character.move_left
#
end
end
This coupled with making an event to trigger a script call:
Code: $game_party.make_me_move_left(1)
I used this in a blank project that forces Basil, Gloria and Hilda to follow the player; Gloria being "Train" party member ID #1.
And with this simple call, it makes Gloria takes one step to the left.
Again, her ID in the Train Actor script is ID #1. This is different than her being "Game"_Party actor #2 as the Train Actor script is really just concerned with the character sprites and not the Actor HP/SP data.
And the line in this simple script character.move_left could be replaced with character.turn_left which would make her face the left rather than taking a step forward. the ' turn_left' portion refers to one of the dozens of movement methods within Game_Character.
By this, one could suggest that most any of the movement commands from Game_Character, or a custom move_traine_route system could be introduced  with the exception of controlling an NPC's "transparency" and "step_anime" flags as Fukuyama's code have those hardwired and repeatedly updated/refreshed.
Up is down, left is right and sideways is straight ahead. - Cord "Circle of Iron", 1978 (written by Bruce Lee and James Coburn... really...)
Above are clickable links
Posts: 168
Threads: 13
Joined: Nov 2024
OOOH! I didn't know it was that simple! I'mma give it a try this week!
Posts: 11,750
Threads: 684
Joined: May 2009
NO ONE DID! No one bothered it seems! I just did a little study and BOOM!
Up is down, left is right and sideways is straight ahead. - Cord "Circle of Iron", 1978 (written by Bruce Lee and James Coburn... really...)
Above are clickable links
Posts: 168
Threads: 13
Joined: Nov 2024
Yesterday, 01:55 PM
(This post was last modified: Yesterday, 01:57 PM by Ace_V.
Edit Reason: added more details
)
OK, so I ran into some issues as usual
I tried an event with this script run:
Code: $game_party.make_me_turn_down(1)
$game_party.make_me_turn_down(2)
$game_party.make_me_turn_up(3)
And encountered this error:
Code: NoMethodError occurred while running script.
undefined method 'make_me_turn_down' for # <Game_Party:0xdf5910>
I then assumed that I needed to add a new script entry below Train Actor script that I named Train_Actor_Change_Direction with this inside:
Code: #==============================================================================
# ** Train_Actor : Game_Party_Module
#------------------------------------------------------------------------------
# This module within the Train_Actor module controls on-screen party members
# that follow the player. It is included within the $game_party class.
#==============================================================================
module Train_Actor::Game_Party_Module
#--------------------------------------------------------------------------
# * Move Left
# id: party member ID
#--------------------------------------------------------------------------
def make_me_move_left(id)
#
character = @characters[id]
character.move_left
#
end
#--------------------------------------------------------------------------
# * Move Right
# id: party member ID
#--------------------------------------------------------------------------
def make_me_move_right(id)
#
character = @characters[id]
character.move_right
#
end
#--------------------------------------------------------------------------
# * Move Up
# id: party member ID
#--------------------------------------------------------------------------
def make_me_move_up(id)
#
character = @characters[id]
character.move_up
#
end
#--------------------------------------------------------------------------
# * Move Down
# id: party member ID
#--------------------------------------------------------------------------
def make_me_move_down(id)
#
character = @characters[id]
character.move_down
#
end
#--------------------------------------------------------------------------
# * Turn Up
# id: party member ID
#--------------------------------------------------------------------------
def make_me_turn_up(id)
#
character = @characters[id]
character.turn_up
#
end
#--------------------------------------------------------------------------
# * Turn Down
# id: party member ID
#--------------------------------------------------------------------------
def make_me_turn_down(id)
#
character = @characters[id]
character.turn_down
#
end
#--------------------------------------------------------------------------
# * Turn Left
# id: party member ID
#--------------------------------------------------------------------------
def make_me_turn_left(id)
#
character = @characters[id]
character.turn_left
#
end
#--------------------------------------------------------------------------
# * Turn Right
# id: party member ID
#--------------------------------------------------------------------------
def make_me_turn_right(id)
#
character = @characters[id]
character.turn_right
#
end
end
(I assumed you wanted me to fill in the other commands as such)
However, testing it out caused this error:
Code: Script 'Train_Change_Direction' line 8: NameError occurred.
uninitialized constant Train_Actor
Is it because I still use the original Fukuyama script with Japanese comments? I don't see Train_Actor defined there, just Train_Actor_Transparent_Switch.
Code: #
# Train_Actor
#
# fukuyama@alles.or.jp
# http://www4.big.or.jp/~fukuyama/
#
# ●透明状態用スイッチ設定
# true だとスイッチ制御を行う
# TRAIN_ACTOR_TRANSPARENT_SWITCH = false
TRAIN_ACTOR_TRANSPARENT_SWITCH = true
# ●透明状態用スイッチ番号
# この番号のスイッチがONだと透明になる
TRAIN_ACTOR_TRANSPARENT_SWITCHES_INDEX = 20
# 定数
#Input::DOWN = 2
#Input::LEFT = 4
#Input::RIGHT = 6
#Input::UP = 8
DOWN_LEFT = 1
DOWN_RIGHT = 3
UP_LEFT = 7
UP_RIGHT = 9
JUMP = 5
class Game_Party_Actor < Game_Character
def initialize
super()
@through = true
end
def setup(actor)
# キャラクターのファイル名と色相を設定
if actor != nil
@character_name = actor.character_name
@character_hue = actor.character_hue
else
@character_name = ""
@character_hue = 0
end
# 不透明度と合成方法を初期化
@opacity = 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
#--------------------------------------------------------------------------
# ● 下に移動
# turn_enabled : その場での向き変更を許可するフラグ
#--------------------------------------------------------------------------
def move_down(turn_enabled = true)
# 下を向く
if turn_enabled
turn_down
end
# 通行可能な場合
if passable?(@x, @y, Input::DOWN)
# 下を向く
turn_down
# 座標を更新
@y += 1
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
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
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
end
end
#--------------------------------------------------------------------------
# ● 左下に移動
#--------------------------------------------------------------------------
def move_lower_left
# 向き固定でない場合
unless @direction_fix
# 右向きだった場合は左を、上向きだった場合は下を向く
@direction = (@direction == Input::RIGHT ? Input::LEFT : @direction == Input::UP ? Input::DOWN : @direction)
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
end
end
#--------------------------------------------------------------------------
# ● 右下に移動
#--------------------------------------------------------------------------
def move_lower_right
# 向き固定でない場合
unless @direction_fix
# 左向きだった場合は右を、上向きだった場合は下を向く
@direction = (@direction == Input::LEFT ? Input::RIGHT : @direction == Input::UP ? Input::DOWN : @direction)
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
end
end
#--------------------------------------------------------------------------
# ● 左上に移動
#--------------------------------------------------------------------------
def move_upper_left
# 向き固定でない場合
unless @direction_fix
# 右向きだった場合は左を、下向きだった場合は上を向く
@direction = (@direction == Input::RIGHT ? Input::LEFT : @direction == Input::DOWN ? Input::UP : @direction)
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
end
end
#--------------------------------------------------------------------------
# ● 右上に移動
#--------------------------------------------------------------------------
def move_upper_right
# 向き固定でない場合
unless @direction_fix
# 左向きだった場合は右を、下向きだった場合は上を向く
@direction = (@direction == Input::LEFT ? Input::RIGHT : @direction == Input::DOWN ? Input::UP : @direction)
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
end
end
def set_move_speed(move_speed)
@move_speed = move_speed
end
end
class Spriteset_Map
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
class Scene_Map
def setup_actor_character_sprites(characters)
@spriteset.setup_actor_character_sprites(characters)
end
end
class Game_Party
def set_transparent_actors(transparent)
@transparent = transparent
end
def setup_actor_character_sprites
if @characters == nil
@characters = []
for i in 1 .. 4
@characters.push(Game_Party_Actor.new)
end
end
if @actors_chach == nil
@actors_chach = []
end
if @actors_chach != @actors
@actors_chach = @actors.clone
for i in 1 .. 4
@characters[i - 1].setup(actors[i])
end
end
if $scene.instance_of?(Scene_Map)
$scene.setup_actor_character_sprites(@characters)
end
end
def update_party_actors
setup_actor_character_sprites
transparent = $game_player.transparent
if transparent == false
if TRAIN_ACTOR_TRANSPARENT_SWITCH
transparent = $game_switches[TRAIN_ACTOR_TRANSPARENT_SWITCHES_INDEX]
else
transparent = $game_player.transparent
end
end
for character in @characters
character.transparent = transparent
character.set_move_speed($game_player.get_move_speed)
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
for i in 0 .. 10
@move_list[i] = nil
end
end
def move_party_actors
if @move_list == nil
@move_list = []
for i in 0 .. 10
@move_list[i] = nil
end
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
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 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 )
super
$game_party.moveto_party_actors( 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
# 下→左、左→下 のどちらかのコースが通行可能な場合
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
end
super
end
def move_lower_right
# 下→右、右→下 のどちらかのコースが通行可能な場合
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
end
super
end
def move_upper_left
# 上→左、左→上 のどちらかのコースが通行可能な場合
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
end
super
end
def move_upper_right
# 上→右、右→上 のどちらかのコースが通行可能な場合
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
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
# -----------------------------------------------
# move_speed を外から見れるように
# -----------------------------------------------
def get_move_speed
return @move_speed
end
end
class Game_Player
include Game_Player_Module
end
I do have a copy of the English version of the Fukuyama Train system that you told me about last year, though when I tried to implement it into my game in 2025 it kept crashing (even with a new save) 
I'll try to switch to the English version again this weekend after I get more free time from work haha.
Posts: 11,750
Threads: 684
Joined: May 2009
Today, 04:43 AM
(This post was last modified: Today, 04:44 AM by DerVVulfman.)
The English Translation is the one I used. Its definitely designed cleaner than the original Fukuyama... I finding an actual structural bug with the original original.
HOWEVER:
Code: #==============================================================================
# ** Game_Party
#------------------------------------------------------------------------------
# This class handles the party. It includes information on amount of gold
# and items. Refer to "$game_party" for the instance of this class.
#==============================================================================
class Game_Party
#--------------------------------------------------------------------------
# * Move Left
# id: party member ID
#--------------------------------------------------------------------------
def make_me_move_left(id)
#
character = @characters[id]
character.move_left
#
end
end
Directly added to Game_Party rather than the Train Actor modules. Same script call to use.
Up is down, left is right and sideways is straight ahead. - Cord "Circle of Iron", 1978 (written by Bruce Lee and James Coburn... really...)
Above are clickable links
Posts: 168
Threads: 13
Joined: Nov 2024
I tried inserting that script into Game_Party just below
And just above the comment
Code: #--------------------------------------------------------------------------
# * Public Instance Variables
#--------------------------------------------------------------------------
And added the other move/turn commands from my previous reply but it kept producing errors and not loading the game.
|