summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorbjarni <bjarni@openttd.org>2006-09-29 18:39:20 +0000
committerbjarni <bjarni@openttd.org>2006-09-29 18:39:20 +0000
commit821d2f14171e98540918b6113e1e8b1fefc87196 (patch)
treebd53a18cbffa3fd5bab5ed482326b8d415d31000
parent648c43dde7b7e93af22550c1638f3f352ef79f80 (diff)
downloadopenttd-821d2f14171e98540918b6113e1e8b1fefc87196.tar.xz
(svn r6580) -Fix r6552: [depot window] fixed issue where vehicles sometimes failed to restart after being replaced
Also fixed an issue where cost animation could fail to show (trigger events appeared to be linked for those two issues)
-rw-r--r--vehicle.c26
1 files changed, 13 insertions, 13 deletions
diff --git a/vehicle.c b/vehicle.c
index 92f3189c5..c08850287 100644
--- a/vehicle.c
+++ b/vehicle.c
@@ -591,7 +591,7 @@ void Ship_Tick(Vehicle *v);
void Train_Tick(Vehicle *v);
static void EffectVehicle_Tick(Vehicle *v);
void DisasterVehicle_Tick(Vehicle *v);
-static int32 MaybeReplaceVehicle(Vehicle **original_vehicle, bool check, bool display_costs);
+static int32 MaybeReplaceVehicle(Vehicle *v, bool check, bool display_costs);
// head of the linked list to tell what vehicles that visited a depot in a tick
static Vehicle* _first_veh_in_depot_list;
@@ -671,7 +671,7 @@ void CallVehicleTicks(void)
while (v != NULL) {
Vehicle *w = v->depot_list;
v->depot_list = NULL; // it should always be NULL at the end of each tick
- MaybeReplaceVehicle(&v, false, true);
+ MaybeReplaceVehicle(v, false, true);
v = w;
}
}
@@ -1729,16 +1729,19 @@ int32 CmdDepotMassAutoReplace(TileIndex tile, uint32 flags, uint32 p1, uint32 p2
(vehicle_type == VEH_Ship && !IsShipInDepot(v) ) ||
(vehicle_type == VEH_Aircraft && !IsAircraftInHangar(v)) ) continue;
- if (stopped) v->vehstatus |= VS_STOPPED; // Stop the vehicle
- ret = MaybeReplaceVehicle(&v, !(flags & DC_EXEC), false);
- if (stopped) v->vehstatus &= ~VS_STOPPED; // restart the vehicle if we stopped it for being replaced
+ x = v->x_pos;
+ y = v->y_pos;
+ z = v->z_pos;
+
+ if (stopped) {
+ v->vehstatus |= VS_STOPPED; // Stop the vehicle
+ v->leave_depot_instantly = true;
+ }
+ ret = MaybeReplaceVehicle(v, !(flags & DC_EXEC), false);
if (!CmdFailed(ret)) {
cost += ret;
if (!(flags & DC_EXEC)) break;
- x = v->x_pos;
- y = v->y_pos;
- z = v->z_pos;
/* There is a problem with autoreplace and newgrf
* It's impossible to tell the length of a train after it's being replaced before it's actually done
* Because of this, we can't estimate costs due to wagon removal and we will have to always return 0 and pay manually
@@ -2069,9 +2072,8 @@ static int32 ReplaceVehicle(Vehicle **w, byte flags, int32 total_cost)
* @param display_costs If set, a cost animation is shown (only if check is false)
* @return CMD_ERROR if something went wrong. Otherwise the price of the replace
*/
-static int32 MaybeReplaceVehicle(Vehicle **original_vehicle, bool check, bool display_costs)
+static int32 MaybeReplaceVehicle(Vehicle *v, bool check, bool display_costs)
{
- Vehicle *v = *original_vehicle;
Vehicle *w;
const Player *p = GetPlayer(v->owner);
byte flags = 0;
@@ -2150,7 +2152,7 @@ static int32 MaybeReplaceVehicle(Vehicle **original_vehicle, bool check, bool di
AddNewsItem(message, NEWS_FLAGS(NM_SMALL, NF_VIEWPORT|NF_VEHICLE, NT_ADVICE, 0), v->index, 0);
}
if (stopped) v->vehstatus &= ~VS_STOPPED;
- _current_player = OWNER_NONE;
+ if (display_costs) _current_player = OWNER_NONE;
return CMD_ERROR;
}
@@ -2189,8 +2191,6 @@ static int32 MaybeReplaceVehicle(Vehicle **original_vehicle, bool check, bool di
}
}
- original_vehicle = &v;
-
if (stopped) v->vehstatus &= ~VS_STOPPED;
if (display_costs) {
if (IsLocalPlayer()) ShowCostOrIncomeAnimation(v->x_pos, v->y_pos, v->z_pos, cost);