diff --git a/src/autoreplace_cmd.cpp b/src/autoreplace_cmd.cpp index 6a191cb49a..36bf98e7f7 100644 --- a/src/autoreplace_cmd.cpp +++ b/src/autoreplace_cmd.cpp @@ -87,34 +87,9 @@ static bool VerifyAutoreplaceRefitForOrders(const Vehicle *v, const EngineID eng */ static CargoID GetNewCargoTypeForReplace(Vehicle *v, EngineID engine_type) { - bool new_cargo_capacity = true; - CargoID new_cargo_type = CT_INVALID; + CargoID new_cargo_type = GetEngineCargoType(engine_type); - switch (v->type) { - case VEH_TRAIN: - new_cargo_capacity = (RailVehInfo(engine_type)->capacity > 0); - new_cargo_type = RailVehInfo(engine_type)->cargo_type; - break; - - case VEH_ROAD: - new_cargo_capacity = (RoadVehInfo(engine_type)->capacity > 0); - new_cargo_type = RoadVehInfo(engine_type)->cargo_type; - break; - case VEH_SHIP: - new_cargo_capacity = (ShipVehInfo(engine_type)->capacity > 0); - new_cargo_type = ShipVehInfo(engine_type)->cargo_type; - break; - - case VEH_AIRCRAFT: - /* all aircraft starts as passenger planes with cargo capacity - * new_cargo_capacity is always true for aircraft, which is the init value. No need to set it here */ - new_cargo_type = CT_PASSENGERS; - break; - - default: NOT_REACHED(); break; - } - - if (!new_cargo_capacity) return CT_NO_REFIT; // Don't try to refit an engine with no cargo capacity + if (new_cargo_type == CT_INVALID) return CT_NO_REFIT; // Don't try to refit an engine with no cargo capacity if (v->cargo_type == new_cargo_type || CanRefitTo(engine_type, v->cargo_type)) { if (VerifyAutoreplaceRefitForOrders(v, engine_type)) { diff --git a/src/engine.cpp b/src/engine.cpp index 4a0b271615..41a7bbeaaf 100644 --- a/src/engine.cpp +++ b/src/engine.cpp @@ -404,6 +404,35 @@ bool IsEngineBuildable(EngineID engine, byte type, PlayerID player) return true; } +/** Get the default cargo type for a certain engine type + * @param engine The ID to get the cargo for + * @return The cargo type. CT_INVALID means no cargo capacity + */ +CargoID GetEngineCargoType(EngineID engine) +{ + assert(IsEngineIndex(engine)); + + switch (GetEngine(engine)->type) { + case VEH_TRAIN: + if (RailVehInfo(engine)->capacity == 0) return CT_INVALID; + return RailVehInfo(engine)->cargo_type; + + case VEH_ROAD: + if (RoadVehInfo(engine)->capacity == 0) return CT_INVALID; + return RoadVehInfo(engine)->cargo_type; + + case VEH_SHIP: + if (ShipVehInfo(engine)->capacity == 0) return CT_INVALID; + return ShipVehInfo(engine)->cargo_type; + + case VEH_AIRCRAFT: + /* all aircraft starts as passenger planes with cargo capacity */ + return CT_PASSENGERS; + + default: NOT_REACHED(); return CT_INVALID; + } +} + /************************************************************************ * Engine Replacement stuff ************************************************************************/ diff --git a/src/engine.h b/src/engine.h index 4ebf1a9f2f..54920e135f 100644 --- a/src/engine.h +++ b/src/engine.h @@ -153,6 +153,7 @@ void LoadCustomEngineNames(); void DeleteCustomEngineNames(); bool IsEngineBuildable(EngineID engine, byte type, PlayerID player); +CargoID GetEngineCargoType(EngineID engine); enum { NUM_NORMAL_RAIL_ENGINES = 54,