aboutsummaryrefslogtreecommitdiff
path: root/extension/src
diff options
context:
space:
mode:
Diffstat (limited to 'extension/src')
-rw-r--r--extension/src/GameSingleton.cpp6
-rw-r--r--extension/src/GameSingleton.hpp2
-rw-r--r--extension/src/openvic2/GameAdvancementHook.cpp5
-rw-r--r--extension/src/openvic2/GameAdvancementHook.hpp5
-rw-r--r--extension/src/openvic2/GameManager.cpp9
-rw-r--r--extension/src/openvic2/GameManager.hpp4
-rw-r--r--extension/src/openvic2/Types.hpp33
-rw-r--r--extension/src/openvic2/map/Building.cpp15
-rw-r--r--extension/src/openvic2/map/Building.hpp21
-rw-r--r--extension/src/openvic2/map/Map.cpp22
-rw-r--r--extension/src/openvic2/map/Map.hpp15
-rw-r--r--extension/src/openvic2/map/Province.cpp16
-rw-r--r--extension/src/openvic2/map/Province.hpp12
-rw-r--r--extension/src/openvic2/map/Region.hpp2
14 files changed, 119 insertions, 48 deletions
diff --git a/extension/src/GameSingleton.cpp b/extension/src/GameSingleton.cpp
index f596cc2..32d940c 100644
--- a/extension/src/GameSingleton.cpp
+++ b/extension/src/GameSingleton.cpp
@@ -18,7 +18,7 @@ void GameSingleton::_bind_methods() {
ClassDB::bind_method(D_METHOD("load_water_province_file", "file_path"), &GameSingleton::load_water_province_file);
ClassDB::bind_method(D_METHOD("load_region_file", "file_path"), &GameSingleton::load_region_file);
ClassDB::bind_method(D_METHOD("load_province_shape_file", "file_path"), &GameSingleton::load_province_shape_file);
- ClassDB::bind_method(D_METHOD("finished_loading_data"), &GameSingleton::finished_loading_data);
+ ClassDB::bind_method(D_METHOD("setup"), &GameSingleton::setup);
ClassDB::bind_method(D_METHOD("get_province_index_from_uv_coords", "coords"), &GameSingleton::get_province_index_from_uv_coords);
ClassDB::bind_method(D_METHOD("get_province_info_from_index", "index"), &GameSingleton::get_province_info_from_index);
@@ -273,8 +273,8 @@ Error GameSingleton::load_province_shape_file(String const& file_path) {
return err;
}
-void GameSingleton::finished_loading_data() {
- game_manager.finished_loading_data();
+godot::Error GameSingleton::setup() {
+ return ERR(game_manager.setup());
}
Error GameSingleton::load_water_province_file(String const& file_path) {
diff --git a/extension/src/GameSingleton.hpp b/extension/src/GameSingleton.hpp
index 0e2cfd1..815c92f 100644
--- a/extension/src/GameSingleton.hpp
+++ b/extension/src/GameSingleton.hpp
@@ -33,7 +33,7 @@ namespace OpenVic2 {
godot::Error load_water_province_file(godot::String const& file_path);
godot::Error load_region_file(godot::String const& file_path);
godot::Error load_province_shape_file(godot::String const& file_path);
- void finished_loading_data();
+ godot::Error setup();
int32_t get_province_index_from_uv_coords(godot::Vector2 const& coords) const;
godot::Dictionary get_province_info_from_index(int32_t index) const;
diff --git a/extension/src/openvic2/GameAdvancementHook.cpp b/extension/src/openvic2/GameAdvancementHook.cpp
index c78847b..4b9bc25 100644
--- a/extension/src/openvic2/GameAdvancementHook.cpp
+++ b/extension/src/openvic2/GameAdvancementHook.cpp
@@ -65,3 +65,8 @@ void GameAdvancementHook::conditionallyAdvanceGame() {
}
if (refreshFunction) refreshFunction();
}
+
+void GameAdvancementHook::reset() {
+ isPaused = true;
+ currentSpeed = 0;
+}
diff --git a/extension/src/openvic2/GameAdvancementHook.hpp b/extension/src/openvic2/GameAdvancementHook.hpp
index 572494a..07f8414 100644
--- a/extension/src/openvic2/GameAdvancementHook.hpp
+++ b/extension/src/openvic2/GameAdvancementHook.hpp
@@ -21,12 +21,12 @@ namespace OpenVic2 {
//A function pointer that advances the simulation, intended to be a capturing lambda or something similar. May need to be reworked later
AdvancementFunction triggerFunction;
RefreshFunction refreshFunction;
+ speed_t currentSpeed;
public:
bool isPaused;
- speed_t currentSpeed;
- GameAdvancementHook(AdvancementFunction tickFunction, RefreshFunction updateFunction, bool startPaused = false, speed_t startingSpeed = 0);
+ GameAdvancementHook(AdvancementFunction tickFunction, RefreshFunction updateFunction, bool startPaused = true, speed_t startingSpeed = 0);
void setSimulationSpeed(speed_t speed);
speed_t getSimulationSpeed() const;
@@ -37,5 +37,6 @@ namespace OpenVic2 {
GameAdvancementHook& operator++();
GameAdvancementHook& operator--();
void conditionallyAdvanceGame();
+ void reset();
};
} \ No newline at end of file
diff --git a/extension/src/openvic2/GameManager.cpp b/extension/src/openvic2/GameManager.cpp
index da742ca..78992f1 100644
--- a/extension/src/openvic2/GameManager.cpp
+++ b/extension/src/openvic2/GameManager.cpp
@@ -5,7 +5,7 @@
using namespace OpenVic2;
GameManager::GameManager(state_updated_func_t state_updated_callback)
- : clock{ [this]() { tick(); }, [this]() { update_state(); }, true }, today{ 1836 }, state_updated{ state_updated_callback } {}
+ : clock{ [this]() { tick(); }, [this]() { update_state(); } }, state_updated{ state_updated_callback } {}
void GameManager::set_needs_update() {
needs_update = true;
@@ -27,8 +27,11 @@ void GameManager::tick() {
set_needs_update();
}
-void GameManager::finished_loading_data() {
- map.generate_province_buildings(building_manager);
+return_t GameManager::setup() {
+ clock.reset();
+ today = { 1836 };
+ set_needs_update();
+ return map.generate_province_buildings(building_manager);
}
Date const& GameManager::get_today() const {
diff --git a/extension/src/openvic2/GameManager.hpp b/extension/src/openvic2/GameManager.hpp
index cba0180..65cd566 100644
--- a/extension/src/openvic2/GameManager.hpp
+++ b/extension/src/openvic2/GameManager.hpp
@@ -13,7 +13,7 @@ namespace OpenVic2 {
private:
Date today;
state_updated_func_t state_updated;
- bool needs_update = true;
+ bool needs_update;
void set_needs_update();
void update_state();
@@ -21,7 +21,7 @@ namespace OpenVic2 {
public:
GameManager(state_updated_func_t state_updated_callback);
- void finished_loading_data();
+ return_t setup();
Date const& get_today() const;
return_t expand_building(Province::index_t province_index, std::string const& building_type_identifier);
diff --git a/extension/src/openvic2/Types.hpp b/extension/src/openvic2/Types.hpp
index 226dd30..f53f842 100644
--- a/extension/src/openvic2/Types.hpp
+++ b/extension/src/openvic2/Types.hpp
@@ -10,47 +10,62 @@ namespace OpenVic2 {
// This mirrors godot::Error, where `OK = 0` and `FAILED = 1`.
static constexpr return_t SUCCESS = false, FAILURE = true;
+ /*
+ * Base class for objects with a non-empty string identifier,
+ * uniquely named instances of which can be entered into an
+ * IdentifierRegistry instance.
+ */
class HasIdentifier {
- std::string identifier;
+ const std::string identifier;
protected:
HasIdentifier(std::string const& new_identifier);
public:
+ HasIdentifier(HasIdentifier const&) = delete;
+ HasIdentifier(HasIdentifier&&) = default;
std::string const& get_identifier() const;
};
- template<typename T, char const* name, std::enable_if<std::is_base_of<HasIdentifier, T>::value>::type* = nullptr>
+ /*
+ * Template for a list of objects with unique string identifiers that can
+ * be locked to prevent any further additions. The template argument T is
+ * the type of object that the registry will store, and the second part ensures
+ * that HasIdentifier is a base class of T.
+ */
+ template<class T, typename std::enable_if<std::is_base_of<HasIdentifier, T>::value>::type* = nullptr>
class IdentifierRegistry {
+ const std::string name;
std::vector<T> items;
bool locked = false;
public:
+ IdentifierRegistry(std::string const& new_name) : name(new_name) {}
return_t add_item(T&& item) {
if (locked) {
Logger::error("Cannot add item to the ", name, " registry - locked!");
return FAILURE;
}
- if (item.get_identifier().empty()) {
- Logger::error("Cannot add item to the ", name, " registry - empty identifier!");
- return FAILURE;
- }
T const* old_item = get_item_by_identifier(item.get_identifier());
if (old_item != nullptr) {
Logger::error("Cannot add item to the ", name, " registry - an item with the identifier \"", item.get_identifier(), "\" already exists!");
return FAILURE;
}
- items.push_back(item);
+ items.push_back(std::move(item));
return SUCCESS;
}
- void lock() {
+ void lock(bool log = true) {
if (locked) {
Logger::error("Failed to lock ", name, " registry - already locked!");
} else {
locked = true;
- Logger::info("Locked ", name, " registry after registering ", get_item_count(), " items");
+ if (log) Logger::info("Locked ", name, " registry after registering ", get_item_count(), " items");
}
}
bool is_locked() const {
return locked;
}
+ void reset() {
+ items.clear();
+ locked = false;
+ }
size_t get_item_count() const {
return items.size();
}
diff --git a/extension/src/openvic2/map/Building.cpp b/extension/src/openvic2/map/Building.cpp
index 3643b4e..00e121b 100644
--- a/extension/src/openvic2/map/Building.cpp
+++ b/extension/src/openvic2/map/Building.cpp
@@ -3,6 +3,7 @@
#include <cassert>
#include "openvic2/Logger.hpp"
+#include "openvic2/map/Province.hpp"
using namespace OpenVic2;
@@ -87,9 +88,13 @@ Timespan BuildingType::get_build_time() const {
return build_time;
}
-const char BuildingManager::building_types_name[] = "building types";
+BuildingManager::BuildingManager() : building_types{ "building types" } {}
return_t BuildingManager::add_building_type(std::string const& identifier, Building::level_t max_level, Timespan build_time) {
+ if (identifier.empty()) {
+ Logger::error("Invalid building type identifier - empty!");
+ return FAILURE;
+ }
if (max_level < 0) {
Logger::error("Invalid building type max level: ", max_level);
return FAILURE;
@@ -109,7 +114,11 @@ BuildingType const* BuildingManager::get_building_type_by_identifier(std::string
return building_types.get_item_by_identifier(identifier);
}
-void BuildingManager::generate_province_buildings(std::vector<Building>& buildings) const {
+return_t BuildingManager::generate_province_buildings(Province& province) const {
+ return_t ret = SUCCESS;
+ province.reset_buildings();
for (BuildingType const& type : building_types.get_items())
- buildings.push_back(Building{ type });
+ if (province.add_building(type) != SUCCESS) ret = FAILURE;
+ province.lock_buildings();
+ return ret;
}
diff --git a/extension/src/openvic2/map/Building.hpp b/extension/src/openvic2/map/Building.hpp
index 08ede3a..1305014 100644
--- a/extension/src/openvic2/map/Building.hpp
+++ b/extension/src/openvic2/map/Building.hpp
@@ -6,7 +6,7 @@
#include "openvic2/Date.hpp"
namespace OpenVic2 {
- struct BuildingManager;
+ struct Province;
struct BuildingType;
/* REQUIREMENTS:
@@ -15,7 +15,7 @@ namespace OpenVic2 {
* MAP-13, MAP-78, MAP-79
*/
struct Building : HasIdentifier {
- friend struct BuildingManager;
+ friend struct Province;
using level_t = int8_t;
@@ -31,6 +31,8 @@ namespace OpenVic2 {
bool _can_expand() const;
public:
+ Building(Building&&) = default;
+
BuildingType const& get_type() const;
level_t get_level() const;
ExpansionState get_expansion_state() const;
@@ -43,26 +45,31 @@ namespace OpenVic2 {
void tick(Date const& today);
};
+ struct BuildingManager;
+
struct BuildingType : HasIdentifier {
friend struct BuildingManager;
private:
- Building::level_t max_level;
- Timespan build_time;
+ const Building::level_t max_level;
+ const Timespan build_time;
BuildingType(std::string const& new_identifier, Building::level_t new_max_level, Timespan new_build_time);
public:
+ BuildingType(BuildingType&&) = default;
+
Building::level_t get_max_level() const;
Timespan get_build_time() const;
};
struct BuildingManager {
private:
- static const char building_types_name[];
- IdentifierRegistry<BuildingType, building_types_name> building_types;
+ IdentifierRegistry<BuildingType> building_types;
public:
+ BuildingManager();
+
return_t add_building_type(std::string const& identifier, Building::level_t max_level, Timespan build_time);
void lock_building_types();
BuildingType const* get_building_type_by_identifier(std::string const& identifier) const;
- void generate_province_buildings(std::vector<Building>& buildings) const;
+ return_t generate_province_buildings(Province& province) const;
};
}
diff --git a/extension/src/openvic2/map/Map.cpp b/extension/src/openvic2/map/Map.cpp
index a440f67..b5cf144 100644
--- a/extension/src/openvic2/map/Map.cpp
+++ b/extension/src/openvic2/map/Map.cpp
@@ -20,13 +20,17 @@ Province::colour_t Mapmode::get_colour(Map const& map, Province const& province)
return colour_func ? colour_func(map, province) : Province::NULL_COLOUR;
}
-const char Map::provinces_name[] = "provinces", Map::regions_name[] = "regions", Map::mapmodes_name[] = "mapmodes";
+Map::Map() : provinces{ "provinces" }, regions{ "regions" }, mapmodes{ "mapmodes" } {}
return_t Map::add_province(std::string const& identifier, Province::colour_t colour) {
if (provinces.get_item_count() >= Province::MAX_INDEX) {
Logger::error("The map's province list is full - there can be at most ", Province::MAX_INDEX, " provinces");
return FAILURE;
}
+ if (identifier.empty()) {
+ Logger::error("Invalid province identifier - empty!");
+ return FAILURE;
+ }
if (colour == Province::NULL_COLOUR || colour > Province::MAX_COLOUR) {
Logger::error("Invalid province colour: ", Province::colour_to_hex_string(colour));
return FAILURE;
@@ -69,8 +73,12 @@ void Map::lock_water_provinces() {
}
return_t Map::add_region(std::string const& identifier, std::vector<std::string> const& province_identifiers) {
- return_t ret = SUCCESS;
+ if (identifier.empty()) {
+ Logger::error("Invalid region identifier - empty!");
+ return FAILURE;
+ }
Region new_region{ identifier };
+ return_t ret = SUCCESS;
for (std::string const& province_identifier : province_identifiers) {
Province* province = get_province_by_identifier(province_identifier);
if (province != nullptr) {
@@ -246,6 +254,10 @@ std::vector<Province::index_t> const& Map::get_province_index_image() const {
}
return_t Map::add_mapmode(std::string const& identifier, Mapmode::colour_func_t colour_func) {
+ if (identifier.empty()) {
+ Logger::error("Invalid mapmode identifier - empty!");
+ return FAILURE;
+ }
if (colour_func == nullptr) {
Logger::error("Mapmode colour function is null for identifier: ", identifier);
return FAILURE;
@@ -290,9 +302,11 @@ return_t Map::generate_mapmode_colours(Mapmode::index_t index, uint8_t* target)
return SUCCESS;
}
-void Map::generate_province_buildings(BuildingManager const& manager) {
+return_t Map::generate_province_buildings(BuildingManager const& manager) {
+ return_t ret = SUCCESS;
for (Province& province : provinces.get_items())
- manager.generate_province_buildings(province.buildings.get_items());
+ if (manager.generate_province_buildings(province) != SUCCESS) ret = FAILURE;
+ return ret;
}
void Map::update_state(Date const& today) {
diff --git a/extension/src/openvic2/map/Map.hpp b/extension/src/openvic2/map/Map.hpp
index ed63912..ebc23be 100644
--- a/extension/src/openvic2/map/Map.hpp
+++ b/extension/src/openvic2/map/Map.hpp
@@ -12,8 +12,8 @@ namespace OpenVic2 {
using colour_func_t = std::function<Province::colour_t (Map const&, Province const&)>;
using index_t = size_t;
private:
- index_t index;
- colour_func_t colour_func;
+ const index_t index;
+ const colour_func_t colour_func;
Mapmode(index_t new_index, std::string const& new_identifier, colour_func_t new_colour_func);
public:
@@ -26,16 +26,17 @@ namespace OpenVic2 {
*/
struct Map {
private:
- static const char provinces_name[], regions_name[], mapmodes_name[];
- IdentifierRegistry<Province, provinces_name> provinces;
- IdentifierRegistry<Region, regions_name> regions;
- IdentifierRegistry<Mapmode, mapmodes_name> mapmodes;
+ IdentifierRegistry<Province> provinces;
+ IdentifierRegistry<Region> regions;
+ IdentifierRegistry<Mapmode> mapmodes;
bool water_provinces_locked = false;
size_t water_province_count = 0;
size_t width = 0, height = 0;
std::vector<Province::index_t> province_index_image;
public:
+ Map();
+
return_t add_province(std::string const& identifier, Province::colour_t colour);
void lock_provinces();
return_t set_water_province(std::string const& identifier);
@@ -67,7 +68,7 @@ namespace OpenVic2 {
Mapmode const* get_mapmode_by_identifier(std::string const& identifier) const;
return_t generate_mapmode_colours(Mapmode::index_t index, uint8_t* target) const;
- void generate_province_buildings(BuildingManager const& manager);
+ return_t generate_province_buildings(BuildingManager const& manager);
void update_state(Date const& today);
void tick(Date const& today);
diff --git a/extension/src/openvic2/map/Province.cpp b/extension/src/openvic2/map/Province.cpp
index 08711af..4360bce 100644
--- a/extension/src/openvic2/map/Province.cpp
+++ b/extension/src/openvic2/map/Province.cpp
@@ -6,10 +6,8 @@
using namespace OpenVic2;
-const char Province::buildings_name[] = "buildings";
-
Province::Province(index_t new_index, std::string const& new_identifier, colour_t new_colour) :
- HasIdentifier{ new_identifier }, index{ new_index }, colour{ new_colour } {
+ HasIdentifier{ new_identifier }, index{ new_index }, colour{ new_colour }, buildings{ "buildings" } {
assert(index != NULL_INDEX);
assert(colour != NULL_COLOUR);
}
@@ -40,6 +38,18 @@ Province::life_rating_t Province::get_life_rating() const {
return life_rating;
}
+return_t Province::add_building(BuildingType const& type) {
+ return buildings.add_item({ type });
+}
+
+void Province::lock_buildings() {
+ buildings.lock(false);
+}
+
+void Province::reset_buildings() {
+ buildings.reset();
+}
+
std::vector<Building> const& Province::get_buildings() const {
return buildings.get_items();
}
diff --git a/extension/src/openvic2/map/Province.hpp b/extension/src/openvic2/map/Province.hpp
index 0b7cd4c..aa0329c 100644
--- a/extension/src/openvic2/map/Province.hpp
+++ b/extension/src/openvic2/map/Province.hpp
@@ -19,23 +19,27 @@ namespace OpenVic2 {
static constexpr colour_t NULL_COLOUR = 0, MAX_COLOUR = 0xFFFFFF;
static constexpr index_t NULL_INDEX = 0, MAX_INDEX = 0xFFFF;
private:
- index_t index;
- colour_t colour;
+ const index_t index;
+ const colour_t colour;
Region* region = nullptr;
bool water = false;
life_rating_t life_rating = 0;
- static const char buildings_name[];
- IdentifierRegistry<Building, buildings_name> buildings;
+ IdentifierRegistry<Building> buildings;
Province(index_t new_index, std::string const& new_identifier, colour_t new_colour);
public:
static std::string colour_to_hex_string(colour_t colour);
+ Province(Province&&) = default;
+
index_t get_index() const;
colour_t get_colour() const;
Region* get_region() const;
bool is_water() const;
life_rating_t get_life_rating() const;
+ return_t add_building(BuildingType const& type);
+ void lock_buildings();
+ void reset_buildings();
std::vector<Building> const& get_buildings() const;
return_t expand_building(std::string const& building_type_identifier);
std::string to_string() const;
diff --git a/extension/src/openvic2/map/Region.hpp b/extension/src/openvic2/map/Region.hpp
index 2eec1cd..04564fc 100644
--- a/extension/src/openvic2/map/Region.hpp
+++ b/extension/src/openvic2/map/Region.hpp
@@ -23,6 +23,8 @@ namespace OpenVic2 {
private:
Region(std::string const& new_identifier);
public:
+ Region(Region&&) = default;
+
Province::colour_t get_colour() const;
};
}