aboutsummaryrefslogtreecommitdiff
path: root/extension
diff options
context:
space:
mode:
author Hop311 <Hop3114@gmail.com>2024-05-09 23:32:18 +0200
committer GitHub <noreply@github.com>2024-05-09 23:32:18 +0200
commitb0a533f945bbc6201fd7df4bc60746cb98efaba4 (patch)
tree56c84e804b11a271e15f38e64d5b3727c636b474 /extension
parentf57bbe6604a237c9fea52aec43641585d0b24568 (diff)
parenta3ef8c1ad72f7e839e073679f374195681208837 (diff)
Merge pull request #228 from OpenVicProject/menu-tweaks
Topbar display data + Population menu rebel icons
Diffstat (limited to 'extension')
-rw-r--r--extension/src/openvic-extension/classes/GUINode.cpp26
-rw-r--r--extension/src/openvic-extension/classes/GUINode.hpp5
-rw-r--r--extension/src/openvic-extension/singletons/PopulationMenu.cpp43
-rw-r--r--extension/src/openvic-extension/utility/Utilities.cpp26
-rw-r--r--extension/src/openvic-extension/utility/Utilities.hpp8
5 files changed, 81 insertions, 27 deletions
diff --git a/extension/src/openvic-extension/classes/GUINode.cpp b/extension/src/openvic-extension/classes/GUINode.cpp
index c9af7e2..452efc8 100644
--- a/extension/src/openvic-extension/classes/GUINode.cpp
+++ b/extension/src/openvic-extension/classes/GUINode.cpp
@@ -84,8 +84,9 @@ void GUINode::_bind_methods() {
OV_BIND_METHOD(GUINode::hide_node, { "path" });
OV_BIND_METHOD(GUINode::hide_nodes, { "paths" });
- OV_BIND_SMETHOD(int_to_formatted_string, { "val" });
- OV_BIND_SMETHOD(float_to_formatted_string, { "val", "decimal_places" });
+ OV_BIND_SMETHOD(int_to_string_suffixed, { "val" });
+ OV_BIND_SMETHOD(float_to_string_suffixed, { "val" });
+ OV_BIND_SMETHOD(float_to_string_dp, { "val", "decimal_places" });
OV_BIND_SMETHOD(format_province_name, { "province_identifier" });
}
@@ -221,17 +222,26 @@ Error GUINode::hide_nodes(TypedArray<NodePath> const& paths) const {
return ret;
}
-String GUINode::int_to_formatted_string(int64_t val) {
- return Utilities::int_to_formatted_string(val);
+String GUINode::int_to_string_suffixed(int64_t val) {
+ return Utilities::int_to_string_suffixed(val);
}
-String GUINode::float_to_formatted_string(float val, int32_t decimal_places) {
- return Utilities::float_to_formatted_string(val, decimal_places);
+String GUINode::float_to_string_suffixed(float val) {
+ return Utilities::float_to_string_suffixed(val);
+}
+
+String GUINode::float_to_string_dp(float val, int32_t decimal_places) {
+ return Utilities::float_to_string_dp(val, decimal_places);
}
String GUINode::format_province_name(String const& province_identifier) {
- static const String province_prefix = "PROV";
- return province_prefix + province_identifier;
+ if (!province_identifier.is_empty()) {
+ static const String province_prefix = "PROV";
+ return province_prefix + province_identifier;
+ } else {
+ static const String no_province = "NO PROVINCE";
+ return no_province;
+ }
}
Ref<BitMap> GUINode::get_click_mask() const {
diff --git a/extension/src/openvic-extension/classes/GUINode.hpp b/extension/src/openvic-extension/classes/GUINode.hpp
index 8d926cc..60c0050 100644
--- a/extension/src/openvic-extension/classes/GUINode.hpp
+++ b/extension/src/openvic-extension/classes/GUINode.hpp
@@ -85,8 +85,9 @@ namespace OpenVic {
godot::Error hide_node(godot::NodePath const& path) const;
godot::Error hide_nodes(godot::TypedArray<godot::NodePath> const& paths) const;
- static godot::String int_to_formatted_string(int64_t val);
- static godot::String float_to_formatted_string(float val, int32_t decimal_places);
+ static godot::String int_to_string_suffixed(int64_t val);
+ static godot::String float_to_string_suffixed(float val);
+ static godot::String float_to_string_dp(float val, int32_t decimal_places);
static godot::String format_province_name(godot::String const& province_identifier);
godot::Ref<godot::BitMap> get_click_mask() const;
diff --git a/extension/src/openvic-extension/singletons/PopulationMenu.cpp b/extension/src/openvic-extension/singletons/PopulationMenu.cpp
index a598ceb..609142a 100644
--- a/extension/src/openvic-extension/singletons/PopulationMenu.cpp
+++ b/extension/src/openvic-extension/singletons/PopulationMenu.cpp
@@ -400,6 +400,18 @@ void MenuSingleton::_population_menu_update_filtered_pops() {
_population_menu_sort_pops();
}
+template<std::derived_from<HasIdentifier> T>
+static bool compare_translated_identifiers(Object const& object, T const& lhs, T const& rhs) {
+ return object.tr(std_view_to_godot_string(lhs.get_identifier()))
+ < object.tr(std_view_to_godot_string(rhs.get_identifier()));
+}
+
+template<std::derived_from<HasIdentifier> T>
+static bool compare_translated_identifiers(Object const& object, T const* lhs, T const* rhs) {
+ return (lhs != nullptr ? object.tr(std_view_to_godot_string(lhs->get_identifier())) : godot::String {})
+ < (rhs != nullptr ? object.tr(std_view_to_godot_string(rhs->get_identifier())) : godot::String {});
+}
+
MenuSingleton::sort_func_t MenuSingleton::_get_population_menu_sort_func(population_menu_t::PopSortKey sort_key) const {
using enum population_menu_t::PopSortKey;
switch (sort_key) {
@@ -409,23 +421,19 @@ MenuSingleton::sort_func_t MenuSingleton::_get_population_menu_sort_func(populat
};
case SORT_TYPE:
return [this](Pop const* a, Pop const* b) -> bool {
- return tr(std_view_to_godot_string(a->get_type().get_identifier()))
- < tr(std_view_to_godot_string(b->get_type().get_identifier()));
+ return compare_translated_identifiers(*this, a->get_type(), b->get_type());
};
case SORT_CULTURE:
return [this](Pop const* a, Pop const* b) -> bool {
- return tr(std_view_to_godot_string(a->get_culture().get_identifier()))
- < tr(std_view_to_godot_string(b->get_culture().get_identifier()));
+ return compare_translated_identifiers(*this, a->get_culture(), b->get_culture());
};
case SORT_RELIGION:
return [this](Pop const* a, Pop const* b) -> bool {
- return tr(std_view_to_godot_string(a->get_religion().get_identifier()))
- < tr(std_view_to_godot_string(b->get_religion().get_identifier()));
+ return compare_translated_identifiers(*this, a->get_religion(), b->get_religion());
};
case SORT_LOCATION:
return [this](Pop const* a, Pop const* b) -> bool {
- return tr(a->get_location() != nullptr ? std_view_to_godot_string(a->get_location()->get_identifier()) : String {})
- < tr(b->get_location() != nullptr ? std_view_to_godot_string(b->get_location()->get_identifier()) : String {});
+ return compare_translated_identifiers(*this, a->get_location(), b->get_location());
};
case SORT_MILITANCY:
return [](Pop const* a, Pop const* b) -> bool {
@@ -464,7 +472,11 @@ MenuSingleton::sort_func_t MenuSingleton::_get_population_menu_sort_func(populat
return a->get_luxury_needs_fulfilled() < b->get_luxury_needs_fulfilled();
};
case SORT_REBEL_FACTION:
- return [](Pop const* a, Pop const* b) -> bool { return false; }; // TODO - implement
+ return [this](Pop const* a, Pop const* b) -> bool {
+ // TODO - include country adjective for [pan-]nationalist rebels
+ // TODO - handle social/political reform movements
+ return compare_translated_identifiers(*this, a->get_rebel_type(), b->get_rebel_type());
+ };
case SORT_SIZE_CHANGE:
return [](Pop const* a, Pop const* b) -> bool {
return a->get_total_change() < b->get_total_change();
@@ -566,7 +578,10 @@ TypedArray<Dictionary> MenuSingleton::get_population_menu_pop_rows(int32_t start
static const StringName pop_luxury_needs_key = "luxury_needs";
// TODO - goods not available on market or goods not affordale + price (for all 3 needs types)
- // TODO - rebel faction icon and name/description
+ static const StringName pop_rebel_icon_key = "rebel_icon";
+ // TODO - rebel faction name/description
+ // TODO - icons for social/political reform movements
+ // TODO - flags for country-related rebels
static const StringName pop_size_change_key = "size_change";
// TODO - size change breakdown
@@ -585,8 +600,9 @@ TypedArray<Dictionary> MenuSingleton::get_population_menu_pop_rows(int32_t start
pop_dict[pop_type_icon_key] = pop->get_type().get_sprite();
pop_dict[pop_culture_key] = std_view_to_godot_string(pop->get_culture().get_identifier());
pop_dict[pop_religion_icon_key] = pop->get_religion().get_icon();
- pop_dict[pop_location_key] =
- pop->get_location() != nullptr ? std_view_to_godot_string(pop->get_location()->get_identifier()) : String {};
+ if (pop->get_location() != nullptr) {
+ pop_dict[pop_location_key] = std_view_to_godot_string(pop->get_location()->get_identifier());
+ }
pop_dict[pop_militancy_key] = pop->get_militancy().to_float();
pop_dict[pop_consciousness_key] = pop->get_consciousness().to_float();
pop_dict[pop_ideology_key] = GFXPieChartTexture::distribution_to_slices_array(pop->get_ideologies());
@@ -596,6 +612,9 @@ TypedArray<Dictionary> MenuSingleton::get_population_menu_pop_rows(int32_t start
pop_dict[pop_life_needs_key] = pop->get_life_needs_fulfilled().to_float();
pop_dict[pop_everyday_needs_key] = pop->get_everyday_needs_fulfilled().to_float();
pop_dict[pop_luxury_needs_key] = pop->get_luxury_needs_fulfilled().to_float();
+ if (pop->get_rebel_type() != nullptr) {
+ pop_dict[pop_rebel_icon_key] = pop->get_rebel_type()->get_icon();
+ }
pop_dict[pop_size_change_key] = pop->get_total_change();
pop_dict[pop_literacy_key] = pop->get_literacy().to_float();
diff --git a/extension/src/openvic-extension/utility/Utilities.cpp b/extension/src/openvic-extension/utility/Utilities.cpp
index 4389e95..694b658 100644
--- a/extension/src/openvic-extension/utility/Utilities.cpp
+++ b/extension/src/openvic-extension/utility/Utilities.cpp
@@ -13,7 +13,7 @@ using namespace OpenVic;
/* Int to 2 decimal place string in terms of the largest suffix less than or equal to it,
* or normal integer string if less than the smallest suffix. */
-String Utilities::int_to_formatted_string(int64_t val) {
+String Utilities::int_to_string_suffixed(int64_t val) {
static const std::vector<std::pair<int64_t, String>> suffixes {
{ 1'000'000'000'000, "T" },
{ 1'000'000'000, "B" },
@@ -36,8 +36,30 @@ String Utilities::int_to_formatted_string(int64_t val) {
return (negative ? "-" : "") + String::num_int64(val);
}
+String Utilities::float_to_string_suffixed(float val) {
+ const float abs_val = std::abs(val);
+
+ if (abs_val < 10'000.0f) {
+ return float_to_string_dp(val, 1);
+ }
+
+ if (abs_val < 1'000'000.0f) {
+ return float_to_string_dp(val / 1'000.0f, 2) + "k";
+ }
+
+ if (abs_val < 1'000'000'000.0f) {
+ return float_to_string_dp(val / 1'000'000.0f, 2) + "M";
+ }
+
+ if (abs_val < 1'000'000'000'000.0f) {
+ return float_to_string_dp(val / 1'000'000'000.0f, 2) + "B";
+ }
+
+ return float_to_string_dp(val / 1'000'000'000'000.0f, 2) + "T";
+}
+
/* Float to string formatted with the specified number of decimal places. */
-String Utilities::float_to_formatted_string(float val, int32_t decimal_places) {
+String Utilities::float_to_string_dp(float val, int32_t decimal_places) {
return String::num(val, decimal_places).pad_decimals(decimal_places);
}
diff --git a/extension/src/openvic-extension/utility/Utilities.hpp b/extension/src/openvic-extension/utility/Utilities.hpp
index 15ff6b6..0cd9edc 100644
--- a/extension/src/openvic-extension/utility/Utilities.hpp
+++ b/extension/src/openvic-extension/utility/Utilities.hpp
@@ -33,9 +33,11 @@ namespace OpenVic::Utilities {
return std_to_godot_string_name(static_cast<std::string>(str));
}
- godot::String int_to_formatted_string(int64_t val);
+ godot::String int_to_string_suffixed(int64_t val);
- godot::String float_to_formatted_string(float val, int32_t decimal_places);
+ godot::String float_to_string_suffixed(float val);
+
+ godot::String float_to_string_dp(float val, int32_t decimal_places);
constexpr real_t to_real_t(std::floating_point auto val) {
return static_cast<real_t>(val);
@@ -83,4 +85,4 @@ namespace OpenVic::Utilities {
namespace literals {
constexpr real_t operator""_real(long double val) { return to_real_t(val); }
}
-} \ No newline at end of file
+}