Skip to content

Commit 07b5473

Browse files
committed
Refactor province buildings
1 parent 0bb087a commit 07b5473

9 files changed

Lines changed: 87 additions & 62 deletions

File tree

src/openvic-simulation/economy/BuildingType.cpp

Lines changed: 11 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,19 +1,23 @@
11
#include "BuildingType.hpp"
2+
#include <optional>
23

34
#include "openvic-simulation/economy/GoodDefinition.hpp"
45
#include "openvic-simulation/economy/production/ProductionType.hpp"
56
#include "openvic-simulation/modifier/ModifierEffectCache.hpp"
67
#include "openvic-simulation/modifier/ModifierManager.hpp"
8+
#include "openvic-simulation/types/TypedIndices.hpp"
79

810
using namespace OpenVic;
911
using namespace OpenVic::NodeTools;
1012

1113
BuildingType::BuildingType(
1214
index_t new_index,
13-
std::string_view identifier,
15+
std::optional<province_building_index_t> new_province_building_index,
16+
std::string_view new_identifier,
1417
building_type_args_t& building_type_args
1518
) : HasIndex { new_index },
16-
Modifier { identifier, std::move(building_type_args.modifier), modifier_type_t::BUILDING },
19+
Modifier { new_identifier, std::move(building_type_args.modifier), modifier_type_t::BUILDING },
20+
province_building_index { new_province_building_index },
1721
type { building_type_args.type },
1822
on_completion { building_type_args.on_completion },
1923
completion_size { building_type_args.completion_size },
@@ -49,10 +53,14 @@ bool BuildingTypeManager::add_building_type(
4953
spdlog::error_s("Invalid building identifier - empty!");
5054
return false;
5155
}
56+
57+
std::optional<province_building_index_t> province_building_index = building_type_args.in_province
58+
? std::make_optional<province_building_index_t>(province_building_types.size())
59+
: std::nullopt;
5260

5361
const bool ret = building_types.emplace_item(
5462
identifier,
55-
BuildingType::index_t { get_building_type_count() }, identifier, building_type_args
63+
BuildingType::index_t { get_building_type_count() }, province_building_index, identifier, building_type_args
5664
);
5765

