aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--extension/src/openvic-extension/singletons/MenuSingleton.cpp75
-rw-r--r--game/src/Game/GameSession/NationManagementScreen/TechnologyMenu.gd93
2 files changed, 131 insertions, 37 deletions
diff --git a/extension/src/openvic-extension/singletons/MenuSingleton.cpp b/extension/src/openvic-extension/singletons/MenuSingleton.cpp
index ab7c217..2634d2e 100644
--- a/extension/src/openvic-extension/singletons/MenuSingleton.cpp
+++ b/extension/src/openvic-extension/singletons/MenuSingleton.cpp
@@ -20,6 +20,9 @@
#include "godot_cpp/core/error_macros.hpp"
#include "godot_cpp/variant/array.hpp"
#include "godot_cpp/variant/dictionary.hpp"
+#include "godot_cpp/variant/packed_float32_array.hpp"
+#include "godot_cpp/variant/packed_int32_array.hpp"
+#include "godot_cpp/variant/packed_string_array.hpp"
#include "godot_cpp/variant/string.hpp"
#include "openvic-simulation/country/CountryInstance.hpp"
#include "openvic-simulation/research/Technology.hpp"
@@ -1007,26 +1010,45 @@ godot::Dictionary MenuSingleton::get_technology_menu_defines() const {
static const StringName tech_folders_key = "tech_folders";
static const StringName tech_areas_key = "tech_areas";
+ static const StringName technologies_key = "technologies";
+ static const StringName folder_tech_count_key = "folder_tech_count";
Dictionary ret;
- const std::vector<OpenVic::TechnologyFolder>& tech_folders = game_singleton->get_definition_manager().get_research_manager().get_technology_manager().get_technology_folders();
+ std::vector<OpenVic::TechnologyFolder> const& tech_folders = game_singleton->get_definition_manager().get_research_manager().get_technology_manager().get_technology_folders();
- Array tech_folder_identifiers {};
+ PackedStringArray tech_folder_identifiers {};
Array tech_area_identifiers {};
+ Array tech_identifiers {};
+ PackedInt32Array folder_tech_count {};
for (TechnologyFolder const& folder : tech_folders) {
tech_folder_identifiers.push_back(Utilities::std_to_godot_string(folder.get_identifier()));
- Array folder_areas {};
+ int32_t num_in_folder = 0;
+
+ PackedStringArray folder_areas {};
+ Array tech_folder_nested_array {}; // tech_identifiers has three levels of nested arrays :P
for (TechnologyArea const* area : folder.get_technology_areas()) {
folder_areas.push_back(Utilities::std_to_godot_string(area->get_identifier()));
+
+ PackedStringArray area_technologies {};
+ for (Technology const* tech : area->get_technologies()) {
+ area_technologies.push_back(Utilities::std_to_godot_string(tech->get_identifier()));
+ num_in_folder++;
+ }
+ tech_folder_nested_array.push_back(std::move(area_technologies));
}
- tech_area_identifiers.push_back(folder_areas);
+ tech_area_identifiers.push_back(std::move(folder_areas));
+ tech_identifiers.push_back(std::move(tech_folder_nested_array));
+ folder_tech_count.push_back(num_in_folder);
}
- ret[tech_folders_key] = tech_folder_identifiers;
- ret[tech_areas_key] = tech_area_identifiers;
+ ret[tech_folders_key] = std::move(tech_folder_identifiers);
+ ret[tech_areas_key] = std::move(tech_area_identifiers);
+ ret[technologies_key] = std::move(tech_identifiers);
+ ret[folder_tech_count_key] = std::move(folder_tech_count);
return ret;
}
+
godot::Dictionary MenuSingleton::get_technology_menu_info() const {
GameSingleton const* game_singleton = GameSingleton::get_singleton();
ERR_FAIL_NULL_V(game_singleton, {});
@@ -1039,16 +1061,24 @@ godot::Dictionary MenuSingleton::get_technology_menu_info() const {
static const StringName current_research_tech = "current_research_tech";
static const StringName current_research_cat = "current_research_cat";
- Dictionary ret;
+ static const StringName researched_technologies_key = "researched_technologies";
- std::vector<std::string_view> tech_folder_identifiers = game_singleton->get_definition_manager().get_research_manager().get_technology_manager().get_technology_folder_identifiers();
+ Dictionary ret;
const CountryInstance* country = game_singleton->get_viewed_country();
if (country == nullptr) {
ret[tech_school_key] = String("traditional_academic");
- ret[tech_school_mod_values] = Array {};
+ ret[tech_school_mod_values] = PackedFloat32Array {};
+ ret[tech_school_mod_icons] = PackedInt32Array {};
+ ret[tech_school_mod_tt] = PackedStringArray {};
+ ret[current_research_tech] = "";
+ ret[current_research_cat] = "";
+ ret[researched_technologies_key] = PackedStringArray {};
return ret;
}
+
+ std::vector<std::string_view> tech_folder_identifiers = game_singleton->get_definition_manager().get_research_manager().get_technology_manager().get_technology_folder_identifiers();
+
ret[tech_school_key] = Utilities::std_to_godot_string(country->get_tech_school() == nullptr ? "traditional_academic" : country->get_tech_school()->get_identifier());
static const auto bonus_suffix = "_research_bonus";
@@ -1058,7 +1088,7 @@ godot::Dictionary MenuSingleton::get_technology_menu_info() const {
return std::find(tech_folder_identifiers.begin(), tech_folder_identifiers.end(), tempA) < std::find(tech_folder_identifiers.begin(), tech_folder_identifiers.end(), tempB);
};
- std::vector<std::pair<std::string_view, fixed_point_t>> school_modifiers;
+ std::vector<std::pair<std::string_view, fixed_point_t>> school_modifiers {};
if (country->get_tech_school() != nullptr) {
for (auto effect : country->get_tech_school()->get_values()) {
if (!effect.first->get_identifier().starts_with("unciv")) {
@@ -1072,30 +1102,37 @@ godot::Dictionary MenuSingleton::get_technology_menu_info() const {
}
}
- Array school_modifier_values {};
- Array school_modifier_icons {};
- Array school_modifier_tt {};
+ PackedFloat32Array school_modifier_values {};
+ PackedInt32Array school_modifier_icons {};
+ PackedStringArray school_modifier_tt {};
for (auto modifier : school_modifiers) {
- size_t folder_id = std::find(tech_folder_identifiers.begin(), tech_folder_identifiers.end(), modifier.first.substr(0, modifier.first.find(bonus_suffix))) - tech_folder_identifiers.begin();
+ int32_t folder_id = std::find(tech_folder_identifiers.begin(), tech_folder_identifiers.end(), modifier.first.substr(0, modifier.first.find(bonus_suffix))) - tech_folder_identifiers.begin();
school_modifier_values.push_back(modifier.second.to_float());
school_modifier_icons.push_back(1 + folder_id);
school_modifier_tt.push_back(make_modifier_effect_tooltip(**game_singleton->get_definition_manager().get_modifier_manager().get_modifier_effect_cache().get_research_bonus_effects().get_item_by_key(*game_singleton->get_definition_manager().get_research_manager().get_technology_manager().get_technology_folder_by_index(folder_id)), modifier.second));
}
- ret[tech_school_mod_values] = school_modifier_values;
- ret[tech_school_mod_icons] = school_modifier_icons;
- ret[tech_school_mod_tt] = school_modifier_tt;
+ ret[tech_school_mod_values] = std::move(school_modifier_values);
+ ret[tech_school_mod_icons] = std::move(school_modifier_icons);
+ ret[tech_school_mod_tt] = std::move(school_modifier_tt);
Technology const* current_research = country->get_current_research();
if (current_research != nullptr) {
ret[current_research_tech] = Utilities::std_to_godot_string(current_research->get_identifier());
ret[current_research_cat] = tr(Utilities::std_to_godot_string(current_research->get_area().get_folder().get_identifier())) + ", " + tr(Utilities::std_to_godot_string(current_research->get_area().get_identifier()));
} else {
- ret[current_research_tech] = tr("TECHNOLOGYVIEW_NO_RESEARCH");
- ret[current_research_cat] = "";
+ ret[current_research_tech] = String("");
+ ret[current_research_cat] = String("");
+ }
+
+ PackedStringArray researched_technologies {};
+ for (Technology const& tech : game_singleton->get_definition_manager().get_research_manager().get_technology_manager().get_technologies()) {
+ if (country->is_technology_unlocked(tech))
+ researched_technologies.push_back(Utilities::std_to_godot_string(tech.get_identifier()));
}
+ ret[researched_technologies_key] = std::move(researched_technologies);
return ret;
} \ No newline at end of file
diff --git a/game/src/Game/GameSession/NationManagementScreen/TechnologyMenu.gd b/game/src/Game/GameSession/NationManagementScreen/TechnologyMenu.gd
index 8498621..ed570da 100644
--- a/game/src/Game/GameSession/NationManagementScreen/TechnologyMenu.gd
+++ b/game/src/Game/GameSession/NationManagementScreen/TechnologyMenu.gd
@@ -5,6 +5,10 @@ var _active : bool = false
const _screen : NationManagement.Screen = NationManagement.Screen.TECHNOLOGY
var _tech_defines : Dictionary = MenuSingleton.get_technology_menu_defines()
+var _tech_folders : PackedStringArray
+var _tech_areas : Array
+var _technologies : Array
+var _folder_tech_counts : PackedInt32Array
var _tech_folder_buttons : Array
var _tech_folder_progressbars : Array
@@ -33,16 +37,18 @@ func _ready() -> void:
_current_research_cat_label = get_gui_label_from_nodepath(^"./country_technology/research_progress_category")
_current_research_progressbar = get_gui_progress_bar_from_nodepath(^"./country_technology/research_progress")
- var tech_folders : Array = _tech_defines.get("tech_folders")
- var tech_areas : Array = _tech_defines.get("tech_areas")
- for i in range(tech_folders.size()):
+ _tech_folders = _tech_defines.get("tech_folders")
+ _tech_areas = _tech_defines.get("tech_areas")
+ _technologies = _tech_defines.get("technologies")
+ _folder_tech_counts = _tech_defines.get("folder_tech_count")
+ for i in range(_tech_folders.size()):
add_gui_element("country_technology", "folder_window")
var folder_node = get_node(^"./folder_window")
var root_node = get_node(^"./country_technology")
folder_node.reparent(root_node)
- folder_node.name = tech_folders[i] + "_folder"
+ folder_node.name = _tech_folders[i] + "_folder"
var pos = GUINode.get_gui_position("country_technology", "folder_offset")
pos.x += folder_node.get_size().x * i
@@ -54,23 +60,23 @@ func _ready() -> void:
var title = GUINode.get_gui_label_from_node(folder_node.get_node(^"./folder_category"))
if title:
- title.set_text(tr(tech_folders[i]))
+ title.set_text(tr(_tech_folders[i]))
var button = GUINode.get_gui_icon_button_from_node(folder_node.get_node(^"./folder_button"))
var button_tooltip: String = tr("TECHNOLOGYVIEW_SHOW_FOLDER_TOOLTIP")
- var button_dict: Dictionary = { "FOLDER" : tech_folders[i] }
+ var button_dict: Dictionary = { "FOLDER" : _tech_folders[i] }
if button:
if i == 0:
button.set_icon_index(2)
- button.pressed.connect(
+ button.pressed.connect( # change selected technology area
func() -> void:
_tech_folder_buttons[_selected_folder].set_icon_index(1)
- for x in range(tech_areas[_selected_folder].size()):
- root_node.get_node("./" + tech_areas[_selected_folder][x]).visible = false
+ for x in range(_tech_areas[_selected_folder].size()):
+ root_node.get_node("./" + _tech_areas[_selected_folder][x]).visible = false
_selected_folder = i
button.set_icon_index(2)
- for x in range(tech_areas[_selected_folder].size()):
- root_node.get_node("./" + tech_areas[_selected_folder][x]).visible = true
+ for x in range(_tech_areas[_selected_folder].size()):
+ root_node.get_node("./" + _tech_areas[_selected_folder][x]).visible = true
)
button.set_tooltip_string_and_substitution_dict(button_tooltip, button_dict)
_tech_folder_buttons.push_back(button)
@@ -84,14 +90,15 @@ func _ready() -> void:
if discovered:
_tech_folder_number_discovered_labels.push_back(discovered)
- var folder_areas : Array = tech_areas[i]
+ # areas
+ var folder_areas : PackedStringArray = _tech_areas[i]
for area_index in range(folder_areas.size()):
add_gui_element("country_technology", "tech_group")
var area_node = get_node(^"./tech_group")
area_node.reparent(root_node)
- area_node.name = tech_areas[i][area_index]
+ area_node.name = folder_areas[area_index]
if i != 0:
area_node.set_visible(false)
@@ -101,7 +108,25 @@ func _ready() -> void:
var area_title = GUINode.get_gui_label_from_node(area_node.get_node(^"./group_name"))
if area_title:
- area_title.set_text(tr(tech_areas[i][area_index]))
+ area_title.set_text(tr(folder_areas[area_index]))
+
+ # technologies
+ var area_technologies : PackedStringArray = _technologies[i][area_index]
+ for tech_index in range(area_technologies.size()):
+ add_gui_element("country_technology", "tech_window")
+
+ var tech_node = get_node(^"./tech_window")
+
+ tech_node.reparent(area_node)
+ tech_node.name = area_technologies[tech_index]
+
+ pos = GUINode.get_gui_position("country_technology", "tech_offset")
+ pos.y += tech_node.get_size().y * tech_index
+ tech_node.set_position(pos)
+
+ var tech_name = GUINode.get_gui_label_from_node(tech_node.get_node(^"./tech_name"))
+ if tech_name:
+ tech_name.set_text(tr(area_technologies[tech_index]))
var close_button : GUIIconButton = get_gui_icon_button_from_nodepath(^"./country_technology/close_button")
if close_button:
@@ -126,9 +151,9 @@ func _update_info() -> void:
_tech_school.set_text(info.get("tech_school"))
if _tech_school_modifiers:
- var mod_values : Array = info.get("tech_school_mod_values")
- var mod_icons : Array = info.get("tech_school_mod_icons")
- var mod_tooltips : Array = info.get("tech_school_mod_tt")
+ var mod_values : PackedFloat32Array = info.get("tech_school_mod_values")
+ var mod_icons : PackedInt32Array = info.get("tech_school_mod_icons")
+ var mod_tooltips : PackedStringArray = info.get("tech_school_mod_tt")
var mod_count = mod_values.size()
_tech_school_modifiers.set_child_count(mod_count)
for i in range(mod_count):
@@ -141,12 +166,44 @@ func _update_info() -> void:
plusminus_icon.mouse_filter = Control.MOUSE_FILTER_PASS
plusminus_icon.set_tooltip_string(mod_tooltips[i])
+ var current_research : String = info.get("current_research_tech")
if _current_research_label:
- _current_research_label.set_text(info.get("current_research_tech"))
+ if current_research != "":
+ _current_research_label.set_text(tr(current_research))
+ else:
+ _current_research_label.set_text(tr("TECHNOLOGYVIEW_NO_RESEARCH"))
if _current_research_cat_label:
_current_research_cat_label.set_text(info.get("current_research_cat"))
+ if _current_research_progressbar:
+ if current_research != "":
+ _current_research_progressbar.set_tooltip_string_and_substitution_dict(tr("TECHNOLOGYVIEW_RESEARCH_TOOLTIP"), {"TECH": tr(current_research), "DATE": MenuSingleton.get_longform_date()})
+ else:
+ _current_research_progressbar.set_tooltip_string(tr("TECHNOLOGYVIEW_NO_RESEARCH_TOOLTIP"))
+
+ var researched_techs : PackedStringArray = info.get("researched_technologies")
+ for ix in range(_technologies.size()):
+ var folder_number_discovered = 0
+ for iy in range(_technologies[ix].size()):
+ for iz in range(_technologies[ix][iy].size()):
+ var tech_identifier = _technologies[ix][iy][iz]
+ var tech = get_gui_icon_button_from_nodepath("./country_technology/{y}/{z}/start_research".format({"y":_tech_areas[ix][iy], "z":tech_identifier}))
+ if tech:
+ if (researched_techs.has(tech_identifier)):
+ tech.set_icon_index(2)
+ folder_number_discovered += 1
+ elif current_research == tech_identifier:
+ tech.set_icon_index(1)
+ else:
+ tech.set_icon_index(4)
+ var label: GUILabel = _tech_folder_number_discovered_labels[ix]
+ if label:
+ label.set_text("{r}/{a}".format({"r":folder_number_discovered,"a":_folder_tech_counts[ix]}))
+ var progbar: GUIProgressBar = _tech_folder_progressbars[ix]
+ if progbar:
+ progbar.value = float(folder_number_discovered) / float(_folder_tech_counts[ix])
+
show()
else:
hide()