aboutsummaryrefslogtreecommitdiff
path: root/extension/src/openvic-extension/GameSingleton.hpp
blob: 2a72e2f3636a3718cfba848b5760139856ffb6be (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
#pragma once

#include <godot_cpp/classes/image_texture.hpp>
#include <godot_cpp/classes/texture2d_array.hpp>

#include <openvic-simulation/GameManager.hpp>
#include <openvic-simulation/dataloader/Dataloader.hpp>

namespace OpenVic {

   struct TerrainVariant : HasIdentifier {
      friend class GameSingleton;

   private:
      const godot::Ref<godot::Image> image;

      TerrainVariant(const std::string_view new_identfier, godot::Ref<godot::Image> const& new_image);

   public:
      static constexpr size_t MAX_TERRIN_VARIANT_COUNT = 1 << (8 * sizeof(TerrainTypeMapping::index_t));

      TerrainVariant(TerrainVariant&&) = default;

      godot::Ref<godot::Image> get_image() const;
   };

   class GameSingleton : public godot::Object {
      GDCLASS(GameSingleton, godot::Object)

      static GameSingleton* singleton;

      GameManager game_manager;
      Dataloader dataloader;

      godot::Vector2i image_subdivisions;
      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;
      IdentifierRegistry<TerrainVariant> terrain_variants;
      godot::Ref<godot::Texture2DArray> terrain_texture;

      godot::Error _generate_terrain_texture_array();
      godot::Error _load_map_images(godot::String const& province_image_path, godot::String const& terrain_image_path, bool flip_vertical = false);

      godot::Error _load_terrain_variants_compatibility_mode(godot::String const& terrain_image_path, godot::String const& terrain_texturesheet_path);

      /* Generate the province_colour_texture from the current mapmode.
       */
      godot::Error _update_colour_image();
      void _on_state_updated();

      godot::Dictionary _distribution_to_dictionary(distribution_t const& dist) const;

   protected:
      static void _bind_methods();

   public:
      static void draw_pie_chart(godot::Ref<godot::Image> image,
         godot::Array const& stopAngles, godot::Array const& colours, float radius,
         godot::Vector2 shadow_displacement, float shadow_tightness, float shadow_radius, float shadow_thickness,
         godot::Color trim_colour, float trim_size, float gradient_falloff, float gradient_base,
         bool donut, bool donut_inner_trim, float donut_inner_radius);
      static godot::Ref<godot::Image> load_image(godot::String const& path);

      static GameSingleton* get_singleton();

      GameSingleton();
      ~GameSingleton();

      static void setup_logger();

      /* Load the game's defines in compatiblity mode from the filepath
       * pointing to the defines folder.
       */
      godot::Error load_defines_compatibility_mode(godot::PackedStringArray const& file_paths);

      godot::String lookup_file(godot::String const& path) const;

      /* Post-load/restart game setup - reset the game to post-load state
       * and (re)generate starting data, e.g. buildings.
       */
      godot::Error setup_game();

      int32_t get_province_index_from_uv_coords(godot::Vector2 const& coords) const;

      static godot::StringName const& get_province_info_province_key();
      static godot::StringName const& get_province_info_region_key();
      static godot::StringName const& get_province_info_life_rating_key();
      static godot::StringName const& get_province_info_total_population_key();
      static godot::StringName const& get_province_info_pop_types_key();
      static godot::StringName const& get_province_info_pop_ideologies_key();
      static godot::StringName const& get_province_info_pop_cultures_key();
      static godot::StringName const& get_province_info_rgo_key();
      static godot::StringName const& get_province_info_buildings_key();

      static godot::StringName const& get_building_info_building_key();
      static godot::StringName const& get_building_info_level_key();
      static godot::StringName const& get_building_info_expansion_state_key();
      static godot::StringName const& get_building_info_start_date_key();
      static godot::StringName const& get_building_info_end_date_key();
      static godot::StringName const& get_building_info_expansion_progress_key();

      static godot::StringName const& get_piechart_info_size_key();
      static godot::StringName const& get_piechart_info_colour_key();

      /* Get info to display in Province Overview Panel, packaged in
       * a Dictionary using the StringNames above as keys.
       */
      godot::Dictionary get_province_info_from_index(int32_t index) const;

      int32_t get_width() const;
      int32_t get_height() const;
      float get_aspect_ratio() const;

      /* The cosmetic terrain textures stored in a Texture2DArray.
       */
      godot::Ref<godot::Texture> get_terrain_texture() const;

      /* Number of (vertical, horizontal) subdivisions the province shape image
       * was split into when making the province_shape_texture to ensure no
       * piece had a dimension greater than 16383.
       */
      godot::Vector2i get_province_shape_image_subdivisions() const;

      /* The map, encoded in RGB8 with RG representing province index and B representing terrain texture.
       * To support a wider range of GPUs, the image is divided so that no piece has a dimension
       * greater than 16383 and the pieces are stored in a Texture2DArray.
       */
      godot::Ref<godot::Texture> get_province_shape_texture() const;

      /* The colour each province should be tinted, arranged in
       * index order into a 256x256 RGB8 texture.
       */
      godot::Ref<godot::Texture> get_province_colour_texture() const;

      int32_t get_mapmode_count() const;
      godot::String get_mapmode_identifier(int32_t index) const;
      godot::Error set_mapmode(godot::String const& identifier);
      int32_t get_selected_province_index() const;
      void set_selected_province(int32_t index);

      godot::Error expand_building(int32_t province_index, godot::String const& building_type_identifier);

      void set_paused(bool paused);
      void toggle_paused();
      bool is_paused() const;
      void increase_speed();
      void decrease_speed();
      bool can_increase_speed() const;
      bool can_decrease_speed() const;
      godot::String get_longform_date() const;
      void try_tick();
   };
}