From d3f3187209cb4085f27f95ce8ad2a77af25704fd Mon Sep 17 00:00:00 2001 From: Hop311 Date: Sun, 23 Apr 2023 19:49:01 +0100 Subject: C++ refactoring + simulation prototype --- game/localisation/en_GB/menus.csv | 9 + game/localisation/en_GB/provinces.csv | 374 ++++++++++++------------ game/localisation/en_GB/regions.csv | 12 +- game/src/Autoload/Events.gd | 9 +- game/src/GameSession/GameSession.gd | 5 +- game/src/GameSession/GameSessionMenu.gd | 1 + game/src/GameSession/GameSpeedPanel.gd | 29 +- game/src/GameSession/MapControlPanel.gd | 6 +- game/src/GameSession/MapView.gd | 21 +- game/src/GameSession/ProvinceOverviewPanel.gd | 82 +++++- game/src/GameSession/ProvinceOverviewPanel.tscn | 14 +- 11 files changed, 320 insertions(+), 242 deletions(-) (limited to 'game') diff --git a/game/localisation/en_GB/menus.csv b/game/localisation/en_GB/menus.csv index 33e5c42..c637a39 100644 --- a/game/localisation/en_GB/menus.csv +++ b/game/localisation/en_GB/menus.csv @@ -63,3 +63,12 @@ GAMESESSIONMENU_QUIT_DIALOG_TEXT,Are you sure you want to quit and return to des DIALOG_OK,OK DIALOG_CANCEL,Cancel + +,, Province Overview Panel +province_MISSING,No Province +region_MISSING,No Region +building_MISSING,No Building +building_fort,Fort +building_naval_base,Naval Base +building_railroad,Railroad +EXPAND_PROVINCE_BUILDING,Expand diff --git a/game/localisation/en_GB/provinces.csv b/game/localisation/en_GB/provinces.csv index 814b4f9..8f1679d 100644 --- a/game/localisation/en_GB/provinces.csv +++ b/game/localisation/en_GB/provinces.csv @@ -1,51 +1,51 @@ ,, Europe -prov_britain_NAME,Britain -prov_ireland_NAME,Ireland -prov_iceland_NAME,Iceland -prov_corsica_NAME,Corsica -prov_sardinia_NAME,Sardinia -prov_sicily_NAME,Sicily -prov_malta_NAME,Malta -prov_cyprus_NAME,Cyprus -prov_greenland_NAME,Greenland -prov_baleares_NAME,Balearic Islands -prov_gotland_NAME,Gotland -prov_crete_NAME,Crete -prov_jan_mayen_NAME,Jan Mayen -prov_faroes_NAME,Faroe Islands -prov_mann_NAME,Isle of Mann -prov_shetlands_NAME,Shetlands -prov_orkney_NAME,Orkney -prov_channel_islands_NAME,Channel Islands -prov_madiera_NAME,Madiera -prov_canarias_NAME,Canarias -prov_sjaeland_NAME,Sjaeland -prov_bornholm_NAME,Bornholm -prov_bear_island_NAME,Bear Island -prov_pantelleria_NAME,Pantelleria -prov_iberia_NAME,Iberia -prov_scandinavia_NAME,Scandinavia -prov_jutland_NAME,Jutland -prov_fyn_NAME,Fyn -prov_hiiumaa_NAME,Hiiumaa -prov_saaremaa_NAME,Saaremaa -prov_italy_NAME,Italy -prov_elba_NAME,Elba -prov_france_NAME,France -prov_netherlands_NAME,Netherlands -prov_belgium_NAME,Belgium -prov_luxembourg_NAME,Luxembourg -prov_switzerland_NAME,Switzerland -prov_balkans_NAME,Balkans -prov_crimea_NAME,Crimea -prov_germany_NAME,Germany -prov_poland_NAME,Poland -prov_baltics_NAME,Baltics -prov_finland_NAME,Finland -prov_aland_NAME,Åland -prov_ukraine_NAME,Ukraine -prov_russia_NAME,Russia +prov_britain,Britain +prov_ireland,Ireland +prov_iceland,Iceland +prov_corsica,Corsica +prov_sardinia,Sardinia +prov_sicily,Sicily +prov_malta,Malta +prov_cyprus,Cyprus +prov_greenland,Greenland +prov_baleares,Balearic Islands +prov_gotland,Gotland +prov_crete,Crete +prov_jan_mayen,Jan Mayen +prov_faroes,Faroe Islands +prov_mann,Isle of Mann +prov_shetlands,Shetlands +prov_orkney,Orkney +prov_channel_islands,Channel Islands +prov_madiera,Madiera +prov_canarias,Canarias +prov_sjaeland,Sjaeland +prov_bornholm,Bornholm +prov_bear_island,Bear Island +prov_pantelleria,Pantelleria +prov_iberia,Iberia +prov_scandinavia,Scandinavia +prov_jutland,Jutland +prov_fyn,Fyn +prov_hiiumaa,Hiiumaa +prov_saaremaa,Saaremaa +prov_italy,Italy +prov_elba,Elba +prov_france,France +prov_netherlands,Netherlands +prov_belgium,Belgium +prov_luxembourg,Luxembourg +prov_switzerland,Switzerland +prov_balkans,Balkans +prov_crimea,Crimea +prov_germany,Germany +prov_poland,Poland +prov_baltics,Baltics +prov_finland,Finland +prov_aland,Åland +prov_ukraine,Ukraine +prov_russia,Russia ,, North America prov_north_america_NAME,North America @@ -92,154 +92,154 @@ prov_yellowknife_NAME,Yellowknife prov_iqaluit_NAME,Iqaluit ,, South America -prov_south_america_NAME,South America -prov_galapagos_NAME,Galapagos -prov_falklands_NAME,Falklands -prov_south_georgia_NAME,South Georgia +prov_south_america,South America +prov_galapagos,Galapagos +prov_falklands,Falklands +prov_south_georgia,South Georgia ,, Africa -prov_africa_NAME,Africa -prov_madagascar_NAME,Madagascar -prov_socotra_NAME,Socotra -prov_mauritius_NAME,Mauritius -prov_reunion_NAME,Réunion -prov_comoros_NAME,Comoros -prov_sao_tome_NAME,Sao Tome -prov_fernando_po_NAME,Fernando Po -prov_cape_verde_NAME,Cape Verde -prov_ascension_NAME,Ascension -prov_st_helena_NAME,St Helena -prov_tristan_da_cunha_NAME,Tristan da Cunha -prov_seychelles_NAME,Seychelles -prov_prince_edward_islands_NAME,Prince Edward Islands -prov_kerguelen_islands_NAME,Kerguelen Islands -prov_heard_island_NAME,Heard Island -prov_egypt_NAME,Egypt -prov_morocco_NAME,Morocco +prov_africa,Africa +prov_madagascar,Madagascar +prov_socotra,Socotra +prov_mauritius,Mauritius +prov_reunion,Réunion +prov_comoros,Comoros +prov_sao_tome,Sao Tome +prov_fernando_po,Fernando Po +prov_cape_verde,Cape Verde +prov_ascension,Ascension +prov_st_helena,St Helena +prov_tristan_da_cunha,Tristan da Cunha +prov_seychelles,Seychelles +prov_prince_edward_islands,Prince Edward Islands +prov_kerguelen_islands,Kerguelen Islands +prov_heard_island,Heard Island +prov_egypt,Egypt +prov_morocco,Morocco ,, Asia -prov_middle_east_NAME,Middle East -prov_ceylon_NAME,Ceylon -prov_formosa_NAME,Formosa -prov_sakhalin_NAME,Sakhalin -prov_maldives_NAME,Maldives -prov_hainan_NAME,Hainan -prov_hokkaido_NAME,Hokkaido -prov_diego_garcia_NAME,Diego Garcia -prov_philippines_NAME,Philippines -prov_india_NAME,India -prov_andamans_NAME,Andaman Islands -prov_nicobar_islands_NAME,Nicobar Islands -prov_indochina_NAME,Indochina -prov_korea_NAME,Korea -prov_okinawa_NAME,Okinawa -prov_yaeyama_NAME,Yaeyama -prov_kyushu_NAME,Kyushu -prov_shikoku_NAME,Shikoku -prov_japan_NAME,Japan -prov_kurils_NAME,Kuril Islands -prov_manchuria_NAME,Manchuria -prov_china_NAME,China -prov_central_asia_NAME,Central Asia -prov_siberia_NAME,Siberia -prov_iran_NAME,Iran -prov_anatolia_NAME,Anatolia +prov_middle_east,Middle East +prov_ceylon,Ceylon +prov_formosa,Formosa +prov_sakhalin,Sakhalin +prov_maldives,Maldives +prov_hainan,Hainan +prov_hokkaido,Hokkaido +prov_diego_garcia,Diego Garcia +prov_philippines,Philippines +prov_india,India +prov_andamans,Andaman Islands +prov_nicobar_islands,Nicobar Islands +prov_indochina,Indochina +prov_korea,Korea +prov_okinawa,Okinawa +prov_yaeyama,Yaeyama +prov_kyushu,Kyushu +prov_shikoku,Shikoku +prov_japan,Japan +prov_kurils,Kuril Islands +prov_manchuria,Manchuria +prov_china,China +prov_central_asia,Central Asia +prov_siberia,Siberia +prov_iran,Iran +prov_anatolia,Anatolia ,, Oceania -prov_oceania_NAME,Oceania -prov_indonesia_NAME,Indonesia -prov_north_island_NAME,North Island -prov_south_island_NAME,South Island -prov_tasmania_NAME,Tasmania -prov_australia_NAME,Australia -prov_hawaii_NAME,Hawaii +prov_oceania,Oceania +prov_indonesia,Indonesia +prov_north_island,North Island +prov_south_island,South Island +prov_tasmania,Tasmania +prov_australia,Australia +prov_hawaii,Hawaii ,, Lakes -prov_aral_sea_NAME,Aral Sea -prov_caspian_sea_NAME,Caspian Sea -prov_lake_ladoga_NAME,Lake Ladoga -prov_lake_ontario_NAME,Lake Ontario -prov_lake_erie_NAME,Lake Erie -prov_lake_huron_NAME,Lake Huron -prov_lake_michigan_NAME,Lake Michigan -prov_lake_superior_NAME,Lake Superior -prov_lake_baikal_NAME,Lake Baikal -prov_lake_woods_NAME,Lake of the Woods -prov_lake_manitoba_NAME,Lake Manitoba -prov_reindeer_lake_NAME,Reindeer Lake -prov_lake_ronge_NAME,Lac la Ronge -prov_lake_athabasca_NAME,Lake Athabasca -prov_great_slave_lake_NAME,Great Slave Lake -prov_great_bear_lake_NAME,Great Bear Lake +prov_aral_sea,Aral Sea +prov_caspian_sea,Caspian Sea +prov_lake_ladoga,Lake Ladoga +prov_lake_ontario,Lake Ontario +prov_lake_erie,Lake Erie +prov_lake_huron,Lake Huron +prov_lake_michigan,Lake Michigan +prov_lake_superior,Lake Superior +prov_lake_baikal,Lake Baikal +prov_lake_woods,Lake of the Woods +prov_lake_manitoba,Lake Manitoba +prov_reindeer_lake,Reindeer Lake +prov_lake_ronge,Lac la Ronge +prov_lake_athabasca,Lake Athabasca +prov_great_slave_lake,Great Slave Lake +prov_great_bear_lake,Great Bear Lake ,, Seas and Oceans -prov_azov_sea_NAME,Sea of Azov -prov_black_sea_NAME,Black Sea -prov_marmara_sea_NAME,Sea of Marmara -prov_agean_sea_NAME,Agean Sea -prov_ionian_sea_NAME,Ionian Sea -prov_adriatic_sea_NAME,Adriatic Sea -prov_tyrrhenian_sea_NAME,Tyrrhenian Sea -prov_east_mediterranean_NAME,East Mediterranean Sea -prov_central_mediterranean_NAME,Central Mediterranean Sea -prov_west_mediterranean_NAME,West Mediterranean Sea -prov_ligurian_sea_NAME,Ligurian Sea -prov_balearic_sea_NAME,Balearic Sea -prov_alboran_sea_NAME,Alboran Sea -prov_gulf_bothnia_NAME,Gulf of Bothnia -prov_gulf_finland_NAME,Gulf of Finland -prov_gulf_riga_NAME,Gulf of Riga -prov_baltic_sea_NAME,Baltic Sea -prov_danish_straits_NAME,Danish Straits -prov_english_channel_NAME,English Channel -prov_irish_sea_NAME,Irish Sea -prov_biscay_bay_NAME,Bay of Biscay -prov_north_sea_NAME,North Sea -prov_red_sea_NAME,Red Sea -prov_arabian_sea_NAME,Arabian Sea -prov_persian_gulf_NAME,Persian Gulf -prov_andaman_sea_NAME,Andaman Sea -prov_bay_bengal_NAME,Bay of Bengal -prov_okhotsk_sea_NAME,Sea of Okhotsk -prov_japan_sea_NAME,Sea of Japan -prov_east_china_sea_NAME,East China Sea -prov_south_china_sea_NAME,South China Sea -prov_philippine_sea_NAME,Philippine Sea -prov_celebes_sea_NAME,Celebes Sea -prov_java_sea_NAME,Java Sea -prov_banda_sea_NAME,Banda Sea -prov_arafura_sea_NAME,Arafura Sea -prov_gulf_mexico_NAME,Gulf of Mexico -prov_caribbean_sea_NAME,Caribbean Sea -prov_mozambique_channel_NAME,Mozambique Channel -prov_zanj_sea_NAME,Sea of Zanj -prov_kara_sea_NAME,Kara Sea -prov_barents_sea_NAME,Barents Sea -prov_norwegian_sea_NAME,Norwegian Sea -prov_greenland_sea_NAME,Greenland Sea -prov_labrador_sea_NAME,Labrador Sea -prov_hudson_bay_NAME,Hudson Bay -prov_gulf_st_lawrence_NAME,Gulf of St Lawrence -prov_gulf_alaska_NAME,Gulf of Alaska -prov_gulf_california_NAME,Gulf of California -prov_east_siberian_sea_NAME,East Siberian Sea -prov_sargasso_sea_NAME,Sargasso Sea -prov_gulf_guinea_NAME,Gulf of Guinea -prov_celtic_sea_NAME,Celtic Sea -prov_argentine_sea_NAME,Argentine Sea -prov_chilean_sea_NAME,Chilean Sea -prov_north_atlantic_NAME,North Atlantic Ocean -prov_central_atlantic_NAME,Central Atlantic Ocean -prov_south_atlantic_NAME,South Atlantic Ocean -prov_indian_ocean_NAME,Indian Ocean -prov_great_australian_bight_NAME,Great Australian Bight -prov_tasman_sea_NAME,Tasman Sea -prov_coral_sea_NAME,Coral Sea -prov_melanesia_NAME,Melanesia -prov_micronesia_NAME,Micronesia -prov_polynesia_NAME,Polynesia -prov_north_pacific_NAME,North Pacific Ocean -prov_south_pacific_NAME,South Pacific Ocean -prov_bering_sea_NAME,Bering Sea -prov_chukchi_sea_NAME,Chukchi Sea -prov_beaufort_sea_NAME,Beaufort Sea +prov_azov_sea,Sea of Azov +prov_black_sea,Black Sea +prov_marmara_sea,Sea of Marmara +prov_agean_sea,Agean Sea +prov_ionian_sea,Ionian Sea +prov_adriatic_sea,Adriatic Sea +prov_tyrrhenian_sea,Tyrrhenian Sea +prov_east_mediterranean,East Mediterranean Sea +prov_central_mediterranean,Central Mediterranean Sea +prov_west_mediterranean,West Mediterranean Sea +prov_ligurian_sea,Ligurian Sea +prov_balearic_sea,Balearic Sea +prov_alboran_sea,Alboran Sea +prov_gulf_bothnia,Gulf of Bothnia +prov_gulf_finland,Gulf of Finland +prov_gulf_riga,Gulf of Riga +prov_baltic_sea,Baltic Sea +prov_danish_straits,Danish Straits +prov_english_channel,English Channel +prov_irish_sea,Irish Sea +prov_biscay_bay,Bay of Biscay +prov_north_sea,North Sea +prov_red_sea,Red Sea +prov_arabian_sea,Arabian Sea +prov_persian_gulf,Persian Gulf +prov_andaman_sea,Andaman Sea +prov_bay_bengal,Bay of Bengal +prov_okhotsk_sea,Sea of Okhotsk +prov_japan_sea,Sea of Japan +prov_east_china_sea,East China Sea +prov_south_china_sea,South China Sea +prov_philippine_sea,Philippine Sea +prov_celebes_sea,Celebes Sea +prov_java_sea,Java Sea +prov_banda_sea,Banda Sea +prov_arafura_sea,Arafura Sea +prov_gulf_mexico,Gulf of Mexico +prov_caribbean_sea,Caribbean Sea +prov_mozambique_channel,Mozambique Channel +prov_zanj_sea,Sea of Zanj +prov_kara_sea,Kara Sea +prov_barents_sea,Barents Sea +prov_norwegian_sea,Norwegian Sea +prov_greenland_sea,Greenland Sea +prov_labrador_sea,Labrador Sea +prov_hudson_bay,Hudson Bay +prov_gulf_st_lawrence,Gulf of St Lawrence +prov_gulf_alaska,Gulf of Alaska +prov_gulf_california,Gulf of California +prov_east_siberian_sea,East Siberian Sea +prov_sargasso_sea,Sargasso Sea +prov_gulf_guinea,Gulf of Guinea +prov_celtic_sea,Celtic Sea +prov_argentine_sea,Argentine Sea +prov_chilean_sea,Chilean Sea +prov_north_atlantic,North Atlantic Ocean +prov_central_atlantic,Central Atlantic Ocean +prov_south_atlantic,South Atlantic Ocean +prov_indian_ocean,Indian Ocean +prov_great_australian_bight,Great Australian Bight +prov_tasman_sea,Tasman Sea +prov_coral_sea,Coral Sea +prov_melanesia,Melanesia +prov_micronesia,Micronesia +prov_polynesia,Polynesia +prov_north_pacific,North Pacific Ocean +prov_south_pacific,South Pacific Ocean +prov_bering_sea,Bering Sea +prov_chukchi_sea,Chukchi Sea +prov_beaufort_sea,Beaufort Sea diff --git a/game/localisation/en_GB/regions.csv b/game/localisation/en_GB/regions.csv index 8fe8943..258cce6 100644 --- a/game/localisation/en_GB/regions.csv +++ b/game/localisation/en_GB/regions.csv @@ -1,8 +1,8 @@ ,, Regions -region_europe_NAME,Europe -region_north_america_NAME,North America -region_south_america_NAME,South America -region_africa_NAME,Africa -region_asia_NAME,Asia -region_oceania_NAME,Oceania +region_europe,Europe +region_north_america,North America +region_south_america,South America +region_africa,Africa +region_asia,Asia +region_oceania,Oceania diff --git a/game/src/Autoload/Events.gd b/game/src/Autoload/Events.gd index dbd3f9f..0ee2eff 100644 --- a/game/src/Autoload/Events.gd +++ b/game/src/Autoload/Events.gd @@ -11,11 +11,12 @@ const _province_shape_file : String = "res://common/map/provinces.png" # REQUIREMENTS # * FS-333, FS-334, FS-335, FS-341 func _ready(): - if MapSingleton.load_province_identifier_file(_province_identifier_file) != OK: + if GameSingleton.load_province_identifier_file(_province_identifier_file) != OK: push_error("Failed to load province identifiers") - if MapSingleton.load_water_province_file(_water_province_file) != OK: + if GameSingleton.load_water_province_file(_water_province_file) != OK: push_error("Failed to load water provinces") - if MapSingleton.load_region_file(_region_file) != OK: + if GameSingleton.load_region_file(_region_file) != OK: push_error("Failed to load regions") - if MapSingleton.load_province_shape_file(_province_shape_file) != OK: + if GameSingleton.load_province_shape_file(_province_shape_file) != OK: push_error("Failed to load province shapes") + GameSingleton.finished_loading_data() diff --git a/game/src/GameSession/GameSession.gd b/game/src/GameSession/GameSession.gd index fe83a8a..2761815 100644 --- a/game/src/GameSession/GameSession.gd +++ b/game/src/GameSession/GameSession.gd @@ -5,7 +5,10 @@ extends Control func _ready(): Events.Options.load_settings_from_file() +func _process(delta : float): + GameSingleton.try_tick() + # REQUIREMENTS: # * SS-42 -func _on_game_session_menu_button_pressed(): +func _on_game_session_menu_button_pressed() -> void: _game_session_menu.visible = !_game_session_menu.visible diff --git a/game/src/GameSession/GameSessionMenu.gd b/game/src/GameSession/GameSessionMenu.gd index 8a76c0f..7d785ca 100644 --- a/game/src/GameSession/GameSessionMenu.gd +++ b/game/src/GameSession/GameSessionMenu.gd @@ -8,6 +8,7 @@ signal options_button_pressed # * SS-47 # * UIFUN-69 func _on_main_menu_confirmed() -> void: + # TODO - reset map when going back to main menu get_tree().change_scene_to_packed(_main_menu_scene) # REQUIREMENTS: diff --git a/game/src/GameSession/GameSpeedPanel.gd b/game/src/GameSession/GameSpeedPanel.gd index 8dc35d7..c203032 100644 --- a/game/src/GameSession/GameSpeedPanel.gd +++ b/game/src/GameSession/GameSpeedPanel.gd @@ -7,27 +7,32 @@ extends PanelContainer @export var _decrease_speed_button : Button @export var _increase_speed_button : Button -var is_game_paused : bool = true - # Called when the node enters the scene tree for the first time. func _ready(): - _update_playpause_button() + GameSingleton.state_updated.connect(_update_buttons) + _update_buttons() + +func _update_buttons(): + _play_pause_display_button.text = "⏸️" if GameSingleton.is_paused() else "▶" + + _increase_speed_button.disabled = not GameSingleton.can_increase_speed() + _decrease_speed_button.disabled = not GameSingleton.can_decrease_speed() -func _update_playpause_button(): - _play_pause_display_button.text = "⏸️" if is_game_paused else "▶" - print("Game is paused" if is_game_paused else "Game is advancing") + _longform_date_button.text = GameSingleton.get_longform_date() func _on_decrease_speed_button_pressed(): - print("Decrease speed") + GameSingleton.decrease_speed() + _update_buttons() func _on_increase_speed_button_pressed(): - print("Increase speed") + GameSingleton.increase_speed() + _update_buttons() func _on_play_pause_display_button_pressed(): - is_game_paused = !is_game_paused - _update_playpause_button() + GameSingleton.toggle_paused() + _update_buttons() func _on_longform_date_label_pressed(): - is_game_paused = !is_game_paused - _update_playpause_button() + GameSingleton.toggle_paused() + _update_buttons() diff --git a/game/src/GameSession/MapControlPanel.gd b/game/src/GameSession/MapControlPanel.gd index d5810c5..73d7e06 100644 --- a/game/src/GameSession/MapControlPanel.gd +++ b/game/src/GameSession/MapControlPanel.gd @@ -27,8 +27,8 @@ func _add_mapmode_button(identifier : String) -> void: func _ready(): _mapmode_button_group = ButtonGroup.new() _mapmode_button_group.pressed.connect(_mapmode_pressed) - for index in MapSingleton.get_mapmode_count(): - _add_mapmode_button(MapSingleton.get_mapmode_identifier(index)) + for index in GameSingleton.get_mapmode_count(): + _add_mapmode_button(GameSingleton.get_mapmode_identifier(index)) # REQUIREMENTS: # * UIFUN-10 @@ -39,7 +39,7 @@ func _on_game_session_menu_button_pressed() -> void: # * SS-76 # * UIFUN-129, UIFUN-133 func _mapmode_pressed(button : BaseButton) -> void: - MapSingleton.set_mapmode(button.tooltip_text) + GameSingleton.set_mapmode(button.tooltip_text) mapmode_changed.emit() func _on_map_view_camera_changed(near_left : Vector2, far_left : Vector2, far_right : Vector2, near_right : Vector2) -> void: diff --git a/game/src/GameSession/MapView.gd b/game/src/GameSession/MapView.gd index ae49e82..ac060e1 100644 --- a/game/src/GameSession/MapView.gd +++ b/game/src/GameSession/MapView.gd @@ -1,6 +1,6 @@ extends Node3D -signal province_selected(identifier : String) +signal province_selected(index : int) signal map_view_camera_changed(near_left : Vector2, far_left : Vector2, far_right : Vector2, near_right : Vector2) const _action_north : StringName = &"map_north" @@ -21,7 +21,7 @@ const _shader_param_terrain_tile_factor : StringName = &"terrain_tile_factor" @export var _camera : Camera3D @export var _cardinal_move_speed : float = 1.0 -@export var _edge_move_threshold: float = 0.02 +@export var _edge_move_threshold: float = 0.01 @export var _edge_move_speed: float = 2.5 var _drag_anchor : Vector2 var _drag_active : bool = false @@ -53,7 +53,7 @@ var _viewport_dims : Vector2 = Vector2(1, 1) # ??? Strange Godot/GDExtension Bug ??? # Upon first opening a clone of this repo with the Godot Editor, -# if MapSingleton.get_province_index_image is called before MapMesh +# if GameSingleton.get_province_index_image is called before MapMesh # is referenced in the script below, then the editor will crash due # to a failed HashMap lookup. I'm not sure if this is a bug in the # editor, GDExtension, my own extension, or a combination of them. @@ -78,7 +78,7 @@ func _ready(): _map_shader_material = map_material # Province index texture - _map_province_index_image = MapSingleton.get_province_index_image() + _map_province_index_image = GameSingleton.get_province_index_image() if _map_province_index_image == null: push_error("Failed to get province index image!") return @@ -86,7 +86,7 @@ func _ready(): _map_shader_material.set_shader_parameter(_shader_param_province_index, province_index_texture) # Province colour texture - _map_province_colour_image = MapSingleton.get_province_colour_image() + _map_province_colour_image = GameSingleton.get_province_colour_image() if _map_province_colour_image == null: push_error("Failed to get province colour image!") return @@ -99,7 +99,7 @@ func _ready(): _map_mesh = _map_mesh_instance.mesh # Set map mesh size and get bounds - _map_image_size = Vector2(Vector2i(MapSingleton.get_width(), MapSingleton.get_height())) + _map_image_size = Vector2(Vector2i(GameSingleton.get_width(), GameSingleton.get_height())) _map_mesh.aspect_ratio = _map_image_size.x / _map_image_size.y _map_shader_material.set_shader_parameter(_shader_param_terrain_tile_factor, _map_image_size.y / 64.0) var map_mesh_aabb := _map_mesh.get_core_aabb() * _map_mesh_instance.transform @@ -120,7 +120,7 @@ func _notification(what : int): _on_mouse_exited_viewport() func _update_colour_texture() -> void: - MapSingleton.update_colour_image() + GameSingleton.update_colour_image() _map_province_colour_texture.update(_map_province_colour_image) func _world_to_map_coords(pos : Vector3) -> Vector2: @@ -151,10 +151,9 @@ func _unhandled_input(event : InputEvent): if _mouse_over_viewport and event.is_action_pressed(_action_click): # Check if the mouse is outside of bounds if _map_mesh.is_valid_uv_coord(_mouse_pos_map): - var selected_index := MapSingleton.get_province_index_from_uv_coords(_mouse_pos_map) + var selected_index := GameSingleton.get_province_index_from_uv_coords(_mouse_pos_map) _map_shader_material.set_shader_parameter(_shader_param_selected_index, selected_index) - var province_identifier := MapSingleton.get_province_identifier_from_uv_coords(_mouse_pos_map) - province_selected.emit(province_identifier) + province_selected.emit(selected_index) else: print("Clicked outside the map!") elif event.is_action_pressed(_action_drag): @@ -248,7 +247,7 @@ func _update_minimap_viewport() -> void: func _update_mouse_map_position() -> void: _mouse_pos_map = _viewport_to_map_coords(_mouse_pos_viewport) - var hover_index := MapSingleton.get_province_index_from_uv_coords(_mouse_pos_map) + var hover_index := GameSingleton.get_province_index_from_uv_coords(_mouse_pos_map) if _mouse_over_viewport: _map_shader_material.set_shader_parameter(_shader_param_hover_index, hover_index) diff --git a/game/src/GameSession/ProvinceOverviewPanel.gd b/game/src/GameSession/ProvinceOverviewPanel.gd index 4615df9..832f21c 100644 --- a/game/src/GameSession/ProvinceOverviewPanel.gd +++ b/game/src/GameSession/ProvinceOverviewPanel.gd @@ -2,32 +2,84 @@ extends Panel @export var _province_name_label : Label @export var _region_name_label : Label +@export var _buildings_container : Container -var _province_identifier: String = "": - get: return _province_identifier +const _missing_suffix : String = "_MISSING" + +var _selected_index : int: + get: return _selected_index set(v): - _province_identifier = v + _selected_index = v update_info() - -const _name_suffix : String = "_NAME" +var _province_info : Dictionary func _ready(): + GameSingleton.state_updated.connect(update_info) update_info() +enum { CANNOT_EXPAND, CAN_EXPAND, PREPARING, EXPANDING } + +func _expand_building(building_identifier : String) -> void: + if GameSingleton.expand_building(_selected_index, building_identifier) != OK: + push_error("Failed to expand ", building_identifier, " in province #", _selected_index); + +func _add_building(building : Dictionary) -> void: + const _building_key : StringName = &"building" + const _level_key : StringName = &"level" + const _expansion_state_key : StringName = &"expansion_state" + const _start_key : StringName = &"start" + const _end_key : StringName = &"end" + const _expansion_progress_key : StringName = &"expansion_progress" + + const _expand_province_building : String = "EXPAND_PROVINCE_BUILDING" + + var level_label := Label.new() + level_label.text = str(building.get(_level_key, 0)) + _buildings_container.add_child(level_label) + + var building_label := Label.new() + building_label.text = building.get(_building_key, _building_key + _missing_suffix) + _buildings_container.add_child(building_label) + + var expansion_state : int = building.get(_expansion_state_key, CANNOT_EXPAND) + if expansion_state == PREPARING or expansion_state == EXPANDING: + var progress_bar := ProgressBar.new() + progress_bar.max_value = 1 + progress_bar.value = building.get(_expansion_progress_key, 0) + progress_bar.size_flags_horizontal = Control.SIZE_EXPAND_FILL + _buildings_container.add_child(progress_bar) + else: + var expand_button := Button.new() + expand_button.text = _expand_province_building + expand_button.size_flags_horizontal = Control.SIZE_EXPAND_FILL + expand_button.disabled = expansion_state != CAN_EXPAND + expand_button.pressed.connect(func(): _expand_building(building_label.text)) + _buildings_container.add_child(expand_button) + func update_info() -> void: - if _province_identifier: - _province_name_label.text = _province_identifier + _name_suffix - var region_identifier := MapSingleton.get_region_identifier_from_province_identifier(_province_identifier) - if region_identifier: - _region_name_label.text = region_identifier + _name_suffix - else: - _region_name_label.text = "NO REGION" + const _province_key : StringName = &"province" + const _region_key : StringName = &"region" + const _life_rating_key : StringName = &"life_rating" + const _buildings_key : StringName = &"buildings" + + _province_info = GameSingleton.get_province_info_from_index(_selected_index) + if _province_info: + _province_name_label.text = _province_info.get(_province_key, _province_key + _missing_suffix) + _region_name_label.text = _province_info.get(_region_key, _region_key + _missing_suffix) + + for child in _buildings_container.get_children(): + _buildings_container.remove_child(child) + child.queue_free() + var buildings : Array = _province_info.get(_buildings_key, []) + for building in buildings: + _add_building(building) + show() else: hide() -func _on_province_selected(identifier : String) -> void: - _province_identifier = identifier +func _on_province_selected(index : int) -> void: + _selected_index = index func _on_close_button_pressed() -> void: - _province_identifier = "" + _selected_index = 0 diff --git a/game/src/GameSession/ProvinceOverviewPanel.tscn b/game/src/GameSession/ProvinceOverviewPanel.tscn index 7d21edc..dacdc4b 100644 --- a/game/src/GameSession/ProvinceOverviewPanel.tscn +++ b/game/src/GameSession/ProvinceOverviewPanel.tscn @@ -2,7 +2,7 @@ [ext_resource type="Script" path="res://src/GameSession/ProvinceOverviewPanel.gd" id="1_3n8k5"] -[node name="ProvinceOverviewPanel" type="Panel" node_paths=PackedStringArray("_province_name_label", "_region_name_label")] +[node name="ProvinceOverviewPanel" type="Panel" node_paths=PackedStringArray("_province_name_label", "_region_name_label", "_buildings_container")] editor_description = "UI-56" anchors_preset = 2 anchor_top = 1.0 @@ -13,6 +13,7 @@ grow_vertical = 0 script = ExtResource("1_3n8k5") _province_name_label = NodePath("VBoxContainer/ProvinceName") _region_name_label = NodePath("VBoxContainer/RegionName") +_buildings_container = NodePath("VBoxContainer/BuildingsContainer") [node name="VBoxContainer" type="VBoxContainer" parent="."] layout_mode = 1 @@ -27,15 +28,22 @@ offset_bottom = -5.0 [node name="ProvinceName" type="Label" parent="VBoxContainer"] editor_description = "UI-57" layout_mode = 2 -text = "PROVINCE_NAME" +text = "province_MISSING" vertical_alignment = 1 [node name="RegionName" type="Label" parent="VBoxContainer"] editor_description = "UI-58" layout_mode = 2 -text = "REGION_NAME" +text = "region_MISSING" vertical_alignment = 1 +[node name="HSeparator" type="HSeparator" parent="VBoxContainer"] +layout_mode = 2 + +[node name="BuildingsContainer" type="GridContainer" parent="VBoxContainer"] +layout_mode = 2 +columns = 3 + [node name="CloseButton" type="Button" parent="."] custom_minimum_size = Vector2(30, 30) layout_mode = 1 -- cgit v1.2.3-56-ga3b1