summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorpeter1138 <peter1138@openttd.org>2008-02-14 07:25:24 +0000
committerpeter1138 <peter1138@openttd.org>2008-02-14 07:25:24 +0000
commit6d333e5d3ed6af26ffc2b30e0bdb1c863a49bf70 (patch)
tree4e1c1e1e7e281723915de9307d1471df65126a4c
parenta36e666ca5bfc8699d3ebcb7d7302136f454dc4c (diff)
downloadopenttd-6d333e5d3ed6af26ffc2b30e0bdb1c863a49bf70.tar.xz
(svn r12137) -Fix [FS#1769]: Show cargo capacity for articulated vehicles correctly in the purchase list. Multiple cargo types can also now been shown.
-rw-r--r--src/articulated_vehicles.cpp36
-rw-r--r--src/articulated_vehicles.h1
-rw-r--r--src/build_vehicle_gui.cpp46
3 files changed, 66 insertions, 17 deletions
diff --git a/src/articulated_vehicles.cpp b/src/articulated_vehicles.cpp
index c2ca4c7ec..c4947bc3b 100644
--- a/src/articulated_vehicles.cpp
+++ b/src/articulated_vehicles.cpp
@@ -34,6 +34,42 @@ uint CountArticulatedParts(EngineID engine_type, bool purchase_window)
return i - 1;
}
+
+uint16 *GetCapacityOfArticulatedParts(EngineID engine, VehicleType type)
+{
+ static uint16 capacity[NUM_CARGO];
+ memset(capacity, 0, sizeof(capacity));
+
+ if (type == VEH_TRAIN) {
+ const RailVehicleInfo *rvi = RailVehInfo(engine);
+ capacity[rvi->cargo_type] = rvi->capacity;
+ if (rvi->railveh_type == RAILVEH_MULTIHEAD) capacity[rvi->cargo_type] += rvi->capacity;
+ } else if (type == VEH_ROAD) {
+ const RoadVehicleInfo *rvi = RoadVehInfo(engine);
+ capacity[rvi->cargo_type] = rvi->capacity;
+ }
+
+ if (!HasBit(EngInfo(engine)->callbackmask, CBM_VEHICLE_ARTIC_ENGINE)) return capacity;
+
+ for (uint i = 1; i < MAX_UVALUE(EngineID); i++) {
+ uint16 callback = GetVehicleCallback(CBID_VEHICLE_ARTIC_ENGINE, i, 0, engine, NULL);
+ if (callback == CALLBACK_FAILED || callback == 0xFF) break;
+
+ EngineID artic_engine = GetFirstEngineOfType(type) + GB(callback, 0, 7);
+
+ if (type == VEH_TRAIN) {
+ const RailVehicleInfo *rvi = RailVehInfo(artic_engine);
+ capacity[rvi->cargo_type] += GetEngineProperty(artic_engine, 0x14, rvi->capacity);
+ } else if (type == VEH_ROAD) {
+ const RoadVehicleInfo *rvi = RoadVehInfo(artic_engine);
+ capacity[rvi->cargo_type] += GetEngineProperty(artic_engine, 0x0F, rvi->capacity);
+ }
+ }
+
+ return capacity;
+}
+
+
void AddArticulatedParts(Vehicle **vl, VehicleType type)
{
const Vehicle *v = vl[0];
diff --git a/src/articulated_vehicles.h b/src/articulated_vehicles.h
index c448532bb..6db647df1 100644
--- a/src/articulated_vehicles.h
+++ b/src/articulated_vehicles.h
@@ -8,6 +8,7 @@
#include "vehicle_type.h"
uint CountArticulatedParts(EngineID engine_type, bool purchase_window);
+uint16 *GetCapacityOfArticulatedParts(EngineID engine, VehicleType type);
void AddArticulatedParts(Vehicle **vl, VehicleType type);
#endif /* ARTICULATED_VEHICLES_H */
diff --git a/src/build_vehicle_gui.cpp b/src/build_vehicle_gui.cpp
index 2922f301b..1ddfb0d62 100644
--- a/src/build_vehicle_gui.cpp
+++ b/src/build_vehicle_gui.cpp
@@ -530,6 +530,26 @@ static const StringID _sort_listing[][11] = {{
INVALID_STRING_ID
}};
+static int DrawCargoCapacityInfo(int x, int y, EngineID engine, VehicleType type, bool refittable)
+{
+ uint16 *cap = GetCapacityOfArticulatedParts(engine, type);
+
+ for (uint c = 0; c < NUM_CARGO; c++) {
+ if (cap[c] == 0) continue;
+
+ SetDParam(0, c);
+ SetDParam(1, cap[c]);
+ SetDParam(2, refittable ? STR_9842_REFITTABLE : STR_EMPTY);
+ DrawString(x, y, STR_PURCHASE_INFO_CAPACITY, TC_FROMSTRING);
+ y += 10;
+
+ /* Only show as refittable once */
+ refittable = false;
+ }
+
+ return y;
+}
+
/* Draw rail wagon specific details */
static int DrawRailWagonPurchaseInfo(int x, int y, EngineID engine_number, const RailVehicleInfo *rvi)
{
@@ -615,13 +635,7 @@ static int DrawRoadVehPurchaseInfo(int x, int y, EngineID engine_number, const R
y += 10;
/* Cargo type + capacity */
- SetDParam(0, rvi->cargo_type);
- SetDParam(1, GetEngineProperty(engine_number, 0x0F, rvi->capacity));
- SetDParam(2, refittable ? STR_9842_REFITTABLE : STR_EMPTY);
- DrawString(x, y, STR_PURCHASE_INFO_CAPACITY, TC_FROMSTRING);
- y += 10;
-
- return y;
+ return DrawCargoCapacityInfo(x, y, engine_number, VEH_ROAD, refittable);
}
/* Draw ship specific details */
@@ -703,7 +717,7 @@ int DrawVehiclePurchaseInfo(int x, int y, uint w, EngineID engine_number)
const RailVehicleInfo *rvi = RailVehInfo(engine_number);
uint capacity = GetEngineProperty(engine_number, 0x14, rvi->capacity);
- refitable = (EngInfo(engine_number)->refit_mask != 0) && (capacity > 0);
+ bool refitable = (EngInfo(engine_number)->refit_mask != 0) && (capacity > 0);
if (rvi->railveh_type == RAILVEH_WAGON) {
y = DrawRailWagonPurchaseInfo(x, y, engine_number, rvi);
@@ -712,20 +726,18 @@ int DrawVehiclePurchaseInfo(int x, int y, uint w, EngineID engine_number)
}
/* Cargo type + capacity, or N/A */
- if (rvi->capacity == 0) {
+ int new_y = DrawCargoCapacityInfo(x, y, engine_number, VEH_TRAIN, refitable);
+
+ if (new_y == y) {
SetDParam(0, CT_INVALID);
SetDParam(2, STR_EMPTY);
+ DrawString(x, y, STR_PURCHASE_INFO_CAPACITY, TC_FROMSTRING);
+ y += 10;
} else {
- int multihead = (rvi->railveh_type == RAILVEH_MULTIHEAD ? 1 : 0);
-
- SetDParam(0, rvi->cargo_type);
- SetDParam(1, (capacity * (CountArticulatedParts(engine_number, true) + 1)) << multihead);
- SetDParam(2, refitable ? STR_9842_REFITTABLE : STR_EMPTY);
+ y = new_y;
}
- DrawString(x, y, STR_PURCHASE_INFO_CAPACITY, TC_FROMSTRING);
- y += 10;
- }
break;
+ }
case VEH_ROAD:
y = DrawRoadVehPurchaseInfo(x, y, engine_number, RoadVehInfo(engine_number));
refitable = true;