From cb23bc5e2ab86360801b70f2d2426c03472a355d Mon Sep 17 00:00:00 2001 From: Peter Nelson Date: Sat, 15 Feb 2025 15:06:58 +0000 Subject: [PATCH] Add: Show cargo types produced by building in house picker. (#13561) --- src/lang/english.txt | 1 + src/town_gui.cpp | 45 ++++++++++++++++++++++++++++++++++++++++++-- 2 files changed, 44 insertions(+), 2 deletions(-) diff --git a/src/lang/english.txt b/src/lang/english.txt index 46e9ef9615..aa446b8f0e 100644 --- a/src/lang/english.txt +++ b/src/lang/english.txt @@ -2859,6 +2859,7 @@ STR_HOUSE_PICKER_YEARS_FROM :{BLACK}Years: { STR_HOUSE_PICKER_YEARS_UNTIL :{BLACK}Years: {ORANGE}Until {NUM} STR_HOUSE_PICKER_SIZE :{BLACK}Size: {ORANGE}{NUM}x{NUM} tiles STR_HOUSE_PICKER_CARGO_ACCEPTED :{BLACK}Cargo accepted: {ORANGE} +STR_HOUSE_PICKER_CARGO_PRODUCED :{BLACK}Cargo produced: {ORANGE} STR_HOUSE_PICKER_CLASS_ZONE1 :Edge STR_HOUSE_PICKER_CLASS_ZONE2 :Outskirts diff --git a/src/town_gui.cpp b/src/town_gui.cpp index b0701b8d96..3cf8fc5f02 100644 --- a/src/town_gui.cpp +++ b/src/town_gui.cpp @@ -1626,6 +1626,39 @@ public: }; /* static */ HousePickerCallbacks HousePickerCallbacks::instance; +/** + * Get the cargo types produced by a house. + * @param hs HouseSpec of the house. + * @returns CargoArray of cargo types produced by the house. + */ +static CargoArray GetProducedCargoOfHouse(const HouseSpec *hs) +{ + /* We don't care how much cargo is produced, but BuildCargoAcceptanceString shows fractions when less then 8. */ + static const uint MIN_CARGO = 8; + + CargoArray production; + if (hs->callback_mask.Test(HouseCallbackMask::ProduceCargo)) { + for (uint i = 0; i < 256; i++) { + uint16_t callback = GetHouseCallback(CBID_HOUSE_PRODUCE_CARGO, i, 0, hs->Index(), nullptr, INVALID_TILE, true); + + if (callback == CALLBACK_FAILED || callback == CALLBACK_HOUSEPRODCARGO_END) break; + + CargoType cargo = GetCargoTranslation(GB(callback, 8, 7), hs->grf_prop.grffile); + if (!IsValidCargoType(cargo)) continue; + + uint amt = GB(callback, 0, 8); + if (amt == 0) continue; + + production[cargo] = MIN_CARGO; + } + } else { + /* Cargo is not controlled by NewGRF, town production effect is used instead. */ + for (const CargoSpec *cs : CargoSpec::town_production_cargoes[TPE_PASSENGERS]) production[cs->Index()] = MIN_CARGO; + for (const CargoSpec *cs : CargoSpec::town_production_cargoes[TPE_MAIL]) production[cs->Index()] = MIN_CARGO; + } + return production; +} + struct BuildHouseWindow : public PickerWindow { std::string house_info; bool house_protected; @@ -1699,10 +1732,18 @@ struct BuildHouseWindow : public PickerWindow { if (hs->building_flags.Test(BuildingFlag::Size1x2)) size = 0x12; if (hs->building_flags.Test(BuildingFlag::Size2x2)) size = 0x22; line << GetString(STR_HOUSE_PICKER_SIZE, GB(size, 0, 4), GB(size, 4, 4)); - line << "\n"; auto cargo_string = BuildCargoAcceptanceString(GetAcceptedCargoOfHouse(hs), STR_HOUSE_PICKER_CARGO_ACCEPTED); - if (cargo_string.has_value()) line << *cargo_string; + if (cargo_string.has_value()) { + line << "\n"; + line << *cargo_string; + } + + cargo_string = BuildCargoAcceptanceString(GetProducedCargoOfHouse(hs), STR_HOUSE_PICKER_CARGO_PRODUCED); + if (cargo_string.has_value()) { + line << "\n"; + line << *cargo_string; + } return line.str(); }