summaryrefslogtreecommitdiff
path: root/train_cmd.c
diff options
context:
space:
mode:
authordominik <dominik@openttd.org>2005-01-23 10:40:54 +0000
committerdominik <dominik@openttd.org>2005-01-23 10:40:54 +0000
commit322bd934be9ee7be7b25de4dc3deab68fdb9a8e4 (patch)
tree4be0844598efe3ee9d2262b9b1e2cf7d088f3875 /train_cmd.c
parent720b18301776864c0f671a909f4bfb4405b8c799 (diff)
downloadopenttd-322bd934be9ee7be7b25de4dc3deab68fdb9a8e4.tar.xz
(svn r1604) Fix: [ 1105112 ] Destroyed train locks crossings
Diffstat (limited to 'train_cmd.c')
-rw-r--r--train_cmd.c34
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);
}