[編成スクリプト]このメソッドはStdMtdStationStopが列車を3秒で止める=SetTimerVoltage 0.0 3000を実行してから5秒後=SetEventAfter this MtdWaitDeparture TimerID 5000、に初めて実行されます。つまり、その時点で列車は停止位置で停車しているはずです。5-3=2秒の差は、最低でも2秒間は止まるように設けた余裕です。
//
//出発進行待ちメソッド
//
BeginFunc MtdWaitDeparture
Var TmpSignal
Var TmpSpeed
//現在速度を評価
GetCurrentSpeed TmpSpeed
ifzero TmpSpeed
//信号灯火色を取得
mov TmpSignal StdObjSignal.StdVarSignalPosition
ifeq TmpSignal 1
//R現示の場合、このメソッドを再度タイマー登録
SetEventAfter this MtdWaitRestart TimerID 1000
else
//出発進行
ifeq VarActive 1
DrawMessage "「出発進行!!」"
endif
ifeq VarAutoMode 1
mov VarTargetSpeed VarSpeedY
call this MtdChangeSpeed
endif
endif
else
//信号無視に対する処理はここへ
endif
EndFunc
[信号スクリプト]出発信号をG現示にしてよい条件というのは、レイアウトのトラックプランに依存する話でもあるので一概には言えませんが、ここでは最もシンプルなケースを例として取り上げてみました。
//公開プロパティ
Var StdVarSignalPosition
//初期状態
call this StdMtdSignalR
//
//R現示メソッド
//
BeginFunc StdMtdSignalR
set StdVarSignalPosition 1
SetSignal StdVarSignalPosition
EndFunc
//
//G現示メソッド
//
BeginFunc StdMtdSignalG
set StdVarSignalPosition 6
SetSignal StdVarSignalPosition
EndFunc
[停止用センサースクリプト]
//前方の閉塞信号
VarSignal ObjChkSignal
get ObjChkSignal "{駅を出て最初の閉塞信号名}"
//
//G現示待ちメソッド
//
BeginFunc MtdWaitSignalG
Var TmpSignal
mov TmpSignal ObjChkSignal.StdVarSignalPosition
//前方の閉塞信号がG現示であれば出発信号をG現示に
ifeq TmpSignal 6
call ObjPartnerSignal StdMtdSignalG
//そうでなければもう1000ミリ秒待つ
else
SetEventAfter this MtdWaitSignalG TimerID 1000
endif
EndFunc
※ SetEventTimerを使ってスクリプトで自前のタイマーを回す、という手もあるが複雑になるので今回は割愛。なお、編成毎に停車時間を変えたいのであれば、MtdStopTrainの中で検知編成の列車種別を示す公開プロパティを取得し、それによる分岐の中で時間指定のそれぞれ異なるSetEventAfter命令を実行すればよろしい。
Aは、メソッドMtdWaitSignalG内のifeq命令がそれに当たります。構造は冒頭に示した出発進行待ちメソッドと似ています。つまり、条件(ここでは前方の閉塞信号がG現示になること)が成立すればある処理をおこない、成立しなければ自分自身(メソッド)がもう1度実行されるようにSetEventAfterをおこなう、というものです。異なるのは、ここでは列車を発車させず、信号の灯火制御のみをおこなっている点です。