Skip to content

Commit 86fca34

Browse files
committed
alpha version for player train switching in timetable mode
1 parent 5d23965 commit 86fca34

File tree

3 files changed

+29
-5
lines changed

3 files changed

+29
-5
lines changed

Source/Orts.Simulation/Simulation/Simulator.cs

Lines changed: 27 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1921,6 +1921,13 @@ private void StartSwitchPlayerTrain()
19211921
var playerTrain = PlayerLocomotive.Train as AITrain;
19221922
if (playerTrain != null)
19231923
{
1924+
if (TimetableMode && playerTrain.ControlMode == Train.TRAIN_CONTROL.MANUAL)
1925+
{
1926+
Confirmer.Message(ConfirmLevel.Warning, Catalog.GetString("Train can't be switched if in manual mode"));
1927+
TrainSwitcher.SuspendOldPlayer = false;
1928+
TrainSwitcher.ClickedSelectedAsPlayer = false;
1929+
return;
1930+
}
19241931
if (playerTrain.ControlMode == Train.TRAIN_CONTROL.MANUAL) TrainSwitcher.SuspendOldPlayer = true; // force suspend state to avoid disappearing of train;
19251932
if (TrainSwitcher.SuspendOldPlayer &&
19261933
(playerTrain.SpeedMpS < -0.025 || playerTrain.SpeedMpS > 0.025 || playerTrain.PresentPosition[0].TCOffset != playerTrain.PreviousPosition[0].TCOffset))
@@ -1930,14 +1937,14 @@ private void StartSwitchPlayerTrain()
19301937
TrainSwitcher.ClickedSelectedAsPlayer = false;
19311938
return;
19321939
}
1933-
if (playerTrain.TrainType == Train.TRAINTYPE.AI_PLAYERDRIVEN)
1940+
if (playerTrain.TrainType == Train.TRAINTYPE.AI_PLAYERDRIVEN || !playerTrain.Autopilot)
19341941
{
19351942
// it must be autopiloted first
19361943
playerTrain.SwitchToAutopilotControl();
19371944
}
19381945
// and now switch!
19391946
playerTrain.TrainType = Train.TRAINTYPE.AI;
1940-
AI.AITrains.Add(playerTrain);
1947+
playerTrain.Autopilot = false;
19411948
if (TrainSwitcher.SuspendOldPlayer)
19421949
{
19431950
playerTrain.MovementState = AITrain.AI_MOVEMENT_STATE.SUSPENDED;
@@ -2089,6 +2096,18 @@ private void StartSwitchPlayerTrain()
20892096
PlayerLocomotive = SetPlayerLocomotive(pathlessPlayerTrain);
20902097
if (oldPlayerTrain != null) oldPlayerTrain.LeadLocomotiveIndex = -1;
20912098
}
2099+
if (TimetableMode)
2100+
{
2101+
// In timetable mode player train must have number 0
2102+
(PlayerLocomotive.Train.Number, oldPlayerTrain.Number) = (oldPlayerTrain.Number, PlayerLocomotive.Train.Number);
2103+
var oldPlayerTrainIndex = Trains.IndexOf(oldPlayerTrain);
2104+
var playerTrainIndex = Trains.IndexOf(PlayerLocomotive.Train);
2105+
(Trains[oldPlayerTrainIndex], Trains[playerTrainIndex]) = (Trains[playerTrainIndex], Trains[oldPlayerTrainIndex]);
2106+
var index = AI.AITrains.IndexOf(PlayerLocomotive.Train as AITrain);
2107+
(AI.AITrains[0], AI.AITrains[index]) = (AI.AITrains[index], AI.AITrains[0]);
2108+
AI.aiListChanged = true;
2109+
PlayerLocomotive.Train.Autopilot = true;
2110+
}
20922111
playerSwitchOngoing = true;
20932112
if (MPManager.IsMultiPlayer())
20942113
{
@@ -2107,19 +2126,23 @@ private void CompleteSwitchPlayerTrain()
21072126
{
21082127
if (PlayerLocomotive.Train.TrainType != Train.TRAINTYPE.STATIC)
21092128
{
2110-
AI.AITrains.Remove(PlayerLocomotive.Train as AITrain);
2129+
if (!TimetableMode)
2130+
AI.AITrains.Remove(PlayerLocomotive.Train as AITrain);
21112131
if ((PlayerLocomotive.Train as AITrain).MovementState == AITrain.AI_MOVEMENT_STATE.SUSPENDED)
21122132
{
21132133
PlayerLocomotive.Train.Reinitialize();
21142134
(PlayerLocomotive.Train as AITrain).MovementState = Math.Abs(PlayerLocomotive.Train.SpeedMpS) <= MaxStoppedMpS ?
21152135
AITrain.AI_MOVEMENT_STATE.INIT : AITrain.AI_MOVEMENT_STATE.BRAKING;
21162136
}
2117-
(PlayerLocomotive.Train as AITrain).SwitchToPlayerControl();
2137+
if (!TimetableMode)
2138+
(PlayerLocomotive.Train as AITrain).SwitchToPlayerControl();
21182139
}
21192140
else
21202141
{
21212142
PlayerLocomotive.Train.CreatePathlessPlayerTrain();
21222143
}
2144+
var playerLocomotive = PlayerLocomotive as MSTSLocomotive;
2145+
playerLocomotive.UsingRearCab = (PlayerLocomotive.Flipped ^ PlayerLocomotive.Train.MUDirection == Direction.Reverse) && (playerLocomotive.HasRearCab || playerLocomotive.HasRear3DCab);
21232146
OnPlayerLocomotiveChanged();
21242147
playerSwitchOngoing = false;
21252148
TrainSwitcher.ClickedSelectedAsPlayer = false;

Source/RunActivity/Viewer3D/Popups/TrainListWindow.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -181,7 +181,7 @@ void TrainListLabel_Click(Control arg1, Point arg2)
181181
}
182182
if (PickedTrainFromList != null && (PickedTrainFromList == Viewer.SelectedTrain || (PickedTrainFromList.TrainType == Train.TRAINTYPE.AI_INCORPORATED &&
183183
(PickedTrainFromList as AITrain).IncorporatingTrain.IsPathless && (PickedTrainFromList as AITrain).IncorporatingTrain == Viewer.SelectedTrain)) && !PickedTrainFromList.IsActualPlayerTrain &&
184-
Viewer.Simulator.IsAutopilotMode && PickedTrainFromList.IsPlayable && !Viewer.Simulator.TimetableMode)
184+
Viewer.Simulator.IsAutopilotMode && PickedTrainFromList.IsPlayable && (Viewer.PlayerTrain as AITrain).MovementState != AITrain.AI_MOVEMENT_STATE.AI_STATIC)
185185
{
186186
if (UserInput.IsDown(UserCommand.GameSuspendOldPlayer) && !Viewer.Simulator.TimetableMode)
187187
Viewer.Simulator.TrainSwitcher.SuspendOldPlayer = true;

Source/RunActivity/Viewer3D/Processes/GameStateRunActivity.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1129,6 +1129,7 @@ void InitSimulator(UserSettings settings, string[] args, string mode, string act
11291129
// for resume and replay : set timetable file and selected train info
11301130
Simulator.TimetableFileName = System.IO.Path.GetFileNameWithoutExtension(args[0]);
11311131
Simulator.PathName = args[1];
1132+
Simulator.IsAutopilotMode = true;
11321133
}
11331134
break;
11341135
}

0 commit comments

Comments
 (0)