Skip to content

Commit

Permalink
Browse files Browse the repository at this point in the history
  • Loading branch information
Csantucci committed Nov 19, 2023
1 parent d279e38 commit 5866028
Show file tree
Hide file tree
Showing 6 changed files with 91 additions and 6 deletions.
14 changes: 14 additions & 0 deletions Source/Orts.Simulation/Common/Events.cs
Expand Up @@ -27,6 +27,10 @@ public interface EventHandler
public enum Event
{
None,
AITrainApproachingStation,
AITrainHelperLoco,
AITrainLeadLoco,
AITrainLeavingStation,
BatterySwitchOff,
BatterySwitchOn,
BatterySwitchCommandOff,
Expand Down Expand Up @@ -123,6 +127,8 @@ public enum Event
PermissionDenied,
PermissionGranted,
PermissionToDepart,
PlayerTrainHelperLoco,
PlayerTrainLeadLoco,
PowerKeyOff,
PowerKeyOn,
ReverserChange,
Expand Down Expand Up @@ -550,6 +556,14 @@ public static Event From(Source source, int eventID)

case 320: return Event.SteamBoosterChange;

// AI train related events
case 330: return Event.AITrainLeadLoco;
case 331: return Event.AITrainHelperLoco;
case 332: return Event.PlayerTrainLeadLoco;
case 333: return Event.PlayerTrainHelperLoco;
case 334: return Event.AITrainApproachingStation;
case 335: return Event.AITrainLeavingStation;

default: return 0;
}
case Source.MSTSCrossing:
Expand Down
38 changes: 37 additions & 1 deletion Source/Orts.Simulation/Simulation/AIs/AITrain.cs
Expand Up @@ -75,6 +75,7 @@ public class AITrain : Train
public float doorOpenDelay = -1f;
public float doorCloseAdvance = -1f;
public AILevelCrossingHornPattern LevelCrossingHornPattern { get; set; }
public bool ApproachTriggerSet = false; // station approach trigger for AI trains has been set

public float PathLength;

Expand Down Expand Up @@ -246,6 +247,7 @@ public AITrain(Simulator simulator, BinaryReader inf, AI airef)
UncondAttach = inf.ReadBoolean();
doorCloseAdvance = inf.ReadSingle();
doorOpenDelay = inf.ReadSingle();
ApproachTriggerSet = inf.ReadBoolean();
if (!Simulator.TimetableMode && doorOpenDelay <= 0 && doorCloseAdvance > 0 && Simulator.OpenDoorsInAITrains &&
MovementState == AI_MOVEMENT_STATE.STATION_STOP && StationStops.Count > 0)
{
Expand Down Expand Up @@ -339,6 +341,7 @@ public override void Save(BinaryWriter outf)
outf.Write(UncondAttach);
outf.Write(doorCloseAdvance);
outf.Write(doorOpenDelay);
outf.Write(ApproachTriggerSet);
if (LevelCrossingHornPattern != null)
{
outf.Write(0);
Expand Down Expand Up @@ -1300,6 +1303,7 @@ public virtual void SetNextStationAction(bool fromAutopilotSwitch = false)
AIActionItem newAction = new AIActionItem(null, AIActionItem.AI_ACTION_TYPE.STATION_STOP);
newAction.SetParam(distancesM[1], 0.0f, distancesM[0], DistanceTravelledM);
requiredActions.InsertAction(newAction);
ApproachTriggerSet = false;

#if DEBUG_REPORTS
if (StationStops[0].ActualStopType == StationStop.STOPTYPE.STATION_STOP)
Expand Down Expand Up @@ -2060,6 +2064,7 @@ public virtual void UpdateStationState(float elapsedClockSeconds, int presentTim

Delay = TimeSpan.FromSeconds((presentTime - thisStation.DepartTime) % (24 * 3600));
}
if (Cars[0] is MSTSLocomotive) Cars[0].SignalEvent(Event.AITrainLeavingStation);

#if DEBUG_REPORTS
DateTime baseDTd = new DateTime();
Expand Down Expand Up @@ -2621,6 +2626,13 @@ public virtual void UpdateBrakingState(float elapsedClockSeconds, int presentTim
}
}

if (nextActionInfo != null && nextActionInfo.NextAction == AIActionItem.AI_ACTION_TYPE.STATION_STOP &&
distanceToGoM < 150 + StationStops[0].PlatformItem.Length && !ApproachTriggerSet)
{
if (Cars[0] is MSTSLocomotive) Cars[0].SignalEvent(Event.AITrainApproachingStation);
ApproachTriggerSet = true;
}

if (nextActionInfo != null && nextActionInfo.NextAction == AIActionItem.AI_ACTION_TYPE.STATION_STOP)
creepDistanceM = 0.0f;
if (nextActionInfo == null && requiredSpeedMpS == 0)
Expand Down Expand Up @@ -4367,6 +4379,7 @@ public void CoupleAI(Train attachTrain, bool thisTrainFront, bool attachTrainFro
Simulator.OnPlayerLocomotiveChanged();
AI.AITrains.Add(this);
}
else if (attachTrain is AITrain) RedefineAITriggers(attachTrain as AITrain);
if (!UncondAttach)
{
RemoveTrain();
Expand Down Expand Up @@ -4475,6 +4488,7 @@ public void CoupleAIToStatic(Train attachTrain, bool thisTrainFront, bool attach
AddTrackSections();
ResetActions(true);
physicsUpdate(0);
RedefineAITriggers(this);
}

//================================================================================================//
Expand Down Expand Up @@ -4716,7 +4730,8 @@ public void TerminateCoupling(Train attachTrain, bool thisTrainFront, bool attac
// Move WP, if any, just under the loco;
AuxActionsContain.MoveAuxActionAfterReversal(this);
ResetActions(true);

RedefineAITriggers(this);
if (attachTrain is AITrain) RedefineAITriggers(attachTrain as AITrain);
physicsUpdate(0);// Stop the wheels from moving etc

}
Expand Down Expand Up @@ -6578,6 +6593,27 @@ public void RestartWaitingTrain(RestartWaitingTrain restartWaitingTrain)
}
}

