# HG changeset patch # User SamuXarick <43006711+SamuXarick@users.noreply.github.com> # Date 2023-02-20 15:19:39 # Node ID 202146204333232d439faaddc29ee84134fe4336 # Parent f61861f69e3dc47d23c4e27a4ac88ea8a99b86c7 Change: Avoid crashing to the side of a train When a road vehicle is already running on a multi level crossing, and a train shows up ahead, don't make the road vehicle crash on the side of the train. diff --git a/src/road_cmd.cpp b/src/road_cmd.cpp --- a/src/road_cmd.cpp +++ b/src/road_cmd.cpp @@ -26,6 +26,7 @@ #include "effectvehicle_base.h" #include "elrail_func.h" #include "roadveh.h" +#include "train.h" #include "town.h" #include "company_base.h" #include "core/random_func.hpp" @@ -2086,6 +2087,8 @@ static TrackStatus GetTileTrackStatus_Ro trackdirbits = TrackBitsToTrackdirBits(AxisToTrackBits(axis)); if (IsCrossingBarred(tile)) { red_signals = trackdirbits; + if (TrainOnCrossing(tile)) break; + auto mask_red_signal_bits_if_crossing_barred = [&](TileIndex t, TrackdirBits mask) { if (IsLevelCrossingTile(t) && IsCrossingBarred(t)) red_signals &= mask; }; diff --git a/src/train.h b/src/train.h --- a/src/train.h +++ b/src/train.h @@ -65,6 +65,8 @@ int GetTrainStopLocation(StationID stati void GetTrainSpriteSize(EngineID engine, uint &width, uint &height, int &xoffs, int &yoffs, EngineImageType image_type); +bool TrainOnCrossing(TileIndex tile); + /** Variables that are cached to improve performance and such */ struct TrainCache { /* Cached wagon override spritegroup */ diff --git a/src/train_cmd.cpp b/src/train_cmd.cpp --- a/src/train_cmd.cpp +++ b/src/train_cmd.cpp @@ -1658,6 +1658,19 @@ static Vehicle *TrainOnTileEnum(Vehicle return (v->type == VEH_TRAIN) ? v : nullptr; } +/** + * Check if a level crossing tile has a train on it + * @param tile tile to test + * @return true if a train is on the crossing + * @pre tile is a level crossing + */ +bool TrainOnCrossing(TileIndex tile) +{ + assert(IsLevelCrossingTile(tile)); + + return HasVehicleOnPos(tile, nullptr, &TrainOnTileEnum); +} + /** * Checks if a train is approaching a rail-road crossing @@ -1709,7 +1722,7 @@ static bool TrainApproachingCrossing(Til static inline bool CheckLevelCrossing(TileIndex tile) { /* reserved || train on crossing || train approaching crossing */ - return HasCrossingReservation(tile) || HasVehicleOnPos(tile, NULL, &TrainOnTileEnum) || TrainApproachingCrossing(tile); + return HasCrossingReservation(tile) || TrainOnCrossing(tile) || TrainApproachingCrossing(tile); } /**