mirror of
https://github.com/JGRennison/OpenTTD-patches.git
synced 2024-11-17 21:25:40 +00:00
(svn r1922) - Fix: Disappearing of crashed trains inside tunnels were not checked properly.
This commit is contained in:
parent
4099a85743
commit
5a24ba51c8
22
train_cmd.c
22
train_cmd.c
@ -2599,11 +2599,20 @@ reverse_train_direction:
|
|||||||
|
|
||||||
extern uint CheckTunnelBusy(uint tile, int *length);
|
extern uint CheckTunnelBusy(uint tile, int *length);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Deletes/Clears the last wagon of a crashed train. It takes the engine of the
|
||||||
|
* train, then goes to the last wagon and deletes that. Each call to this function
|
||||||
|
* will remove the last wagon of a crashed train. If this wagon was on a crossing,
|
||||||
|
* or inside a tunnel, recalculate the signals as they might need updating
|
||||||
|
* @param v the @Vehicle of which last wagon is to be removed
|
||||||
|
*/
|
||||||
static void DeleteLastWagon(Vehicle *v)
|
static void DeleteLastWagon(Vehicle *v)
|
||||||
{
|
{
|
||||||
Vehicle *u = v;
|
Vehicle *u = v;
|
||||||
int t;
|
|
||||||
|
|
||||||
|
/* Go to the last wagon and delete the link pointing there
|
||||||
|
* *u is then the one-before-last wagon, and *v the last
|
||||||
|
* one which will physicially be removed */
|
||||||
while (v->next != NULL) {
|
while (v->next != NULL) {
|
||||||
u = v;
|
u = v;
|
||||||
v = v->next;
|
v = v->next;
|
||||||
@ -2619,16 +2628,19 @@ static void DeleteLastWagon(Vehicle *v)
|
|||||||
EndVehicleMove(v);
|
EndVehicleMove(v);
|
||||||
DeleteVehicle(v);
|
DeleteVehicle(v);
|
||||||
|
|
||||||
if (!((t=v->u.rail.track) & 0xC0)) {
|
if (!(v->u.rail.track & 0xC0))
|
||||||
SetSignalsOnBothDir(v->tile, FIND_FIRST_BIT(t));
|
SetSignalsOnBothDir(v->tile, FIND_FIRST_BIT(v->u.rail.track));
|
||||||
}
|
|
||||||
|
|
||||||
/* Check if the wagon was on a road/rail-crossing and disable it if no others are on it */
|
/* Check if the wagon was on a road/rail-crossing and disable it if no others are on it */
|
||||||
DisableTrainCrossing(v->tile);
|
DisableTrainCrossing(v->tile);
|
||||||
|
|
||||||
if (v->u.rail.track == 0x40) {
|
if (v->u.rail.track == 0x40) { // inside a tunnel
|
||||||
int length;
|
int length;
|
||||||
TileIndex endtile = CheckTunnelBusy(v->tile, &length);
|
TileIndex endtile = CheckTunnelBusy(v->tile, &length);
|
||||||
|
|
||||||
|
if (endtile == (uint)-1) // tunnel is busy (error returned)
|
||||||
|
return;
|
||||||
|
|
||||||
if ((v->direction == 1) || (v->direction == 5) )
|
if ((v->direction == 1) || (v->direction == 5) )
|
||||||
SetSignalsOnBothDir(v->tile, 0);
|
SetSignalsOnBothDir(v->tile, 0);
|
||||||
SetSignalsOnBothDir(endtile, 0);
|
SetSignalsOnBothDir(endtile, 0);
|
||||||
|
Loading…
Reference in New Issue
Block a user