拙作のATS-PTプラグインでは、地上子(Beacon.Put)のSendDataに2閉塞先までの距離情報を入力する必要があったが、AtsEXにより閉塞情報を取得するようにして路線データ制作者様の負担を軽減することにした。
AtsEXにて地上子情報と閉塞情報を利用したので、備忘録としてまとめておく。
なお、以下ではBveHacker.Scenario.~にアクセスしているが、シナリオの読込完了前にアクセスすると例外が発生する。
シナリオの読み込み完了前にアクセスする可能性があるならBveHacker.IsScenarioCreatedがtrueであることをチェックすること。
はじめに
SectionもBeaconもMapObjectBaseクラスの継承なので、距離程を取得できる。
// 0番目の閉塞の設置距離程
double location1 = BveHacker.Scenario.Route.Sections[0].Location;
// 0番目の地上子の設置距離程
double location2 = BveHacker.Scenario.Route.Beacons[0].Location;
閉塞
閉塞制御クラスから
// 閉塞リストにおける、現在自列車がいる閉塞のインデックス
int sectionIndex = BveHacker.Scenario.SectionManager.Sections.CurrentIndex;
/*
まだ一度もSection.Begin(~) を通過していないなら-1になっている。
*/
// 現在自列車がいる閉塞の信号インデックス
int sectionSignal = BveHacker.Scenario.SectionManager.CurrentSectionSignalIndex;
// 現在自列車がいる閉塞の信号による制限速度
double nowLimit = BveHacker.Scenario.SectionManager.CurrentSectionSpeedLimit;
// 現在自列車がいる閉塞の次の閉塞の信号による制限速度
double nowLimit = BveHacker.Scenario.SectionManager.ForwardSectionSpeedLimit;
閉塞リストから
// 閉塞リスト(≒ Section.Begin(~) のリスト)
MapObjectList lSection = BveHacker.Scenario.Route.Sections;
// i番目の閉塞(≒ i番目のBeacon.Put(~))
Section section = (Section)lSection[i];
// i番目の閉塞の信号インデックス
int signalIndex = section.CurrentSignalIndex;
// 信号現示インデックスのリスト (Section.Begin(~)で指定した信号インデックス)
List<int> signals = section.SignalIndexes;
// 列車 (自列車・先行列車) が走行している閉塞のインデックスの一覧
List<int> trainsOn = section.SectionIndexesTrainOn;
地上子
// 地上子リスト(≒ Beacon.Put(~) のリスト)
MapObjectList lBeacon = BveHacker.Scenario.Route.Beacons;
// 地上子を通過した際の、地上子リストにおける当該地上子のインデックス
int i = BveHacker.Scenario.Route.Beacons.CurrentIndex;
// i番目の地上子(≒ i番目のBeacon.Put(~))
Beacon beacon = (Beacon)lBeacon[i];
// i番目の地上子(≒ i番目のBeacon.Put(~))の種類と送信値 Beacon.PutのTypeとSendDataと同じ
int beaconType = beacon.Type;
int beaconData = beacon.SendData;
// i番目の地上子(≒ i番目のBeacon.Put(~))の対象となる閉塞のインデックス
int beaconSection = beacon.TargetSectionIndex;
/*
TargetSectionIndex = 地上子設置距離程におけるSectionのインデックス + Beacon.Putで指定された閉塞相対インデックス
*/
※閉塞相対インデックスが-1の場合は、TargetSectionIndexは現地点以降の最寄りの停止現示の閉塞のインデックスではなく、上式で計算された値もしくは2,147,483,647が格納されている。
※TargetSectionIndexが負になったり、閉塞リスト数以上になる可能性があるため、TargetSectionIndexを使用して閉塞リストにアクセスする場合はチェックしないとぬるぽになる。