From 0ba36e6762615d17605a573a036aff5bf84dfc95 Mon Sep 17 00:00:00 2001 From: hop311 Date: Mon, 3 Jun 2024 23:54:38 +0100 Subject: Province const/mutable + proper State names --- extension/deps/openvic-simulation | 2 +- .../openvic-extension/singletons/GameSingleton.cpp | 19 +++++---- .../openvic-extension/singletons/MenuSingleton.cpp | 49 +++++++++++++++++++--- .../openvic-extension/singletons/MenuSingleton.hpp | 9 ++-- .../singletons/ModelSingleton.cpp | 26 +++++++----- .../singletons/ModelSingleton.hpp | 5 ++- .../singletons/PopulationMenu.cpp | 30 +++++++------ 7 files changed, 97 insertions(+), 43 deletions(-) (limited to 'extension') diff --git a/extension/deps/openvic-simulation b/extension/deps/openvic-simulation index e286cfe..f5d173e 160000 --- a/extension/deps/openvic-simulation +++ b/extension/deps/openvic-simulation @@ -1 +1 @@ -Subproject commit e286cfef29d7c431ba33cd77283e838e6fba05d2 +Subproject commit f5d173e88a49a1a9556860063aef1aa287925cfd diff --git a/extension/src/openvic-extension/singletons/GameSingleton.cpp b/extension/src/openvic-extension/singletons/GameSingleton.cpp index 9f080b5..7576d0c 100644 --- a/extension/src/openvic-extension/singletons/GameSingleton.cpp +++ b/extension/src/openvic-extension/singletons/GameSingleton.cpp @@ -124,10 +124,11 @@ Error GameSingleton::setup_game(int32_t bookmark_index) { ERR_FAIL_NULL_V_MSG(bookmark, FAILED, vformat("Failed to get bookmark with index: %d", bookmark_index)); bool ret = game_manager.load_bookmark(bookmark); - for (Province& province : game_manager.get_map().get_provinces()) { + for (ProvinceInstance& province : game_manager.get_map().get_province_instances()) { province.set_crime( game_manager.get_crime_manager().get_crime_modifier_by_index( - (province.get_index() - 1) % game_manager.get_crime_manager().get_crime_modifier_count() + (province.get_province_definition().get_index() - 1) + % game_manager.get_crime_manager().get_crime_modifier_count() ) ); } @@ -215,15 +216,15 @@ Ref GameSingleton::get_province_colour_texture() const { Error GameSingleton::_update_colour_image() { Map const& map = game_manager.get_map(); ERR_FAIL_COND_V_MSG( - !map.provinces_are_locked(), FAILED, "Cannot generate province colour image before provinces are locked!" + !map.province_definitions_are_locked(), FAILED, "Cannot generate province colour image before provinces are locked!" ); /* We reshape the list of colours into a square, as each texture dimensions cannot exceed 16384. */ - static constexpr int32_t PROVINCE_INDEX_SQRT = 1 << (sizeof(Province::index_t) * CHAR_BIT / 2); + static constexpr int32_t PROVINCE_INDEX_SQRT = 1 << (sizeof(ProvinceDefinition::index_t) * CHAR_BIT / 2); static constexpr int32_t colour_image_width = PROVINCE_INDEX_SQRT * sizeof(Mapmode::base_stripe_t) / sizeof(colour_argb_t); /* Province count + null province, rounded up to next multiple of PROVINCE_INDEX_SQRT. * Rearranged from: (map.get_province_count() + 1) + (PROVINCE_INDEX_SQRT - 1) */ - const int32_t colour_image_height = (map.get_province_count() + PROVINCE_INDEX_SQRT) / PROVINCE_INDEX_SQRT; + const int32_t colour_image_height = (map.get_province_definition_count() + PROVINCE_INDEX_SQRT) / PROVINCE_INDEX_SQRT; static PackedByteArray colour_data_array; const int64_t colour_data_array_size = colour_image_width * colour_image_height * sizeof(colour_argb_t); @@ -258,10 +259,10 @@ TypedArray GameSingleton::get_province_names() const { static const StringName scale_key = "scale"; TypedArray ret; - ERR_FAIL_COND_V(ret.resize(game_manager.get_map().get_province_count()) != OK, {}); + ERR_FAIL_COND_V(ret.resize(game_manager.get_map().get_province_definition_count()) != OK, {}); - for (int32_t index = 0; index < game_manager.get_map().get_province_count(); ++index) { - Province const& province = game_manager.get_map().get_provinces()[index]; + for (int32_t index = 0; index < game_manager.get_map().get_province_definition_count(); ++index) { + ProvinceDefinition const& province = game_manager.get_map().get_province_definitions()[index]; Dictionary province_dict; @@ -323,7 +324,7 @@ void GameSingleton::set_selected_province(int32_t index) { } void GameSingleton::unset_selected_province() { - set_selected_province(Province::NULL_INDEX); + set_selected_province(ProvinceDefinition::NULL_INDEX); } void GameSingleton::try_tick() { diff --git a/extension/src/openvic-extension/singletons/MenuSingleton.cpp b/extension/src/openvic-extension/singletons/MenuSingleton.cpp index 993549c..b304b69 100644 --- a/extension/src/openvic-extension/singletons/MenuSingleton.cpp +++ b/extension/src/openvic-extension/singletons/MenuSingleton.cpp @@ -5,6 +5,7 @@ #include #include "openvic-extension/classes/GFXPieChartTexture.hpp" +#include "openvic-extension/classes/GUINode.hpp" #include "openvic-extension/singletons/GameSingleton.hpp" #include "openvic-extension/utility/ClassBindings.hpp" #include "openvic-extension/utility/Utilities.hpp" @@ -28,6 +29,44 @@ StringName const& MenuSingleton::_signal_population_menu_pops_changed() { return signal_population_menu_pops_changed; } +String MenuSingleton::get_state_name(State const& state) const { + StateSet const& state_set = state.get_state_set(); + + const String region_identifier = std_view_to_godot_string(state_set.get_region().get_identifier()); + + String name = tr(region_identifier); + + const bool named = name != region_identifier; + const bool owned = state.get_owner() != nullptr; + const bool split = state_set.get_state_count() > 1; + + if (!named) { + // Capital province name + name = tr(GUINode::format_province_name(std_view_to_godot_string(state.get_capital()->get_identifier()))); + + if (!owned) { + static const StringName region_key = "REGION_NAME"; + static const String name_key = "$NAME$"; + + String region = tr(region_key); + + if (region != region_key) { + // CAPITAL Region + return region.replace(name_key, name); + } + } + } + + if (owned && split) { + // COUNTRY STATE/CAPITAL + return tr(std_view_to_godot_string(StringUtils::append_string_views(state.get_owner()->get_identifier(), "_ADJ"))) + + " " + name; + } + + // STATE/CAPITAL + return name; +} + void MenuSingleton::_bind_methods() { /* PROVINCE OVERVIEW PANEL */ OV_BIND_METHOD(MenuSingleton::get_province_info_from_index, { "index" }); @@ -132,7 +171,7 @@ Dictionary MenuSingleton::get_province_info_from_index(int32_t index) const { ERR_FAIL_NULL_V(game_manager, {}); static const StringName province_info_province_key = "province"; - static const StringName province_info_region_key = "region"; + static const StringName province_info_state_key = "state"; static const StringName province_info_slave_status_key = "slave_status"; static const StringName province_info_colony_status_key = "colony_status"; static const StringName province_info_terrain_type_key = "terrain_type"; @@ -149,7 +188,7 @@ Dictionary MenuSingleton::get_province_info_from_index(int32_t index) const { static const StringName province_info_cores_key = "cores"; static const StringName province_info_buildings_key = "buildings"; - Province const* province = game_manager->get_map().get_province_by_index(index); + ProvinceInstance const* province = game_manager->get_map().get_province_instance_by_index(index); if (province == nullptr) { return {}; } @@ -157,9 +196,9 @@ Dictionary MenuSingleton::get_province_info_from_index(int32_t index) const { ret[province_info_province_key] = std_view_to_godot_string(province->get_identifier()); - Region const* region = province->get_region(); - if (region != nullptr) { - ret[province_info_region_key] = std_view_to_godot_string(region->get_identifier()); + State const* state = province->get_state(); + if (state != nullptr) { + ret[province_info_state_key] = get_state_name(*state); } ret[province_info_slave_status_key] = province->get_slave(); diff --git a/extension/src/openvic-extension/singletons/MenuSingleton.hpp b/extension/src/openvic-extension/singletons/MenuSingleton.hpp index fd1b6c5..efce81f 100644 --- a/extension/src/openvic-extension/singletons/MenuSingleton.hpp +++ b/extension/src/openvic-extension/singletons/MenuSingleton.hpp @@ -7,7 +7,7 @@ namespace OpenVic { struct GameManager; - struct Region; + struct State; class MenuSingleton : public godot::Object { GDCLASS(MenuSingleton, godot::Object) @@ -28,13 +28,12 @@ namespace OpenVic { }; struct state_entry_t { - // TODO - change to State - Region const& state; + State const& state; bool selected = true, expanded = false; }; struct province_entry_t { - Province const& province; + ProvinceInstance const& province; bool selected = true; }; @@ -80,6 +79,8 @@ namespace OpenVic { /* Emitted when the selected/filtered collection of pops changes. */ static godot::StringName const& _signal_population_menu_pops_changed(); + godot::String get_state_name(State const& state) const; + protected: static void _bind_methods(); diff --git a/extension/src/openvic-extension/singletons/ModelSingleton.cpp b/extension/src/openvic-extension/singletons/ModelSingleton.cpp index 88a69c9..152a7f4 100644 --- a/extension/src/openvic-extension/singletons/ModelSingleton.cpp +++ b/extension/src/openvic-extension/singletons/ModelSingleton.cpp @@ -288,7 +288,8 @@ bool ModelSingleton::add_unit_dict(ordered_set const& units, TypedArraymap_position_to_world_coords(unit.get_position()->get_unit_position()); + dict[position_key] = + game_singleton->map_position_to_world_coords(unit.get_position()->get_province_definition().get_unit_position()); if (display_unit_type->get_unit_category() != UnitType::unit_category_t::INFANTRY) { dict[rotation_key] = -0.25f * std::numbers::pi_v; @@ -310,8 +311,8 @@ TypedArray ModelSingleton::get_units() const { TypedArray ret; - for (Province const& province : game_singleton->get_game_manager().get_map().get_provinces()) { - if (province.is_water()) { + for (ProvinceInstance const& province : game_singleton->get_game_manager().get_map().get_province_instances()) { + if (province.get_province_definition().is_water()) { if (!add_unit_dict(province.get_navies(), ret)) { UtilityFunctions::push_error( "Error adding navy to province \"", std_view_to_godot_string(province.get_identifier()), "\"" @@ -363,8 +364,10 @@ Dictionary ModelSingleton::get_flag_model(bool floating) const { } bool ModelSingleton::add_building_dict( - BuildingInstance const& building, Province const& province, TypedArray& building_array + BuildingInstance const& building, ProvinceInstance const& province, TypedArray& building_array ) const { + ProvinceDefinition const& province_definition = province.get_province_definition(); + GameSingleton const* game_singleton = GameSingleton::get_singleton(); ERR_FAIL_NULL_V(game_singleton, false); @@ -379,7 +382,7 @@ bool ModelSingleton::add_building_dict( game_singleton->get_game_manager().get_economy_manager().get_building_type_manager().get_port_building_type() ) { /* Port */ - if (!province.has_port()) { + if (!province_definition.has_port()) { return true; } @@ -404,8 +407,8 @@ bool ModelSingleton::add_building_dict( return true; } - fvec2_t const* position_ptr = province.get_building_position(&building.get_building_type()); - const float rotation = province.get_building_rotation(&building.get_building_type()); + fvec2_t const* position_ptr = province_definition.get_building_position(&building.get_building_type()); + const float rotation = province_definition.get_building_rotation(&building.get_building_type()); const std::string actor_name = StringUtils::append_string_views("building_", building.get_identifier(), suffix); @@ -422,8 +425,9 @@ bool ModelSingleton::add_building_dict( dict[model_key] = make_model_dict(*actor); - dict[position_key] = - game_singleton->map_position_to_world_coords(position_ptr != nullptr ? *position_ptr : province.get_centre()); + dict[position_key] = game_singleton->map_position_to_world_coords( + position_ptr != nullptr ? *position_ptr : province_definition.get_centre() + ); if (rotation != 0.0f) { dict[rotation_key] = rotation; @@ -441,8 +445,8 @@ TypedArray ModelSingleton::get_buildings() const { TypedArray ret; - for (Province const& province : game_singleton->get_game_manager().get_map().get_provinces()) { - if (!province.is_water()) { + for (ProvinceInstance const& province : game_singleton->get_game_manager().get_map().get_province_instances()) { + if (!province.get_province_definition().is_water()) { for (BuildingInstance const& building : province.get_buildings()) { if (!add_building_dict(building, province, ret)) { UtilityFunctions::push_error( diff --git a/extension/src/openvic-extension/singletons/ModelSingleton.hpp b/extension/src/openvic-extension/singletons/ModelSingleton.hpp index 17c2dd0..ad1a6d8 100644 --- a/extension/src/openvic-extension/singletons/ModelSingleton.hpp +++ b/extension/src/openvic-extension/singletons/ModelSingleton.hpp @@ -6,6 +6,8 @@ #include namespace OpenVic { + struct BuildingInstance; + class ModelSingleton : public godot::Object { GDCLASS(ModelSingleton, godot::Object) @@ -33,7 +35,8 @@ namespace OpenVic { bool add_unit_dict(ordered_set const& units, godot::TypedArray& unit_array) const; bool add_building_dict( - BuildingInstance const& building, Province const& province, godot::TypedArray& building_array + BuildingInstance const& building, ProvinceInstance const& province, + godot::TypedArray& building_array ) const; public: diff --git a/extension/src/openvic-extension/singletons/PopulationMenu.cpp b/extension/src/openvic-extension/singletons/PopulationMenu.cpp index 609142a..4aeedae 100644 --- a/extension/src/openvic-extension/singletons/PopulationMenu.cpp +++ b/extension/src/openvic-extension/singletons/PopulationMenu.cpp @@ -20,6 +20,9 @@ void MenuSingleton::_population_menu_update_provinces() { population_menu.province_list_entries.clear(); population_menu.visible_province_list_entries = 0; + Map const& map = game_manager->get_map(); + ERR_FAIL_COND(!map.province_instances_are_locked()); + for (Country const* country : { // Example country game_manager->get_country_manager().get_country_by_identifier("ENG") @@ -29,14 +32,15 @@ void MenuSingleton::_population_menu_update_provinces() { population_menu.province_list_entries.emplace_back(population_menu_t::country_entry_t { *country }); population_menu.visible_province_list_entries++; - // TODO - change to State - for (Region const& state : game_manager->get_map().get_regions()) { + for (StateSet const& state_set : map.get_state_manager().get_state_sets()) { + for (State const& state : state_set.get_states()) { - population_menu.province_list_entries.emplace_back(population_menu_t::state_entry_t { state }); - population_menu.visible_province_list_entries++; + population_menu.province_list_entries.emplace_back(population_menu_t::state_entry_t { state }); + population_menu.visible_province_list_entries++; - for (Province const* province : state.get_provinces()) { - population_menu.province_list_entries.emplace_back(population_menu_t::province_entry_t { *province }); + for (ProvinceInstance const* province : state.get_provinces()) { + population_menu.province_list_entries.emplace_back(population_menu_t::province_entry_t { *province }); + } } } } @@ -81,6 +85,8 @@ TypedArray MenuSingleton::get_population_menu_province_list_rows(int struct entry_visitor_t { + MenuSingleton const& menu_singleton; + int32_t& start_counter; int32_t& count_counter; @@ -124,8 +130,8 @@ TypedArray MenuSingleton::get_population_menu_province_list_rows(int state_dict[type_key] = population_menu_t::LIST_ENTRY_STATE; state_dict[index_key] = index; - state_dict[name_key] = std_view_to_godot_string(state_entry.state.get_identifier()); - state_dict[size_key] = state_entry.state.calculate_total_population(); + state_dict[name_key] = menu_singleton.get_state_name(state_entry.state); + state_dict[size_key] = state_entry.state.get_total_population(); state_dict[change_key] = 0; state_dict[selected_key] = state_entry.selected; state_dict[expanded_key] = state_entry.expanded; @@ -157,7 +163,7 @@ TypedArray MenuSingleton::get_population_menu_province_list_rows(int return true; } - } entry_visitor { start, count, game_manager->get_map().get_total_map_population() }; + } entry_visitor { *this, start, count, game_manager->get_map().get_total_map_population() }; while (entry_visitor.index < population_menu.province_list_entries.size() && std::visit(entry_visitor, population_menu.province_list_entries[entry_visitor.index])) { @@ -170,7 +176,7 @@ TypedArray MenuSingleton::get_population_menu_province_list_rows(int Error MenuSingleton::population_menu_select_province_list_entry(int32_t select_index, bool set_scroll_index) { ERR_FAIL_INDEX_V(select_index, population_menu.province_list_entries.size(), FAILED); - struct entry_visitor { + struct entry_visitor_t { const int32_t _select_index; @@ -253,7 +259,7 @@ Error MenuSingleton::population_menu_select_province_list_entry(int32_t select_i Error MenuSingleton::population_menu_select_province(int32_t province_index) { ERR_FAIL_NULL_V(game_manager, FAILED); - ERR_FAIL_COND_V(province_index <= 0 || province_index > game_manager->get_map().get_province_count(), FAILED); + ERR_FAIL_COND_V(province_index <= 0 || province_index > game_manager->get_map().get_province_instance_count(), FAILED); struct entry_visitor_t { @@ -283,7 +289,7 @@ Error MenuSingleton::population_menu_select_province(int32_t province_index) { } bool operator()(population_menu_t::province_entry_t& province_entry) { - if (province_entry.province.get_index() == _province_index) { + if (province_entry.province.get_province_definition().get_index() == _province_index) { if (state_entry_to_expand >= 0) { ret &= menu_singleton.population_menu_toggle_expanded(state_entry_to_expand, false) == OK; -- cgit v1.2.3-56-ga3b1