diff options
-rw-r--r-- | src/openvic-simulation/dataloader/Dataloader.cpp | 23 | ||||
-rw-r--r-- | src/openvic-simulation/dataloader/Dataloader.hpp | 5 | ||||
-rw-r--r-- | src/openvic-simulation/economy/ProductionType.hpp | 12 | ||||
-rw-r--r-- | src/openvic-simulation/map/Building.cpp | 112 | ||||
-rw-r--r-- | src/openvic-simulation/map/Building.hpp | 60 |
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; }; } |