mirror of
https://github.com/OpenTTD/OpenTTD.git
synced 2025-03-06 14:27:16 +00:00
(svn r2320) - Fix: [ 1185176 ] Train in tunnel is not properly detected by signal code (Hackykid)
This commit is contained in:
parent
14996be3ef
commit
2151550631
30
rail_cmd.c
30
rail_cmd.c
@ -1619,7 +1619,35 @@ bool SignalVehicleCheck(TileIndex tile, uint track)
|
||||
dest.tile = tile;
|
||||
dest.track = track;
|
||||
|
||||
return VehicleFromPos(tile, &dest, SignalVehicleCheckProc) != NULL;
|
||||
if (GetTileType(tile)==MP_TUNNELBRIDGE && ((_map5[tile] & 0xF0)==0)) {
|
||||
// It is a tunnel we're checking, we need to do some special stuff
|
||||
// because VehicleFromPos will not find the vihicle otherwise
|
||||
byte direction = _map5[tile] & 3;
|
||||
FindLengthOfTunnelResult flotr;
|
||||
flotr = FindLengthOfTunnel(tile, direction);
|
||||
dest.track = 1 << (direction & 1); // get the trackbit the vehicle would have if it has not entered the tunnel yet (ie is still visible)
|
||||
|
||||
// check for a vehicle with that trackdir on the start tile of the tunnel
|
||||
if (VehicleFromPos(tile, &dest, SignalVehicleCheckProc) != NULL)
|
||||
return true;
|
||||
|
||||
// check for a vehicle with that trackdir on the end tile of the tunnel
|
||||
if (VehicleFromPos(flotr.tile, &dest, SignalVehicleCheckProc) != NULL)
|
||||
return true;
|
||||
|
||||
// now check all tiles from start to end for a "hidden" vehicle
|
||||
// NOTE: the hashes for tiles may overlap, so this could maybe be optimised a bit by not checking every tile?
|
||||
dest.track = 0x40; // trackbit for vehicles "hidden" inside a tunnel
|
||||
for (; tile != flotr.tile; tile += TileOffsByDir(direction)) {
|
||||
if (VehicleFromPos(tile, &dest, SignalVehicleCheckProc) != NULL)
|
||||
return true;
|
||||
}
|
||||
|
||||
// no vehicle found
|
||||
return false;
|
||||
} else {
|
||||
return VehicleFromPos(tile, &dest, SignalVehicleCheckProc) != NULL;
|
||||
};
|
||||
}
|
||||
|
||||
static void SetSignalsAfterProc(TrackPathFinder *tpf)
|
||||
|
Loading…
Reference in New Issue
Block a user