From 3550c455526eb6f8935f488810e73fe01a1177a9 Mon Sep 17 00:00:00 2001 From: Hop311 Date: Mon, 8 May 2023 22:01:13 +0100 Subject: Added GoodManager --- src/openvic2/map/Building.cpp | 9 +++++++-- src/openvic2/map/Map.cpp | 32 ++++++++++++++++++++++++-------- src/openvic2/map/Map.hpp | 8 +++++++- src/openvic2/map/Province.cpp | 9 ++++++++- src/openvic2/map/Province.hpp | 7 ++++++- src/openvic2/map/Region.cpp | 6 +++--- src/openvic2/map/Region.hpp | 6 ++---- 7 files changed, 57 insertions(+), 20 deletions(-) (limited to 'src/openvic2/map') diff --git a/src/openvic2/map/Building.cpp b/src/openvic2/map/Building.cpp index 1e26873..4e0b14a 100644 --- a/src/openvic2/map/Building.cpp +++ b/src/openvic2/map/Building.cpp @@ -76,7 +76,7 @@ void Building::tick(Date const& today) { BuildingType::BuildingType(std::string const& new_identifier, Building::level_t new_max_level, Timespan new_build_time) : HasIdentifier{ new_identifier }, max_level{ new_max_level }, build_time{ new_build_time } { - assert(new_max_level >= 0); + assert(max_level >= 0); assert(build_time >= 0); } @@ -115,8 +115,13 @@ BuildingType const* BuildingManager::get_building_type_by_identifier(std::string } return_t BuildingManager::generate_province_buildings(Province& province) const { - return_t ret = SUCCESS; province.reset_buildings(); + if (!building_types.is_locked()) { + Logger::error("Cannot generate buildings until building types are locked!"); + return FAILURE; + } + if (province.is_water()) return SUCCESS; + return_t ret = SUCCESS; for (BuildingType const& type : building_types.get_items()) if (province.add_building(type) != SUCCESS) ret = FAILURE; province.lock_buildings(); diff --git a/src/openvic2/map/Map.cpp b/src/openvic2/map/Map.cpp index 1f44c43..d456a1f 100644 --- a/src/openvic2/map/Map.cpp +++ b/src/openvic2/map/Map.cpp @@ -4,6 +4,7 @@ #include #include "../Logger.hpp" +#include "../economy/Good.hpp" using namespace OpenVic2; @@ -95,7 +96,7 @@ return_t Map::add_region(std::string const& identifier, std::vector else Logger::error("Province ", province_identifier, " is already part of an unknown region with index ", other_region_index); ret = FAILURE; - } else new_region.provinces.insert(province); + } else new_region.provinces.push_back(province); } } else { Logger::error("Invalid province identifier ", province_identifier); @@ -154,6 +155,18 @@ index_t Map::get_province_index_at(size_t x, size_t y) const { return NULL_INDEX; } +void Map::set_selected_province(index_t index) { + selected_province = index <= get_province_count() ? index : NULL_INDEX; +} + +index_t Map::get_selected_province_index() const { + return selected_province; +} + +Province const* Map::get_selected_province() const { + return get_province_by_index(get_selected_province_index()); +} + Region* Map::get_region_by_identifier(std::string const& identifier) { return regions.get_item_by_identifier(identifier); } @@ -306,18 +319,21 @@ return_t Map::generate_mapmode_colours(Mapmode::index_t index, uint8_t* target) *target++ = 0; for (Province const& province : provinces.get_items()) { const colour_t colour = mapmode->get_colour(*this, province); - *target++ = (colour >> 16) & 0xFF; - *target++ = (colour >> 8) & 0xFF; - *target++ = colour & 0xFF; - *target++ = (colour >> 24) & 0xFF; + *target++ = (colour >> 16) & FULL_COLOUR; + *target++ = (colour >> 8) & FULL_COLOUR; + *target++ = colour & FULL_COLOUR; + *target++ = (colour >> 24) & FULL_COLOUR; } return SUCCESS; } -return_t Map::generate_province_buildings(BuildingManager const& manager) { +return_t Map::setup(GoodManager const& good_manager, BuildingManager const& building_manager) { return_t ret = SUCCESS; - for (Province& province : provinces.get_items()) - if (manager.generate_province_buildings(province) != SUCCESS) ret = FAILURE; + for (Province& province : provinces.get_items()) { + if (!province.is_water()) // Set all land provinces to have an RGO based on their index to test them + province.rgo = good_manager.get_good_by_index(province.get_index() % good_manager.get_good_count()); + if (building_manager.generate_province_buildings(province) != SUCCESS) ret = FAILURE; + } return ret; } diff --git a/src/openvic2/map/Map.hpp b/src/openvic2/map/Map.hpp index cb8dcb1..dd42076 100644 --- a/src/openvic2/map/Map.hpp +++ b/src/openvic2/map/Map.hpp @@ -21,6 +21,8 @@ namespace OpenVic2 { colour_t get_colour(Map const& map, Province const& province) const; }; + struct GoodManager; + /* REQUIREMENTS: * MAP-4 */ @@ -46,6 +48,7 @@ namespace OpenVic2 { size_t width = 0, height = 0; std::vector province_shape_image; colour_index_map_t colour_index_map; + index_t selected_province = NULL_INDEX; index_t get_index_from_colour(colour_t colour) const; public: @@ -64,6 +67,9 @@ namespace OpenVic2 { Province* get_province_by_identifier(std::string const& identifier); Province const* get_province_by_identifier(std::string const& identifier) const; index_t get_province_index_at(size_t x, size_t y) const; + void set_selected_province(index_t index); + index_t get_selected_province_index() const; + Province const* get_selected_province() const; Region* get_region_by_identifier(std::string const& identifier); Region const* get_region_by_identifier(std::string const& identifier) const; @@ -82,7 +88,7 @@ namespace OpenVic2 { static constexpr size_t MAPMODE_COLOUR_SIZE = 4; return_t generate_mapmode_colours(Mapmode::index_t index, uint8_t* target) const; - return_t generate_province_buildings(BuildingManager const& manager); + return_t setup(GoodManager const& good_manager, BuildingManager const& building_manager); void update_state(Date const& today); void tick(Date const& today); diff --git a/src/openvic2/map/Province.cpp b/src/openvic2/map/Province.cpp index b3d455b..6c80317 100644 --- a/src/openvic2/map/Province.cpp +++ b/src/openvic2/map/Province.cpp @@ -9,7 +9,6 @@ using namespace OpenVic2; Province::Province(index_t new_index, std::string const& new_identifier, colour_t new_colour) : HasIdentifier{ new_identifier }, HasColour{ new_colour }, index{ new_index }, buildings{ "buildings" } { assert(index != NULL_INDEX); - assert(new_colour != NULL_COLOUR); } index_t Province::get_index() const { @@ -40,6 +39,10 @@ void Province::reset_buildings() { buildings.reset(); } +Building const* Province::get_building_by_identifier(std::string const& identifier) const { + return buildings.get_item_by_identifier(identifier); +} + std::vector const& Province::get_buildings() const { return buildings.get_items(); } @@ -50,6 +53,10 @@ return_t Province::expand_building(std::string const& building_type_identifier) return building->expand(); } +Good const* Province::get_rgo() const { + return rgo; +} + std::string Province::to_string() const { std::stringstream stream; stream << "(#" << std::to_string(index) << ", " << get_identifier() << ", 0x" << colour_to_hex_string() << ")"; diff --git a/src/openvic2/map/Province.hpp b/src/openvic2/map/Province.hpp index 9b07fc1..44d0dee 100644 --- a/src/openvic2/map/Province.hpp +++ b/src/openvic2/map/Province.hpp @@ -5,9 +5,10 @@ namespace OpenVic2 { struct Map; struct Region; + struct Good; /* REQUIREMENTS: - * MAP-5, MAP-8, MAP-43, MAP-47 + * MAP-5, MAP-7, MAP-8, MAP-43, MAP-47 */ struct Province : HasIdentifier, HasColour { friend struct Map; @@ -20,6 +21,8 @@ namespace OpenVic2 { bool water = false; life_rating_t life_rating = 0; IdentifierRegistry buildings; + // TODO - change this into a factory-like structure + Good const* rgo = nullptr; Province(index_t new_index, std::string const& new_identifier, colour_t new_colour); public: @@ -32,8 +35,10 @@ namespace OpenVic2 { return_t add_building(BuildingType const& type); void lock_buildings(); void reset_buildings(); + Building const* get_building_by_identifier(std::string const& identifier) const; std::vector const& get_buildings() const; return_t expand_building(std::string const& building_type_identifier); + Good const* get_rgo() const; std::string to_string() const; void update_state(Date const& today); diff --git a/src/openvic2/map/Region.cpp b/src/openvic2/map/Region.cpp index da0dfdd..d6d8dcc 100644 --- a/src/openvic2/map/Region.cpp +++ b/src/openvic2/map/Region.cpp @@ -12,13 +12,13 @@ bool ProvinceSet::contains_province(Province const* province) const { return province && std::find(provinces.begin(), provinces.end(), province) != provinces.end(); } -std::set const& ProvinceSet::get_provinces() const { +std::vector const& ProvinceSet::get_provinces() const { return provinces; } Region::Region(std::string const& new_identifier) : HasIdentifier{ new_identifier } {} colour_t Region::get_colour() const { - if (provinces.empty()) return 0xFF0000; - return (*provinces.cbegin())->get_colour(); + if (provinces.empty()) return FULL_COLOUR << 16; + return provinces.front()->get_colour(); } diff --git a/src/openvic2/map/Region.hpp b/src/openvic2/map/Region.hpp index 3920dfc..f688254 100644 --- a/src/openvic2/map/Region.hpp +++ b/src/openvic2/map/Region.hpp @@ -1,18 +1,16 @@ #pragma once -#include - #include "Province.hpp" namespace OpenVic2 { struct ProvinceSet { protected: - std::set provinces; + std::vector provinces; public: size_t get_province_count() const; bool contains_province(Province const* province) const; - std::set const& get_provinces() const; + std::vector const& get_provinces() const; }; /* REQUIREMENTS: -- cgit v1.2.3-56-ga3b1