summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorsmatz <smatz@openttd.org>2007-12-27 13:25:23 +0000
committersmatz <smatz@openttd.org>2007-12-27 13:25:23 +0000
commit4e66f5a04b3b1393a13fa81edfdd10243aaf13a4 (patch)
tree98bd057405fe5ac4e9ba391e32658cb1fb70ca1a
parent0b1d3e43e59d331566fb86627dad3683d998c002 (diff)
downloadopenttd-4e66f5a04b3b1393a13fa81edfdd10243aaf13a4.tar.xz
(svn r11705) -Fix [FS#1557]: trains could have sprites with wrong direction when reversing, also was inconsistent with save/load process (possible desyncs)
-rw-r--r--src/train_cmd.cpp26
1 files changed, 12 insertions, 14 deletions
diff --git a/src/train_cmd.cpp b/src/train_cmd.cpp
index b1e96aa40..a86f94487 100644
--- a/src/train_cmd.cpp
+++ b/src/train_cmd.cpp
@@ -1570,6 +1570,8 @@ static void AdvanceWagons(Vehicle *v, bool before)
Vehicle *tempnext = last->Next();
last->SetNext(NULL);
+ /* do not update images now because the wagons are disconnected
+ * and that could cause problems with NewGRFs */
for (int i = 0; i < differential; i++) TrainController(first, false);
last->SetNext(tempnext);
@@ -1605,9 +1607,8 @@ static void ReverseTrainDirection(Vehicle *v)
}
/* count number of vehicles */
- int r = -1;
- const Vehicle *u = v;
- do r++; while ((u = u->Next()) != NULL);
+ int r = 0; ///< number of vehicles - 1
+ for (const Vehicle *u = v; (u = u->Next()) != NULL;) { r++; }
AdvanceWagons(v, true);
@@ -1623,6 +1624,9 @@ static void ReverseTrainDirection(Vehicle *v)
InvalidateWindowData(WC_VEHICLE_DEPOT, v->tile);
}
+ /* update all images */
+ for (Vehicle *u = v; u != NULL; u = u->Next()) { u->cur_image = u->GetImage(u->direction); }
+
ClrBit(v->u.rail.flags, VRF_REVERSING);
}
@@ -2597,13 +2601,6 @@ static Direction GetNewVehicleDirectionByTile(TileIndex new_tile, TileIndex old_
return _new_vehicle_direction_table[offs];
}
-static Direction GetNewVehicleDirection(const Vehicle *v, int x, int y)
-{
- uint offs = (y - v->y_pos + 1) * 4 + (x - v->x_pos + 1);
- assert(offs < 11);
- return _new_vehicle_direction_table[offs];
-}
-
static int GetDirectionToVehicle(const Vehicle *v, int x, int y)
{
byte offs;
@@ -2969,7 +2966,9 @@ static void TrainController(Vehicle *v, bool update_image)
v->direction = chosen_dir;
}
} else {
- /* In tunnel or on a bridge */
+ /* In a tunnel or on a bridge
+ * - for tunnels, only the part when the vehicle is not visible (part of enter/exit tile too)
+ * - for bridges, only the middle part - without the bridge heads */
if (!(v->vehstatus & VS_HIDDEN)) {
v->cur_speed =
min(v->cur_speed, GetBridge(GetBridgeType(v->tile))->speed);
@@ -2985,9 +2984,8 @@ static void TrainController(Vehicle *v, bool update_image)
}
/* update image of train, as well as delta XY */
- Direction newdir = GetNewVehicleDirection(v, gp.x, gp.y);
- v->UpdateDeltaXY(newdir);
- if (update_image) v->cur_image = v->GetImage(newdir);
+ v->UpdateDeltaXY(v->direction);
+ if (update_image) v->cur_image = v->GetImage(v->direction);
v->x_pos = gp.x;
v->y_pos = gp.y;