diff options
author | dominik <dominik@openttd.org> | 2005-01-23 10:40:54 +0000 |
---|---|---|
committer | dominik <dominik@openttd.org> | 2005-01-23 10:40:54 +0000 |
commit | 322bd934be9ee7be7b25de4dc3deab68fdb9a8e4 (patch) | |
tree | 4be0844598efe3ee9d2262b9b1e2cf7d088f3875 | |
parent | 720b18301776864c0f671a909f4bfb4405b8c799 (diff) | |
download | openttd-322bd934be9ee7be7b25de4dc3deab68fdb9a8e4.tar.xz |
(svn r1604) Fix: [ 1105112 ] Destroyed train locks crossings
-rw-r--r-- | train_cmd.c | 34 |
1 files changed, 22 insertions, 12 deletions
diff --git a/train_cmd.c b/train_cmd.c index 09ece94e0..d862e21da 100644 --- a/train_cmd.c +++ b/train_cmd.c @@ -968,6 +968,21 @@ static void *TestTrainOnCrossing(Vehicle *v, void *data) return v; } +static void DisableTrainCrossing(TileIndex tile) +{ + /* Test if we have a rail/road-crossing */ + if (IsTileType(tile, MP_STREET) && (_map5[tile] & 0xF0) == 0x10) { + /* Check if there is a train on the tile itself */ + if (VehicleFromPos(tile, &tile, TestTrainOnCrossing) == NULL) { + /* If light is on, switch light off */ + if (_map5[tile] & 4) { + _map5[tile] &= ~4; + MarkTileDirtyByTile(tile); + } + } + } +} + static void ReverseTrainDirection(Vehicle *v) { int l = 0, r = -1; @@ -987,17 +1002,9 @@ static void ReverseTrainDirection(Vehicle *v) } /* Calculate next tile */ tile += TileOffsByDir(t); - /* Test if we have a rail/road-crossing */ - if (IsTileType(tile, MP_STREET) && (_map5[tile] & 0xF0) == 0x10) { - /* Check if there is a train on the tile itself */ - if (VehicleFromPos(tile, &tile, TestTrainOnCrossing) == NULL) { - /* If light is on, switch light off */ - if (_map5[tile] & 4) { - _map5[tile] &= ~4; - MarkTileDirtyByTile(tile); - } - } - } + + /* Check if the train left a rail/road-crossing */ + DisableTrainCrossing(tile); } // count number of vehicles @@ -2328,6 +2335,9 @@ static void DeleteLastWagon(Vehicle *v) SetSignalsOnBothDir(v->tile, FIND_FIRST_BIT(t)); } + /* 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) { int length; TileIndex endtile = CheckTunnelBusy(v->tile, &length); @@ -2389,7 +2399,7 @@ static void HandleCrashedTrain(Vehicle *v) ChangeTrainDirRandomly(v); } - if (state >= 4440 && !(v->tick_counter&0x1F)) + if (state >= 4440 && !(v->tick_counter&0x1F)) DeleteLastWagon(v); } |