55#include " openvic-simulation/country/CountryInstance.hpp"
66#include " openvic-simulation/defines/Define.hpp"
77#include " openvic-simulation/DefinitionManager.hpp"
8+ #include " openvic-simulation/economy/BuildingInstance.hpp"
89#include " openvic-simulation/economy/BuildingType.hpp"
910#include " openvic-simulation/economy/production/Employee.hpp"
1011#include " openvic-simulation/economy/production/ProductionType.hpp"
1112#include " openvic-simulation/InstanceManager.hpp"
1213#include " openvic-simulation/map/ProvinceDefinition.hpp"
1314#include " openvic-simulation/misc/GameRulesManager.hpp"
1415#include " openvic-simulation/modifier/StaticModifierCache.hpp"
16+ #include " openvic-simulation/types/TypedIndices.hpp"
1517
1618using namespace OpenVic ;
1719
@@ -30,22 +32,19 @@ ProvinceInstance::ProvinceInstance(
3032 game_rules_manager { province_instance_deps->game_rules_manager },
3133 terrain_type { new_province_definition->get_default_terrain_type () },
3234 rgo { province_instance_deps->rgo_deps },
33- pops_cache_by_type { province_instance_deps->pop_types }
35+ pops_cache_by_type { province_instance_deps->pop_types },
36+ _buildings (
37+ new_province_definition->is_water ()
38+ ? 0
39+ : province_instance_deps->building_type_manager.get_province_building_types().size(),
40+ [&province_instance_deps](const size_t i)->BuildingInstance {
41+ return *province_instance_deps->building_type_manager .get_province_building_types ()[i];
42+ }
43+ ),
44+ buildings(_buildings)
3445{
3546 modifier_sum.set_this_source (this );
3647 rgo.setup_location_ptr (*this );
37- if (!province_definition.is_water ()) {
38- BuildingTypeManager const & building_type_manager = province_instance_deps->building_type_manager ;
39- assert (building_type_manager.building_types_are_locked ());
40- buildings.reserve (building_type_manager.get_province_building_types ().size ());
41-
42- for (BuildingType const * building_type_ptr : building_type_manager.get_province_building_types ()) {
43- BuildingType const & building_type = *building_type_ptr;
44- buildings.emplace_item (building_type.get_identifier (), building_type);
45- }
46- }
47-
48- lock_buildings ();
4948}
5049
5150ModifierSum const & ProvinceInstance::get_owner_modifier_sum () const {
@@ -172,17 +171,8 @@ bool ProvinceInstance::remove_core(CountryInstance& core_to_remove, bool warn) {
172171 return true ;
173172}
174173
175- bool ProvinceInstance::expand_building (const building_instance_index_t index) {
176- BuildingInstance* building = buildings.get_item_by_index (type_safe::get (index));
177- if (building == nullptr ) {
178- spdlog::error_s (
179- " Trying to expand non-existent building index {} in province {}" ,
180- index, *this
181- );
182- return false ;
183- }
184-
185- return building->expand ();
174+ bool ProvinceInstance::expand_building (const province_building_index_t index) {
175+ return buildings[index].expand ();
186176}
187177
188178void ProvinceInstance::_add_pop (Pop&& pop) {
@@ -299,7 +289,7 @@ void ProvinceInstance::update_modifier_sum(Date today, StaticModifierCache const
299289 }
300290 });
301291
302- for (BuildingInstance const & building : buildings. get_items () ) {
292+ for (BuildingInstance const & building : buildings) {
303293 modifier_sum.add_modifier (building.building_type );
304294 }
305295
@@ -380,7 +370,7 @@ void ProvinceInstance::update_gamestate(InstanceManager const& instance_manager)
380370
381371 const Date today = instance_manager.get_today ();
382372
383- for (BuildingInstance& building : buildings. get_items () ) {
373+ for (BuildingInstance& building : buildings) {
384374 building.update_gamestate (today);
385375 }
386376 _update_pops (instance_manager.definition_manager .get_define_manager ());
@@ -397,7 +387,7 @@ void ProvinceInstance::province_tick(
397387 > reusable_vectors
398388) {
399389 if (is_occupied ()) {
400- occupation_duration++ ;
390+ ++occupation_duration ;
401391 }
402392
403393 if (!pops.empty ()) {
@@ -412,7 +402,7 @@ void ProvinceInstance::province_tick(
412402 }
413403 }
414404
415- for (BuildingInstance& building : buildings. get_items () ) {
405+ for (BuildingInstance& building : buildings) {
416406 building.tick (today);
417407 }
418408 rgo.rgo_tick (reusable_vectors[0 ]);
@@ -499,17 +489,8 @@ bool ProvinceInstance::apply_history_to_province(ProvinceHistoryEntry const& ent
499489
500490 set_optional (life_rating, entry.get_life_rating ());
501491 set_optional (terrain_type, entry.get_terrain_type ());
502- for (auto const & [building, level] : entry.get_province_buildings ()) {
503- BuildingInstance* existing_entry = buildings.get_item_by_identifier (building->get_identifier ());
504- if (existing_entry != nullptr ) {
505- existing_entry->set_level (level);
506- } else {
507- spdlog::error_s (
508- " Trying to set level of non-existent province building {} to {} in province {}" ,
509- *building, level, *this
510- );
511- ret = false ;
512- }
492+ for (auto const & [province_building_index, level] : entry.get_province_buildings ()) {
493+ buildings[province_building_index].set_level (level);
513494 }
514495 // TODO: load state buildings - entry.get_state_buildings()
515496 // TODO: party loyalties for each POP when implemented on POP side - entry.get_party_loyalties()
0 commit comments