(svn r22876) -Fix [FS#4712]: Report an error in the news if autoreplace/renew fails due to the engine type being no longer available.

This commit is contained in:
frosch 2011-09-02 22:21:07 +00:00
parent f227e90c24
commit b2bc7797bf
1 changed files with 25 additions and 14 deletions

View File

@ -213,29 +213,35 @@ static CargoID GetNewCargoTypeForReplace(Vehicle *v, EngineID engine_type, bool
* Get the EngineID of the replacement for a vehicle * Get the EngineID of the replacement for a vehicle
* @param v The vehicle to find a replacement for * @param v The vehicle to find a replacement for
* @param c The vehicle's owner (it's faster to forward the pointer than refinding it) * @param c The vehicle's owner (it's faster to forward the pointer than refinding it)
* @return the EngineID of the replacement. INVALID_ENGINE if no buildable replacement is found * @param [out] e the EngineID of the replacement. INVALID_ENGINE if no replacement is found
* @return Error if the engine to build is not available
*/ */
static EngineID GetNewEngineType(const Vehicle *v, const Company *c) static CommandCost GetNewEngineType(const Vehicle *v, const Company *c, EngineID &e)
{ {
assert(v->type != VEH_TRAIN || !v->IsArticulatedPart()); assert(v->type != VEH_TRAIN || !v->IsArticulatedPart());
e = INVALID_ENGINE;
if (v->type == VEH_TRAIN && Train::From(v)->IsRearDualheaded()) { if (v->type == VEH_TRAIN && Train::From(v)->IsRearDualheaded()) {
/* we build the rear ends of multiheaded trains with the front ones */ /* we build the rear ends of multiheaded trains with the front ones */
return INVALID_ENGINE; return CommandCost();
} }
EngineID e = EngineReplacementForCompany(c, v->engine_type, v->group_id); e = EngineReplacementForCompany(c, v->engine_type, v->group_id);
/* Autoreplace, if engine is available */
if (e != INVALID_ENGINE && IsEngineBuildable(e, v->type, _current_company)) { if (e != INVALID_ENGINE && IsEngineBuildable(e, v->type, _current_company)) {
return e; return CommandCost();
} }
if (v->NeedsAutorenewing(c) && // replace if engine is too old /* Autorenew if needed */
IsEngineBuildable(v->engine_type, v->type, _current_company)) { // engine can still be build if (v->NeedsAutorenewing(c)) e = v->engine_type;
return v->engine_type;
}
return INVALID_ENGINE; /* Nothing to do or all is fine? */
if (e == INVALID_ENGINE || IsEngineBuildable(e, v->type, _current_company)) return CommandCost();
/* The engine we need is not available. Report error to user */
return CommandCost(STR_ERROR_RAIL_VEHICLE_NOT_AVAILABLE + v->type);
} }
/** /**
@ -252,7 +258,9 @@ static CommandCost BuildReplacementVehicle(Vehicle *old_veh, Vehicle **new_vehic
/* Shall the vehicle be replaced? */ /* Shall the vehicle be replaced? */
const Company *c = Company::Get(_current_company); const Company *c = Company::Get(_current_company);
EngineID e = GetNewEngineType(old_veh, c); EngineID e;
CommandCost cost = GetNewEngineType(old_veh, c, e);
if (cost.Failed()) return cost;
if (e == INVALID_ENGINE) return CommandCost(); // neither autoreplace is set, nor autorenew is triggered if (e == INVALID_ENGINE) return CommandCost(); // neither autoreplace is set, nor autorenew is triggered
/* Does it need to be refitted */ /* Does it need to be refitted */
@ -260,7 +268,7 @@ static CommandCost BuildReplacementVehicle(Vehicle *old_veh, Vehicle **new_vehic
if (refit_cargo == CT_INVALID) return CommandCost(); // incompatible cargos if (refit_cargo == CT_INVALID) return CommandCost(); // incompatible cargos
/* Build the new vehicle */ /* Build the new vehicle */
CommandCost cost = DoCommand(old_veh->tile, e, 0, DC_EXEC | DC_AUTOREPLACE, GetCmdBuildVeh(old_veh)); cost = DoCommand(old_veh->tile, e, 0, DC_EXEC | DC_AUTOREPLACE, GetCmdBuildVeh(old_veh));
if (cost.Failed()) return cost; if (cost.Failed()) return cost;
Vehicle *new_veh = Vehicle::Get(_new_vehicle_id); Vehicle *new_veh = Vehicle::Get(_new_vehicle_id);
@ -662,8 +670,11 @@ CommandCost CmdAutoreplaceVehicle(TileIndex tile, DoCommandFlag flags, uint32 p1
/* Test whether any replacement is set, before issuing a whole lot of commands that would end in nothing changed */ /* Test whether any replacement is set, before issuing a whole lot of commands that would end in nothing changed */
Vehicle *w = v; Vehicle *w = v;
bool any_replacements = false; bool any_replacements = false;
while (w != NULL && !any_replacements) { while (w != NULL) {
any_replacements = (GetNewEngineType(w, c) != INVALID_ENGINE); EngineID e;
CommandCost cost = GetNewEngineType(w, c, e);
if (cost.Failed()) return cost;
any_replacements |= (e != INVALID_ENGINE);
w = (!free_wagon && w->type == VEH_TRAIN ? Train::From(w)->GetNextUnit() : NULL); w = (!free_wagon && w->type == VEH_TRAIN ? Train::From(w)->GetNextUnit() : NULL);
} }