Changeset - r26903:202146204333
[Not reviewed]
master
0 3 0
SamuXarick - 19 months ago 2023-02-20 15:19:39
43006711+SamuXarick@users.noreply.github.com
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.
3 files changed with 19 insertions and 1 deletions:
0 comments (0 inline, 0 general)
src/road_cmd.cpp
Show inline comments
 
@@ -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;
 
						};
src/train.h
Show inline comments
 
@@ -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 */
src/train_cmd.cpp
Show inline comments
 
@@ -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);
 
}
 

	
 
/**
0 comments (0 inline, 0 general)