aboutsummaryrefslogtreecommitdiff
path: root/src/openvic-simulation
diff options
context:
space:
mode:
Diffstat (limited to 'src/openvic-simulation')
-rw-r--r--src/openvic-simulation/dataloader/Dataloader.cpp23
-rw-r--r--src/openvic-simulation/dataloader/Dataloader.hpp5
-rw-r--r--src/openvic-simulation/economy/ProductionType.hpp12
-rw-r--r--src/openvic-simulation/map/Building.cpp112
-rw-r--r--src/openvic-simulation/map/Building.hpp60
5 files changed, 161 insertions, 51 deletions
diff --git a/src/openvic-simulation/dataloader/Dataloader.cpp b/src/openvic-simulation/dataloader/Dataloader.cpp
index 530aa76..c21c6da 100644
--- a/src/openvic-simulation/dataloader/Dataloader.cpp
+++ b/src/openvic-simulation/dataloader/Dataloader.cpp
@@ -1,12 +1,5 @@
#include "Dataloader.hpp"
-#include <openvic-dataloader/csv/Parser.hpp>
-#include <openvic-dataloader/detail/CallbackOStream.hpp>
-#include <openvic-dataloader/v2script/Parser.hpp>
-
-#include "openvic-simulation/GameManager.hpp"
-#include "openvic-simulation/utility/Logger.hpp"
-
using namespace OpenVic;
using namespace OpenVic::NodeTools;
using namespace ovdl;
@@ -282,6 +275,7 @@ bool Dataloader::load_defines(GameManager& game_manager) const {
static const fs::path ideology_file = "common/ideologies.txt";
static const fs::path issues_file = "common/issues.txt";
static const fs::path production_types_file = "common/production_types.txt";
+ static const fs::path buildings_file = "common/buildings.txt";
static const fs::path map_directory = "map";
static const fs::path units_directory = "units";
@@ -320,19 +314,28 @@ bool Dataloader::load_defines(GameManager& game_manager) const {
ret = false;
}
if (!game_manager.get_production_type_manager().load_production_types_file(
- game_manager.get_good_manager(), game_manager.get_pop_manager(),
+ game_manager.get_good_manager(),
+ game_manager.get_pop_manager(),
_parse_defines(lookup_file(production_types_file)).get_file_node())) {
Logger::error("Failed to load production types!");
ret = false;
}
- if (!_load_units(game_manager, units_directory)) {
- Logger::error("Failed to load units!");
+ if (!game_manager.get_building_manager().load_buildings_file(
+ game_manager.get_good_manager(),
+ game_manager.get_production_type_manager(),
+ game_manager.get_modifier_manager(),
+ _parse_defines(lookup_file(buildings_file)).get_file_node())) {
+ Logger::error("Failed to load buildings!");
ret = false;
}
if (!_load_map_dir(game_manager, map_directory)) {
Logger::error("Failed to load map!");
ret = false;
}
+ if (!_load_units(game_manager, units_directory)) {
+ Logger::error("Failed to load units!");
+ ret = false;
+ }
return ret;
}
diff --git a/src/openvic-simulation/dataloader/Dataloader.hpp b/src/openvic-simulation/dataloader/Dataloader.hpp
index e935091..e1a2614 100644
--- a/src/openvic-simulation/dataloader/Dataloader.hpp
+++ b/src/openvic-simulation/dataloader/Dataloader.hpp
@@ -5,6 +5,11 @@
#include <vector>
#include "openvic-simulation/dataloader/NodeTools.hpp"
+#include <openvic-dataloader/csv/Parser.hpp>
+#include <openvic-dataloader/detail/CallbackOStream.hpp>
+#include <openvic-dataloader/v2script/Parser.hpp>
+#include "openvic-simulation/GameManager.hpp"
+#include "openvic-simulation/utility/Logger.hpp"
namespace OpenVic {
namespace fs = std::filesystem;
diff --git a/src/openvic-simulation/economy/ProductionType.hpp b/src/openvic-simulation/economy/ProductionType.hpp
index 50af41e..57d04ea 100644
--- a/src/openvic-simulation/economy/ProductionType.hpp
+++ b/src/openvic-simulation/economy/ProductionType.hpp
@@ -58,16 +58,16 @@ namespace OpenVic {
} type;
const Pop::pop_size_t workforce;
- const std::map<Good const*, fixed_point_t> input_goods; // farms generally lack this
+ const std::map<Good const*, fixed_point_t> input_goods;
Good const* output_goods;
const fixed_point_t value;
- const std::vector<Bonus> bonuses; // some
+ const std::vector<Bonus> bonuses;
- const std::map<Good const*, fixed_point_t> efficiency; // some
- const bool coastal; // is_coastal some(false)
+ const std::map<Good const*, fixed_point_t> efficiency;
+ const bool coastal; // is_coastal
- const bool farm; // some (false)
- const bool mine; // some (false)
+ const bool farm;
+ const bool mine;
ProductionType(PRODUCTION_TYPE_ARGS(type_t, Good const*));
diff --git a/src/openvic-simulation/map/Building.cpp b/src/openvic-simulation/map/Building.cpp
index f4b5034..29ee354 100644
--- a/src/openvic-simulation/map/Building.cpp
+++ b/src/openvic-simulation/map/Building.cpp
@@ -5,17 +5,19 @@
using namespace OpenVic;
using namespace OpenVic::NodeTools;
-Building::Building(std::string_view identifier, ARGS) : HasIdentifier { identifier }, type { type }, on_completion { on_completion },
- completion_size { completion_size }, max_level { max_level }, build_cost { build_cost }, build_time { build_time }, visibility { visibility }, on_map { on_map },
- default_enabled { default_enabled }, production_type { production_type }, pop_build_factory { pop_build_factory }, strategic_factory { strategic_factory },
- fort_level { fort_level }, naval_capacity { naval_capacity }, colonial_points { colonial_points }, in_province { in_province }, one_per_state { one_per_state },
- colonial_range { colonial_range }, infrastructure { infrastructure }, movement_cost { movement_cost }, spawn_railway_track { spawn_railway_track } {}
+Building::Building(std::string_view identifier, ARGS) : HasIdentifier { identifier }, ModifierValue { std::move(modifiers) }, type { type },
+ on_completion { on_completion }, completion_size { completion_size }, max_level { max_level }, goods_cost { goods_cost }, cost { cost }, build_time { build_time },
+ visibility { visibility }, on_map { on_map }, default_enabled { default_enabled }, production_type { production_type }, pop_build_factory { pop_build_factory },
+ strategic_factory { strategic_factory }, advanced_factory { advanced_factory }, fort_level { fort_level }, naval_capacity { naval_capacity },
+ colonial_points { colonial_points }, in_province { in_province }, one_per_state { one_per_state }, colonial_range { colonial_range },
+ infrastructure { infrastructure }, movement_cost { movement_cost }, local_ship_build { local_ship_build }, spawn_railway_track { spawn_railway_track },
+ sail { sail }, steam { steam }, capital { capital }, port { port } {}
BuildingType const& Building::get_type() const {
return type;
}
-Building::sound_t Building::get_on_completion() const {
+std::string_view Building::get_on_completion() const {
return on_completion;
}
@@ -27,8 +29,12 @@ Building::level_t Building::get_max_level() const {
return max_level;
}
-std::map<const Good*, fixed_point_t> const& Building::get_build_cost() const {
- return build_cost;
+std::map<const Good*, fixed_point_t> const& Building::get_goods_cost() const {
+ return goods_cost;
+}
+
+fixed_point_t Building::get_cost() const {
+ return cost;
}
Timespan Building::get_build_time() const {
@@ -59,6 +65,10 @@ bool Building::is_strategic_factory() const {
return strategic_factory;
}
+bool Building::is_advanced_factory() const {
+ return advanced_factory;
+}
+
Building::level_t Building::get_fort_level() const {
return fort_level;
}
@@ -79,7 +89,7 @@ bool Building::is_one_per_state() const {
return one_per_state;
}
-uint64_t Building::get_colonial_range() const {
+fixed_point_t Building::get_colonial_range() const {
return colonial_range;
}
@@ -174,6 +184,88 @@ bool BuildingManager::add_building_type(const std::string_view identifier) {
return building_types.add_item({ identifier });
}
+bool BuildingManager::add_building(std::string_view identifier, ARGS) {
+ if (identifier.empty()) {
+ Logger::error("Invalid building identifier - empty!");
+ return false;
+ }
+
+ return buildings.add_item({
+ identifier, type, on_completion, completion_size, max_level, goods_cost, cost, build_time, visibility, on_map, default_enabled,
+ production_type, pop_build_factory, strategic_factory, advanced_factory, fort_level, naval_capacity, colonial_points, in_province, one_per_state,
+ colonial_range, infrastructure, movement_cost, local_ship_build, spawn_railway_track, sail, steam, capital, port, std::move(modifiers)
+ });
+}
+
+bool BuildingManager::load_buildings_file(GoodManager const& good_manager, ProductionTypeManager const& production_type_manager, ModifierManager const& modifier_manager, ast::NodeCPtr root) {
+ bool ret = expect_dictionary([this, &good_manager, &production_type_manager, &modifier_manager](std::string_view key, ast::NodeCPtr value) -> bool {
+ std::string_view type, on_completion = "", production_type;
+ fixed_point_t completion_size = 0, cost = 0, infrastructure = 0, movement_cost = 0, colonial_range = 0, local_ship_build = 0;
+ Building::level_t max_level, fort_level = 0;
+ std::map<const Good*, fixed_point_t> goods_cost;
+ uint32_t build_days;
+ bool visibility, on_map, default_enabled, pop_build_factory, strategic_factory, advanced_factory, in_province, one_per_state, spawn_railway_track, sail, steam, capital, port;
+ default_enabled = pop_build_factory = strategic_factory = advanced_factory = in_province = one_per_state = spawn_railway_track = sail = steam = capital = port = false;
+ uint64_t naval_capacity = 0;
+ std::vector<uint64_t> colonial_points;
+ ModifierValue modifiers;
+
+ bool ret = modifier_manager.expect_modifier_value_and_keys(move_variable_callback(modifiers),
+ "type", ONE_EXACTLY, expect_identifier(assign_variable_callback(type)),
+ "on_completion", ZERO_OR_ONE, expect_identifier(assign_variable_callback(on_completion)),
+ "completion_size", ZERO_OR_ONE, expect_fixed_point(assign_variable_callback(completion_size)),
+ "max_level", ONE_EXACTLY, expect_uint(assign_variable_callback(max_level)),
+ "goods_cost", ONE_EXACTLY, good_manager.expect_good_decimal_map(assign_variable_callback(goods_cost)),
+ "cost", ZERO_OR_MORE, expect_fixed_point(assign_variable_callback(cost)),
+ "time", ONE_EXACTLY, expect_uint(assign_variable_callback_uint("building build time", build_days)),
+ "visibility", ONE_EXACTLY, expect_bool(assign_variable_callback(visibility)),
+ "onmap", ONE_EXACTLY, expect_bool(assign_variable_callback(on_map)),
+ "default_enabled", ZERO_OR_ONE, expect_bool(assign_variable_callback(default_enabled)),
+ "production_type", ZERO_OR_ONE, expect_identifier(assign_variable_callback(production_type)),
+ "pop_build_factory", ZERO_OR_ONE, expect_bool(assign_variable_callback(pop_build_factory)),
+ "strategic_factory", ZERO_OR_ONE, expect_bool(assign_variable_callback(strategic_factory)),
+ "advanced_factory", ZERO_OR_ONE, expect_bool(assign_variable_callback(advanced_factory)),
+ "fort_level", ZERO_OR_ONE, expect_uint(assign_variable_callback_uint("building fort level", fort_level)),
+ "naval_capacity", ZERO_OR_ONE, expect_uint(assign_variable_callback_uint("building naval capacity", naval_capacity)),
+ "colonial_points", ZERO_OR_ONE, expect_list(expect_uint([&colonial_points](uint64_t points) -> bool {
+ return colonial_points.emplace_back(points);
+ })), "province", ZERO_OR_ONE, expect_bool(assign_variable_callback(in_province)),
+ "one_per_state", ZERO_OR_ONE, expect_bool(assign_variable_callback(one_per_state)),
+ "colonial_range", ZERO_OR_ONE, expect_fixed_point(assign_variable_callback(colonial_range)),
+ "infrastructure", ZERO_OR_ONE, expect_fixed_point(assign_variable_callback(infrastructure)),
+ "movement_cost", ZERO_OR_ONE, expect_fixed_point(assign_variable_callback(movement_cost)),
+ "local_ship_build", ZERO_OR_ONE, expect_fixed_point(assign_variable_callback(local_ship_build)),
+ "spawn_railway_track", ZERO_OR_ONE, expect_bool(assign_variable_callback(spawn_railway_track)),
+ "sail", ZERO_OR_ONE, expect_bool(assign_variable_callback(sail)),
+ "steam", ZERO_OR_ONE, expect_bool(assign_variable_callback(steam)),
+ "capital", ZERO_OR_ONE, expect_bool(assign_variable_callback(capital)),
+ "port", ZERO_OR_ONE, expect_bool(assign_variable_callback(port))
+ )(value);
+
+ BuildingType const* type_ref = building_types.get_item_by_identifier(type);
+ if (type_ref == nullptr) {
+ building_types.add_item({ type });
+ type_ref = building_types.get_item_by_identifier(type);
+ }
+
+ Timespan build_time = Timespan(build_days);
+
+ ProductionType const* production_type_ref = production_type_manager.get_production_type_by_identifier(production_type);
+
+ ret &= add_building(
+ key, *type_ref, on_completion, completion_size, max_level, goods_cost, cost, build_time, visibility, on_map, default_enabled,
+ production_type_ref, pop_build_factory, strategic_factory, advanced_factory, fort_level, naval_capacity, colonial_points, in_province,
+ one_per_state, colonial_range, infrastructure, movement_cost, local_ship_build, spawn_railway_track, sail, steam, capital, port, std::move(modifiers)
+ );
+
+ return ret;
+ })(root);
+ lock_building_types();
+ lock_buildings();
+
+ return ret;
+}
+
bool BuildingManager::generate_province_buildings(Province& province) const {
province.reset_buildings();
if (!building_types.is_locked()) {
@@ -188,4 +280,4 @@ bool BuildingManager::generate_province_buildings(Province& province) const {
}
province.lock_buildings();
return ret;
-} \ No newline at end of file
+}
diff --git a/src/openvic-simulation/map/Building.hpp b/src/openvic-simulation/map/Building.hpp
index cd649ff..9b11c1c 100644
--- a/src/openvic-simulation/map/Building.hpp
+++ b/src/openvic-simulation/map/Building.hpp
@@ -1,19 +1,18 @@
#pragma once
-#include <cstdint>
-#include <string_view>
-#include <vector>
-
#include "openvic-simulation/types/Date.hpp"
#include "openvic-simulation/types/fixed_point/FixedPoint.hpp"
#include "openvic-simulation/types/IdentifierRegistry.hpp"
#include "openvic-simulation/economy/Good.hpp"
#include "openvic-simulation/economy/ProductionType.hpp"
+#include "openvic-simulation/Modifier.hpp"
-#define ARGS BuildingType const& type, sound_t on_completion, fixed_point_t completion_size, level_t max_level, std::map<const Good*, fixed_point_t> build_cost, \
- Timespan build_time, bool visibility, bool on_map, const bool default_enabled, ProductionType const* production_type, bool pop_build_factory, \
- bool strategic_factory, level_t fort_level, uint64_t naval_capacity, std::vector<uint64_t> colonial_points, bool in_province, bool one_per_state, \
- uint64_t colonial_range, fixed_point_t infrastructure, fixed_point_t movement_cost, bool spawn_railway_track
+#define ARGS BuildingType const& type, std::string_view on_completion, fixed_point_t completion_size, level_t max_level, \
+ std::map<const Good*, fixed_point_t> goods_cost, fixed_point_t cost, Timespan build_time, bool visibility, bool on_map, bool default_enabled, \
+ ProductionType const* production_type, bool pop_build_factory, bool strategic_factory, bool advanced_factory, level_t fort_level, \
+ uint64_t naval_capacity, std::vector<uint64_t> colonial_points, bool in_province, bool one_per_state, fixed_point_t colonial_range, \
+ fixed_point_t infrastructure, fixed_point_t movement_cost, fixed_point_t local_ship_build, bool spawn_railway_track, bool sail, bool steam, \
+ bool capital, bool port, ModifierValue&& modifiers
namespace OpenVic {
@@ -25,40 +24,45 @@ namespace OpenVic {
* MAP-12, MAP-75, MAP-76
* MAP-13, MAP-78, MAP-79
*/
- struct Building : HasIdentifier {
+ struct Building : HasIdentifier, ModifierValue {
friend struct BuildingManager;
using level_t = uint8_t;
- using sound_t = std::string_view;
private:
BuildingType const& type;
- const sound_t on_completion; //probably sound played on completion
+ const std::string_view on_completion; //probably sound played on completion
const fixed_point_t completion_size;
const level_t max_level;
- const std::map<const Good*, fixed_point_t> build_cost;
+ const std::map<const Good*, fixed_point_t> goods_cost;
+ const fixed_point_t cost;
const Timespan build_time; //time
const bool visibility;
const bool on_map; //onmap
- const bool default_enabled; //some(false)
+ const bool default_enabled;
ProductionType const* production_type;
const bool pop_build_factory;
const bool strategic_factory;
+ const bool advanced_factory;
- const level_t fort_level; //some(0), probably the step-per-level?
+ const level_t fort_level; //probably the step-per-level
- const uint64_t naval_capacity; //some(0)
+ const uint64_t naval_capacity;
const std::vector<uint64_t> colonial_points;
- const bool in_province; //province some(false)
+ const bool in_province; //province
const bool one_per_state;
- const uint64_t colonial_range;
+ const fixed_point_t colonial_range;
const fixed_point_t infrastructure;
const fixed_point_t movement_cost;
- const bool spawn_railway_track; //some(false)
+ const fixed_point_t local_ship_build;
+ const bool spawn_railway_track;
- //any modifiers really
+ const bool sail; //only in clipper shipyard
+ const bool steam; //only in steamer shipyard
+ const bool capital; //only in naval base
+ const bool port; //only in naval base
Building(std::string_view identifier, ARGS);
@@ -66,10 +70,11 @@ namespace OpenVic {
Building(Building&&) = default;
BuildingType const& get_type() const;
- sound_t get_on_completion() const;
+ std::string_view get_on_completion() const;
fixed_point_t get_completion_size() const;
level_t get_max_level() const;
- std::map<const Good*, fixed_point_t> const& get_build_cost() const;
+ std::map<const Good*, fixed_point_t> const& get_goods_cost() const;
+ fixed_point_t get_cost() const;
Timespan get_build_time() const;
bool has_visibility() const;
bool is_on_map() const;
@@ -78,6 +83,7 @@ namespace OpenVic {
ProductionType const* get_production_type() const;
bool is_pop_built_factory() const;
bool is_strategic_factory() const;
+ bool is_advanced_factory() const;
level_t get_fort_level() const;
@@ -85,10 +91,11 @@ namespace OpenVic {
std::vector<uint64_t> const& get_colonial_points() const;
bool is_in_province() const;
bool is_one_per_state() const;
- uint64_t get_colonial_range() const;
+ fixed_point_t get_colonial_range() const;
fixed_point_t get_infrastructure() const;
fixed_point_t get_movement_cost() const;
+ fixed_point_t get_local_ship_build() const;
bool spawned_railway_track() const;
};
@@ -145,6 +152,8 @@ namespace OpenVic {
struct Province;
struct BuildingManager {
+ using level_t = Building::level_t; //this is getting ridiculous
+
private:
IdentifierRegistry<BuildingType> building_types;
IdentifierRegistry<Building> buildings;
@@ -154,11 +163,12 @@ namespace OpenVic {
bool add_building_type(const std::string_view identifier);
IDENTIFIER_REGISTRY_ACCESSORS(BuildingType, building_type)
- bool generate_province_buildings(Province& province) const;
- bool add_building(std::string_view identifier);
+ bool add_building(std::string_view identifier, ARGS);
IDENTIFIER_REGISTRY_ACCESSORS(Building, building)
- //bool load_buildings_file(ast::NodeCPtr root);
+ bool load_buildings_file(GoodManager const& good_manager, ProductionTypeManager const& production_type_manager, ModifierManager const& modifier_manager, ast::NodeCPtr root);
+
+ bool generate_province_buildings(Province& province) const;
};
}