summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/articulated_vehicles.cpp35
-rw-r--r--src/build_vehicle_gui.cpp13
-rw-r--r--src/engine_func.h1
3 files changed, 42 insertions, 7 deletions
diff --git a/src/articulated_vehicles.cpp b/src/articulated_vehicles.cpp
index 859d9a750..c000da03b 100644
--- a/src/articulated_vehicles.cpp
+++ b/src/articulated_vehicles.cpp
@@ -163,6 +163,41 @@ CargoArray GetCapacityOfArticulatedParts(EngineID engine)
}
/**
+ * Get the default cargoes and refits of an articulated vehicle.
+ * The refits are linked to a cargo rather than an articulated part to prevent a long list of parts.
+ * @param engine Model to investigate.
+ * @param[out] cargoes Total amount of units that can be transported, summed by cargo.
+ * @param[out] refits Whether a (possibly partial) refit for each cargo is possible.
+ */
+void GetArticulatedVehicleCargoesAndRefits(EngineID engine, CargoArray *cargoes, uint32 *refits)
+{
+ cargoes->Clear();
+ *refits = 0;
+
+ const Engine *e = Engine::Get(engine);
+
+ CargoID cargo_type;
+ uint16 cargo_capacity = GetVehicleDefaultCapacity(engine, &cargo_type);
+ if (cargo_type < NUM_CARGO && cargo_capacity > 0) {
+ (*cargoes)[cargo_type] += cargo_capacity;
+ if (IsEngineRefittable(engine)) SetBit(*refits, cargo_type);
+ }
+
+ if (!e->IsGroundVehicle() || !HasBit(e->info.callback_mask, CBM_VEHICLE_ARTIC_ENGINE)) return;
+
+ for (uint i = 1; i < MAX_ARTICULATED_PARTS; i++) {
+ EngineID artic_engine = GetNextArticulatedPart(i, engine);
+ if (artic_engine == INVALID_ENGINE) break;
+
+ cargo_capacity = GetVehicleDefaultCapacity(artic_engine, &cargo_type);
+ if (cargo_type < NUM_CARGO && cargo_capacity > 0) {
+ (*cargoes)[cargo_type] += cargo_capacity;
+ if (IsEngineRefittable(artic_engine)) SetBit(*refits, cargo_type);
+ }
+ }
+}
+
+/**
* Checks whether any of the articulated parts is refittable
* @param engine the first part
* @return true if refittable
diff --git a/src/build_vehicle_gui.cpp b/src/build_vehicle_gui.cpp
index 6c139eb71..bb5c6d6e3 100644
--- a/src/build_vehicle_gui.cpp
+++ b/src/build_vehicle_gui.cpp
@@ -532,21 +532,20 @@ static GUIEngineList::FilterFunction * const _filter_funcs[] = {
&CargoFilter,
};
-static int DrawCargoCapacityInfo(int left, int right, int y, EngineID engine, bool refittable)
+static int DrawCargoCapacityInfo(int left, int right, int y, EngineID engine)
{
- CargoArray cap = GetCapacityOfArticulatedParts(engine);
+ CargoArray cap;
+ uint32 refits;
+ GetArticulatedVehicleCargoesAndRefits(engine, &cap, &refits);
for (CargoID c = 0; c < NUM_CARGO; c++) {
if (cap[c] == 0) continue;
SetDParam(0, c);
SetDParam(1, cap[c]);
- SetDParam(2, refittable ? STR_PURCHASE_INFO_REFITTABLE : STR_EMPTY);
+ SetDParam(2, HasBit(refits, c) ? STR_PURCHASE_INFO_REFITTABLE : STR_EMPTY);
DrawString(left, right, y, STR_PURCHASE_INFO_CAPACITY);
y += FONT_HEIGHT_NORMAL;
-
- /* Only show as refittable once */
- refittable = false;
}
return y;
@@ -831,7 +830,7 @@ int DrawVehiclePurchaseInfo(int left, int right, int y, EngineID engine_number)
if (articulated_cargo) {
/* Cargo type + capacity, or N/A */
- int new_y = DrawCargoCapacityInfo(left, right, y, engine_number, refittable);
+ int new_y = DrawCargoCapacityInfo(left, right, y, engine_number);
if (new_y == y) {
SetDParam(0, CT_INVALID);
diff --git a/src/engine_func.h b/src/engine_func.h
index faa8e8e02..6c3fb14ff 100644
--- a/src/engine_func.h
+++ b/src/engine_func.h
@@ -26,6 +26,7 @@ extern const uint8 _engine_offsets[4];
bool IsEngineBuildable(EngineID engine, VehicleType type, CompanyID company);
bool IsEngineRefittable(EngineID engine);
+void GetArticulatedVehicleCargoesAndRefits(EngineID engine, CargoArray *cargoes, uint32 *refits);
void SetYearEngineAgingStops();
void StartupOneEngine(Engine *e, Date aging_date);