diff --git a/libs/s25main/BuildingRegister.cpp b/libs/s25main/BuildingRegister.cpp index 4d6cae9bc6..180276ad1d 100644 --- a/libs/s25main/BuildingRegister.cpp +++ b/libs/s25main/BuildingRegister.cpp @@ -153,7 +153,7 @@ helpers::EnumArray BuildingRegister::CalcProductivities( unsigned BuildingRegister::CalcAverageProductivity(BuildingType bldType) const { - if(!BLD_WORK_DESC[bldType].producedWare) + if(holds_alternative(BLD_WORK_DESC[bldType].producedWare)) return 0; unsigned productivity = 0; const auto& buildings = GetBuildings(bldType); @@ -173,7 +173,7 @@ unsigned short BuildingRegister::CalcAverageProductivity() const unsigned numBlds = 0; for(const auto bldType : helpers::enumRange()) { - if(!BLD_WORK_DESC[bldType].producedWare) + if(holds_alternative(BLD_WORK_DESC[bldType].producedWare)) continue; const auto& buildings = GetBuildings(bldType); diff --git a/libs/s25main/gameData/BuildingConsts.h b/libs/s25main/gameData/BuildingConsts.h index 515df3bc24..83d3e57823 100644 --- a/libs/s25main/gameData/BuildingConsts.h +++ b/libs/s25main/gameData/BuildingConsts.h @@ -70,9 +70,8 @@ const helpers::EnumArray SUPPRESS_UNUSED BLD_W {Job::Helper, GoodType::Water}, {Job::Shipwright, GoodType::Boat, WaresNeeded(GoodType::Boards)}, {Job::Farmer, GoodType::Grain}, - {Job::DonkeyBreeder, GoodType::Nothing, - WaresNeeded(GoodType::Grain, GoodType::Water)}, // Produces a job. TODO: Better way - {}, // Harbour + {Job::DonkeyBreeder, Job::PackDonkey, WaresNeeded(GoodType::Grain, GoodType::Water)}, + {}, // Harbour }}; /// Smoke consts for all buildings and nations diff --git a/libs/s25main/gameTypes/BuildingTypes.h b/libs/s25main/gameTypes/BuildingTypes.h index dd8ea38cec..06b176ae84 100644 --- a/libs/s25main/gameTypes/BuildingTypes.h +++ b/libs/s25main/gameTypes/BuildingTypes.h @@ -9,6 +9,7 @@ #include "JobTypes.h" #include "Point.h" #include "helpers/OptionalEnum.h" +#include "variant.h" #include struct BuildingCost @@ -44,7 +45,7 @@ struct BldWorkDescription /// Worker belonging to the building, if any helpers::OptionalEnum job = boost::none; /// Ware produced, if any - helpers::OptionalEnum producedWare = boost::none; + boost_variant2 producedWare = boost::none; // Required for use in aggregate initialization // NOLINTBEGIN(readability-redundant-member-init) /// Wares the building needs, if any diff --git a/libs/s25main/ingameWindows/iwBuilding.cpp b/libs/s25main/ingameWindows/iwBuilding.cpp index beb501d898..84d0ec2fde 100644 --- a/libs/s25main/ingameWindows/iwBuilding.cpp +++ b/libs/s25main/ingameWindows/iwBuilding.cpp @@ -44,11 +44,16 @@ iwBuilding::iwBuilding(GameWorldView& gwv, GameCommandFactory& gcFactory, nobUsu AddImage(1, DrawPoint(117, 114), &building->GetBuildingImage()); // Symbol der produzierten Ware (falls hier was produziert wird) - const auto producedWare = BLD_WORK_DESC[building->GetBuildingType()].producedWare; - if(producedWare && producedWare != GoodType::Nothing) + const auto& producedWare = BLD_WORK_DESC[building->GetBuildingType()].producedWare; + ITexture* tex = visit( + composeVisitor([](GoodType gt) -> ITexture* { return gt != GoodType::Nothing ? LOADER.GetWareTex(gt) : nullptr; }, + [](Job job) -> ITexture* { return LOADER.GetJobTex(job); }, + [](boost::none_t) -> ITexture* { return nullptr; }), + producedWare); + if(tex) { AddImage(2, DrawPoint(196, 39), LOADER.GetMapTexture(2298)); - AddImage(3, DrawPoint(196, 39), LOADER.GetWareTex(*producedWare)); + AddImage(3, DrawPoint(196, 39), tex); } // Info diff --git a/tests/s25Main/simple/testGameData.cpp b/tests/s25Main/simple/testGameData.cpp index fab8a83225..a4d01887db 100644 --- a/tests/s25Main/simple/testGameData.cpp +++ b/tests/s25Main/simple/testGameData.cpp @@ -58,7 +58,7 @@ BOOST_AUTO_TEST_CASE(ProductionBuildingsAreNobUsual) if(!BuildingProperties::IsValid(bld)) continue; // Only nobUsuals can produce wares (though not all do) - if(BLD_WORK_DESC[bld].producedWare) + if(!holds_alternative(BLD_WORK_DESC[bld].producedWare)) { BOOST_TEST_INFO("bld: " << bld); BOOST_TEST(BuildingProperties::IsUsual(bld));