Mercurial > hg > openttd
changeset 4741:2aa0721ffa87 draft
(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
author | bjarni <bjarni@openttd.org> |
---|---|
date | Thu, 05 Oct 2006 14:04:24 +0000 |
parents | fd30f7e7fe1e |
children | bf4f46e782d9 |
files | vehicle.c |
diffstat | 1 files changed, 27 insertions(+), 2 deletions(-) [+] |
line wrap: on
line diff
--- a/vehicle.c +++ b/vehicle.c @@ -1887,6 +1887,26 @@ } 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 @@ 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 */