diff --git a/config.lib b/config.lib index ca8346e3e7..8281cbc658 100644 --- a/config.lib +++ b/config.lib @@ -1441,6 +1441,7 @@ make_cflags_and_ldflags() { make_compiler_cflags "$cc_host" "CFLAGS" "CXXFLAGS" "LDFLAGS" "FEATURES" CFLAGS="$CFLAGS -D$os" + CFLAGS_BUILD="$CFLAGS_BUILD -D$os" if [ "$enable_debug" = "0" ]; then # No debug, add default stuff diff --git a/src/articulated_vehicles.cpp b/src/articulated_vehicles.cpp index 501af719de..b1897674bd 100644 --- a/src/articulated_vehicles.cpp +++ b/src/articulated_vehicles.cpp @@ -160,6 +160,41 @@ CargoArray GetCapacityOfArticulatedParts(EngineID engine) return capacity; } +/** + * 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 diff --git a/src/build_vehicle_gui.cpp b/src/build_vehicle_gui.cpp index 0719f29ec6..5203cdcd73 100644 --- a/src/build_vehicle_gui.cpp +++ b/src/build_vehicle_gui.cpp @@ -526,21 +526,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; @@ -825,7 +824,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/economy.cpp b/src/economy.cpp index 4f890b01d2..fed80b82f7 100644 --- a/src/economy.cpp +++ b/src/economy.cpp @@ -1514,7 +1514,11 @@ static void HandleStationRefit(Vehicle *v, CargoArray &consist_capleft, Station /* Refit if given a valid cargo. */ if (new_cid < NUM_CARGO && new_cid != v_start->cargo_type) { - IterateVehicleParts(v_start, ReturnCargoAction(st, StationIDStack(next_station).Pop())); + /* INVALID_STATION because in the DT_MANUAL case that's correct and in the DT_(A)SYMMETRIC + * cases the next hop of the vehicle doesn't really tell us anything if the cargo had been + * "via any station" before reserving. We rather produce some more "any station" cargo than + * misrouting it. */ + IterateVehicleParts(v_start, ReturnCargoAction(st, INVALID_STATION)); CommandCost cost = DoCommand(v_start->tile, v_start->index, new_cid | 1U << 6 | 0xFF << 8 | 1U << 16, DC_EXEC, GetCmdRefitVeh(v_start)); // Auto-refit and only this vehicle including artic parts. if (cost.Succeeded()) v->First()->profit_this_year -= cost.GetCost() << 8; } diff --git a/src/engine_func.h b/src/engine_func.h index faa8e8e024..6c3fb14ff2 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); diff --git a/src/engine_gui.cpp b/src/engine_gui.cpp index 6ee47692d4..ab15aa9895 100644 --- a/src/engine_gui.cpp +++ b/src/engine_gui.cpp @@ -140,14 +140,8 @@ void ShowEnginePreviewWindow(EngineID engine) */ uint GetTotalCapacityOfArticulatedParts(EngineID engine) { - uint total = 0; - CargoArray cap = GetCapacityOfArticulatedParts(engine); - for (CargoID c = 0; c < NUM_CARGO; c++) { - total += cap[c]; - } - - return total; + return cap.GetSum(); } static StringID GetTrainEngineInfoString(const Engine *e) diff --git a/src/signs_gui.cpp b/src/signs_gui.cpp index aeac02eb96..87685a1f90 100644 --- a/src/signs_gui.cpp +++ b/src/signs_gui.cpp @@ -158,7 +158,6 @@ struct SignListWindow : Window, SignList { /* Initialize the text edit widget */ this->querystrings[WID_SIL_FILTER_TEXT] = &this->filter_editbox; - this->filter_editbox.ok_button = WID_SIL_FILTER_ENTER_BTN; this->filter_editbox.cancel_button = QueryString::ACTION_CLEAR; /* Initialize the filtering variables */