From 4e0804b7914f38a6ea80d54648b49c512a568095 Mon Sep 17 00:00:00 2001 From: Jonathan G Rennison Date: Fri, 29 Jan 2021 02:13:08 +0000 Subject: [PATCH] Fix const issues around GetTrainStopLocation/GetCurrentMaxSpeed --- src/station_cmd.cpp | 2 +- src/train.h | 21 +++++++++++++++++---- src/train_cmd.cpp | 11 ++++++----- 3 files changed, 24 insertions(+), 10 deletions(-) diff --git a/src/station_cmd.cpp b/src/station_cmd.cpp index ae1a6fc5b1..844a101adf 100644 --- a/src/station_cmd.cpp +++ b/src/station_cmd.cpp @@ -3618,7 +3618,7 @@ static VehicleEnterTileStatus VehicleEnter_Station(Vehicle *v, TileIndex tile, i int station_ahead; int station_length; - int stop = GetTrainStopLocation(station_id, tile, Train::From(v), &station_ahead, &station_length, x, y); + int stop = GetTrainStopLocation(station_id, tile, Train::From(v), true, &station_ahead, &station_length, x, y); /* Stop whenever that amount of station ahead + the distance from the * begin of the platform to the stop location is longer than the length diff --git a/src/train.h b/src/train.h index 22f17a9c47..bdd8976bac 100644 --- a/src/train.h +++ b/src/train.h @@ -169,7 +169,20 @@ struct Train FINAL : public GroundVehicle { int strict_max_speed; int advisory_max_speed; }; - MaxSpeedInfo GetCurrentMaxSpeedInfo() const; + +private: + MaxSpeedInfo GetCurrentMaxSpeedInfoInternal(bool update_state) const; + +public: + MaxSpeedInfo GetCurrentMaxSpeedInfo() const + { + return this->GetCurrentMaxSpeedInfoInternal(false); + } + + MaxSpeedInfo GetCurrentMaxSpeedInfoAndUpdate() + { + return this->GetCurrentMaxSpeedInfoInternal(true); + } int GetCurrentMaxSpeed() const; @@ -438,11 +451,11 @@ inline int GetTileMarginInFrontOfTrain(const Train *v) return GetTileMarginInFrontOfTrain(v, v->x_pos, v->y_pos); } -int GetTrainStopLocation(StationID station_id, TileIndex tile, Train *v, int *station_ahead, int *station_length, int x_pos, int y_pos); +int GetTrainStopLocation(StationID station_id, TileIndex tile, Train *v, bool update_train_state, int *station_ahead, int *station_length, int x_pos, int y_pos); -inline int GetTrainStopLocation(StationID station_id, TileIndex tile, Train *v, int *station_ahead, int *station_length) +inline int GetTrainStopLocation(StationID station_id, TileIndex tile, Train *v, bool update_train_state, int *station_ahead, int *station_length) { - return GetTrainStopLocation(station_id, tile, v, station_ahead, station_length, v->x_pos, v->y_pos); + return GetTrainStopLocation(station_id, tile, v, update_train_state, station_ahead, station_length, v->x_pos, v->y_pos); } #endif /* TRAIN_H */ diff --git a/src/train_cmd.cpp b/src/train_cmd.cpp index 7b7535cbdd..18d4985d2f 100644 --- a/src/train_cmd.cpp +++ b/src/train_cmd.cpp @@ -398,13 +398,14 @@ int GetTileMarginInFrontOfTrain(const Train *v, int x_pos, int y_pos) * @param station_id the ID of the station where we're stopping * @param tile the tile where the vehicle currently is * @param v the vehicle to get the stop location of + * @param update_train_state whether the state of the train v may be changed * @param station_ahead 'return' the amount of 1/16th tiles in front of the train * @param station_length 'return' the station length in 1/16th tiles * @param x_pos vehicle x position * @param y_pos vehicle y position * @return the location, calculated from the begin of the station to stop at. */ -int GetTrainStopLocation(StationID station_id, TileIndex tile, Train *v, int *station_ahead, int *station_length, int x_pos, int y_pos) +int GetTrainStopLocation(StationID station_id, TileIndex tile, Train *v, bool update_train_state, int *station_ahead, int *station_length, int x_pos, int y_pos) { Train *front = v->First(); if (IsRailWaypoint(tile)) { @@ -439,7 +440,7 @@ int GetTrainStopLocation(StationID station_id, TileIndex tile, Train *v, int *st if (osl == OSL_PLATFORM_THROUGH && overhang > 0) { /* The train is longer than the station, and we can run through the station to load/unload */ for (Train *u = v; u != nullptr; u = u->Next()) { - if (overhang > 0 && !HasBit(u->flags, VRF_BEYOND_PLATFORM_END) && !u->IsArticulatedPart()) { + if (update_train_state && overhang > 0 && !HasBit(u->flags, VRF_BEYOND_PLATFORM_END) && !u->IsArticulatedPart()) { bool skip = true; for (const Train *part = u; part != nullptr; part = part->HasArticulatedPart() ? part->GetNextArticulatedPart() : nullptr) { if (part->cargo_cap != 0) { @@ -903,7 +904,7 @@ static void AdvanceLookAheadPosition(Train *v) * Calculates the maximum speed information of the vehicle under its current conditions. * @return Maximum speed information of the vehicle. */ -Train::MaxSpeedInfo Train::GetCurrentMaxSpeedInfo() const +Train::MaxSpeedInfo Train::GetCurrentMaxSpeedInfoInternal(bool update_state) const { int max_speed = _settings_game.vehicle.train_acceleration_model == AM_ORIGINAL ? this->gcache.cached_max_track_speed : @@ -921,7 +922,7 @@ Train::MaxSpeedInfo Train::GetCurrentMaxSpeedInfo() const if (this->current_order.ShouldStopAtStation(this, sid, IsRailWaypoint(platform_tile))) { int station_ahead; int station_length; - int stop_at = GetTrainStopLocation(sid, platform_tile, v_platform, &station_ahead, &station_length); + int stop_at = GetTrainStopLocation(sid, platform_tile, v_platform, update_state, &station_ahead, &station_length); /* The distance to go is whatever is still ahead of the train minus the * distance from the train's stop location to the end of the platform */ @@ -4260,7 +4261,7 @@ void Train::MarkDirty() int Train::UpdateSpeed() { AccelStatus accel_status = this->GetAccelerationStatus(); - MaxSpeedInfo max_speed_info = this->GetCurrentMaxSpeedInfo(); + MaxSpeedInfo max_speed_info = this->GetCurrentMaxSpeedInfoAndUpdate(); if (this->lookahead != nullptr && HasBit(this->lookahead->flags, TRLF_APPLY_ADVISORY) && this->cur_speed <= max_speed_info.strict_max_speed) { ClrBit(this->lookahead->flags, TRLF_APPLY_ADVISORY); }