aboutsummaryrefslogtreecommitdiff
path: root/extension/src
diff options
context:
space:
mode:
Diffstat (limited to 'extension/src')
-rw-r--r--extension/src/openvic-extension/classes/GFXPieChartTexture.hpp73
-rw-r--r--extension/src/openvic-extension/singletons/MenuSingleton.cpp10
-rw-r--r--extension/src/openvic-extension/singletons/PopulationMenu.cpp19
3 files changed, 54 insertions, 48 deletions
diff --git a/extension/src/openvic-extension/classes/GFXPieChartTexture.hpp b/extension/src/openvic-extension/classes/GFXPieChartTexture.hpp
index 69330a4..50616d9 100644
--- a/extension/src/openvic-extension/classes/GFXPieChartTexture.hpp
+++ b/extension/src/openvic-extension/classes/GFXPieChartTexture.hpp
@@ -11,6 +11,7 @@ namespace OpenVic {
GDCLASS(GFXPieChartTexture, godot::ImageTexture)
public:
+ using godot_pie_chart_data_t = godot::TypedArray<godot::Dictionary>;
struct slice_t {
godot::String name;
godot::Color colour;
@@ -29,56 +30,44 @@ namespace OpenVic {
godot::Error _generate_pie_chart_image();
- protected:
- static void _bind_methods();
-
public:
- GFXPieChartTexture();
-
- // Position must be centred and normalised so that coords are in [-1, 1].
- slice_t const* get_slice(godot::Vector2 const& position) const;
-
- using godot_pie_chart_data_t = godot::TypedArray<godot::Dictionary>;
-
- /* Set slices given an Array of Dictionaries, each with the following key-value entries:
- * - colour: Color
- * - weight: float */
- godot::Error set_slices_array(godot_pie_chart_data_t const& new_slices);
-
/* Generate slice data from a distribution of objects satisfying HasGetIdentifierAndGetColour, sorted by their weight.
* The resulting Array of Dictionaries can be used as an argument for set_slices_array. */
template<typename Container>
static godot_pie_chart_data_t distribution_to_slices_array(Container const& dist)
requires(
(
- /* fixed_point_map_t<T const*>, T derived from HasIdentifierAndColour */
- utility::is_specialization_of_v<Container, tsl::ordered_map> &&
- HasGetIdentifierAndGetColour<std::remove_pointer_t<typename Container::key_type>> &&
- std::is_same_v<typename Container::mapped_type, fixed_point_t>
- ) || (
- /* IndexedMap<T, fixed_point_t>, T derived from HasIdentifierAndColour */
- utility::is_specialization_of_v<Container, IndexedMap> &&
- HasGetIdentifierAndGetColour<typename Container::key_type> &&
- std::is_same_v<typename Container::value_t, fixed_point_t>
+ /* ordered_map<T const*, mapped_type>, T derived from HasIdentifierAndColour */
+ utility::is_specialization_of_v<Container, tsl::ordered_map>
+ /* IndexedMap<T, mapped_type>, T derived from HasIdentifierAndColour */
+ || utility::is_specialization_of_v<Container, IndexedMap>
)
+ && HasGetIdentifierAndGetColour<std::remove_pointer_t<typename Container::key_type>>
+ && std::convertible_to<typename Container::mapped_type, float>
) {
using namespace godot;
+
using key_type = std::remove_pointer_t<typename Container::key_type>;
- using entry_t = std::pair<key_type const*, fixed_point_t>;
+ using entry_t = std::pair<key_type const*, float>;
+
std::vector<entry_t> sorted_dist;
+ sorted_dist.reserve(dist.size());
if constexpr (utility::is_specialization_of_v<Container, tsl::ordered_map>) {
- sorted_dist.reserve(dist.size());
- for (entry_t const& entry : dist) {
- ERR_CONTINUE_MSG(
- entry.first == nullptr, vformat("Null distribution key with value %f", entry.second.to_float())
- );
- sorted_dist.push_back(entry);
+ for (auto const& [key, non_float_value] : dist) {
+ const float value = static_cast<float>(non_float_value);
+
+ ERR_CONTINUE_MSG(key == nullptr, vformat("Null distribution key with value %f", value));
+
+ if (value != 0.0f) {
+ sorted_dist.emplace_back(key, value);
+ }
}
} else {
for (size_t index = 0; index < dist.size(); ++index) {
- fixed_point_t const& value = dist[index];
- if (value != 0) {
+ const float value = static_cast<float>(dist[index]);
+
+ if (value != 0.0f) {
key_type const* key = &dist(index);
sorted_dist.emplace_back(key, value);
}
@@ -93,16 +82,30 @@ namespace OpenVic {
ERR_FAIL_COND_V(array.resize(sorted_dist.size()) != OK, {});
for (size_t idx = 0; idx < array.size(); ++idx) {
- auto const& [key, val] = sorted_dist[idx];
+ auto const& [key, value] = sorted_dist[idx];
Dictionary sub_dict;
sub_dict[_slice_identifier_key()] = Utilities::std_to_godot_string(key->get_identifier());
sub_dict[_slice_colour_key()] = Utilities::to_godot_color(key->get_colour());
- sub_dict[_slice_weight_key()] = val.to_float();
+ sub_dict[_slice_weight_key()] = value;
array[idx] = std::move(sub_dict);
}
return array;
}
+ protected:
+ static void _bind_methods();
+
+ public:
+ GFXPieChartTexture();
+
+ // Position must be centred and normalised so that coords are in [-1, 1].
+ slice_t const* get_slice(godot::Vector2 const& position) const;
+
+ /* Set slices given an Array of Dictionaries, each with the following key-value entries:
+ * - colour: Color
+ * - weight: float */
+ godot::Error set_slices_array(godot_pie_chart_data_t const& new_slices);
+
/* Create a GFXPieChartTexture using the specified GFX::PieChart. Returns nullptr if gfx_pie_chart fails. */
static godot::Ref<GFXPieChartTexture> make_gfx_pie_chart_texture(GFX::PieChart const* gfx_pie_chart);
diff --git a/extension/src/openvic-extension/singletons/MenuSingleton.cpp b/extension/src/openvic-extension/singletons/MenuSingleton.cpp
index 8d7f9fe..cabe82b 100644
--- a/extension/src/openvic-extension/singletons/MenuSingleton.cpp
+++ b/extension/src/openvic-extension/singletons/MenuSingleton.cpp
@@ -2,8 +2,10 @@
#include <godot_cpp/variant/utility_functions.hpp>
+#include <openvic-simulation/economy/GoodDefinition.hpp>
#include <openvic-simulation/GameManager.hpp>
#include <openvic-simulation/modifier/Modifier.hpp>
+#include <openvic-simulation/types/fixed_point/FixedPoint.hpp>
#include "openvic-extension/classes/GFXPieChartTexture.hpp"
#include "openvic-extension/classes/GUINode.hpp"
@@ -472,10 +474,10 @@ Dictionary MenuSingleton::get_province_info_from_index(int32_t index) const {
ret[province_info_controller_key] = Utilities::std_to_godot_string(controller->get_identifier());
}
- GoodDefinition const* rgo = province->get_rgo();
- if (rgo != nullptr) {
- ret[province_info_rgo_name_key] = Utilities::std_to_godot_string(rgo->get_identifier());
- ret[province_info_rgo_icon_key] = static_cast<int32_t>(rgo->get_index());
+ GoodDefinition const* const rgo_good = province->get_rgo_good();
+ if (rgo_good != nullptr) {
+ ret[province_info_rgo_name_key] = Utilities::std_to_godot_string(rgo_good->get_identifier());
+ ret[province_info_rgo_icon_key] = static_cast<int32_t>(rgo_good->get_index());
}
Crime const* crime = province->get_crime();
diff --git a/extension/src/openvic-extension/singletons/PopulationMenu.cpp b/extension/src/openvic-extension/singletons/PopulationMenu.cpp
index 0c5a82d..700c57f 100644
--- a/extension/src/openvic-extension/singletons/PopulationMenu.cpp
+++ b/extension/src/openvic-extension/singletons/PopulationMenu.cpp
@@ -4,6 +4,7 @@
#include <openvic-simulation/DefinitionManager.hpp>
#include <openvic-simulation/InstanceManager.hpp>
+#include <openvic-simulation/types/fixed_point/FixedPoint.hpp>
#include "openvic-extension/classes/GFXPieChartTexture.hpp"
#include "openvic-extension/classes/GUINode.hpp"
@@ -366,7 +367,7 @@ Error MenuSingleton::_population_menu_update_pops() {
if (province_entry != nullptr && province_entry->selected) {
for (Pop const& pop : province_entry->province.get_pops()) {
population_menu.pops.push_back(&pop);
- population_menu_t::pop_filter_t& filter = population_menu.pop_filters[&pop.get_type()];
+ population_menu_t::pop_filter_t& filter = population_menu.pop_filters[pop.get_type()];
filter.count += pop.get_size();
// TODO - set filter.promotion_demotion_change
}
@@ -387,7 +388,7 @@ Error MenuSingleton::_population_menu_update_filtered_pops() {
population_menu.vote_distribution.clear();
for (Pop const* pop : population_menu.pops) {
- if (population_menu.pop_filters[&pop->get_type()].selected) {
+ if (population_menu.pop_filters[pop->get_type()].selected) {
population_menu.filtered_pops.push_back(pop);
}
}
@@ -395,12 +396,12 @@ Error MenuSingleton::_population_menu_update_filtered_pops() {
for (Pop const* pop : population_menu.filtered_pops) {
const fixed_point_t pop_size = fixed_point_t::parse(pop->get_size());
- population_menu.workforce_distribution[&pop->get_type()] += pop->get_size();
- population_menu.religion_distribution[&pop->get_religion()] += pop->get_size();
- population_menu.ideology_distribution += pop->get_ideologies() * fixed_point_t::parse(pop->get_size());
- population_menu.culture_distribution[&pop->get_culture()] += pop->get_size();
- population_menu.issue_distribution += pop->get_issues() * fixed_point_t::parse(pop->get_size());
- population_menu.vote_distribution += pop->get_votes() * fixed_point_t::parse(pop->get_size());
+ population_menu.workforce_distribution[pop->get_type()] += pop_size;
+ population_menu.religion_distribution[&pop->get_religion()] += pop_size;
+ population_menu.ideology_distribution += pop->get_ideologies() * pop_size;
+ population_menu.culture_distribution[&pop->get_culture()] += pop_size;
+ population_menu.issue_distribution += pop->get_issues() * pop_size;
+ population_menu.vote_distribution += pop->get_votes() * pop_size;
}
normalise_fixed_point_map(population_menu.workforce_distribution);
@@ -678,7 +679,7 @@ TypedArray<Dictionary> MenuSingleton::get_population_menu_pop_rows(int32_t start
Dictionary pop_dict;
pop_dict[pop_size_key] = pop->get_size();
- pop_dict[pop_type_icon_key] = pop->get_type().get_sprite();
+ pop_dict[pop_type_icon_key] = pop->get_type()->get_sprite();
pop_dict[pop_culture_key] = Utilities::std_to_godot_string(pop->get_culture().get_identifier());
pop_dict[pop_religion_icon_key] = pop->get_religion().get_icon();
if (pop->get_location() != nullptr) {