diff options
author | Darkvater <darkvater@openttd.org> | 2005-03-03 23:26:35 +0000 |
---|---|---|
committer | Darkvater <darkvater@openttd.org> | 2005-03-03 23:26:35 +0000 |
commit | 232fffffacd45b6ca718bad3c63c35701e46467c (patch) | |
tree | ea81de82229c57a6c707fc71631ffa1fdbec49f4 | |
parent | 0c3927ce4a45ca8c446083b6101ebaf005b09748 (diff) | |
download | openttd-232fffffacd45b6ca718bad3c63c35701e46467c.tar.xz |
(svn r1922) - Fix: Disappearing of crashed trains inside tunnels were not checked properly.
-rw-r--r-- | train_cmd.c | 30 |
1 files changed, 21 insertions, 9 deletions
diff --git a/train_cmd.c b/train_cmd.c index d90594377..ac39e4b1a 100644 --- a/train_cmd.c +++ b/train_cmd.c @@ -2599,11 +2599,20 @@ reverse_train_direction: 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) { 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) { u = v; v = v->next; @@ -2619,22 +2628,25 @@ static void DeleteLastWagon(Vehicle *v) EndVehicleMove(v); DeleteVehicle(v); - if (!((t=v->u.rail.track) & 0xC0)) { - SetSignalsOnBothDir(v->tile, FIND_FIRST_BIT(t)); - } + if (!(v->u.rail.track & 0xC0)) + 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 */ DisableTrainCrossing(v->tile); - if (v->u.rail.track == 0x40) { + if (v->u.rail.track == 0x40) { // inside a tunnel int length; TileIndex endtile = CheckTunnelBusy(v->tile, &length); + + if (endtile == (uint)-1) // tunnel is busy (error returned) + return; + if ((v->direction == 1) || (v->direction == 5) ) - SetSignalsOnBothDir(v->tile,0); - SetSignalsOnBothDir(endtile,0); + SetSignalsOnBothDir(v->tile, 0); + SetSignalsOnBothDir(endtile, 0); if ((v->direction == 3) || (v->direction == 7) ) - SetSignalsOnBothDir(v->tile,1); - SetSignalsOnBothDir(endtile,1); + SetSignalsOnBothDir(v->tile, 1); + SetSignalsOnBothDir(endtile, 1); } } |