aboutsummaryrefslogtreecommitdiff
path: root/extension/src
diff options
context:
space:
mode:
author Hop311 <Hop3114@gmail.com>2024-11-19 17:35:26 +0100
committer GitHub <noreply@github.com>2024-11-19 17:35:26 +0100
commit0da99047c2d5f30fa90798a3833134c78910c2ea (patch)
tree08979339133a902a9226ea1766de321ee1cc780c /extension/src
parent9455c807d392e2cdd11c7f3cc89dd567422faa99 (diff)
parent2cdbcea72762822adedf948f43a61d38472b5c7d (diff)
Merge pull request #287 from OpenVicProject/mapmode-panel
Implement the V2 Minimap + Menubar GUI
Diffstat (limited to 'extension/src')
-rw-r--r--extension/src/openvic-extension/singletons/GameSingleton.cpp56
-rw-r--r--extension/src/openvic-extension/singletons/GameSingleton.hpp7
-rw-r--r--extension/src/openvic-extension/singletons/MenuSingleton.cpp2
-rw-r--r--extension/src/openvic-extension/singletons/MenuSingleton.hpp14
-rw-r--r--extension/src/openvic-extension/utility/UITools.cpp8
5 files changed, 61 insertions, 26 deletions
diff --git a/extension/src/openvic-extension/singletons/GameSingleton.cpp b/extension/src/openvic-extension/singletons/GameSingleton.cpp
index f258fe1..553d17c 100644
--- a/extension/src/openvic-extension/singletons/GameSingleton.cpp
+++ b/extension/src/openvic-extension/singletons/GameSingleton.cpp
@@ -33,6 +33,10 @@ StringName const& GameSingleton::_signal_clock_state_changed() {
static const StringName signal_clock_state_changed = "clock_state_changed";
return signal_clock_state_changed;
}
+StringName const& GameSingleton::_signal_mapmode_changed() {
+ static const StringName signal_mapmode_changed = "mapmode_changed";
+ return signal_mapmode_changed;
+}
void GameSingleton::_bind_methods() {
OV_BIND_SMETHOD(setup_logger);
@@ -63,7 +67,9 @@ void GameSingleton::_bind_methods() {
OV_BIND_METHOD(GameSingleton::get_mapmode_count);
OV_BIND_METHOD(GameSingleton::get_mapmode_identifier);
- OV_BIND_METHOD(GameSingleton::set_mapmode, { "identifier" });
+ OV_BIND_METHOD(GameSingleton::get_mapmode_localisation_key);
+ OV_BIND_METHOD(GameSingleton::get_current_mapmode_index);
+ OV_BIND_METHOD(GameSingleton::set_mapmode, { "index" });
OV_BIND_METHOD(GameSingleton::is_parchment_mapmode_allowed);
OV_BIND_METHOD(GameSingleton::get_selected_province_index);
OV_BIND_METHOD(GameSingleton::set_selected_province, { "index" });
@@ -76,6 +82,7 @@ void GameSingleton::_bind_methods() {
ADD_SIGNAL(MethodInfo(_signal_gamestate_updated()));
ADD_SIGNAL(MethodInfo(_signal_province_selected(), PropertyInfo(Variant::INT, "index")));
ADD_SIGNAL(MethodInfo(_signal_clock_state_changed()));
+ ADD_SIGNAL(MethodInfo(_signal_mapmode_changed(), PropertyInfo(Variant::INT, "index")));
}
GameSingleton* GameSingleton::get_singleton() {
@@ -95,9 +102,11 @@ void GameSingleton::_on_clock_state_changed() {
* MAP-21, MAP-23, MAP-25, MAP-32, MAP-33, MAP-34
*/
GameSingleton::GameSingleton()
- : game_manager {
+ : game_manager {
std::bind(&GameSingleton::_on_gamestate_updated, this), std::bind(&GameSingleton::_on_clock_state_changed, this)
- }, viewed_country { nullptr } {
+ },
+ viewed_country { nullptr },
+ mapmode { &Mapmode::ERROR_MAPMODE } {
ERR_FAIL_COND(singleton != nullptr);
singleton = this;
}
@@ -249,7 +258,7 @@ Error GameSingleton::_update_colour_image() {
InstanceManager const* instance_manager = get_instance_manager();
if (instance_manager != nullptr && !get_definition_manager().get_mapmode_manager().generate_mapmode_colours(
- instance_manager->get_map_instance(), mapmode_index, colour_data_array.ptrw()
+ instance_manager->get_map_instance(), mapmode, colour_data_array.ptrw()
)) {
err = FAILED;
}
@@ -311,28 +320,37 @@ int32_t GameSingleton::get_mapmode_count() const {
}
String GameSingleton::get_mapmode_identifier(int32_t index) const {
- Mapmode const* mapmode = get_definition_manager().get_mapmode_manager().get_mapmode_by_index(index);
- if (mapmode != nullptr) {
- return Utilities::std_to_godot_string(mapmode->get_identifier());
+ Mapmode const* identifier_mapmode = get_definition_manager().get_mapmode_manager().get_mapmode_by_index(index);
+ if (identifier_mapmode != nullptr) {
+ return Utilities::std_to_godot_string(identifier_mapmode->get_identifier());
+ }
+ return String {};
+}
+
+String GameSingleton::get_mapmode_localisation_key(int32_t index) const {
+ Mapmode const* localisation_key_mapmode = get_definition_manager().get_mapmode_manager().get_mapmode_by_index(index);
+ if (localisation_key_mapmode != nullptr) {
+ return Utilities::std_to_godot_string(localisation_key_mapmode->get_localisation_key());
}
return String {};
}
-Error GameSingleton::set_mapmode(String const& identifier) {
- Mapmode const* mapmode =
- get_definition_manager().get_mapmode_manager().get_mapmode_by_identifier(Utilities::godot_to_std_string(identifier));
- ERR_FAIL_NULL_V_MSG(mapmode, FAILED, vformat("Failed to find mapmode with identifier: %s", identifier));
- mapmode_index = mapmode->get_index();
- return _update_colour_image();
+int32_t GameSingleton::get_current_mapmode_index() const {
+ return mapmode->get_index();
+}
+
+Error GameSingleton::set_mapmode(int32_t index) {
+ Mapmode const* new_mapmode = get_definition_manager().get_mapmode_manager().get_mapmode_by_index(index);
+ ERR_FAIL_NULL_V_MSG(new_mapmode, FAILED, vformat("Failed to find mapmode with index: %d", index));
+ mapmode = new_mapmode;
+ const Error err = _update_colour_image();
+ emit_signal(_signal_mapmode_changed(), mapmode->get_index());
+ return err;
}
bool GameSingleton::is_parchment_mapmode_allowed() const {
- // TODO - parchment bool per mapmode?
- // TODO - move mapmode index to SIM/Map?
- /* Disallows parchment mapmode for the cosmetic terrain mapmode */
- static constexpr std::string_view cosmetic_terrain_mapmode = "mapmode_terrain";
- Mapmode const* mapmode = get_definition_manager().get_mapmode_manager().get_mapmode_by_index(mapmode_index);
- return mapmode != nullptr && mapmode->get_identifier() != cosmetic_terrain_mapmode;
+ /* Disallows parchment mapmode, e.g. for the cosmetic terrain mapmode */
+ return mapmode->is_parchment_mapmode_allowed();
}
int32_t GameSingleton::get_selected_province_index() const {
diff --git a/extension/src/openvic-extension/singletons/GameSingleton.hpp b/extension/src/openvic-extension/singletons/GameSingleton.hpp
index e737643..aa80141 100644
--- a/extension/src/openvic-extension/singletons/GameSingleton.hpp
+++ b/extension/src/openvic-extension/singletons/GameSingleton.hpp
@@ -21,7 +21,7 @@ namespace OpenVic {
godot::Ref<godot::Texture2DArray> province_shape_texture;
godot::Ref<godot::Image> province_colour_image;
godot::Ref<godot::ImageTexture> province_colour_texture;
- Mapmode::index_t mapmode_index = 0;
+ Mapmode const* mapmode; // This should never be null, if no mapmode is set then it'll point to Mapmode::ERROR_MAPMODE
godot::Ref<godot::Texture2DArray> terrain_texture;
static const godot::Vector2i PROPERTY(flag_dims); /* The size in pixels of an individual flag. */
@@ -34,6 +34,7 @@ namespace OpenVic {
static godot::StringName const& _signal_gamestate_updated();
static godot::StringName const& _signal_province_selected();
static godot::StringName const& _signal_clock_state_changed();
+ static godot::StringName const& _signal_mapmode_changed();
godot::Error _load_map_images();
godot::Error _load_terrain_variants();
@@ -120,7 +121,9 @@ namespace OpenVic {
int32_t get_mapmode_count() const;
godot::String get_mapmode_identifier(int32_t index) const;
- godot::Error set_mapmode(godot::String const& identifier);
+ godot::String get_mapmode_localisation_key(int32_t index) const;
+ int32_t get_current_mapmode_index() const;
+ godot::Error set_mapmode(int32_t index);
bool is_parchment_mapmode_allowed() const;
int32_t get_selected_province_index() const;
void set_selected_province(int32_t index);
diff --git a/extension/src/openvic-extension/singletons/MenuSingleton.cpp b/extension/src/openvic-extension/singletons/MenuSingleton.cpp
index 81582c2..e5554c3 100644
--- a/extension/src/openvic-extension/singletons/MenuSingleton.cpp
+++ b/extension/src/openvic-extension/singletons/MenuSingleton.cpp
@@ -482,7 +482,7 @@ Dictionary MenuSingleton::get_province_info_from_index(int32_t index) const {
ret[province_info_rgo_output_quantity_yesterday_key] = rgo.get_output_quantity_yesterday().to_float();
ret[province_info_rgo_revenue_yesterday_key] = rgo.get_revenue_yesterday().to_float();
ret[province_info_rgo_total_employees_key] = rgo.get_total_employees_count_cache();
- const Pop::pop_size_t max_employee_count = rgo.get_max_employee_count_cache();
+ const pop_size_t max_employee_count = rgo.get_max_employee_count_cache();
if (max_employee_count == 0) {
ret[province_info_rgo_employment_percentage_key] = 100.0f;
} else {
diff --git a/extension/src/openvic-extension/singletons/MenuSingleton.hpp b/extension/src/openvic-extension/singletons/MenuSingleton.hpp
index 0dcc8ff..169d519 100644
--- a/extension/src/openvic-extension/singletons/MenuSingleton.hpp
+++ b/extension/src/openvic-extension/singletons/MenuSingleton.hpp
@@ -1,16 +1,26 @@
#pragma once
+#include <variant>
+
#include <godot_cpp/classes/control.hpp>
#include <godot_cpp/classes/image.hpp>
-#include <openvic-simulation/pop/Pop.hpp>
#include <openvic-simulation/types/IndexedMap.hpp>
+#include <openvic-simulation/types/PopSize.hpp>
#include <openvic-simulation/types/OrderedContainers.hpp>
namespace OpenVic {
struct CountryInstance;
struct State;
struct ProvinceInstance;
+ struct Pop;
+ struct PopType;
+ struct Religion;
+ struct Ideology;
+ struct Culture;
+ struct Issue;
+ struct CountryParty;
+ struct RebelType;
struct ModifierValue;
struct RuleSet;
@@ -46,7 +56,7 @@ namespace OpenVic {
int32_t visible_province_list_entries = 0;
struct pop_filter_t {
- Pop::pop_size_t count, promotion_demotion_change;
+ pop_size_t count, promotion_demotion_change;
bool selected;
};
ordered_map<PopType const*, pop_filter_t> pop_filters;
diff --git a/extension/src/openvic-extension/utility/UITools.cpp b/extension/src/openvic-extension/utility/UITools.cpp
index 4bd537d..ecb35a8 100644
--- a/extension/src/openvic-extension/utility/UITools.cpp
+++ b/extension/src/openvic-extension/utility/UITools.cpp
@@ -482,14 +482,18 @@ static bool generate_window(generate_gui_args_t&& args) {
GUI::Window const& window = static_cast<GUI::Window const&>(args.element);
- // TODO - moveable, fullscreen, dontRender (disable visibility?)
+ // TODO - moveable, dontRender (disable visibility?)
const String window_name = Utilities::std_to_godot_string(window.get_name());
Panel* godot_panel = nullptr;
bool ret = new_control(godot_panel, window, args.name);
ERR_FAIL_NULL_V_MSG(godot_panel, false, vformat("Failed to create Panel for GUI window %s", window_name));
- godot_panel->set_custom_minimum_size(Utilities::to_godot_fvec2(window.get_size()));
+ if (window.get_fullscreen()) {
+ godot_panel->set_anchors_preset(godot::Control::PRESET_FULL_RECT);
+ } else {
+ godot_panel->set_custom_minimum_size(Utilities::to_godot_fvec2(window.get_size()));
+ }
Ref<StyleBoxEmpty> stylebox_empty;
stylebox_empty.instantiate();