5866
if (ret) {
@@ -147,10 +155,6 @@ bool BuildingTypeManager::load_buildings_file(
147155
FORMAT_x1_0DP_NEG
148156
);
149157

150-
if (building_type.is_in_province()) {
151-
province_building_types.emplace_back(&building_type);
152-
}
153-
154158
if (building_type.is_port()) {
155159
if (building_type.is_in_province()) {
156160
if (port_building_type == nullptr) {

src/openvic-simulation/economy/BuildingType.hpp

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
#pragma once
22

3+
#include <optional>
4+
35
#include "openvic-simulation/modifier/Modifier.hpp"
46
#include "openvic-simulation/economy/BuildingLevel.hpp"
57
#include "openvic-simulation/types/Date.hpp"
@@ -72,9 +74,15 @@ namespace OpenVic {
7274
bool PROPERTY(steam); // only in steamer shipyard
7375
bool PROPERTY(capital); // only in naval base
7476
bool PROPERTY_CUSTOM_PREFIX(port, is); // only in naval base
77+
std::optional<province_building_index_t> PROPERTY(province_building_index);
7578

7679
public:
77-
BuildingType(index_t new_index, std::string_view identifier, building_type_args_t& building_type_args);
80+
BuildingType(
81+
index_t new_index,
82+
std::optional<province_building_index_t> new_province_building_index,
83+
std::string_view new_identifier,
84+
building_type_args_t& building_type_args
85+
);
7886
BuildingType(BuildingType&&) = default;
7987
};
8088

src/openvic-simulation/history/ProvinceHistory.cpp

Lines changed: 25 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44

55
#include "openvic-simulation/dataloader/NodeTools.hpp"
66
#include "openvic-simulation/DefinitionManager.hpp"
7+
#include "openvic-simulation/economy/BuildingLevel.hpp"
78
#include "openvic-simulation/economy/GoodDefinition.hpp"
89
#include "openvic-simulation/map/ProvinceDefinition.hpp"
910
#include "openvic-simulation/utility/Logger.hpp"
@@ -12,8 +13,18 @@
1213
using namespace OpenVic;
1314
using namespace OpenVic::NodeTools;
1415

15-
ProvinceHistoryEntry::ProvinceHistoryEntry(ProvinceDefinition const& new_province, Date new_date)
16-
: HistoryEntry { new_date }, province { new_province } {}
16+
ProvinceHistoryEntry::ProvinceHistoryEntry(
17+
BuildingTypeManager const& building_type_manager,
18+
ProvinceDefinition const& new_province,
19+
Date new_date
20+
) : HistoryEntry { new_date },
21+
province { new_province },
22+
_province_building_levels(
23+
building_type_manager.get_province_building_types().size(),
24+
building_level_t(0)
25+
),
26+
province_building_levels(_province_building_levels)
27+
{}
1728

1829
ProvinceHistoryMap::ProvinceHistoryMap(ProvinceDefinition const& new_province) : province { new_province } {}
1930

@@ -85,7 +96,17 @@ bool ProvinceHistoryMap::_load_history_entry(
8596
return expect_strong_typedef<building_level_t>(
8697
/* This is set to warn to prevent vanilla from always having errors because
8798
* of a duplicate railroad entry in the 1861.1.1 history of Manchester (278). */
88-
map_callback(entry.province_buildings, building_type, true)
99+
[
100+
&entry,
101+
optional_index = building_type->get_province_building_index()
102+
](const building_level_t level) -> bool {
103+
if (!optional_index.has_value()) {
104+
return false;
105+
}
106+
107+
entry.province_building_levels[optional_index.value()] = level;
108+
return true;
109+
}
89110
)(value);
90111
} else {
91112
spdlog::error_s(
@@ -167,7 +188,7 @@ bool ProvinceHistoryMap::_load_history_entry(
167188
)(node);
168189
if (building_type != nullptr) {
169190
if (!building_type->is_in_province()) {
170-
ret &= map_callback(entry.state_buildings, building_type, true)(level);
191+
ret &= map_callback(entry.state_buildings, building_type->index, true)(level);
171192
} else {
172193
spdlog::error_s(
173194
"Attempted to add province building \"{}\" to state building list of province history for {}",

src/openvic-simulation/history/ProvinceHistory.hpp

Lines changed: 12 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -8,8 +8,11 @@
88
#include "openvic-simulation/economy/BuildingLevel.hpp"
99
#include "openvic-simulation/types/ColonyStatus.hpp"
1010
#include "openvic-simulation/types/Date.hpp"
11-
#include "openvic-simulation/types/OrderedContainers.hpp"
1211
#include "openvic-simulation/types/fixed_point/FixedPointMap.hpp"
12+
#include "openvic-simulation/types/FixedVector.hpp"
13+
#include "openvic-simulation/types/OrderedContainers.hpp"
14+
#include "openvic-simulation/types/TypedSpan.hpp"
15+
#include "openvic-simulation/types/TypedIndices.hpp"
1316
#include "openvic-simulation/map/LifeRating.hpp"
1417
#include "openvic-simulation/utility/Containers.hpp"
1518
#include "openvic-simulation/utility/Getters.hpp"
@@ -26,7 +29,11 @@ namespace OpenVic {
2629
struct ProvinceHistoryEntry : HistoryEntry {
2730
friend struct ProvinceHistoryMap;
2831

29-
ProvinceHistoryEntry(ProvinceDefinition const& new_province, Date new_date);
32+
ProvinceHistoryEntry(
33+
BuildingTypeManager const& building_type_manager,
34+
ProvinceDefinition const& new_province,
35+
Date new_date
36+
);
3037
private:
3138
std::optional<CountryDefinition const*> PROPERTY(owner);
3239
std::optional<CountryDefinition const*> PROPERTY(controller);
@@ -36,8 +43,9 @@ namespace OpenVic {
3643
std::optional<ProductionType const*> PROPERTY(rgo_production_type_nullable);
3744
std::optional<life_rating_t> PROPERTY(life_rating);
3845
std::optional<TerrainType const*> PROPERTY(terrain_type);
39-
ordered_map<BuildingType const*, building_level_t> PROPERTY(province_buildings);
40-
ordered_map<BuildingType const*, building_level_t> PROPERTY(state_buildings);
46+
memory::FixedVector<building_level_t> _province_building_levels;
47+
TypedSpan<province_building_index_t, building_level_t> SPAN_PROPERTY(province_building_levels);
48+
ordered_map<building_type_index_t, building_level_t> PROPERTY(state_buildings);
4149
fixed_point_map_t<Ideology const*> PROPERTY(party_loyalties);
4250
memory::vector<PopBase> SPAN_PROPERTY(pops);
4351

src/openvic-simulation/map/ProvinceInstance.cpp

Lines changed: 20 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -5,13 +5,15 @@
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

1618
using 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

5150
ModifierSum 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

188178
void 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()

src/openvic-simulation/map/ProvinceInstance.hpp

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
#include <plf_colony.h>
44

5+
#include "openvic-simulation/core/portable/ForwardableSpan.hpp"
56
#include "openvic-simulation/economy/BuildingInstance.hpp"
67
#include "openvic-simulation/economy/production/ResourceGatheringOperation.hpp"
78
#include "openvic-simulation/military/UnitBranchedGetterMacro.hpp"
@@ -14,10 +15,11 @@
1415
#include "openvic-simulation/types/HasIndex.hpp"
1516
#include "openvic-simulation/types/OrderedContainers.hpp"
1617
#include "openvic-simulation/map/LifeRating.hpp"
18+
#include "openvic-simulation/types/FixedVector.hpp"
1719
#include "openvic-simulation/types/TypedIndices.hpp"
1820
#include "openvic-simulation/types/UnitBranchType.hpp"
1921
#include "openvic-simulation/utility/Containers.hpp"
20-
#include "openvic-simulation/core/portable/ForwardableSpan.hpp"
22+
#include "types/TypedSpan.hpp"
2123

2224
namespace OpenVic {
2325
struct BaseIssue;
@@ -95,7 +97,8 @@ namespace OpenVic {
9597
memory::vector<ProvinceInstance const*> SPAN_PROPERTY(adjacent_nonempty_land_provinces);
9698
Crime const* PROPERTY_RW(crime, nullptr);
9799
ResourceGatheringOperation PROPERTY(rgo);
98-
IdentifierRegistry<BuildingInstance> IDENTIFIER_REGISTRY(building, false);
100+
memory::FixedVector<BuildingInstance> _buildings;
101+
TypedSpan<province_building_index_t, BuildingInstance> SPAN_PROPERTY(buildings);
99102
memory::vector<ArmyInstance*> SPAN_PROPERTY(armies);
100103
memory::vector<NavyInstance*> SPAN_PROPERTY(navies);
101104
// The number of land regiments currently in the province, including those being transported by navies
@@ -158,7 +161,7 @@ namespace OpenVic {
158161
return owner == nullptr;
159162
}
160163

161-
bool expand_building(const building_instance_index_t index);
164+
bool expand_building(const province_building_index_t index);
162165

163166
bool add_pop(Pop&& pop);
164167
bool add_pop_vec(

src/openvic-simulation/misc/GameAction.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -44,15 +44,15 @@ bool GameActionManager::VariantVisitor::operator() (set_ai_argument_t const& arg
4444

4545
// Production
4646
bool GameActionManager::VariantVisitor::operator() (expand_province_building_argument_t const& argument) const {
47-
const auto [province_index, building_instance_index] = argument;
47+
const auto [province_index, province_building_index] = argument;
4848
ProvinceInstance* province = instance_manager.get_map_instance().get_province_instance_by_index(province_index);
4949

5050
if (OV_unlikely(province == nullptr)) {
5151
spdlog::error_s("GAME_ACTION_EXPAND_PROVINCE_BUILDING called with invalid province index: {}", province_index);
5252
return false;
5353
}
5454

55-
return province->expand_building(building_instance_index);
55+
return province->expand_building(province_building_index);
5656
}
5757

5858
// Budget

src/openvic-simulation/misc/GameAction.hpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -68,7 +68,7 @@ X(tick, std::monostate) \
6868
X(set_pause, bool) \
6969
X(set_speed, int64_t) \
7070
X(set_ai, country_index_t, bool) \
71-
X(expand_province_building, province_index_t, building_instance_index_t) \
71+
X(expand_province_building, province_index_t, province_building_index_t) \
7272
X(set_strata_tax, country_index_t, strata_index_t, fixed_point_t) \
7373
X(set_army_spending, country_index_t, fixed_point_t) \
7474
X(set_navy_spending, country_index_t, fixed_point_t) \

src/openvic-simulation/types/TypedIndices.hpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,8 +26,8 @@
2626
#define TYPED_INDEX(name) TYPED_INDEX_CUSTOM(name, std::size_t)
2727

2828
TYPED_INDEX(bookmark_index_t)
29-
TYPED_INDEX(building_instance_index_t)
3029
TYPED_INDEX(building_type_index_t)
30+
TYPED_INDEX(province_building_index_t)
3131
TYPED_INDEX(country_index_t)
3232
TYPED_INDEX(crime_index_t)
3333
TYPED_INDEX(good_index_t)

0 commit comments

Comments
 (0)