Skip to content

Commit 083bc6c

Browse files
committed
Move CreateInPool from AI to Pools
1 parent 3ffb9bc commit 083bc6c

File tree

3 files changed

+140
-47
lines changed

3 files changed

+140
-47
lines changed

Source/Orts.Simulation/Simulation/AIs/AI.cs

Lines changed: 1 addition & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -1159,54 +1159,13 @@ private bool AddToWorldTT(TTTrain thisTrain, List<TTTrain> nextTrains)
11591159
int presentTime = Convert.ToInt32(Math.Floor(clockTime));
11601160
TimetablePool thisPool = Simulator.PoolHolder.Pools[thisTrain.CreateInPool];
11611161

1162-
int PoolStorageState = (int)TTTrain.PoolAccessState.PoolInvalid;
1163-
thisTrain.TCRoute.TCRouteSubpaths[0] = thisPool.CreateInPool(thisTrain, out PoolStorageState, false);
1164-
thisTrain.ValidRoute[0] = new Train.TCSubpathRoute(thisTrain.TCRoute.TCRouteSubpaths[0]);
1165-
thisTrain.TCRoute.activeSubpath = 0;
1162+
int PoolStorageState = thisPool.CreateInPool(thisTrain, nextTrains);
11661163

1167-
// if no storage available - abondone train
11681164
if (PoolStorageState < 0)
11691165
{
11701166
Trace.TraceInformation("Train : " + thisTrain.Name + " : no storage room available in pool : " + thisPool.PoolName + " ; engine not created");
11711167
return (endPreRun);
11721168
}
1173-
1174-
// use stored traveller
1175-
thisTrain.PoolStorageIndex = PoolStorageState;
1176-
thisTrain.RearTDBTraveller = new Traveller(thisPool.StoragePool[thisTrain.PoolStorageIndex].StoragePathTraveller);
1177-
1178-
// if storage available check for other engines on storage track
1179-
if (thisPool.StoragePool[thisTrain.PoolStorageIndex].StoredUnits.Count > 0)
1180-
{
1181-
int lastTrainNumber = thisPool.StoragePool[thisTrain.PoolStorageIndex].StoredUnits[thisPool.StoragePool[thisTrain.PoolStorageIndex].StoredUnits.Count - 1];
1182-
TTTrain lastTrain = thisTrain.GetOtherTTTrainByNumber(lastTrainNumber);
1183-
if (lastTrain == null)
1184-
{
1185-
lastTrain = thisTrain.Simulator.GetAutoGenTTTrainByNumber(lastTrainNumber);
1186-
}
1187-
if (lastTrain != null)
1188-
{
1189-
thisTrain.CreateAhead = String.Copy(lastTrain.Name).ToLower();
1190-
}
1191-
}
1192-
1193-
tempRoute = thisTrain.CalculateInitialTTTrainPosition(ref validPosition, nextTrains);
1194-
1195-
if (validPosition)
1196-
{
1197-
thisTrain.SetInitialTrainRoute(tempRoute);
1198-
thisTrain.CalculatePositionOfCars();
1199-
for (int i = 0; i < thisTrain.Cars.Count; i++)
1200-
thisTrain.Cars[i].WorldPosition.XNAMatrix.M42 -= 1000;
1201-
thisTrain.ResetInitialTrainRoute(tempRoute);
1202-
1203-
// set train route and position so proper position in pool can be calculated
1204-
thisTrain.UpdateTrainPosition();
1205-
1206-
// add unit to pool
1207-
thisPool.AddUnit(thisTrain, false);
1208-
validPosition = thisTrain.PostInit(false); // post init train but do not activate
1209-
}
12101169
}
12111170

12121171
// clear track and align switches - check state

Source/Orts.Simulation/Simulation/Timetables/TTPool.cs

