Only apply signal speed restrictions from the front direction

This commit is contained in:
Jonathan G Rennison
2021-06-28 00:04:12 +01:00
parent 5fb3eb0bb9
commit 11e49ef99e

View File

@@ -5559,23 +5559,25 @@ bool TrainController(Train *v, Vehicle *nomove, bool reverse)
if (_settings_game.vehicle.train_speed_adaptation && IsTileType(gp.old_tile, MP_RAILWAY) && HasSignals(gp.old_tile)) { if (_settings_game.vehicle.train_speed_adaptation && IsTileType(gp.old_tile, MP_RAILWAY) && HasSignals(gp.old_tile)) {
const TrackdirBits rev_tracks = TrackBitsToTrackdirBits(GetTrackBits(gp.old_tile)) & DiagdirReachesTrackdirs(ReverseDiagDir(enterdir)); const TrackdirBits rev_tracks = TrackBitsToTrackdirBits(GetTrackBits(gp.old_tile)) & DiagdirReachesTrackdirs(ReverseDiagDir(enterdir));
const Trackdir rev_trackdir = FindFirstTrackdir(rev_tracks); const Trackdir rev_trackdir = FindFirstTrackdir(rev_tracks);
const Track track = TrackdirToTrack(rev_trackdir); if (HasSignalOnTrackdir(gp.old_tile, ReverseTrackdir(rev_trackdir))) {
SignalSpeedKey speed_key = { const Track track = TrackdirToTrack(rev_trackdir);
speed_key.signal_tile = gp.old_tile, SignalSpeedKey speed_key = {
speed_key.signal_track = track, speed_key.signal_tile = gp.old_tile,
speed_key.last_passing_train_dir = v->GetVehicleTrackdir() speed_key.signal_track = track,
}; speed_key.last_passing_train_dir = v->GetVehicleTrackdir()
const auto found_speed_restriction = _signal_speeds.find(speed_key); };
const auto found_speed_restriction = _signal_speeds.find(speed_key);
if (found_speed_restriction != _signal_speeds.end()) { if (found_speed_restriction != _signal_speeds.end()) {
if (IsOutOfDate(found_speed_restriction->second)) { if (IsOutOfDate(found_speed_restriction->second)) {
_signal_speeds.erase(found_speed_restriction); _signal_speeds.erase(found_speed_restriction);
v->signal_speed_restriction = 0; v->signal_speed_restriction = 0;
} else {
v->signal_speed_restriction = std::max<uint16>(25, found_speed_restriction->second.train_speed);
}
} else { } else {
v->signal_speed_restriction = std::max<uint16>(25, found_speed_restriction->second.train_speed); v->signal_speed_restriction = 0;
} }
} else {
v->signal_speed_restriction = 0;
} }
} }
@@ -5621,20 +5623,20 @@ bool TrainController(Train *v, Vehicle *nomove, bool reverse)
const Trackdir rev_trackdir = FindFirstTrackdir(rev_tracks); const Trackdir rev_trackdir = FindFirstTrackdir(rev_tracks);
const Track track = TrackdirToTrack(rev_trackdir); const Track track = TrackdirToTrack(rev_trackdir);
if (HasSignalOnTrack(gp.old_tile, track)) { if (_settings_game.vehicle.train_speed_adaptation && HasSignalOnTrackdir(gp.old_tile, ReverseTrackdir(rev_trackdir))) {
if (_settings_game.vehicle.train_speed_adaptation) { SignalSpeedKey speed_key = {
SignalSpeedKey speed_key = { speed_key.signal_tile = gp.old_tile,
speed_key.signal_tile = gp.old_tile, speed_key.signal_track = track,
speed_key.signal_track = track, speed_key.last_passing_train_dir = v->GetVehicleTrackdir()
speed_key.last_passing_train_dir = v->GetVehicleTrackdir() };
}; SignalSpeedValue speed_value = {
SignalSpeedValue speed_value = { speed_value.train_speed = v->First()->cur_speed,
speed_value.train_speed = v->First()->cur_speed, speed_value.time_stamp = GetSpeedRestrictionTimeout(v->First())
speed_value.time_stamp = GetSpeedRestrictionTimeout(v->First()) };
}; _signal_speeds[speed_key] = speed_value;
_signal_speeds[speed_key] = speed_value; }
}
if (HasSignalOnTrack(gp.old_tile, track)) {
if (IsRestrictedSignal(gp.old_tile)) { if (IsRestrictedSignal(gp.old_tile)) {
const TraceRestrictProgram *prog = GetExistingTraceRestrictProgram(gp.old_tile, track); const TraceRestrictProgram *prog = GetExistingTraceRestrictProgram(gp.old_tile, track);
if (prog && prog->actions_used_flags & TRPAUF_SLOT_RELEASE_BACK) { if (prog && prog->actions_used_flags & TRPAUF_SLOT_RELEASE_BACK) {