Skip to content

Commit 54f6282

Browse files
authored
Merge pull request #783 from Roeterdink/MoveCreateInPool
Move CreateInPool from AI to Pools
2 parents 16c7c0f + 083bc6c commit 54f6282

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
@@ -798,10 +798,84 @@ private float CalculateVectorLength(int firstIndex, int LastIndex, int connectIn
798798

799799
//================================================================================================//
800800
/// <summary>
801-
/// Create in pool : create train in pool, for this type of pool train is created directly on storage path
801+
/// Create in pool : create train in pool
802802
/// </summary>
803+
/// <param name="train"></param>
803804

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

0 commit comments

Comments
 (0)