summaryrefslogtreecommitdiff
path: root/vehicle.c
diff options
context:
space:
mode:
authorbjarni <bjarni@openttd.org>2006-10-05 14:04:24 +0000
committerbjarni <bjarni@openttd.org>2006-10-05 14:04:24 +0000
commit1e14976bbf5e4a4a4456059545bb79fbe781d6af (patch)
treeb2d799dde6de26204d6dd0e31e82591eca9d36de /vehicle.c
parente341cc1e496261fa9778b8bde19b1eae32b9f6b7 (diff)
downloadopenttd-1e14976bbf5e4a4a4456059545bb79fbe781d6af.tar.xz
(svn r6653) -Fix r6624: [autoreplace] autoreplace will no longer replace a vehicle if the old type can refit to the cargo types being used in the refit orders and the new one lacks one or more of those refit capabilities
Diffstat (limited to 'vehicle.c')
-rw-r--r--vehicle.c29
1 files changed, 27 insertions, 2 deletions
diff --git a/vehicle.c b/vehicle.c
index fd005da92..29610a566 100644
--- a/vehicle.c
+++ b/vehicle.c
@@ -1887,6 +1887,26 @@ static void MoveVehicleCargo(Vehicle *dest, Vehicle *source)
} while ((source = source->next) != NULL);
}
+static bool VerifyAutoreplaceRefitForOrders(const Vehicle *v, const EngineID engine_type)
+{
+ const Order *o;
+ const Vehicle *u;
+
+ if (v->type == VEH_Train) {
+ u = GetFirstVehicleInChain(v);
+ } else {
+ u = v;
+ }
+
+ FOR_VEHICLE_ORDERS(u, o) {
+ if (o->refit_cargo == CT_NO_REFIT) continue;
+ if (!CanRefitTo(v->engine_type, o->refit_cargo)) continue;
+ if (!CanRefitTo(engine_type, o->refit_cargo)) return false;
+ }
+
+ return true;
+}
+
/**
* Function to find what type of cargo to refit to when autoreplacing
* @param *v Original vehicle, that is being replaced
@@ -1926,8 +1946,13 @@ static CargoID GetNewCargoTypeForReplace(Vehicle *v, EngineID engine_type)
if (!new_cargo_capacity) return CT_NO_REFIT; // Don't try to refit an engine with no cargo capacity
- if (v->cargo_type == new_cargo_type) return CT_NO_REFIT;
- if (CanRefitTo(engine_type, v->cargo_type)) return v->cargo_type;
+ if (v->cargo_type == new_cargo_type || CanRefitTo(engine_type, v->cargo_type)) {
+ if (VerifyAutoreplaceRefitForOrders(v, engine_type)) {
+ return v->cargo_type == new_cargo_type ? CT_NO_REFIT : v->cargo_type;
+ } else {
+ return CT_INVALID;
+ }
+ }
if (v->type != VEH_Train) return CT_INVALID; // We can't refit the vehicle to carry the cargo we want
/* Below this line it's safe to assume that the vehicle in question is a train */