//================================================================================================//
/// <summary>
/// Redefine sound triggers for AI trains
/// </summary>
public void RedefineAITriggers(AITrain train)
{
var leadFound = false;
foreach (var car in train.Cars)
{
if (car is MSTSLocomotive)
{
if (!leadFound)
{
car.SignalEvent(Event.AITrainLeadLoco);
leadFound = true;
}
else car.SignalEvent(Event.AITrainHelperLoco);
}
}
}

}


Expand Down
2 changes: 2 additions & 0 deletions Source/Orts.Simulation/Simulation/Physics/Train.cs
Expand Up @@ -1518,6 +1518,8 @@ public void ReverseCars()
// Update flipped state of each car.
for (var i = 0; i < Cars.Count; i++)
Cars[i].Flipped = !Cars[i].Flipped;
// if AI train redefine first loco for sound
if (TrainType == TRAINTYPE.AI) (this as AITrain).RedefineAITriggers(this as AITrain);
}

/// <summary>
Expand Down
34 changes: 29 additions & 5 deletions Source/Orts.Simulation/Simulation/Simulator.cs
Expand Up @@ -742,14 +742,20 @@ public void SetWagonCommandReceivers(MSTSWagon wag)
public TrainCar SetPlayerLocomotive(Train playerTrain)
{
TrainCar PlayerLocomotive = null;
var leadFound = false;
foreach (TrainCar car in playerTrain.Cars)
if (car.IsDriveable) // first loco is the one the player drives
{
PlayerLocomotive = car;
playerTrain.LeadLocomotive = car;
playerTrain.InitializeBrakes();
PlayerLocomotive.LocalThrottlePercent = playerTrain.AITrainThrottlePercent;
break;
if (!leadFound)
{
PlayerLocomotive = car;
playerTrain.LeadLocomotive = car;
playerTrain.InitializeBrakes();
PlayerLocomotive.LocalThrottlePercent = playerTrain.AITrainThrottlePercent;
PlayerLocomotive.SignalEvent(Event.PlayerTrainLeadLoco);
leadFound = true;
}
else car.SignalEvent(Event.PlayerTrainHelperLoco);
}
if (PlayerLocomotive == null)
throw new InvalidDataException("Can't find player locomotive in activity");
Expand Down Expand Up @@ -969,6 +975,7 @@ private void FinishCoupling(Train drivenTrain, Train train, bool couple_to_front
}
drivenTrain.Cars.Clear();
AI.TrainsToRemoveFromAI.Add((AITrain)train);
PlayerLocomotive.SignalEvent(Event.PlayerTrainHelperLoco);
PlayerLocomotive = SetPlayerLocomotive(train);
(train as AITrain).SwitchToPlayerControl();
OnPlayerLocomotiveChanged();
Expand Down Expand Up @@ -1083,6 +1090,7 @@ public void CheckForCoupling(Train drivenTrain, float elapsedClockSeconds)
{
drivenTrain.Cars.Add(car);
car.Train = drivenTrain;
if (car is MSTSLocomotive) car.SignalEvent(Event.PlayerTrainHelperLoco);
}
FinishRearCoupling(drivenTrain, train, true);
return;
Expand Down Expand Up @@ -1113,6 +1121,7 @@ public void CheckForCoupling(Train drivenTrain, float elapsedClockSeconds)
drivenTrain.Cars.Add(car);
car.Train = drivenTrain;
car.Flipped = !car.Flipped;
if (car is MSTSLocomotive) car.SignalEvent(Event.PlayerTrainHelperLoco);
}
FinishRearCoupling(drivenTrain, train, false);
return;
Expand Down Expand Up @@ -1177,6 +1186,7 @@ public void CheckForCoupling(Train drivenTrain, float elapsedClockSeconds)
TrainCar car = train.Cars[i];
drivenTrain.Cars.Insert(i, car);
car.Train = drivenTrain;
if (car is MSTSLocomotive) car.SignalEvent(Event.PlayerTrainHelperLoco);
}
if (drivenTrain.LeadLocomotiveIndex >= 0) drivenTrain.LeadLocomotiveIndex += train.Cars.Count;
FinishFrontCoupling(drivenTrain, train, lead, true);
Expand Down Expand Up @@ -1210,6 +1220,7 @@ public void CheckForCoupling(Train drivenTrain, float elapsedClockSeconds)
drivenTrain.Cars.Insert(0, car);
car.Train = drivenTrain;
car.Flipped = !car.Flipped;
if (car is MSTSLocomotive) car.SignalEvent(Event.PlayerTrainHelperLoco);
}
if (drivenTrain.LeadLocomotiveIndex >= 0) drivenTrain.LeadLocomotiveIndex += train.Cars.Count;
FinishFrontCoupling(drivenTrain, train, lead, false);
Expand Down Expand Up @@ -1797,6 +1808,19 @@ public void UncoupleBehind(TrainCar car, bool keepFront)
train2.TrainType = Train.TRAINTYPE.AI;
train.IncorporatedTrainNo = -1;
train2.MUDirection = Direction.Forward;
var leadFound = false;
foreach (var trainCar in train2.Cars)
{
if (trainCar is MSTSLocomotive)
{
if (!leadFound)
{
trainCar.SignalEvent(Event.AITrainLeadLoco);
leadFound = true;
}
}
else trainCar.SignalEvent(Event.AITrainHelperLoco);
}
}
else train2.TrainType = Train.TRAINTYPE.STATIC;
train2.LeadLocomotive = null;
Expand Down
1 change: 1 addition & 0 deletions Source/Orts.Simulation/Simulation/Timetables/TTTrain.cs
Expand Up @@ -583,6 +583,7 @@ public override void Save(BinaryWriter outf)
outf.Write(UncondAttach);
outf.Write(doorCloseAdvance);
outf.Write(doorOpenDelay);
outf.Write(ApproachTriggerSet);
// Dummy for level crossing horn pattern
outf.Write(-1);

Expand Down
8 changes: 8 additions & 0 deletions Source/RunActivity/Viewer3D/RollingStock/MSTSWagonViewer.cs
Expand Up @@ -1402,6 +1402,14 @@ protected void LoadCarSound(string wagonFolderSlash, string filename)
try
{
Viewer.SoundProcess.AddSoundSource(this, new SoundSource(Viewer, MSTSWagon, smsFilePath));
if (MSTSWagon is MSTSLocomotive && MSTSWagon.Train != null && MSTSWagon.Train.TrainType == Simulation.Physics.Train.TRAINTYPE.AI)
{
if (MSTSWagon.CarID == MSTSWagon.Train.Cars[0].CarID)
// Lead loco, enable AI train trigger
MSTSWagon.SignalEvent(Orts.Common.Event.AITrainLeadLoco);
// AI train helper loco
else MSTSWagon.SignalEvent(Orts.Common.Event.AITrainHelperLoco);
}
}
catch (Exception error)
{
Expand Down

0 comments on commit 5866028

Please sign in to comment.