Lines changed: 63 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
// COPYRIGHT 2014 by the Open Rails project.
1+
// COPYRIGHT 2014 by the Open Rails project.
22
//
33
// This file is part of Open Rails.
44
//
@@ -176,6 +176,7 @@ public struct PoolDetails
176176
{
177177
public Train.TCSubpathRoute StoragePath; // path defined as storage location
178178
public Traveller StoragePathTraveller; // traveller used to get path position and direction
179+
public Traveller StoragePathReverseTraveller; // traveller used if path must be reversed
179180
public string StorageName; // storage name
180181
public List<Train.TCSubpathRoute> AccessPaths; // access paths defined for storage location
181182
public float StorageLength; // available length
@@ -737,11 +738,70 @@ virtual public bool TestPoolExit(TTTrain train)
737738
//================================================================================================//
738739
/// <summary>
739740
/// Create in pool : create train in pool
740-
/// For this type of pool, a train is created in pool by running it into the pool as would be done on dispose
741741
/// </summary>
742742
/// <param name="train"></param>
743743

744-
virtual public Train.TCSubpathRoute CreateInPool(TTTrain train, out int poolStorageIndex, bool checkAccessPath)
744+
virtual public int CreateInPool(TTTrain train, List<TTTrain> nextTrains)
745+
{
746+
int PoolStorageState = (int)TTTrain.PoolAccessState.PoolInvalid;
747+
train.TCRoute.TCRouteSubpaths[0] = PlaceInPool(train, out PoolStorageState, false);
748+
train.ValidRoute[0] = new Train.TCSubpathRoute(train.TCRoute.TCRouteSubpaths[0]);
749+
train.TCRoute.activeSubpath = 0;
750+
751+
// if no storage available - abondone train
752+
if (PoolStorageState < 0)
753+
{
754+
return (PoolStorageState);
755+
}
756+
757+
// use stored traveller
758+
train.PoolStorageIndex = PoolStorageState;
759+
train.RearTDBTraveller = new Traveller(StoragePool[train.PoolStorageIndex].StoragePathTraveller);
760+
761+
// if storage available check for other engines on storage track
762+
if (StoragePool[train.PoolStorageIndex].StoredUnits.Count > 0)
763+
{
764+
int lastTrainNumber = StoragePool[train.PoolStorageIndex].StoredUnits[StoragePool[train.PoolStorageIndex].StoredUnits.Count - 1];
765+
TTTrain lastTrain = train.GetOtherTTTrainByNumber(lastTrainNumber);
766+
if (lastTrain == null)
767+
{
768+
lastTrain = train.Simulator.GetAutoGenTTTrainByNumber(lastTrainNumber);
769+
}
770+
if (lastTrain != null)
771+
{
772+
train.CreateAhead = String.Copy(lastTrain.Name).ToLower();
773+
}
774+
}
775+
776+
bool validPosition = false;
777+
Train.TCSubpathRoute tempRoute = train.CalculateInitialTTTrainPosition(ref validPosition, nextTrains);
778+
779+
if (validPosition)
780+
{
781+
train.SetInitialTrainRoute(tempRoute);
782+
train.CalculatePositionOfCars();
783+
for (int i = 0; i < train.Cars.Count; i++)
784+
train.Cars[i].WorldPosition.XNAMatrix.M42 -= 1000;
785+
train.ResetInitialTrainRoute(tempRoute);
786+
787+
// set train route and position so proper position in pool can be calculated
788+
train.UpdateTrainPosition();
789+
790+
// add unit to pool
791+
AddUnit(train, false);
792+
validPosition = train.PostInit(false); // post init train but do not activate
793+
}
794+
795+
return (PoolStorageState);
796+
}
797+
798+
//================================================================================================//
799+
/// <summary>
800+
/// Place in pool : place train in pool
801+
/// </summary>
802+
/// <param name="train"></param>
803+
804+
virtual public Train.TCSubpathRoute PlaceInPool(TTTrain train, out int poolStorageIndex, bool checkAccessPath)
745805
{
746806
int tempIndex;
747807
Train.TCSubpathRoute newRoute = SetPoolExit(train, out tempIndex, checkAccessPath);

Source/Orts.Simulation/Simulation/Timetables/TTTurntable.cs

Lines changed: 76 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -803,10 +803,84 @@ private float CalculateVectorLength(int firstIndex, int LastIndex, int connectIn
803803

804804
//================================================================================================//
805805
/// <summary>
806-
/// Create in pool : create train in pool, for this type of pool train is created directly on storage path
806+
/// Create in pool : create train in pool
807807
/// </summary>
808+
/// <param name="train"></param>
808809

809-
public override Train.TCSubpathRoute CreateInPool(TTTrain train, out int poolStorageIndex, bool checkAccessPath)
810+
override public int CreateInPool(TTTrain train, List<TTTrain> nextTrains)
811+
{
812+
int PoolStorageState = (int)TTTrain.PoolAccessState.PoolInvalid;
813+
train.TCRoute.TCRouteSubpaths[0] = PlaceInPool(train, out PoolStorageState, false);
814+
train.ValidRoute[0] = new Train.TCSubpathRoute(train.TCRoute.TCRouteSubpaths[0]);
815+
train.TCRoute.activeSubpath = 0;
816+
817+
// if no storage available - abondone train
818+
if (PoolStorageState < 0)
819+
{
820+
return (PoolStorageState);
821+
}
822+
823+
train.PoolStorageIndex = PoolStorageState;
824+
825+
// if no of units is limited to 1, place engine in direction of turntable
826+
if (StoragePool[PoolStorageState].maxStoredUnits.HasValue && StoragePool[PoolStorageState].maxStoredUnits == 1)
827+
{
828+
// use stored traveller
829+
train.RearTDBTraveller = new Traveller(StoragePool[PoolStorageState].StoragePathTraveller);
830+
}
831+
832+
else
833+
{
834+
// use reverse path
835+
train.TCRoute.TCRouteSubpaths[0] = new Train.TCSubpathRoute(train.TCRoute.TCRouteSubpaths[0].ReversePath(train.signalRef));
836+
train.ValidRoute[0] = new Train.TCSubpathRoute(train.TCRoute.TCRouteSubpaths[0]);
837+
838+
train.RearTDBTraveller = new Traveller(StoragePool[PoolStorageState].StoragePathReverseTraveller);
839+
840+
// if storage available check for other engines on storage track
841+
if (StoragePool[PoolStorageState].StoredUnits.Count > 0)
842+
{
843+
int lastTrainNumber = StoragePool[PoolStorageState].StoredUnits[StoragePool[PoolStorageState].StoredUnits.Count - 1];
844+
TTTrain lastTrain = train.GetOtherTTTrainByNumber(lastTrainNumber);
845+
if (lastTrain == null)
846+
{
847+
lastTrain = train.Simulator.GetAutoGenTTTrainByNumber(lastTrainNumber);
848+
}
849+
if (lastTrain != null)
850+
{
851+
train.CreateAhead = String.Copy(lastTrain.Name).ToLower();
852+
}
853+
}
854+
}
855+
856+
bool validPosition = false;
857+
Train.TCSubpathRoute tempRoute = train.CalculateInitialTTTrainPosition(ref validPosition, nextTrains);
858+
859+
if (validPosition)
860+
{
861+
train.SetInitialTrainRoute(tempRoute);
862+
train.CalculatePositionOfCars();
863+
for (int i = 0; i < train.Cars.Count; i++)
864+
train.Cars[i].WorldPosition.XNAMatrix.M42 -= 1000;
865+
train.ResetInitialTrainRoute(tempRoute);
866+
867+
// set train route and position so proper position in pool can be calculated
868+
train.UpdateTrainPosition();
869+
870+
// add unit to pool
871+
AddUnit(train, false);
872+
validPosition = train.PostInit(false); // post init train but do not activate
873+
}
874+
875+
return (PoolStorageState);
876+
}
877+
878+
//================================================================================================//
879+
/// <summary>
880+
/// Place in pool : place train in pool, for this type of pool train is created directly on storage path
881+
/// </summary>
882+
883+
public override Train.TCSubpathRoute PlaceInPool(TTTrain train, out int poolStorageIndex, bool checkAccessPath)
810884
{
811885
Train.TCSubpathRoute newRoute = null;
812886
int storageIndex = -1;

0 commit comments

Comments
 (0)