From cef940108fe15752c3ef66f43f5169403fa2f71d Mon Sep 17 00:00:00 2001 From: Spartan322 Date: Sat, 3 Jun 2023 14:37:10 -0400 Subject: Reorganize the file structure of the files in `game/src` --- game/src/Game/Menu/CreditsMenu/CreditsMenu.gd | 200 +++++++++++++++++++++ game/src/Game/Menu/CreditsMenu/CreditsMenu.tscn | 50 ++++++ .../src/Game/Menu/CreditsMenu/GodotEngineButton.gd | 4 + .../Game/Menu/CreditsMenu/GodotEngineButton.tscn | 20 +++ .../Menu/CreditsMenu/logo_vertical_color_dark.svg | 1 + .../logo_vertical_color_dark.svg.import | 37 ++++ game/src/Game/Menu/LobbyMenu/LobbyMenu.gd | 165 +++++++++++++++++ game/src/Game/Menu/LobbyMenu/LobbyMenu.tscn | 138 ++++++++++++++ game/src/Game/Menu/LobbyMenu/LobbyPanelButton.gd | 102 +++++++++++ game/src/Game/Menu/LobbyMenu/LobbyPanelButton.tscn | 31 ++++ game/src/Game/Menu/MainMenu/MainMenu.gd | 50 ++++++ game/src/Game/Menu/MainMenu/MainMenu.tscn | 150 ++++++++++++++++ game/src/Game/Menu/MainMenu/ReleaseInfoBox.gd | 41 +++++ game/src/Game/Menu/MainMenu/ReleaseInfoBox.tscn | 38 ++++ .../Menu/OptionMenu/AutosaveIntervalSelector.gd | 2 + game/src/Game/Menu/OptionMenu/ControlsTab.tscn | 14 ++ game/src/Game/Menu/OptionMenu/GeneralTab.gd | 9 + game/src/Game/Menu/OptionMenu/GeneralTab.tscn | 81 +++++++++ game/src/Game/Menu/OptionMenu/GuiScaleSelector.gd | 64 +++++++ .../Game/Menu/OptionMenu/MonitorDisplaySelector.gd | 18 ++ game/src/Game/Menu/OptionMenu/OptionsMenu.gd | 68 +++++++ game/src/Game/Menu/OptionMenu/OptionsMenu.tscn | 52 ++++++ game/src/Game/Menu/OptionMenu/OtherTab.tscn | 18 ++ .../Game/Menu/OptionMenu/QualityPresetSelector.gd | 4 + .../Game/Menu/OptionMenu/RefreshRateSelector.gd | 5 + .../Game/Menu/OptionMenu/ResolutionRevertDialog.gd | 35 ++++ .../src/Game/Menu/OptionMenu/ResolutionSelector.gd | 91 ++++++++++ .../src/Game/Menu/OptionMenu/ScreenModeSelector.gd | 48 +++++ .../Menu/OptionMenu/SettingNodes/SettingHSlider.gd | 41 +++++ .../OptionMenu/SettingNodes/SettingOptionButton.gd | 77 ++++++++ .../OptionMenu/SettingNodes/SettingRevertButton.gd | 27 +++ game/src/Game/Menu/OptionMenu/SoundTab.gd | 4 + game/src/Game/Menu/OptionMenu/SoundTab.tscn | 34 ++++ game/src/Game/Menu/OptionMenu/VideoTab.gd | 9 + game/src/Game/Menu/OptionMenu/VideoTab.tscn | 181 +++++++++++++++++++ game/src/Game/Menu/OptionMenu/VolumeGrid.gd | 70 ++++++++ game/src/Game/Menu/OptionMenu/VolumeGrid.tscn | 8 + game/src/Game/Menu/SaveLoadMenu/SaveLoadMenu.gd | 123 +++++++++++++ game/src/Game/Menu/SaveLoadMenu/SaveLoadMenu.tscn | 109 +++++++++++ game/src/Game/Menu/SaveLoadMenu/SavePanelButton.gd | 41 +++++ .../Game/Menu/SaveLoadMenu/SavePanelButton.tscn | 58 ++++++ game/src/Game/Menu/SaveLoadMenu/SaveResource.gd | 59 ++++++ 42 files changed, 2377 insertions(+) create mode 100644 game/src/Game/Menu/CreditsMenu/CreditsMenu.gd create mode 100644 game/src/Game/Menu/CreditsMenu/CreditsMenu.tscn create mode 100644 game/src/Game/Menu/CreditsMenu/GodotEngineButton.gd create mode 100644 game/src/Game/Menu/CreditsMenu/GodotEngineButton.tscn create mode 100644 game/src/Game/Menu/CreditsMenu/logo_vertical_color_dark.svg create mode 100644 game/src/Game/Menu/CreditsMenu/logo_vertical_color_dark.svg.import create mode 100644 game/src/Game/Menu/LobbyMenu/LobbyMenu.gd create mode 100644 game/src/Game/Menu/LobbyMenu/LobbyMenu.tscn create mode 100644 game/src/Game/Menu/LobbyMenu/LobbyPanelButton.gd create mode 100644 game/src/Game/Menu/LobbyMenu/LobbyPanelButton.tscn create mode 100644 game/src/Game/Menu/MainMenu/MainMenu.gd create mode 100644 game/src/Game/Menu/MainMenu/MainMenu.tscn create mode 100644 game/src/Game/Menu/MainMenu/ReleaseInfoBox.gd create mode 100644 game/src/Game/Menu/MainMenu/ReleaseInfoBox.tscn create mode 100644 game/src/Game/Menu/OptionMenu/AutosaveIntervalSelector.gd create mode 100644 game/src/Game/Menu/OptionMenu/ControlsTab.tscn create mode 100644 game/src/Game/Menu/OptionMenu/GeneralTab.gd create mode 100644 game/src/Game/Menu/OptionMenu/GeneralTab.tscn create mode 100644 game/src/Game/Menu/OptionMenu/GuiScaleSelector.gd create mode 100644 game/src/Game/Menu/OptionMenu/MonitorDisplaySelector.gd create mode 100644 game/src/Game/Menu/OptionMenu/OptionsMenu.gd create mode 100644 game/src/Game/Menu/OptionMenu/OptionsMenu.tscn create mode 100644 game/src/Game/Menu/OptionMenu/OtherTab.tscn create mode 100644 game/src/Game/Menu/OptionMenu/QualityPresetSelector.gd create mode 100644 game/src/Game/Menu/OptionMenu/RefreshRateSelector.gd create mode 100644 game/src/Game/Menu/OptionMenu/ResolutionRevertDialog.gd create mode 100644 game/src/Game/Menu/OptionMenu/ResolutionSelector.gd create mode 100644 game/src/Game/Menu/OptionMenu/ScreenModeSelector.gd create mode 100644 game/src/Game/Menu/OptionMenu/SettingNodes/SettingHSlider.gd create mode 100644 game/src/Game/Menu/OptionMenu/SettingNodes/SettingOptionButton.gd create mode 100644 game/src/Game/Menu/OptionMenu/SettingNodes/SettingRevertButton.gd create mode 100644 game/src/Game/Menu/OptionMenu/SoundTab.gd create mode 100644 game/src/Game/Menu/OptionMenu/SoundTab.tscn create mode 100644 game/src/Game/Menu/OptionMenu/VideoTab.gd create mode 100644 game/src/Game/Menu/OptionMenu/VideoTab.tscn create mode 100644 game/src/Game/Menu/OptionMenu/VolumeGrid.gd create mode 100644 game/src/Game/Menu/OptionMenu/VolumeGrid.tscn create mode 100644 game/src/Game/Menu/SaveLoadMenu/SaveLoadMenu.gd create mode 100644 game/src/Game/Menu/SaveLoadMenu/SaveLoadMenu.tscn create mode 100644 game/src/Game/Menu/SaveLoadMenu/SavePanelButton.gd create mode 100644 game/src/Game/Menu/SaveLoadMenu/SavePanelButton.tscn create mode 100644 game/src/Game/Menu/SaveLoadMenu/SaveResource.gd (limited to 'game/src/Game/Menu') diff --git a/game/src/Game/Menu/CreditsMenu/CreditsMenu.gd b/game/src/Game/Menu/CreditsMenu/CreditsMenu.gd new file mode 100644 index 0000000..0db4d7d --- /dev/null +++ b/game/src/Game/Menu/CreditsMenu/CreditsMenu.gd @@ -0,0 +1,200 @@ +extends Control + +signal back_button_pressed + +############### +# Credits CSV format +# The project title row is the only requirement within the csv file, however +# it can be on any row, so long as it exists. +# ---------------------- +# title,project-title +# role-name,person-name +# role-name,person-name +# role-name,person-name +# ... +############### + +@export_file("*.csv") +var core_credits_path : String + +@export +var godot_engine_scene : PackedScene + +@export_group("Label Variants", "label_variants_") +@export +var label_variants_project : StringName + +@export +var label_variants_role : StringName + +@export +var label_variants_person : StringName + +@export +var credits_list: VBoxContainer + +const title_key : String = "TITLE" + +# REQUIREMENTS: +# * 1.5 Credits Menu +# * SS-17 + +# REQUIREMENTS +# * FS-4 +func _load_credit_file(path : String) -> Dictionary: + var roles := {} + var core_credits = FileAccess.open(path, FileAccess.READ) + if core_credits == null: + push_error("Failed to open credits file %s (error code %d)" % [path, FileAccess.get_open_error()]) + return roles + + while not core_credits.eof_reached(): + var line := core_credits.get_csv_line() + var role := line[0].strip_edges().to_upper() + + # If the line does not have an identifiable role or is empty then skip it + if role.is_empty() or line.size() < 2: + if not (role.is_empty() and line.size() < 2): + push_warning("Incorrectly formatted credit line %s in %s" % [line, path]) + continue + + var person := line[1].strip_edges() + + if person.is_empty(): + push_warning("Incorrectly formatted credit line %s in %s" % [line, path]) + continue + if line.size() > 2: + push_warning("Extra entries ignored in credit line %s in %s" % [line, path]) + + if role not in roles: + roles[role] = [person] + else: + if person in roles[role]: + push_warning("Duplicate person %s for role %s in %s" % [person, role, path]) + else: + roles[role].push_back(person) + if title_key in roles: + if roles[title_key].size() > 1: + push_warning("More than one %s: %s in %s" % [title_key, roles[title_key], path]) + roles[title_key] = [roles[title_key][0]] + else: + push_warning("Credits file %s missing %s" % [path, title_key]) + for role_list in roles.values(): + role_list.sort_custom(func(a : String, b : String) -> bool: return a.naturalnocasecmp_to(b) < 0) + return roles + +func _add_label(node : Node, text : String, type_variation : StringName) -> void: + var label := Label.new() + label.name = 'Label' + text + label.text = text + label.horizontal_alignment = HORIZONTAL_ALIGNMENT_CENTER + label.theme_type_variation = type_variation + node.add_child(label) + +# REQUIREMENTS: +# * UI-34, UI-35 +func _add_project_credits(project : Dictionary) -> void: + var project_credits_list = VBoxContainer.new() + project_credits_list.name = 'Credits' + if title_key in project: + var title : String = project[title_key][0] + project_credits_list.name += title + _add_label(project_credits_list, title, label_variants_project) + project_credits_list.add_child(HSeparator.new()) + + for role in project: + if role == title_key: + continue + + var role_parent = VBoxContainer.new() + + for person in project[role]: + _add_label(role_parent, person, label_variants_person) + + _add_label(project_credits_list, role, label_variants_role) + project_credits_list.add_child(role_parent) + project_credits_list.add_child(HSeparator.new()) + + credits_list.add_child(project_credits_list) + +func _add_godot_credits() -> void: + var godot_credits_list = VBoxContainer.new() + godot_credits_list.name = 'CreditsGodot' + var godot_engine = godot_engine_scene.instantiate() + godot_credits_list.add_child(godot_engine) + godot_credits_list.add_child(HSeparator.new()) + + var author_dict := Engine.get_author_info() + _add_label(godot_credits_list, "Contributors", label_variants_role) + + for role in author_dict: + var role_parent = VBoxContainer.new() + + for person in author_dict[role]: + _add_label(role_parent, person, label_variants_person) + + _add_label(godot_credits_list, role.replace("_", " ").capitalize(), label_variants_role) + godot_credits_list.add_child(role_parent) + godot_credits_list.add_child(HSeparator.new()) + + var donor_dict := Engine.get_donor_info() + _add_label(godot_credits_list, "Donors", label_variants_role) + + for role in donor_dict: + if donor_dict[role].size() == 0 or donor_dict[role][0].begins_with("None"): continue + var role_parent = VBoxContainer.new() + + for person in donor_dict[role]: + _add_label(role_parent, person, label_variants_person) + + _add_label(godot_credits_list, role.replace("_", " ").capitalize(), label_variants_role) + godot_credits_list.add_child(role_parent) + godot_credits_list.add_child(HSeparator.new()) + + credits_list.add_child(godot_credits_list) + +func _add_link_button(node : Node, text : String, url: String, type_variation : StringName) -> void: + var button := LinkButton.new() + button.name = 'LinkButton' + text + button.text = text + button.uri = url + button.size_flags_horizontal = SIZE_SHRINK_CENTER + button.theme_type_variation = type_variation + node.add_child(button) + +func _add_licenses() -> void: + var license_list = VBoxContainer.new() + license_list.name = 'Licenses' + _add_label(license_list, "Third-Party Licenses", label_variants_project) + license_list.add_child(HSeparator.new()) + + var license_info := { + "OpenVic": ["GPLv3", "https://github.com/OpenVicProject/OpenVic/blob/main/LICENSE.md"], + "Godot": ["MIT", "https://github.com/godotengine/godot/blob/master/LICENSE.txt"], + "FreeType": ["FreeType License", "https://gitlab.freedesktop.org/freetype/freetype/-/blob/master/docs/FTL.TXT"], + "ENet": ["MIT", "http://enet.bespin.org/License.html"], + "mbed TLS": ["APLv2", "https://github.com/Mbed-TLS/mbedtls/blob/development/LICENSE"] + } + # Add additional licenses required for attribution here + # These licenses should also either be displayed or exported alongside this project + + for project in license_info: + _add_label(license_list, project, label_variants_role) + _add_link_button(license_list, license_info[project][0], license_info[project][1], label_variants_person) + license_list.add_child(HSeparator.new()) + + credits_list.add_child(license_list) + + +# REQUIREMENTS: +# * SS-17 +func _ready(): + _add_project_credits(_load_credit_file(core_credits_path)) + _add_godot_credits() + _add_licenses() + +# REQUIREMENTS: +# * UI-38 +# * UIFUN-37 +func _on_back_button_pressed() -> void: + back_button_pressed.emit() diff --git a/game/src/Game/Menu/CreditsMenu/CreditsMenu.tscn b/game/src/Game/Menu/CreditsMenu/CreditsMenu.tscn new file mode 100644 index 0000000..2d10d2e --- /dev/null +++ b/game/src/Game/Menu/CreditsMenu/CreditsMenu.tscn @@ -0,0 +1,50 @@ +[gd_scene load_steps=4 format=3 uid="uid://c8knthxkwj1uj"] + +[ext_resource type="Theme" uid="uid://stfxt4hpsify" path="res://theme/credits_menu.tres" id="1_7y4l8"] +[ext_resource type="Script" path="res://src/CreditsMenu/CreditsMenu.gd" id="1_csd7i"] +[ext_resource type="PackedScene" uid="uid://ddjbee5gj6bkv" path="res://src/CreditsMenu/GodotEngineButton.tscn" id="3_fl02a"] + +[node name="CreditsMenu" type="Control" node_paths=PackedStringArray("credits_list")] +editor_description = "UI-34" +layout_mode = 3 +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +grow_horizontal = 2 +grow_vertical = 2 +theme = ExtResource("1_7y4l8") +script = ExtResource("1_csd7i") +core_credits_path = "res://common/credits.csv" +godot_engine_scene = ExtResource("3_fl02a") +label_variants_project = &"ProjectLabel" +label_variants_role = &"RoleLabel" +label_variants_person = &"PersonLabel" +credits_list = NodePath("Scroll/CreditsList") + +[node name="ControlMargin" type="MarginContainer" parent="."] +layout_mode = 2 +anchor_right = 1.0 +anchor_bottom = 0.071 +offset_bottom = -0.120003 +theme_type_variation = &"BackButtonsMargin" + +[node name="BackButton" type="Button" parent="ControlMargin"] +editor_description = "UI-38" +layout_mode = 2 +text = "CREDITS_BACK" + +[node name="Scroll" type="ScrollContainer" parent="."] +editor_description = "UI-35" +layout_mode = 2 +anchor_top = 0.071 +anchor_right = 1.0 +anchor_bottom = 1.0 +offset_top = -0.120003 +offset_bottom = -6.0 + +[node name="CreditsList" type="VBoxContainer" parent="Scroll"] +layout_mode = 2 +size_flags_horizontal = 3 +size_flags_vertical = 3 + +[connection signal="pressed" from="ControlMargin/BackButton" to="." method="_on_back_button_pressed"] diff --git a/game/src/Game/Menu/CreditsMenu/GodotEngineButton.gd b/game/src/Game/Menu/CreditsMenu/GodotEngineButton.gd new file mode 100644 index 0000000..ca3a958 --- /dev/null +++ b/game/src/Game/Menu/CreditsMenu/GodotEngineButton.gd @@ -0,0 +1,4 @@ +extends Button + +func _on_pressed(): + OS.shell_open("https://godotengine.org") diff --git a/game/src/Game/Menu/CreditsMenu/GodotEngineButton.tscn b/game/src/Game/Menu/CreditsMenu/GodotEngineButton.tscn new file mode 100644 index 0000000..8b0c46b --- /dev/null +++ b/game/src/Game/Menu/CreditsMenu/GodotEngineButton.tscn @@ -0,0 +1,20 @@ +[gd_scene load_steps=3 format=3 uid="uid://ddjbee5gj6bkv"] + +[ext_resource type="Texture2D" uid="uid://rh7l4xuh4ali" path="res://src/CreditsMenu/logo_vertical_color_dark.svg" id="1_b0brk"] +[ext_resource type="Script" path="res://src/CreditsMenu/GodotEngineButton.gd" id="3_gi8fv"] + +[node name="GodotEngineButton" type="Button"] +custom_minimum_size = Vector2(0, 200) +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +grow_horizontal = 2 +grow_vertical = 2 +size_flags_vertical = 3 +icon = ExtResource("1_b0brk") +flat = true +icon_alignment = 1 +expand_icon = true +script = ExtResource("3_gi8fv") + +[connection signal="pressed" from="." to="." method="_on_pressed"] diff --git a/game/src/Game/Menu/CreditsMenu/logo_vertical_color_dark.svg b/game/src/Game/Menu/CreditsMenu/logo_vertical_color_dark.svg new file mode 100644 index 0000000..00e50cd --- /dev/null +++ b/game/src/Game/Menu/CreditsMenu/logo_vertical_color_dark.svg @@ -0,0 +1 @@ + diff --git a/game/src/Game/Menu/CreditsMenu/logo_vertical_color_dark.svg.import b/game/src/Game/Menu/CreditsMenu/logo_vertical_color_dark.svg.import new file mode 100644 index 0000000..a4fb09a --- /dev/null +++ b/game/src/Game/Menu/CreditsMenu/logo_vertical_color_dark.svg.import @@ -0,0 +1,37 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://rh7l4xuh4ali" +path="res://.godot/imported/logo_vertical_color_dark.svg-1167b3ce62f0747c0e76b17bdbb9f218.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://src/CreditsMenu/logo_vertical_color_dark.svg" +dest_files=["res://.godot/imported/logo_vertical_color_dark.svg-1167b3ce62f0747c0e76b17bdbb9f218.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=0 +svg/scale=1.0 +editor/scale_with_editor_scale=false +editor/convert_colors_with_editor_theme=false diff --git a/game/src/Game/Menu/LobbyMenu/LobbyMenu.gd b/game/src/Game/Menu/LobbyMenu/LobbyMenu.gd new file mode 100644 index 0000000..db4f2ce --- /dev/null +++ b/game/src/Game/Menu/LobbyMenu/LobbyMenu.gd @@ -0,0 +1,165 @@ +extends HBoxContainer + +# REQUIREMENTS: +# * 1.4 Game Lobby Menu +# * SS-12 + +signal back_button_pressed +signal save_game_selected(save : SaveResource) +signal start_date_selected(index : int) + +@export var lobby_panel_button : PackedScene +@export var save_scene : PackedScene + +@export_group("Nodes") +@export var game_select_start_date : BoxContainer +@export var game_select_save_tab : TabBar +@export var game_select_save_list : BoxContainer +@export var start_button : BaseButton +@export var session_tag_line_edit : LineEdit +@export var session_tag_dialog : ConfirmationDialog +@export var delete_dialog : ConfirmationDialog + +func filter_for_tag(tag : StringName) -> void: + for child in game_select_save_list.get_children(): + if tag == &"": + child.show() + else: + if tag == child.resource.session_tag: + child.show() + else: + child.hide() + +func _build_date_list() -> void: + var start_date := lobby_panel_button.instantiate() + start_date.set_text(&"1836") + start_date.pressed.connect(_on_start_date_panel_button_pressed.bind(start_date)) + game_select_start_date.add_child(start_date) + start_date = lobby_panel_button.instantiate() + start_date.set_text(&"1863") + start_date.pressed.connect(_on_start_date_panel_button_pressed.bind(start_date)) + game_select_start_date.add_child(start_date) + +var _id_to_tag : Array[StringName] = [] + +# Requirements +# * FS-8 +func _build_save_list() -> void: + game_select_save_tab.add_tab("GAMELOBBY_SELECT_ALL") + for save_name in SaveManager._save_dictionary: + var save : SaveResource = SaveManager._save_dictionary[save_name] + var save_node := _create_save_node(save) + game_select_save_list.add_child(save_node) + if not _id_to_tag.has(save.session_tag): + _id_to_tag.append(save.session_tag) + game_select_save_tab.add_tab(save.session_tag) + +func _create_save_node(resource : SaveResource) -> Control: + var save_node = save_scene.instantiate() + save_node.resource = resource + save_node.pressed.connect(_on_save_node_pressed.bind(save_node)) + save_node.request_to_delete.connect(_on_save_node_delete_requested.bind(save_node)) + return save_node + +func _queue_clear_lists() -> void: + var full_list = game_select_start_date.get_children() + full_list.append_array(game_select_save_list.get_children()) + for child in full_list: + child.queue_free() + game_select_save_tab.clear_tabs() + _id_to_tag.clear() + +# REQUIREMENTS: +# * SS-16 +# * UIFUN-40 +func _on_back_button_button_down(): + print("Returning to Main Menu.") + SaveManager.current_session_tag = "" + SaveManager.current_save = null + back_button_pressed.emit() + +# REQUIREMENTS: +# * SS-21 +func _on_start_button_pressed(): + print("Starting new game.") + if SaveManager.current_session_tag == "": + # TODO: Get country tag as well + var datetime := Time.get_datetime_dict_from_system() + SaveManager.current_session_tag = "%s/%s/%s-%s:%s:%s" % [ + datetime["day"], + datetime["month"], + datetime["year"], + datetime["hour"], + datetime["minute"], + datetime["second"] + ] + if SaveManager.current_save == null and SaveManager.current_session_tag in _id_to_tag: + session_tag_dialog.dialog_text = tr("GAMELOBBY_SESSIONTAG_DIALOG_TEXT").format({ "session_tag": SaveManager.current_session_tag }) + session_tag_dialog.title = tr("GAMELOBBY_SESSIONTAG_DIALOG_TITLE").format({ "session_tag": SaveManager.current_session_tag }) + session_tag_dialog.popup_centered() + else: + _on_session_tag_dialog_confirmed() + +# REQUIREMENTS: +# * SS-19 +func _on_game_select_list_item_selected(index): + print("Selected save game: ", index) + save_game_selected.emit(index) + +# If the date is double-clicked, start the game! +func _on_game_select_list_item_activated(index): + _on_game_select_list_item_selected(index) + _on_start_button_pressed() + +func _on_session_tag_edit_text_submitted(new_text): + SaveManager.current_session_tag = new_text + _on_start_button_pressed() + +func _on_session_tag_dialog_confirmed(): + get_tree().change_scene_to_file("res://src/GameSession/GameSession.tscn") + +var _requested_node_to_delete : Control +func _on_save_node_delete_requested(node : Control) -> void: + _requested_node_to_delete = node + delete_dialog.dialog_text = tr("GAMELOBBY_DELETE_DIALOG_TEXT").format({ "file_name": _requested_node_to_delete.resource.save_name }) + delete_dialog.title = tr("GAMELOBBY_DELETE_DIALOG_TITLE").format({ "file_name": _requested_node_to_delete.resource.save_name }) + delete_dialog.popup_centered() + +var _start_date_index := -1 +func _on_start_date_panel_button_pressed(node : Control) -> void: + if node is LobbyPanelButton and node.get_index(true) == _start_date_index: + _on_start_button_pressed() + return + _start_date_index = node.get_index(true) + start_button.disabled = false + start_date_selected.emit(_start_date_index) + +func _on_save_node_pressed(node : Control) -> void: + if SaveManager.current_save != null and SaveManager.current_save == node.resource: + SaveManager.current_session_tag = SaveManager.current_save.session_tag + _on_start_button_pressed() + return + SaveManager.current_save = node.resource + if SaveManager.current_save != null: + session_tag_line_edit.text = SaveManager.current_save.session_tag + else: + session_tag_line_edit.text = "" + start_button.disabled = false + save_game_selected.emit(SaveManager.current_save) + +func _on_game_select_save_tab_tab_changed(tab) -> void: + if tab == 0: + filter_for_tag(&"") + else: + filter_for_tag(_id_to_tag[tab - 1]) + +func _on_delete_dialog_confirmed(): + _requested_node_to_delete.resource.delete() + _requested_node_to_delete.queue_free() + +func _on_visibility_changed(): + if visible: + _build_date_list() + _build_save_list() + else: + _queue_clear_lists() diff --git a/game/src/Game/Menu/LobbyMenu/LobbyMenu.tscn b/game/src/Game/Menu/LobbyMenu/LobbyMenu.tscn new file mode 100644 index 0000000..3b5796e --- /dev/null +++ b/game/src/Game/Menu/LobbyMenu/LobbyMenu.tscn @@ -0,0 +1,138 @@ +[gd_scene load_steps=4 format=3 uid="uid://do60kx0d3nrh4"] + +[ext_resource type="Script" path="res://src/LobbyMenu/LobbyMenu.gd" id="1_cvwum"] +[ext_resource type="PackedScene" uid="uid://k71f5gibwmtc" path="res://src/LobbyMenu/LobbyPanelButton.tscn" id="2_exh17"] +[ext_resource type="PackedScene" uid="uid://d2s7roinx2or7" path="res://src/SaveLoadMenu/SavePanelButton.tscn" id="3_4otj7"] + +[node name="LobbyMenu" type="HBoxContainer" node_paths=PackedStringArray("game_select_start_date", "game_select_save_tab", "game_select_save_list", "start_button", "session_tag_line_edit", "session_tag_dialog", "delete_dialog")] +editor_description = "UI-36" +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +grow_horizontal = 2 +grow_vertical = 2 +script = ExtResource("1_cvwum") +lobby_panel_button = ExtResource("2_exh17") +save_scene = ExtResource("3_4otj7") +game_select_start_date = NodePath("GameSelectPanel/VBoxContainer/GameSelectScroll/GameSelectList/GameSelectStartDate") +game_select_save_tab = NodePath("GameSelectPanel/VBoxContainer/GameSelectScroll/GameSelectList/GameSelectSaveTab") +game_select_save_list = NodePath("GameSelectPanel/VBoxContainer/GameSelectScroll/GameSelectList/GameSelectSaveList") +start_button = NodePath("GameStartPanel/VBoxContainer/StartButton") +session_tag_line_edit = NodePath("GameStartPanel/VBoxContainer/SessionTagEdit") +session_tag_dialog = NodePath("SessionTagDialog") +delete_dialog = NodePath("DeleteDialog") + +[node name="GameSelectPanel" type="PanelContainer" parent="."] +layout_mode = 2 +size_flags_horizontal = 3 + +[node name="VBoxContainer" type="VBoxContainer" parent="GameSelectPanel"] +layout_mode = 2 + +[node name="GameSelectScroll" type="ScrollContainer" parent="GameSelectPanel/VBoxContainer"] +editor_description = "UI-39" +layout_mode = 2 +size_flags_vertical = 3 +horizontal_scroll_mode = 0 + +[node name="GameSelectList" type="VBoxContainer" parent="GameSelectPanel/VBoxContainer/GameSelectScroll"] +layout_mode = 2 +size_flags_horizontal = 3 +size_flags_vertical = 3 + +[node name="GameSelectStartDate" type="VBoxContainer" parent="GameSelectPanel/VBoxContainer/GameSelectScroll/GameSelectList"] +layout_mode = 2 + +[node name="GameSelectSaveTab" type="TabBar" parent="GameSelectPanel/VBoxContainer/GameSelectScroll/GameSelectList"] +layout_mode = 2 +tab_count = 1 +tab_0/title = "GAMELOBBY_SELECT_ALL" + +[node name="GameSelectSaveList" type="VBoxContainer" parent="GameSelectPanel/VBoxContainer/GameSelectScroll/GameSelectList"] +layout_mode = 2 +size_flags_vertical = 3 + +[node name="GameSelectList" type="ItemList" parent="GameSelectPanel/VBoxContainer"] +visible = false +layout_mode = 2 +size_flags_vertical = 3 +item_count = 2 +item_0/text = "1836" +item_1/text = "1863" + +[node name="Spacer" type="Control" parent="GameSelectPanel/VBoxContainer"] +custom_minimum_size = Vector2(0, 150) +layout_mode = 2 +size_flags_vertical = 3 + +[node name="BackButton" type="Button" parent="GameSelectPanel/VBoxContainer"] +editor_description = "UI-37" +layout_mode = 2 +text = "GAMELOBBY_BACK" + +[node name="Spacer2" type="Control" parent="GameSelectPanel/VBoxContainer"] +custom_minimum_size = Vector2(0, 33) +layout_mode = 2 + +[node name="Spacer" type="Control" parent="."] +layout_mode = 2 +size_flags_horizontal = 3 +size_flags_stretch_ratio = 2.75 +mouse_filter = 2 + +[node name="GameStartPanel" type="PanelContainer" parent="."] +layout_mode = 2 +size_flags_horizontal = 3 + +[node name="VBoxContainer" type="VBoxContainer" parent="GameStartPanel"] +layout_mode = 2 + +[node name="Spacer" type="Control" parent="GameStartPanel/VBoxContainer"] +custom_minimum_size = Vector2(0, 50) +layout_mode = 2 + +[node name="SelectedCountryNameLabel" type="Label" parent="GameStartPanel/VBoxContainer"] +layout_mode = 2 +text = "France" +horizontal_alignment = 1 + +[node name="Spacer2" type="Control" parent="GameStartPanel/VBoxContainer"] +custom_minimum_size = Vector2(0, 150) +layout_mode = 2 +size_flags_vertical = 3 + +[node name="SessionTagEdit" type="LineEdit" parent="GameStartPanel/VBoxContainer"] +layout_mode = 2 +placeholder_text = "GAMELOBBY_SESSION_TAG" + +[node name="StartButton" type="Button" parent="GameStartPanel/VBoxContainer"] +editor_description = "UI-43" +layout_mode = 2 +disabled = true +text = "GAMELOBBY_START" + +[node name="Spacer3" type="Control" parent="GameStartPanel/VBoxContainer"] +custom_minimum_size = Vector2(0, 33) +layout_mode = 2 + +[node name="SessionTagDialog" type="ConfirmationDialog" parent="."] +disable_3d = true +title = "GAMELOBBY_SESSIONTAG_DIALOG_TITLE" +ok_button_text = "DIALOG_OK" +dialog_text = "GAMELOBBY_SESSIONTAG_DIALOG_TEXT" +cancel_button_text = "DIALOG_CANCEL" + +[node name="DeleteDialog" type="ConfirmationDialog" parent="."] +disable_3d = true +title = "GAMELOBBY_DELETE_DIALOG_TITLE" +ok_button_text = "DIALOG_OK" +dialog_text = "GAMELOBBY_DELETE_DIALOG_TEXT" +cancel_button_text = "DIALOG_CANCEL" + +[connection signal="visibility_changed" from="." to="." method="_on_visibility_changed"] +[connection signal="tab_changed" from="GameSelectPanel/VBoxContainer/GameSelectScroll/GameSelectList/GameSelectSaveTab" to="." method="_on_game_select_save_tab_tab_changed"] +[connection signal="button_down" from="GameSelectPanel/VBoxContainer/BackButton" to="." method="_on_back_button_button_down"] +[connection signal="text_submitted" from="GameStartPanel/VBoxContainer/SessionTagEdit" to="." method="_on_session_tag_edit_text_submitted"] +[connection signal="pressed" from="GameStartPanel/VBoxContainer/StartButton" to="." method="_on_start_button_pressed"] +[connection signal="confirmed" from="SessionTagDialog" to="." method="_on_session_tag_dialog_confirmed"] +[connection signal="confirmed" from="DeleteDialog" to="." method="_on_delete_dialog_confirmed"] diff --git a/game/src/Game/Menu/LobbyMenu/LobbyPanelButton.gd b/game/src/Game/Menu/LobbyMenu/LobbyPanelButton.gd new file mode 100644 index 0000000..5f3ea46 --- /dev/null +++ b/game/src/Game/Menu/LobbyMenu/LobbyPanelButton.gd @@ -0,0 +1,102 @@ +@tool +class_name LobbyPanelButton +extends Container + +signal button_down +signal button_up +signal pressed +signal toggled(button_pressed : bool) + +var is_start_date : bool: + get = _is_start_date + +func _is_start_date() -> bool: + return true + +@export_group("Nodes") +@export var background_button : BaseButton +@export var name_label : Label + +var text : StringName: + get = get_text, + set = set_text + +func get_text() -> StringName: + return name_label.text + +func set_text(value : StringName) -> void: + name_label.text = value + +func _get_minimum_size() -> Vector2: + var result := Vector2() + for child in get_children(): + child = child as Control + if child == null or not child.visible: + continue + if child.top_level: + continue + + var minsize : Vector2 = child.get_combined_minimum_size() + result.x = max(result.x, minsize.x) + result.y = max(result.y, minsize.y) + + var draw_style := _get_draw_mode_style() + if draw_style != null: + result += draw_style.get_minimum_size() + + return result + +func _get_draw_mode_name(support_rtl : bool = true) -> StringName: + var rtl := support_rtl and background_button != null and background_button.is_layout_rtl() + match background_button.get_draw_mode() if background_button != null else BaseButton.DrawMode.DRAW_NORMAL: + BaseButton.DrawMode.DRAW_NORMAL: + if rtl: return &"normal_mirrored" + return &"normal" + BaseButton.DrawMode.DRAW_PRESSED: + if rtl: return &"pressed_mirrored" + return &"pressed" + BaseButton.DrawMode.DRAW_HOVER: + if rtl: return &"hover_mirrored" + return &"hover" + BaseButton.DrawMode.DRAW_DISABLED: + if rtl: return &"disabled_mirrored" + return &"disabled" + BaseButton.DrawMode.DRAW_HOVER_PRESSED: + if rtl: return &"hover_pressed_mirrored" + return &"hover_pressed" + return &"" + +func _get_draw_mode_style() -> StyleBox: + if background_button == null: return null + var result := background_button.get_theme_stylebox(_get_draw_mode_name()) + if result == null: + return background_button.get_theme_stylebox(_get_draw_mode_name(false)) + return result + +func _notification(what) -> void: + if what == NOTIFICATION_SORT_CHILDREN: + var _size := size + var offset := Vector2() + var style := _get_draw_mode_style() + if style != null: + _size -= style.get_minimum_size() + offset += style.get_offset() + + for child in get_children(): + child = child as Control + if child == null or not child.is_visible_in_tree() or child.top_level: + continue + + fit_child_in_rect(child, Rect2(offset, _size)) + +func _on_background_button_button_down(): + button_down.emit() + +func _on_background_button_button_up(): + button_up.emit() + +func _on_background_button_pressed(): + pressed.emit() + +func _on_background_button_toggled(button_pressed : bool): + toggled.emit(button_pressed) diff --git a/game/src/Game/Menu/LobbyMenu/LobbyPanelButton.tscn b/game/src/Game/Menu/LobbyMenu/LobbyPanelButton.tscn new file mode 100644 index 0000000..f409a2e --- /dev/null +++ b/game/src/Game/Menu/LobbyMenu/LobbyPanelButton.tscn @@ -0,0 +1,31 @@ +[gd_scene load_steps=2 format=3 uid="uid://k71f5gibwmtc"] + +[ext_resource type="Script" path="res://src/LobbyMenu/LobbyPanelButton.gd" id="1_327u2"] + +[node name="LobbyPanelButton" type="Container" node_paths=PackedStringArray("background_button", "name_label")] +editor_description = "UI-41" +offset_right = 113.0 +offset_bottom = 48.0 +script = ExtResource("1_327u2") +background_button = NodePath("BackgroundButton") +name_label = NodePath("SaveList/NameLabel") + +[node name="BackgroundButton" type="Button" parent="."] +layout_mode = 2 +theme_type_variation = &"ButtonContainer" + +[node name="SaveList" type="HBoxContainer" parent="."] +layout_mode = 2 +size_flags_horizontal = 0 +mouse_filter = 2 + +[node name="NameLabel" type="Label" parent="SaveList"] +layout_mode = 2 +size_flags_vertical = 1 +text = "PLACEHOLDER" +vertical_alignment = 1 + +[connection signal="button_down" from="BackgroundButton" to="." method="_on_background_button_button_down"] +[connection signal="button_up" from="BackgroundButton" to="." method="_on_background_button_button_up"] +[connection signal="pressed" from="BackgroundButton" to="." method="_on_background_button_pressed"] +[connection signal="toggled" from="BackgroundButton" to="." method="_on_background_button_toggled"] diff --git a/game/src/Game/Menu/MainMenu/MainMenu.gd b/game/src/Game/Menu/MainMenu/MainMenu.gd new file mode 100644 index 0000000..9d0edc6 --- /dev/null +++ b/game/src/Game/Menu/MainMenu/MainMenu.gd @@ -0,0 +1,50 @@ +extends Control + +signal options_button_pressed +signal new_game_button_pressed +signal credits_button_pressed + +@export +var _new_game_button : BaseButton + +# REQUIREMENTS: +# * SS-3 +func _ready(): + _on_new_game_button_visibility_changed() + +# REQUIREMENTS: +# * SS-14 +# * UIFUN-32 +func _on_new_game_button_pressed(): + print("Start a new game!") + new_game_button_pressed.emit() + + +func _on_continue_button_pressed(): + print("Continue last game!") + + +func _on_multi_player_button_pressed(): + print("Have fun with friends!") + + +func _on_options_button_pressed(): + print("Check out some options!") + options_button_pressed.emit() + +# REQUIREMENTS +# * UI-32 +# * UIFUN-36 +func _on_credits_button_pressed(): + credits_button_pressed.emit() + +# REQUIREMENTS +# * SS-4 +# * UIFUN-3 +func _on_exit_button_pressed(): + print("See you later!") + get_tree().quit() + +func _on_new_game_button_visibility_changed(): + if visible: + _new_game_button.grab_focus.call_deferred() diff --git a/game/src/Game/Menu/MainMenu/MainMenu.tscn b/game/src/Game/Menu/MainMenu/MainMenu.tscn new file mode 100644 index 0000000..0618fe8 --- /dev/null +++ b/game/src/Game/Menu/MainMenu/MainMenu.tscn @@ -0,0 +1,150 @@ +[gd_scene load_steps=6 format=3 uid="uid://bp5n3mlu45ygw"] + +[ext_resource type="Theme" uid="uid://qoi3oec48jp0" path="res://theme/main_menu.tres" id="1_1yri4"] +[ext_resource type="Script" path="res://src/MainMenu/MainMenu.gd" id="2_nm1fq"] +[ext_resource type="Texture2D" uid="uid://dxys0wg0f0ic5" path="res://theme/assets/OpenVicFINALREALTRANS.png" id="3_58ess"] +[ext_resource type="PackedScene" uid="uid://b7oncobnacxmt" path="res://src/LocaleButton.tscn" id="3_amonp"] +[ext_resource type="PackedScene" uid="uid://cen7wkmn6og66" path="res://src/MainMenu/ReleaseInfoBox.tscn" id="3_km0er"] + +[node name="MainMenu" type="Control" node_paths=PackedStringArray("_new_game_button")] +editor_description = "UI-13" +layout_mode = 3 +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +grow_horizontal = 2 +grow_vertical = 2 +theme = ExtResource("1_1yri4") +script = ExtResource("2_nm1fq") +_new_game_button = NodePath("MenuPanel/MenuList/ButtonListMargin/ButtonList/NewGameButton") + +[node name="MenuPanel" type="PanelContainer" parent="."] +layout_mode = 1 +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +grow_horizontal = 2 +grow_vertical = 2 +theme_type_variation = &"BackgroundPanel" + +[node name="MenuList" type="VBoxContainer" parent="MenuPanel"] +layout_mode = 2 + +[node name="TitleIcon" type="TextureRect" parent="MenuPanel/MenuList"] +layout_mode = 2 +size_flags_vertical = 3 +size_flags_stretch_ratio = 1.75 +texture = ExtResource("3_58ess") +expand_mode = 1 +stretch_mode = 5 + +[node name="ButtonListMargin" type="MarginContainer" parent="MenuPanel/MenuList"] +layout_mode = 2 +theme_override_constants/margin_left = 15 +theme_override_constants/margin_right = 12 + +[node name="ButtonList" type="HBoxContainer" parent="MenuPanel/MenuList/ButtonListMargin"] +custom_minimum_size = Vector2(500, 0) +layout_mode = 2 +theme_type_variation = &"HBox_MainMenu_ButtonList" +theme_override_constants/separation = 18 +alignment = 1 + +[node name="NewGameButton" type="Button" parent="MenuPanel/MenuList/ButtonListMargin/ButtonList"] +editor_description = "UI-26" +layout_mode = 2 +size_flags_horizontal = 3 +focus_neighbor_left = NodePath("../ExitButton") +focus_neighbor_top = NodePath("../ExitButton") +focus_neighbor_right = NodePath("../ContinueButton") +focus_next = NodePath("../ContinueButton") +focus_previous = NodePath("../ExitButton") +theme_type_variation = &"TitleButton" +text = "MAINMENU_NEW_GAME" +clip_text = true + +[node name="ContinueButton" type="Button" parent="MenuPanel/MenuList/ButtonListMargin/ButtonList"] +layout_mode = 2 +size_flags_horizontal = 3 +focus_neighbor_left = NodePath("../NewGameButton") +focus_neighbor_right = NodePath("../MultiplayerButton") +focus_next = NodePath("../MultiplayerButton") +focus_previous = NodePath("../NewGameButton") +theme_type_variation = &"TitleButton" +disabled = true +text = "MAINMENU_CONTINUE" +clip_text = true + +[node name="MultiplayerButton" type="Button" parent="MenuPanel/MenuList/ButtonListMargin/ButtonList"] +editor_description = "UI-27" +layout_mode = 2 +size_flags_horizontal = 3 +focus_neighbor_left = NodePath("../ContinueButton") +focus_neighbor_right = NodePath("../OptionsButton") +focus_next = NodePath("../OptionsButton") +focus_previous = NodePath("../ContinueButton") +theme_type_variation = &"TitleButton" +text = "MAINMENU_MULTIPLAYER" +clip_text = true + +[node name="OptionsButton" type="Button" parent="MenuPanel/MenuList/ButtonListMargin/ButtonList"] +editor_description = "UI-5" +layout_mode = 2 +size_flags_horizontal = 3 +focus_neighbor_left = NodePath("../MultiplayerButton") +focus_neighbor_right = NodePath("../CreditsButton") +focus_next = NodePath("../CreditsButton") +focus_previous = NodePath("../MultiplayerButton") +theme_type_variation = &"TitleButton" +text = "MAINMENU_OPTIONS" +clip_text = true + +[node name="CreditsButton" type="Button" parent="MenuPanel/MenuList/ButtonListMargin/ButtonList"] +editor_description = "UI-32" +layout_mode = 2 +size_flags_horizontal = 3 +focus_neighbor_left = NodePath("../OptionsButton") +focus_neighbor_right = NodePath("../ExitButton") +focus_next = NodePath("../ExitButton") +focus_previous = NodePath("../OptionsButton") +theme_type_variation = &"TitleButton" +text = "MAINMENU_CREDITS" +clip_text = true + +[node name="ExitButton" type="Button" parent="MenuPanel/MenuList/ButtonListMargin/ButtonList"] +editor_description = "UI-3" +layout_mode = 2 +size_flags_horizontal = 3 +focus_neighbor_left = NodePath("../OptionsButton") +focus_neighbor_right = NodePath("../NewGameButton") +focus_next = NodePath("../NewGameButton") +focus_previous = NodePath("../OptionsButton") +theme_type_variation = &"TitleButton" +text = "MAINMENU_EXIT" +clip_text = true + +[node name="BottomSpace" type="Control" parent="MenuPanel/MenuList"] +layout_mode = 2 +size_flags_vertical = 3 +size_flags_stretch_ratio = 0.35 + +[node name="BottomMargin" type="MarginContainer" parent="MenuPanel/MenuList"] +layout_mode = 2 +theme_type_variation = &"BottomMargin" + +[node name="ReleaseInfoBox" parent="MenuPanel/MenuList/BottomMargin" instance=ExtResource("3_km0er")] +layout_mode = 2 + +[node name="LocaleButton" parent="MenuPanel/MenuList/BottomMargin" instance=ExtResource("3_amonp")] +layout_mode = 2 +size_flags_horizontal = 8 +alignment = 0 +text_overrun_behavior = 4 + +[connection signal="pressed" from="MenuPanel/MenuList/ButtonListMargin/ButtonList/NewGameButton" to="." method="_on_new_game_button_pressed"] +[connection signal="visibility_changed" from="MenuPanel/MenuList/ButtonListMargin/ButtonList/NewGameButton" to="." method="_on_new_game_button_visibility_changed"] +[connection signal="pressed" from="MenuPanel/MenuList/ButtonListMargin/ButtonList/ContinueButton" to="." method="_on_continue_button_pressed"] +[connection signal="pressed" from="MenuPanel/MenuList/ButtonListMargin/ButtonList/MultiplayerButton" to="." method="_on_multi_player_button_pressed"] +[connection signal="pressed" from="MenuPanel/MenuList/ButtonListMargin/ButtonList/OptionsButton" to="." method="_on_options_button_pressed"] +[connection signal="pressed" from="MenuPanel/MenuList/ButtonListMargin/ButtonList/CreditsButton" to="." method="_on_credits_button_pressed"] +[connection signal="pressed" from="MenuPanel/MenuList/ButtonListMargin/ButtonList/ExitButton" to="." method="_on_exit_button_pressed"] diff --git a/game/src/Game/Menu/MainMenu/ReleaseInfoBox.gd b/game/src/Game/Menu/MainMenu/ReleaseInfoBox.gd new file mode 100644 index 0000000..e363162 --- /dev/null +++ b/game/src/Game/Menu/MainMenu/ReleaseInfoBox.gd @@ -0,0 +1,41 @@ +extends HBoxContainer + +@export +var _version_label : Button + +@export +var _commit_label : Button + +@export +var _checksum_label : Button + +var _checksum : String = "????" + +# REQUIREMENTS: +# * UIFUN-97 +func _ready(): + _version_label.text = _GIT_INFO_.release_name + _version_label.tooltip_text = _GIT_INFO_.tag + _commit_label.text = _GIT_INFO_.short_hash + _commit_label.tooltip_text = _GIT_INFO_.commit_hash + # UI-111 + _checksum = Checksum.get_checksum_text() + _update_checksum_label_text() + +func _notification(what : int): + match what: + NOTIFICATION_TRANSLATION_CHANGED: + _update_checksum_label_text() + +func _update_checksum_label_text() -> void: + _checksum_label.tooltip_text = tr("MAINMENU_CHECKSUM").format({ "checksum": _checksum }) + _checksum_label.text = "(%s)" % _checksum.substr(0, 4) + +func _on_version_label_pressed(): + DisplayServer.clipboard_set(_GIT_INFO_.tag) + +func _on_commit_label_pressed(): + DisplayServer.clipboard_set(_GIT_INFO_.commit_hash) + +func _on_checksum_label_pressed(): + DisplayServer.clipboard_set(_checksum) diff --git a/game/src/Game/Menu/MainMenu/ReleaseInfoBox.tscn b/game/src/Game/Menu/MainMenu/ReleaseInfoBox.tscn new file mode 100644 index 0000000..821982b --- /dev/null +++ b/game/src/Game/Menu/MainMenu/ReleaseInfoBox.tscn @@ -0,0 +1,38 @@ +[gd_scene load_steps=2 format=3 uid="uid://cen7wkmn6og66"] + +[ext_resource type="Script" path="res://src/MainMenu/ReleaseInfoBox.gd" id="1_y2djw"] + +[node name="ReleaseInfoBox" type="HBoxContainer" node_paths=PackedStringArray("_version_label", "_commit_label", "_checksum_label")] +editor_description = "UI-31" +script = ExtResource("1_y2djw") +_version_label = NodePath("VersionLabel") +_commit_label = NodePath("CommitLabel") +_checksum_label = NodePath("ChecksumLabel") + +[node name="VersionLabel" type="Button" parent="."] +layout_mode = 2 +tooltip_text = "VERSION_MISSING" +theme_type_variation = &"VersionLabel" +text = "VERSION_MISSING" +flat = true +alignment = 0 + +[node name="CommitLabel" type="Button" parent="."] +layout_mode = 2 +theme_type_variation = &"CommitLabel" +text = "????????" +flat = true +alignment = 0 + +[node name="ChecksumLabel" type="Button" parent="."] +editor_description = "UI-111" +layout_mode = 2 +tooltip_text = "CHECKSUM_MISSING" +theme_type_variation = &"ChecksumLabel" +text = "(????)" +flat = true +alignment = 0 + +[connection signal="pressed" from="VersionLabel" to="." method="_on_version_label_pressed"] +[connection signal="pressed" from="CommitLabel" to="." method="_on_commit_label_pressed"] +[connection signal="pressed" from="ChecksumLabel" to="." method="_on_checksum_label_pressed"] diff --git a/game/src/Game/Menu/OptionMenu/AutosaveIntervalSelector.gd b/game/src/Game/Menu/OptionMenu/AutosaveIntervalSelector.gd new file mode 100644 index 0000000..2c55862 --- /dev/null +++ b/game/src/Game/Menu/OptionMenu/AutosaveIntervalSelector.gd @@ -0,0 +1,2 @@ +extends SettingOptionButton + diff --git a/game/src/Game/Menu/OptionMenu/ControlsTab.tscn b/game/src/Game/Menu/OptionMenu/ControlsTab.tscn new file mode 100644 index 0000000..b84dc85 --- /dev/null +++ b/game/src/Game/Menu/OptionMenu/ControlsTab.tscn @@ -0,0 +1,14 @@ +[gd_scene load_steps=2 format=3 uid="uid://cdwymd51i4b2f"] + +[ext_resource type="PackedScene" uid="uid://by4gggse2nsdx" path="res://addons/keychain/ShortcutEdit.tscn" id="1_fv8sh"] + +[node name="Controls" type="Control"] +layout_mode = 3 +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +grow_horizontal = 2 +grow_vertical = 2 + +[node name="ShortcutEdit" parent="." instance=ExtResource("1_fv8sh")] +layout_mode = 1 diff --git a/game/src/Game/Menu/OptionMenu/GeneralTab.gd b/game/src/Game/Menu/OptionMenu/GeneralTab.gd new file mode 100644 index 0000000..3d98678 --- /dev/null +++ b/game/src/Game/Menu/OptionMenu/GeneralTab.gd @@ -0,0 +1,9 @@ +extends HBoxContainer + +@export var initial_focus: Control + +func _notification(what : int) -> void: + match(what): + NOTIFICATION_VISIBILITY_CHANGED: + if visible and is_inside_tree(): + initial_focus.grab_focus() diff --git a/game/src/Game/Menu/OptionMenu/GeneralTab.tscn b/game/src/Game/Menu/OptionMenu/GeneralTab.tscn new file mode 100644 index 0000000..4e9ff6a --- /dev/null +++ b/game/src/Game/Menu/OptionMenu/GeneralTab.tscn @@ -0,0 +1,81 @@ +[gd_scene load_steps=5 format=3 uid="uid://duwjal7sd7p6w"] + +[ext_resource type="Script" path="res://src/OptionMenu/GeneralTab.gd" id="1_gbutn"] +[ext_resource type="PackedScene" uid="uid://b7oncobnacxmt" path="res://src/LocaleButton.tscn" id="2_5cfd7"] +[ext_resource type="Script" path="res://src/OptionMenu/SettingNodes/SettingOptionButton.gd" id="2_msx2u"] +[ext_resource type="Script" path="res://src/OptionMenu/AutosaveIntervalSelector.gd" id="2_t06tb"] + +[node name="GeneralTab" type="HBoxContainer" node_paths=PackedStringArray("initial_focus")] +editor_description = "UI-48, UIFUN-45" +alignment = 1 +script = ExtResource("1_gbutn") +initial_focus = NodePath("VBoxContainer/GridContainer/SavegameFormatSelector") + +[node name="VBoxContainer" type="VBoxContainer" parent="."] +layout_mode = 2 + +[node name="Control" type="Control" parent="VBoxContainer"] +layout_mode = 2 +size_flags_vertical = 3 +size_flags_stretch_ratio = 0.1 + +[node name="GridContainer" type="GridContainer" parent="VBoxContainer"] +layout_mode = 2 +size_flags_vertical = 3 +columns = 2 + +[node name="SavegameFormatLabel" type="Label" parent="VBoxContainer/GridContainer"] +layout_mode = 2 +text = "OPTIONS_GENERAL_SAVEFORMAT" + +[node name="SavegameFormatSelector" type="OptionButton" parent="VBoxContainer/GridContainer"] +editor_description = "UI-50" +layout_mode = 2 +focus_neighbor_bottom = NodePath("../AutosaveIntervalSelector") +item_count = 2 +selected = 0 +popup/item_0/text = "OPTIONS_GENERAL_BINARY" +popup/item_0/id = 0 +popup/item_1/text = "OPTIONS_GENERAL_TEXT" +popup/item_1/id = 1 +script = ExtResource("2_msx2u") +section_name = "general" +setting_name = "savegame_format" +default_selected = 0 + +[node name="AutosaveIntervalLabel" type="Label" parent="VBoxContainer/GridContainer"] +layout_mode = 2 +text = "OPTIONS_GENERAL_AUTOSAVE" + +[node name="AutosaveIntervalSelector" type="OptionButton" parent="VBoxContainer/GridContainer"] +editor_description = "UI-15, UIFUN-19" +layout_mode = 2 +focus_neighbor_top = NodePath("../SavegameFormatSelector") +focus_neighbor_bottom = NodePath("../LocaleButton") +item_count = 5 +selected = 0 +popup/item_0/text = "OPTIONS_GENERAL_AUTOSAVE_MONTHLY" +popup/item_0/id = 0 +popup/item_1/text = "OPTIONS_GENERAL_AUTOSAVE_BIMONTHLY" +popup/item_1/id = 1 +popup/item_2/text = "OPTIONS_GENERAL_AUTOSAVE_YEARLY" +popup/item_2/id = 2 +popup/item_3/text = "OPTIONS_GENERAL_AUTOSAVE_BIYEARLY" +popup/item_3/id = 3 +popup/item_4/text = "OPTIONS_GENERAL_AUTOSAVE_NEVER" +popup/item_4/id = 4 +script = ExtResource("2_t06tb") +section_name = "general" +setting_name = "autosave_interval" +default_selected = 0 + +[node name="LocaleLabel" type="Label" parent="VBoxContainer/GridContainer"] +layout_mode = 2 +text = "OPTIONS_GENERAL_LANGUAGE" + +[node name="LocaleButton" parent="VBoxContainer/GridContainer" instance=ExtResource("2_5cfd7")] +editor_description = "UI-79" +layout_mode = 2 +focus_neighbor_top = NodePath("../AutosaveIntervalSelector") +alignment = 0 +text_overrun_behavior = 4 diff --git a/game/src/Game/Menu/OptionMenu/GuiScaleSelector.gd b/game/src/Game/Menu/OptionMenu/GuiScaleSelector.gd new file mode 100644 index 0000000..4dd86e1 --- /dev/null +++ b/game/src/Game/Menu/OptionMenu/GuiScaleSelector.gd @@ -0,0 +1,64 @@ +extends SettingOptionButton + +# REQUIREMENTS +# * UIFUN-24 +# * UIFUN-31 + +@export +var default_value : float = GuiScale.error_guiscale + +func _find_guiscale_index_by_value(value : float) -> int: + for item_index in item_count: + if get_item_metadata(item_index) == value: + return item_index + return -1 + +func _sync_guiscales(to_select : float = GuiScale.get_current_guiscale()) -> void: + clear() + default_selected = -1 + selected = -1 + for guiscale_value in GuiScale.get_guiscale_value_list(): + add_item(GuiScale.get_guiscale_display_name(guiscale_value)) + set_item_metadata(item_count - 1, guiscale_value) + + if guiscale_value == default_value: + default_selected = item_count - 1 + + if guiscale_value == to_select: + selected = item_count - 1 + + if default_selected == -1: + default_selected = item_count - 1 + + if selected == -1: + selected = default_selected + +func _setup_button(): + if default_value <= 0: + default_value = ProjectSettings.get_setting("display/window/stretch/scale") + GuiScale.add_guiscale(default_value, &"default") + _sync_guiscales() + +func _get_value_for_file(select_value : int): + if _valid_index(select_value): + return get_item_metadata(select_value) + else: + return null + +func _set_value_from_file(load_value): + if typeof(load_value) == TYPE_FLOAT: + var target_guiscale : float = load_value + selected = _find_guiscale_index_by_value(target_guiscale) + if selected != -1: return + if GuiScale.add_guiscale(target_guiscale): + _sync_guiscales(target_guiscale) + return + push_error("Setting value '%s' invalid for setting [%s] %s" % [load_value, section_name, setting_name]) + selected = default_selected + +func _on_option_selected(index : int, by_user : bool): + if _valid_index(index): + GuiScale.set_guiscale(get_item_metadata(index)) + else: + push_error("Invalid GuiScaleSelector index: %d" % index) + reset_setting(not by_user) diff --git a/game/src/Game/Menu/OptionMenu/MonitorDisplaySelector.gd b/game/src/Game/Menu/OptionMenu/MonitorDisplaySelector.gd new file mode 100644 index 0000000..7de033a --- /dev/null +++ b/game/src/Game/Menu/OptionMenu/MonitorDisplaySelector.gd @@ -0,0 +1,18 @@ +extends SettingOptionButton + +func _setup_button() -> void: + clear() + for screen_index in DisplayServer.get_screen_count(): + add_item("Monitor %d" % (screen_index + 1)) + default_selected = get_viewport().get_window().current_screen + +func _on_option_selected(index : int, by_user : bool) -> void: + if _valid_index(index): + var window := get_viewport().get_window() + var mode := window.mode + window.mode = Window.MODE_WINDOWED + get_viewport().get_window().set_current_screen(index) + window.mode = mode + else: + push_error("Invalid MonitorDisplaySelector index: %d" % index) + reset_setting(not by_user) diff --git a/game/src/Game/Menu/OptionMenu/OptionsMenu.gd b/game/src/Game/Menu/OptionMenu/OptionsMenu.gd new file mode 100644 index 0000000..5f6a088 --- /dev/null +++ b/game/src/Game/Menu/OptionMenu/OptionsMenu.gd @@ -0,0 +1,68 @@ +extends Control + +# REQUIREMENTS +# * SS-13 + +signal back_button_pressed + +func _ready(): + # Prepare options menu before loading user settings + var tab_bar : TabBar = $Margin/Tab.get_child(0, true) + + # This ends up easier to manage then trying to manually recreate the TabContainer's behavior + # These buttons can be accessed regardless of the tab + var button_list := HBoxContainer.new() + button_list.set_anchors_and_offsets_preset(Control.PRESET_FULL_RECT) + button_list.alignment = BoxContainer.ALIGNMENT_END + tab_bar.add_child(button_list) + + # REQUIREMENTS + # * UI-12 + # * UIFUN-14 + var reset_button := Button.new() + reset_button.text = "OPTIONS_RESET" + reset_button.pressed.connect(Events.Options.try_reset_settings) + button_list.add_child(reset_button) + + # REQUIREMENTS + # * UI-11 + # * UIFUN-17 + var back_button := Button.new() + back_button.text = "OPTIONS_BACK" + back_button.pressed.connect(_on_back_button_pressed) + button_list.add_child(back_button) + get_viewport().get_window().close_requested.connect(_on_window_close_requested) + _save_overrides.call_deferred() + Events.Options.save_settings.connect(func(_f): self._save_overrides.call_deferred()) + +func _notification(what): + match what: + NOTIFICATION_CRASH: + _on_window_close_requested() + +func _input(event): + if self.is_visible_in_tree(): + if event.is_action_pressed("ui_cancel"): + _on_back_button_pressed() + +func _on_back_button_pressed(): + Events.Options.save_settings_to_file() + back_button_pressed.emit() + +func _on_window_close_requested() -> void: + if visible: + Events.Options.save_settings_to_file() + +func _save_overrides() -> void: + var override_path : String = ProjectSettings.get_setting("application/config/project_settings_override", "") + if override_path.is_empty(): + override_path = ProjectSettings.get_setting(Events.Options.settings_file_path_setting, Events.Options.settings_file_path_default) + var file := ConfigFile.new() + var err_ret := file.load(override_path) + if err_ret != OK: push_error("Failed to load overrides from %s" % override_path) + file.set_value("display", "window/size/mode", get_viewport().get_window().mode) + var resolution : Vector2i = Resolution.get_current_resolution() + file.set_value("display", "window/size/viewport_width", resolution.x) + file.set_value("display", "window/size/viewport_height", resolution.y) + err_ret = file.save(override_path) + if err_ret != OK: push_error("Failed to save overrides to %s" % override_path) diff --git a/game/src/Game/Menu/OptionMenu/OptionsMenu.tscn b/game/src/Game/Menu/OptionMenu/OptionsMenu.tscn new file mode 100644 index 0000000..3156e33 --- /dev/null +++ b/game/src/Game/Menu/OptionMenu/OptionsMenu.tscn @@ -0,0 +1,52 @@ +[gd_scene load_steps=8 format=3 uid="uid://cnbfxjy1m6wja"] + +[ext_resource type="Theme" uid="uid://fbxssqcg1s0m" path="res://theme/options_menu.tres" id="1_0up1d"] +[ext_resource type="Script" path="res://src/OptionMenu/OptionsMenu.gd" id="1_tlein"] +[ext_resource type="PackedScene" uid="uid://bq3awxxjn1tuw" path="res://src/OptionMenu/VideoTab.tscn" id="2_ji8xr"] +[ext_resource type="PackedScene" uid="uid://cbtgwpx2wxi33" path="res://src/OptionMenu/SoundTab.tscn" id="3_4w35t"] +[ext_resource type="PackedScene" uid="uid://duwjal7sd7p6w" path="res://src/OptionMenu/GeneralTab.tscn" id="3_6gvf6"] +[ext_resource type="PackedScene" uid="uid://bq7ibhm0txl5p" path="res://addons/keychain/ShortcutEdit.tscn" id="4_vdhjp"] +[ext_resource type="PackedScene" uid="uid://dp2grvybtecqu" path="res://src/OptionMenu/OtherTab.tscn" id="5_ahefp"] + +[node name="OptionsMenu" type="PanelContainer"] +editor_description = "UI-25" +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +grow_horizontal = 2 +grow_vertical = 2 +theme = ExtResource("1_0up1d") +theme_type_variation = &"BackgroundPanel" +script = ExtResource("1_tlein") + +[node name="Margin" type="MarginContainer" parent="."] +layout_mode = 2 +theme_type_variation = &"TabMargin" + +[node name="Tab" type="TabContainer" parent="Margin"] +editor_description = "UI-45" +layout_mode = 2 +tab_alignment = 1 +use_hidden_tabs_for_min_size = true + +[node name="General" parent="Margin/Tab" instance=ExtResource("3_6gvf6")] +layout_mode = 2 + +[node name="Video" parent="Margin/Tab" instance=ExtResource("2_ji8xr")] +editor_description = "UI-46, UIFUN-43" +visible = false +layout_mode = 2 + +[node name="Sound" parent="Margin/Tab" instance=ExtResource("3_4w35t")] +editor_description = "UI-47, UIFUN-44" +visible = false +layout_mode = 2 + +[node name="Controls" parent="Margin/Tab" instance=ExtResource("4_vdhjp")] +editor_description = "SS-27, UI-49, UIFUN-46" +visible = false +layout_mode = 2 +alignment = 1 + +[node name="Other" parent="Margin/Tab" instance=ExtResource("5_ahefp")] +layout_mode = 2 diff --git a/game/src/Game/Menu/OptionMenu/OtherTab.tscn b/game/src/Game/Menu/OptionMenu/OtherTab.tscn new file mode 100644 index 0000000..0ffc92d --- /dev/null +++ b/game/src/Game/Menu/OptionMenu/OtherTab.tscn @@ -0,0 +1,18 @@ +[gd_scene format=3 uid="uid://dp2grvybtecqu"] + +[node name="Other" type="Control"] +visible = false +layout_mode = 3 +anchors_preset = 0 + +[node name="HBoxContainer" type="HBoxContainer" parent="."] +layout_mode = 0 +offset_right = 40.0 +offset_bottom = 40.0 + +[node name="Label" type="Label" parent="HBoxContainer"] +layout_mode = 2 +text = "Spinbox Example :)" + +[node name="SpinBox" type="SpinBox" parent="HBoxContainer"] +layout_mode = 2 diff --git a/game/src/Game/Menu/OptionMenu/QualityPresetSelector.gd b/game/src/Game/Menu/OptionMenu/QualityPresetSelector.gd new file mode 100644 index 0000000..57ba4ab --- /dev/null +++ b/game/src/Game/Menu/OptionMenu/QualityPresetSelector.gd @@ -0,0 +1,4 @@ +extends SettingOptionButton + +func _setup_button(): + pass diff --git a/game/src/Game/Menu/OptionMenu/RefreshRateSelector.gd b/game/src/Game/Menu/OptionMenu/RefreshRateSelector.gd new file mode 100644 index 0000000..31b115b --- /dev/null +++ b/game/src/Game/Menu/OptionMenu/RefreshRateSelector.gd @@ -0,0 +1,5 @@ +extends SettingOptionButton + + +func _setup_button(): + pass diff --git a/game/src/Game/Menu/OptionMenu/ResolutionRevertDialog.gd b/game/src/Game/Menu/OptionMenu/ResolutionRevertDialog.gd new file mode 100644 index 0000000..4d2b8f2 --- /dev/null +++ b/game/src/Game/Menu/OptionMenu/ResolutionRevertDialog.gd @@ -0,0 +1,35 @@ +extends ConfirmationDialog +class_name ResolutionRevertDialog + +signal dialog_accepted(button : SettingRevertButton) +signal dialog_reverted(button : SettingRevertButton) + +@export_group("Nodes") +@export var timer : Timer + +var _revert_node : SettingRevertButton = null + +func show_dialog(button : SettingRevertButton, time : float = 0) -> void: + timer.start(time) + popup_centered(Vector2(1,1)) + _revert_node = button + +func _notification(what): + if what == NOTIFICATION_VISIBILITY_CHANGED: + set_process(visible) + if not visible: _revert_node = null + +func _process(_delta) -> void: + dialog_text = tr("OPTIONS_VIDEO_RESOLUTION_DIALOG_TEXT").format({ "time": int(timer.time_left) }) + +func _on_canceled_or_close_requested() -> void: + timer.stop() + dialog_reverted.emit(_revert_node) + +func _on_confirmed() -> void: + timer.stop() + dialog_accepted.emit(_revert_node) + +func _on_resolution_revert_timer_timeout() -> void: + dialog_reverted.emit(_revert_node) + hide() diff --git a/game/src/Game/Menu/OptionMenu/ResolutionSelector.gd b/game/src/Game/Menu/OptionMenu/ResolutionSelector.gd new file mode 100644 index 0000000..ebdf718 --- /dev/null +++ b/game/src/Game/Menu/OptionMenu/ResolutionSelector.gd @@ -0,0 +1,91 @@ +extends SettingRevertButton + +# REQUIREMENTS +# * UIFUN-21 +# * UIFUN-28 +# * UIFUN-301 +# * UIFUN-302 + +@export var default_value : Vector2i = Resolution.error_resolution + +func _find_resolution_index_by_value(value : Vector2i) -> int: + for item_index in item_count: + if get_item_metadata(item_index) == value: + return item_index + return -1 + +func _sync_resolutions( + value : Vector2i = Resolution.error_resolution, + _resolution_name = null, + _resolution_display_name = null +) -> void: + clear() + default_selected = -1 + selected = -1 + var resolution_list := Resolution.get_resolution_value_list() + if value != Resolution.error_resolution: + resolution_list.append(value) + for resolution_value in resolution_list: + var display_name := "%sx%s" % [resolution_value.x, resolution_value.y] + var resolution_name := Resolution.get_resolution_name(resolution_value) + if resolution_name == &"Default": + display_name = "Default (%s)" % resolution_name + if not resolution_name.is_empty(): + display_name = "%s (%s)" % [display_name, resolution_name + (", Default" if resolution_value == default_value else "")] + add_item(display_name) + set_item_metadata(item_count - 1, resolution_value) + + if resolution_value == default_value: + default_selected = item_count - 1 + + if resolution_value == Resolution.get_current_resolution(): + selected = item_count - 1 + + if default_selected == -1: + default_selected = item_count - 1 + + if selected == -1: + selected = default_selected + +func _setup_button() -> void: + Resolution.resolution_added.connect(_sync_resolutions) + if default_value.x <= 0: + default_value.x = ProjectSettings.get_setting("display/window/size/viewport_width") + if default_value.y <= 0: + default_value.y = ProjectSettings.get_setting("display/window/size/viewport_height") + if not Resolution.has_resolution(default_value): + Resolution.add_resolution(default_value, &"Default") + else: + _sync_resolutions() + +func _get_value_for_file(select_value : int) -> Variant: + if _valid_index(select_value): + return get_item_metadata(select_value) + else: + return null + +func _set_value_from_file(load_value) -> void: + var target_resolution := Resolution.error_resolution + match typeof(load_value): + TYPE_VECTOR2I: target_resolution = load_value + TYPE_STRING, TYPE_STRING_NAME: target_resolution = Resolution.get_resolution_value_from_string(load_value) + if target_resolution != Resolution.error_resolution: + selected = _find_resolution_index_by_value(target_resolution) + if selected != -1: return + if Resolution.add_resolution(target_resolution): + Resolution.set_resolution(target_resolution) + return + push_error("Setting value '%s' invalid for setting [%s] %s" % [load_value, section_name, setting_name]) + selected = default_selected + +func _on_option_selected(index : int, by_user : bool) -> void: + if _valid_index(index): + if by_user: + print("Start Revert Countdown!") + revert_dialog.show_dialog.call_deferred(self) + previous_index = _find_resolution_index_by_value(Resolution.get_current_resolution()) + + Resolution.set_resolution(get_item_metadata(index)) + else: + push_error("Invalid ResolutionSelector index: %d" % index) + reset_setting(not by_user) diff --git a/game/src/Game/Menu/OptionMenu/ScreenModeSelector.gd b/game/src/Game/Menu/OptionMenu/ScreenModeSelector.gd new file mode 100644 index 0000000..af95901 --- /dev/null +++ b/game/src/Game/Menu/OptionMenu/ScreenModeSelector.gd @@ -0,0 +1,48 @@ +extends SettingRevertButton + +# REQUIREMENTS +# * UIFUN-42 + +enum ScreenMode { Unknown = -1, Fullscreen, Borderless, Windowed } + +func get_screen_mode_from_window_mode(window_mode : int) -> ScreenMode: + match window_mode: + Window.MODE_EXCLUSIVE_FULLSCREEN: + return ScreenMode.Fullscreen + Window.MODE_FULLSCREEN: + return ScreenMode.Borderless + Window.MODE_WINDOWED: + return ScreenMode.Windowed + _: + return ScreenMode.Unknown + +func get_window_mode_from_screen_mode(screen_mode : int) -> Window.Mode: + match screen_mode: + ScreenMode.Fullscreen: + return Window.MODE_EXCLUSIVE_FULLSCREEN + ScreenMode.Borderless: + return Window.MODE_FULLSCREEN + ScreenMode.Windowed: + return Window.MODE_WINDOWED + _: + return Window.MODE_EXCLUSIVE_FULLSCREEN + +func _setup_button(): + default_selected = get_screen_mode_from_window_mode(get_viewport().get_window().mode) + selected = default_selected + +func _on_option_selected(index : int, by_user : bool) -> void: + if _valid_index(index): + if by_user: + print("Start Revert Countdown!") + revert_dialog.show_dialog.call_deferred(self) + previous_index = get_screen_mode_from_window_mode(get_viewport().get_window().mode) + + var current_resolution := Resolution.get_current_resolution() + var window_mode := get_window_mode_from_screen_mode(index) + Resolution.window_mode_changed.emit(window_mode) + get_viewport().get_window().mode = window_mode + Resolution.set_resolution(current_resolution) + else: + push_error("Invalid ScreenModeSelector index: %d" % index) + reset_setting(not by_user) diff --git a/game/src/Game/Menu/OptionMenu/SettingNodes/SettingHSlider.gd b/game/src/Game/Menu/OptionMenu/SettingNodes/SettingHSlider.gd new file mode 100644 index 0000000..6fa30ed --- /dev/null +++ b/game/src/Game/Menu/OptionMenu/SettingNodes/SettingHSlider.gd @@ -0,0 +1,41 @@ +extends HSlider +class_name SettingHSlider + +@export +var section_name : String = "setting" + +@export +var setting_name : String = "setting_hslider" + +@export +var default_value : float = 0 + +func _ready(): + Events.Options.load_settings.connect(load_setting) + Events.Options.save_settings.connect(save_setting) + Events.Options.reset_settings.connect(reset_setting) + +func load_setting(file : ConfigFile): + if file == null: return + var load_value = file.get_value(section_name, setting_name, default_value) + match typeof(load_value): + TYPE_FLOAT, TYPE_INT: + if value == load_value: value_changed.emit(value) + value = load_value + return + TYPE_STRING, TYPE_STRING_NAME: + var load_string := load_value as String + if load_string.is_valid_float(): + load_value = load_string.to_float() + if value == load_value: value_changed.emit(value) + value = load_value + return + push_error("Setting value '%s' invalid for setting [%s] \"%s\"" % [load_value, section_name, setting_name]) + value = default_value + +func save_setting(file : ConfigFile): + if file == null: return + file.set_value(section_name, setting_name, value) + +func reset_setting(): + value = default_value diff --git a/game/src/Game/Menu/OptionMenu/SettingNodes/SettingOptionButton.gd b/game/src/Game/Menu/OptionMenu/SettingNodes/SettingOptionButton.gd new file mode 100644 index 0000000..c5a805e --- /dev/null +++ b/game/src/Game/Menu/OptionMenu/SettingNodes/SettingOptionButton.gd @@ -0,0 +1,77 @@ +extends OptionButton +class_name SettingOptionButton + +signal option_selected(index : int, by_user : bool) + +@export +var section_name : String = "setting" + +@export +var setting_name : String = "setting_optionbutton" + +@export +var default_selected : int = -1: + get: return default_selected + set(v): + if v < 0 or item_count == 0: + default_selected = -1 + return + default_selected = v % item_count + +func _valid_index(index : int) -> bool: + return 0 <= index and index < item_count + +func _get_value_for_file(select_value : int): + if _valid_index(select_value): + return select_value + else: + return null + +func _set_value_from_file(load_value) -> void: + match typeof(load_value): + TYPE_INT: + if _valid_index(load_value): + selected = load_value + return + TYPE_STRING, TYPE_STRING_NAME: + var load_string := load_value as String + if load_string.is_valid_int(): + var load_int := load_string.to_int() + if _valid_index(load_int): + selected = load_int + return + for item_index in item_count: + if load_string == get_item_text(item_index): + selected = item_index + return + push_error("Setting value '%s' invalid for setting [%s] \"%s\"" % [load_value, section_name, setting_name]) + selected = default_selected + +func _setup_button() -> void: + pass + +func _ready(): + Events.Options.load_settings.connect(load_setting) + Events.Options.save_settings.connect(save_setting) + Events.Options.reset_settings.connect(reset_setting) + item_selected.connect(func(index : int): option_selected.emit(index, true)) + _setup_button() + if not _valid_index(default_selected) or selected == -1: + var msg := "Failed to generate %s %s options." % [setting_name, section_name] + push_error(msg) + OS.alert(msg, "%s Options Error" % section_name) + get_tree().quit() + +func load_setting(file : ConfigFile) -> void: + if file == null: return + _set_value_from_file(file.get_value(section_name, setting_name, _get_value_for_file(default_selected))) + option_selected.emit(selected, false) + +func save_setting(file : ConfigFile) -> void: + if file == null: return + file.set_value(section_name, setting_name, _get_value_for_file(selected)) + +func reset_setting(no_emit : bool = false) -> void: + selected = default_selected + if not no_emit: + option_selected.emit(selected, false) diff --git a/game/src/Game/Menu/OptionMenu/SettingNodes/SettingRevertButton.gd b/game/src/Game/Menu/OptionMenu/SettingNodes/SettingRevertButton.gd new file mode 100644 index 0000000..945d35b --- /dev/null +++ b/game/src/Game/Menu/OptionMenu/SettingNodes/SettingRevertButton.gd @@ -0,0 +1,27 @@ +extends SettingOptionButton +class_name SettingRevertButton + +@export_group("Nodes") +@export var revert_dialog : ResolutionRevertDialog + +var previous_index : int = -1 + +func _ready(): + super() + if revert_dialog != null: + revert_dialog.visibility_changed.connect(_on_revert_dialog_visibility_changed) + revert_dialog.dialog_accepted.connect(_on_accepted) + revert_dialog.dialog_reverted.connect(_on_reverted) + +func _on_revert_dialog_visibility_changed() -> void: + disabled = revert_dialog.visible + if not revert_dialog.visible: + previous_index = -1 + +func _on_reverted(button : SettingRevertButton) -> void: + if button != self: return + selected = previous_index + option_selected.emit(selected, false) + +func _on_accepted(button : SettingRevertButton) -> void: + if button != self: return diff --git a/game/src/Game/Menu/OptionMenu/SoundTab.gd b/game/src/Game/Menu/OptionMenu/SoundTab.gd new file mode 100644 index 0000000..c707605 --- /dev/null +++ b/game/src/Game/Menu/OptionMenu/SoundTab.gd @@ -0,0 +1,4 @@ +extends HBoxContainer + +func _on_ear_exploder_toggled(button_pressed): + print("KABOOM!!!" if button_pressed else "DEFUSED!!!") diff --git a/game/src/Game/Menu/OptionMenu/SoundTab.tscn b/game/src/Game/Menu/OptionMenu/SoundTab.tscn new file mode 100644 index 0000000..10d7f10 --- /dev/null +++ b/game/src/Game/Menu/OptionMenu/SoundTab.tscn @@ -0,0 +1,34 @@ +[gd_scene load_steps=3 format=3 uid="uid://cbtgwpx2wxi33"] + +[ext_resource type="Script" path="res://src/OptionMenu/SoundTab.gd" id="1_a7k0s"] +[ext_resource type="PackedScene" uid="uid://dy4si8comamnv" path="res://src/OptionMenu/VolumeGrid.tscn" id="1_okpft"] + +[node name="Sound" type="HBoxContainer"] +alignment = 1 +script = ExtResource("1_a7k0s") + +[node name="VBoxContainer" type="VBoxContainer" parent="."] +layout_mode = 2 + +[node name="Control" type="Control" parent="VBoxContainer"] +layout_mode = 2 +size_flags_vertical = 3 +size_flags_stretch_ratio = 0.1 + +[node name="VolumeGrid" parent="VBoxContainer" instance=ExtResource("1_okpft")] +layout_mode = 2 + +[node name="ButtonGrid" type="GridContainer" parent="VBoxContainer"] +layout_mode = 2 +size_flags_vertical = 2 +columns = 2 + +[node name="Spacer" type="Control" parent="VBoxContainer/ButtonGrid"] +layout_mode = 2 +size_flags_horizontal = 3 + +[node name="EarExploder" type="CheckButton" parent="VBoxContainer/ButtonGrid"] +layout_mode = 2 +text = "Explode Eardrums on Startup?" + +[connection signal="toggled" from="VBoxContainer/ButtonGrid/EarExploder" to="." method="_on_ear_exploder_toggled"] diff --git a/game/src/Game/Menu/OptionMenu/VideoTab.gd b/game/src/Game/Menu/OptionMenu/VideoTab.gd new file mode 100644 index 0000000..3d98678 --- /dev/null +++ b/game/src/Game/Menu/OptionMenu/VideoTab.gd @@ -0,0 +1,9 @@ +extends HBoxContainer + +@export var initial_focus: Control + +func _notification(what : int) -> void: + match(what): + NOTIFICATION_VISIBILITY_CHANGED: + if visible and is_inside_tree(): + initial_focus.grab_focus() diff --git a/game/src/Game/Menu/OptionMenu/VideoTab.tscn b/game/src/Game/Menu/OptionMenu/VideoTab.tscn new file mode 100644 index 0000000..244f481 --- /dev/null +++ b/game/src/Game/Menu/OptionMenu/VideoTab.tscn @@ -0,0 +1,181 @@ +[gd_scene load_steps=9 format=3 uid="uid://bq3awxxjn1tuw"] + +[ext_resource type="Script" path="res://src/OptionMenu/ResolutionSelector.gd" id="1_i8nro"] +[ext_resource type="Script" path="res://src/OptionMenu/VideoTab.gd" id="1_jvv62"] +[ext_resource type="Script" path="res://src/OptionMenu/ScreenModeSelector.gd" id="2_wa7vw"] +[ext_resource type="Script" path="res://src/OptionMenu/GuiScaleSelector.gd" id="3_pgc5d"] +[ext_resource type="Script" path="res://src/OptionMenu/MonitorDisplaySelector.gd" id="3_y6lyb"] +[ext_resource type="Script" path="res://src/OptionMenu/RefreshRateSelector.gd" id="4_381mg"] +[ext_resource type="Script" path="res://src/OptionMenu/QualityPresetSelector.gd" id="5_srg4v"] +[ext_resource type="Script" path="res://src/OptionMenu/ResolutionRevertDialog.gd" id="8_802cr"] + +[node name="Video" type="HBoxContainer" node_paths=PackedStringArray("initial_focus")] +editor_description = "UI-46" +alignment = 1 +script = ExtResource("1_jvv62") +initial_focus = NodePath("VideoSettingList/VideoSettingGrid/ResolutionSelector") + +[node name="VideoSettingList" type="VBoxContainer" parent="."] +layout_mode = 2 + +[node name="Control" type="Control" parent="VideoSettingList"] +layout_mode = 2 +size_flags_vertical = 3 +size_flags_stretch_ratio = 0.1 + +[node name="VideoSettingGrid" type="GridContainer" parent="VideoSettingList"] +layout_mode = 2 +size_flags_vertical = 3 +columns = 2 + +[node name="ResolutionLabel" type="Label" parent="VideoSettingList/VideoSettingGrid"] +layout_mode = 2 +text = "OPTIONS_VIDEO_RESOLUTION" + +[node name="ResolutionSelector" type="OptionButton" parent="VideoSettingList/VideoSettingGrid" node_paths=PackedStringArray("revert_dialog")] +editor_description = "UI-19" +layout_mode = 2 +focus_neighbor_bottom = NodePath("../ScreenModeSelector") +item_count = 1 +selected = 0 +popup/item_0/text = "MISSING" +popup/item_0/id = 0 +script = ExtResource("1_i8nro") +revert_dialog = NodePath("../../../ResolutionRevertDialog") +section_name = "video" +setting_name = "resolution" + +[node name="GuiScaleLabel" type="Label" parent="VideoSettingList/VideoSettingGrid"] +layout_mode = 2 +text = "OPTIONS_VIDEO_GUI_SCALE" + +[node name="GuiScaleSelector" type="OptionButton" parent="VideoSettingList/VideoSettingGrid"] +editor_description = "UI-23" +layout_mode = 2 +focus_neighbor_bottom = NodePath("../ScreenModeSelector") +item_count = 1 +selected = 0 +popup/item_0/text = "MISSING" +popup/item_0/id = 0 +script = ExtResource("3_pgc5d") +section_name = "video" +setting_name = "gui_scale" + +[node name="ScreenModeLabel" type="Label" parent="VideoSettingList/VideoSettingGrid"] +editor_description = "UI-44" +layout_mode = 2 +text = "OPTIONS_VIDEO_SCREEN_MODE" + +[node name="ScreenModeSelector" type="OptionButton" parent="VideoSettingList/VideoSettingGrid" node_paths=PackedStringArray("revert_dialog")] +layout_mode = 2 +focus_neighbor_top = NodePath("../ResolutionSelector") +focus_neighbor_bottom = NodePath("../MonitorDisplaySelector") +item_count = 3 +selected = 0 +popup/item_0/text = "OPTIONS_VIDEO_FULLSCREEN" +popup/item_0/id = 0 +popup/item_1/text = "OPTIONS_VIDEO_BORDERLESS" +popup/item_1/id = 1 +popup/item_2/text = "OPTIONS_VIDEO_WINDOWED" +popup/item_2/id = 2 +script = ExtResource("2_wa7vw") +revert_dialog = NodePath("../../../ResolutionRevertDialog") +section_name = "video" +setting_name = "mode_selected" + +[node name="MonitorSelectionLabel" type="Label" parent="VideoSettingList/VideoSettingGrid"] +layout_mode = 2 +text = "OPTIONS_VIDEO_MONITOR_SELECTION" + +[node name="MonitorDisplaySelector" type="OptionButton" parent="VideoSettingList/VideoSettingGrid"] +layout_mode = 2 +focus_neighbor_top = NodePath("../ScreenModeSelector") +focus_neighbor_bottom = NodePath("../RefreshRateSelector") +item_count = 1 +selected = 0 +popup/item_0/text = "MISSING" +popup/item_0/id = 0 +script = ExtResource("3_y6lyb") +section_name = "video" +setting_name = "current_screen" + +[node name="RefreshRateLabel" type="Label" parent="VideoSettingList/VideoSettingGrid"] +layout_mode = 2 +text = "OPTIONS_VIDEO_REFRESH_RATE" + +[node name="RefreshRateSelector" type="OptionButton" parent="VideoSettingList/VideoSettingGrid"] +editor_description = "UI-18, UIFUN-20" +layout_mode = 2 +tooltip_text = "OPTIONS_VIDEO_REFRESH_RATE_TOOLTIP" +focus_neighbor_top = NodePath("../MonitorDisplaySelector") +focus_neighbor_bottom = NodePath("../QualityPresetSelector") +item_count = 8 +selected = 0 +popup/item_0/text = "VSYNC" +popup/item_0/id = 0 +popup/item_1/text = "30hz" +popup/item_1/id = 1 +popup/item_2/text = "60hz" +popup/item_2/id = 2 +popup/item_3/text = "90hz" +popup/item_3/id = 3 +popup/item_4/text = "120hz" +popup/item_4/id = 4 +popup/item_5/text = "144hz" +popup/item_5/id = 5 +popup/item_6/text = "365hz" +popup/item_6/id = 6 +popup/item_7/text = "Unlimited" +popup/item_7/id = 7 +script = ExtResource("4_381mg") +section_name = "video" +setting_name = "refresh_rate" +default_selected = 0 + +[node name="QualityPresetLabel" type="Label" parent="VideoSettingList/VideoSettingGrid"] +layout_mode = 2 +text = "OPTIONS_VIDEO_QUALITY" + +[node name="QualityPresetSelector" type="OptionButton" parent="VideoSettingList/VideoSettingGrid"] +editor_description = "UI-21, UIFUN-22" +layout_mode = 2 +focus_neighbor_top = NodePath("../RefreshRateSelector") +item_count = 5 +selected = 1 +popup/item_0/text = "Low" +popup/item_0/id = 0 +popup/item_1/text = "Medium" +popup/item_1/id = 1 +popup/item_2/text = "High" +popup/item_2/id = 2 +popup/item_3/text = "Ultra" +popup/item_3/id = 3 +popup/item_4/text = "Custom" +popup/item_4/id = 4 +script = ExtResource("5_srg4v") +section_name = "video" +setting_name = "quality_preset" +default_selected = 1 + +[node name="ResolutionRevertDialog" type="ConfirmationDialog" parent="." node_paths=PackedStringArray("timer")] +editor_description = "UI-873" +disable_3d = true +title = "OPTIONS_VIDEO_RESOLUTION_DIALOG_TITLE" +size = Vector2i(730, 100) +ok_button_text = "DIALOG_OK" +cancel_button_text = "DIALOG_CANCEL" +script = ExtResource("8_802cr") +timer = NodePath("ResolutionRevertTimer") + +[node name="ResolutionRevertTimer" type="Timer" parent="ResolutionRevertDialog"] +wait_time = 5.0 +one_shot = true + +[connection signal="option_selected" from="VideoSettingList/VideoSettingGrid/ResolutionSelector" to="VideoSettingList/VideoSettingGrid/ResolutionSelector" method="_on_option_selected"] +[connection signal="option_selected" from="VideoSettingList/VideoSettingGrid/GuiScaleSelector" to="VideoSettingList/VideoSettingGrid/GuiScaleSelector" method="_on_option_selected"] +[connection signal="option_selected" from="VideoSettingList/VideoSettingGrid/ScreenModeSelector" to="VideoSettingList/VideoSettingGrid/ScreenModeSelector" method="_on_option_selected"] +[connection signal="option_selected" from="VideoSettingList/VideoSettingGrid/MonitorDisplaySelector" to="VideoSettingList/VideoSettingGrid/MonitorDisplaySelector" method="_on_option_selected"] +[connection signal="canceled" from="ResolutionRevertDialog" to="ResolutionRevertDialog" method="_on_canceled_or_close_requested"] +[connection signal="close_requested" from="ResolutionRevertDialog" to="ResolutionRevertDialog" method="_on_canceled_or_close_requested"] +[connection signal="confirmed" from="ResolutionRevertDialog" to="ResolutionRevertDialog" method="_on_confirmed"] +[connection signal="timeout" from="ResolutionRevertDialog/ResolutionRevertTimer" to="ResolutionRevertDialog" method="_on_resolution_revert_timer_timeout"] diff --git a/game/src/Game/Menu/OptionMenu/VolumeGrid.gd b/game/src/Game/Menu/OptionMenu/VolumeGrid.gd new file mode 100644 index 0000000..46613b4 --- /dev/null +++ b/game/src/Game/Menu/OptionMenu/VolumeGrid.gd @@ -0,0 +1,70 @@ +extends GridContainer + +const RATIO_FOR_LINEAR : float = 100 + +var _slider_dictionary : Dictionary + +var initial_focus : Control + +func get_db_as_volume_value(db : float) -> float: + # db_to_linear produces a float between 0 and 1 from a db value + return db_to_linear(db) * RATIO_FOR_LINEAR + +func get_volume_value_as_db(value : float) -> float: + # linear_to_db consumes a float between 0 and 1 to produce the db value + return linear_to_db(value / RATIO_FOR_LINEAR) + +func add_volume_row(bus_name : String, bus_index : int) -> HSlider: + var volume_label := Label.new() + if bus_name == "Master": + volume_label.text = "MASTER_BUS" + else: + volume_label.text = bus_name + add_child(volume_label) + + var volume_slider := SettingHSlider.new() + volume_slider.section_name = "audio" + volume_slider.setting_name = volume_label.text + volume_slider.custom_minimum_size = Vector2(290, 0) + volume_slider.size_flags_vertical = Control.SIZE_FILL + volume_slider.min_value = 0 + volume_slider.default_value = 100 + volume_slider.max_value = 120 # 120 so volume can be boosted somewhat + volume_slider.value_changed.connect(_on_slider_value_changed.bind(bus_index)) + add_child(volume_slider) + + _slider_dictionary[volume_label.text] = volume_slider + if not initial_focus: initial_focus = volume_slider + return volume_slider + +# REQUIREMENTS +# * UI-22 +func _ready(): + for bus_index in AudioServer.bus_count: + add_volume_row(AudioServer.get_bus_name(bus_index), bus_index) + +func _notification(what : int) -> void: + match(what): + NOTIFICATION_VISIBILITY_CHANGED: + if visible and is_inside_tree() and initial_focus: initial_focus.grab_focus() + +# REQUIREMENTS +# * UIFUN-30 +func _on_slider_value_changed(value : float, bus_index : int) -> void: + AudioServer.set_bus_volume_db(bus_index, get_volume_value_as_db(value)) + + +func _on_options_menu_load_settings(load_file : ConfigFile): + for volume_slider in _slider_dictionary.values(): + volume_slider.load_setting(load_file) + +# REQUIREMENTS +# * UIFUN-23 +func _on_options_menu_save_settings(save_file : ConfigFile): + for volume_slider in _slider_dictionary.values(): + volume_slider.save_setting(save_file) + + +func _on_options_menu_reset_settings(): + for volume_slider in _slider_dictionary.values(): + volume_slider.reset_setting() diff --git a/game/src/Game/Menu/OptionMenu/VolumeGrid.tscn b/game/src/Game/Menu/OptionMenu/VolumeGrid.tscn new file mode 100644 index 0000000..6d4de3c --- /dev/null +++ b/game/src/Game/Menu/OptionMenu/VolumeGrid.tscn @@ -0,0 +1,8 @@ +[gd_scene load_steps=2 format=3 uid="uid://dy4si8comamnv"] + +[ext_resource type="Script" path="res://src/OptionMenu/VolumeGrid.gd" id="1_wb64h"] + +[node name="VolumeGrid" type="GridContainer"] +size_flags_vertical = 0 +columns = 2 +script = ExtResource("1_wb64h") diff --git a/game/src/Game/Menu/SaveLoadMenu/SaveLoadMenu.gd b/game/src/Game/Menu/SaveLoadMenu/SaveLoadMenu.gd new file mode 100644 index 0000000..bff0bb5 --- /dev/null +++ b/game/src/Game/Menu/SaveLoadMenu/SaveLoadMenu.gd @@ -0,0 +1,123 @@ +extends Control + +@export var _save_scene : PackedScene + +@export_group("Nodes") +@export var _label : Label +@export var _scroll_list : BoxContainer +@export var _save_line_edit : LineEdit +@export var _save_load_button : Button +@export var _tag_selection_tab : TabBar +@export var _delete_dialog : ConfirmationDialog +@export var _overwrite_dialog : ConfirmationDialog + +var is_save_menu : bool = true +var _id_to_tag : Array[StringName] = [] + +func filter_for_tag(tag : StringName) -> void: + for child in _scroll_list.get_children(): + if tag == &"": + child.show() + else: + if tag == child.resource.session_tag: + child.show() + else: + child.hide() + +# Requirements +# * UIFUN-78 +func show_for_load() -> void: + _label.text = "SAVELOADMENU_LOAD_TITLE" + _save_load_button.text = "SAVELOADMENU_LOAD_BUTTON" + _save_line_edit.editable = false + is_save_menu = false + show() + +# Requirements +# * UIFUN-77 +func show_for_save() -> void: + _label.text = "SAVELOADMENU_SAVE_TITLE" + _save_load_button.text = "SAVELOADMENU_SAVE_BUTTON" + _save_line_edit.editable = true + is_save_menu = true + show() + +func _build_save_list() -> void: + _tag_selection_tab.add_tab("SAVELOADMENU_TABSELECTIONTABBAR_ALL") + for save_name in SaveManager._save_dictionary: + var save : SaveResource = SaveManager._save_dictionary[save_name] + var save_node := _create_save_node(save) + _scroll_list.add_child(save_node) + if not _id_to_tag.has(save.session_tag): + _id_to_tag.append(save.session_tag) + _tag_selection_tab.add_tab(save.session_tag) + +func _create_save_node(resource : SaveResource) -> Control: + var save_node = _save_scene.instantiate() + save_node.resource = resource + save_node.pressed.connect(_on_save_node_pressed.bind(save_node)) + save_node.request_to_delete.connect(_on_save_node_delete_requested.bind(save_node)) + return save_node + +func _queue_clear_scroll_list() -> void: + for child in _scroll_list.get_children(): + child.queue_free() + _tag_selection_tab.clear_tabs() + _id_to_tag.clear() + +# REQUIREMENTS: +# * UIFUN-84 +# * UIFUN-89 +func _on_close_button_pressed() -> void: + hide() + +func _on_delete_dialog_confirmed() -> void: + _requested_node_to_delete.resource.delete() + _requested_node_to_delete.queue_free() + +# REQUIREMENTS: +# * UIFUN-83 +func _on_overwrite_dialog_confirmed() -> void: + SaveManager.add_or_replace_save(SaveManager.make_new_save(_submitted_text)) + _on_close_button_pressed() + +var _submitted_text : String = "" +func _on_save_line_edit_text_submitted(new_text) -> void: + _submitted_text = new_text + if SaveManager.has_save(new_text): + _overwrite_dialog.dialog_text = tr("SAVELOADMENU_OVERWRITE_DIALOG_TEXT").format({ "file_name": _submitted_text }) + _overwrite_dialog.title = tr("SAVELOADMENU_OVERWRITE_DIALOG_TITLE").format({ "file_name": _submitted_text }) + _overwrite_dialog.popup_centered() + return + _on_overwrite_dialog_confirmed() + +func _on_save_load_button_pressed() -> void: + if is_save_menu: + _save_line_edit.text_submitted.emit(_save_line_edit.text) + +var _requested_node_to_delete : Control +func _on_save_node_delete_requested(node : Control) -> void: + _requested_node_to_delete = node + _delete_dialog.dialog_text = tr("SAVELOADMENU_DELETE_DIALOG_TEXT").format({ "file_name": _requested_node_to_delete.resource.save_name }) + _delete_dialog.title = tr("SAVELOADMENU_DELETE_DIALOG_TITLE").format({ "file_name": _requested_node_to_delete.resource.save_name }) + _delete_dialog.popup_centered() + +# REQUIREMENTS: +# * UIFUN-81 +# * UIFUN-86 +func _on_save_node_pressed(node : Control) -> void: + if is_save_menu: + _save_line_edit.text = node.resource.save_name + +func _on_tag_selection_tab_bar_tab_changed(tab) -> void: + if tab == 0: + filter_for_tag(&"") + else: + filter_for_tag(_id_to_tag[tab - 1]) + +func _on_visibility_changed() -> void: + if visible: + _build_save_list() + else: + _queue_clear_scroll_list() + SaveManager.flush_save() diff --git a/game/src/Game/Menu/SaveLoadMenu/SaveLoadMenu.tscn b/game/src/Game/Menu/SaveLoadMenu/SaveLoadMenu.tscn new file mode 100644 index 0000000..e9f068e --- /dev/null +++ b/game/src/Game/Menu/SaveLoadMenu/SaveLoadMenu.tscn @@ -0,0 +1,109 @@ +[gd_scene load_steps=5 format=3 uid="uid://d3g6wbvwflmyk"] + +[ext_resource type="Script" path="res://src/SaveLoadMenu/SaveLoadMenu.gd" id="1_3jkds"] +[ext_resource type="PackedScene" uid="uid://d2s7roinx2or7" path="res://src/SaveLoadMenu/SavePanelButton.tscn" id="2_fc6r3"] + +[sub_resource type="InputEventAction" id="InputEventAction_8vo2t"] +action = &"ui_accept" +pressed = true + +[sub_resource type="Shortcut" id="Shortcut_o1f2l"] +events = [SubResource("InputEventAction_8vo2t")] + +[node name="SaveLoadMenu" type="MarginContainer" node_paths=PackedStringArray("_label", "_scroll_list", "_save_line_edit", "_save_load_button", "_tag_selection_tab", "_delete_dialog", "_overwrite_dialog")] +editor_description = "UI-82, UI-89" +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +grow_horizontal = 2 +grow_vertical = 2 +theme_override_constants/margin_left = 250 +theme_override_constants/margin_top = 100 +theme_override_constants/margin_right = 250 +theme_override_constants/margin_bottom = 100 +script = ExtResource("1_3jkds") +_save_scene = ExtResource("2_fc6r3") +_label = NodePath("SaveLoadPanel/SaveLoadList/TitleBarList/SaveLoadLabel") +_scroll_list = NodePath("SaveLoadPanel/SaveLoadList/SaveLoadScroll/SaveLoadScrollList") +_save_line_edit = NodePath("SaveLoadPanel/SaveLoadList/SaveLineEdit") +_save_load_button = NodePath("SaveLoadPanel/SaveLoadList/SaveLoadButton") +_tag_selection_tab = NodePath("SaveLoadPanel/SaveLoadList/TagSelectionList/TagSelectionTabBar") +_delete_dialog = NodePath("DeleteDialog") +_overwrite_dialog = NodePath("OverwriteDialog") + +[node name="SaveLoadPanel" type="PanelContainer" parent="."] +layout_mode = 2 + +[node name="SaveLoadList" type="VBoxContainer" parent="SaveLoadPanel"] +layout_mode = 2 + +[node name="TitleBarList" type="HBoxContainer" parent="SaveLoadPanel/SaveLoadList"] +layout_mode = 2 +alignment = 2 + +[node name="SaveLoadLabel" type="Label" parent="SaveLoadPanel/SaveLoadList/TitleBarList"] +layout_mode = 2 +size_flags_horizontal = 6 +text = "SAVELOADMENU_SAVE_TITLE" + +[node name="CloseButton" type="Button" parent="SaveLoadPanel/SaveLoadList/TitleBarList"] +editor_description = "UI-87, UI-94" +layout_mode = 2 +text = "X" + +[node name="TagSelectionList" type="HBoxContainer" parent="SaveLoadPanel/SaveLoadList"] +layout_mode = 2 + +[node name="TagSelectionLabel" type="Label" parent="SaveLoadPanel/SaveLoadList/TagSelectionList"] +layout_mode = 2 +text = "SAVELOADMENU_SESSION" + +[node name="TagSelectionTabBar" type="TabBar" parent="SaveLoadPanel/SaveLoadList/TagSelectionList"] +layout_mode = 2 +size_flags_horizontal = 3 +tab_count = 1 +tab_0/title = "SAVELOADMENU_TABSELECTIONTABBAR_ALL" + +[node name="SaveLoadScroll" type="ScrollContainer" parent="SaveLoadPanel/SaveLoadList"] +editor_description = "UI-83, UI-90" +layout_mode = 2 +size_flags_vertical = 3 + +[node name="SaveLoadScrollList" type="VBoxContainer" parent="SaveLoadPanel/SaveLoadList/SaveLoadScroll"] +layout_mode = 2 +size_flags_horizontal = 3 +size_flags_vertical = 3 + +[node name="SaveLineEdit" type="LineEdit" parent="SaveLoadPanel/SaveLoadList"] +editor_description = "UI-85, UI-92" +layout_mode = 2 + +[node name="SaveLoadButton" type="Button" parent="SaveLoadPanel/SaveLoadList"] +editor_description = "UIFUN-82, UIFUN-87" +layout_mode = 2 +size_flags_horizontal = 4 +shortcut = SubResource("Shortcut_o1f2l") +shortcut_feedback = false +text = "SAVELOADMENU_SAVE_BUTTON" + +[node name="DeleteDialog" type="ConfirmationDialog" parent="."] +disable_3d = true +title = "SAVELOADMENU_DELETE_DIALOG_TITLE" +ok_button_text = "DIALOG_OK" +dialog_text = "SAVELOADMENU_DELETE_DIALOG_TEXT" +cancel_button_text = "DIALOG_CANCEL" + +[node name="OverwriteDialog" type="ConfirmationDialog" parent="."] +disable_3d = true +title = "SAVELOADMENU_OVERWRITE_DIALOG_TITLE" +ok_button_text = "DIALOG_OK" +dialog_text = "SAVELOADMENU_OVERWRITE_DIALOG_TEXT" +cancel_button_text = "DIALOG_CANCEL" + +[connection signal="visibility_changed" from="." to="." method="_on_visibility_changed"] +[connection signal="pressed" from="SaveLoadPanel/SaveLoadList/TitleBarList/CloseButton" to="." method="_on_close_button_pressed"] +[connection signal="tab_changed" from="SaveLoadPanel/SaveLoadList/TagSelectionList/TagSelectionTabBar" to="." method="_on_tag_selection_tab_bar_tab_changed"] +[connection signal="text_submitted" from="SaveLoadPanel/SaveLoadList/SaveLineEdit" to="." method="_on_save_line_edit_text_submitted"] +[connection signal="pressed" from="SaveLoadPanel/SaveLoadList/SaveLoadButton" to="." method="_on_save_load_button_pressed"] +[connection signal="confirmed" from="DeleteDialog" to="." method="_on_delete_dialog_confirmed"] +[connection signal="confirmed" from="OverwriteDialog" to="." method="_on_overwrite_dialog_confirmed"] diff --git a/game/src/Game/Menu/SaveLoadMenu/SavePanelButton.gd b/game/src/Game/Menu/SaveLoadMenu/SavePanelButton.gd new file mode 100644 index 0000000..5fe4917 --- /dev/null +++ b/game/src/Game/Menu/SaveLoadMenu/SavePanelButton.gd @@ -0,0 +1,41 @@ +@tool +extends LobbyPanelButton + +signal request_to_delete + +@export_group("Nodes") +@export var country_flag : TextureRect +@export var date_label : Label +@export var delete_button : BaseButton + +var resource : SaveResource: + get: + return resource + set(value): + if resource != null: + resource.changed.disconnect(_resource_changed) + resource = value + if resource != null: + resource.changed.connect(_resource_changed) + _resource_changed() + +func get_text() -> StringName: + return resource.save_name + +func set_text(value : StringName) -> void: + if resource != null: + resource.save_name = value + +func _ready(): + _resource_changed() + +func _is_start_date() -> bool: + return false + +func _resource_changed() -> void: + if resource == null: return + name_label.text = resource.save_name + date_label.text = Time.get_datetime_string_from_unix_time(resource.get_save_file_time(), true) + +func _on_delete_button_pressed() -> void: + request_to_delete.emit() diff --git a/game/src/Game/Menu/SaveLoadMenu/SavePanelButton.tscn b/game/src/Game/Menu/SaveLoadMenu/SavePanelButton.tscn new file mode 100644 index 0000000..d2d0a41 --- /dev/null +++ b/game/src/Game/Menu/SaveLoadMenu/SavePanelButton.tscn @@ -0,0 +1,58 @@ +[gd_scene load_steps=2 format=3 uid="uid://d2s7roinx2or7"] + +[ext_resource type="Script" path="res://src/SaveLoadMenu/SavePanelButton.gd" id="1_rtuo6"] + +[node name="SavePanelButton" type="Container" node_paths=PackedStringArray("country_flag", "date_label", "delete_button", "background_button", "name_label")] +editor_description = "SS-18, UI-40, UI-84, UI-86, UI-91, UI-93" +offset_right = 276.0 +offset_bottom = 48.0 +script = ExtResource("1_rtuo6") +country_flag = NodePath("SaveList/CountryFlag") +date_label = NodePath("SaveList/DateLabel") +delete_button = NodePath("SaveList/DeleteButton") +background_button = NodePath("BackgroundButton") +name_label = NodePath("SaveList/NameLabel") + +[node name="BackgroundButton" type="Button" parent="."] +layout_mode = 2 +theme_type_variation = &"ButtonContainer" + +[node name="SaveList" type="HBoxContainer" parent="."] +layout_mode = 2 +mouse_filter = 2 + +[node name="CountryFlag" type="TextureRect" parent="SaveList"] +layout_mode = 2 +size_flags_horizontal = 0 +size_flags_vertical = 4 +mouse_filter = 2 + +[node name="NameLabel" type="Label" parent="SaveList"] +layout_mode = 2 +size_flags_horizontal = 0 +size_flags_vertical = 1 +text = "PLACEHOLDER" +vertical_alignment = 1 + +[node name="DateLabel" type="Label" parent="SaveList"] +layout_mode = 2 +size_flags_horizontal = 0 +size_flags_vertical = 1 +text = "00.00.0000" +vertical_alignment = 1 + +[node name="Separator" type="Control" parent="SaveList"] +layout_mode = 2 +size_flags_horizontal = 3 +mouse_filter = 2 + +[node name="DeleteButton" type="Button" parent="SaveList"] +layout_mode = 2 +size_flags_horizontal = 8 +text = "x" + +[connection signal="button_down" from="BackgroundButton" to="." method="_on_background_button_button_down"] +[connection signal="button_up" from="BackgroundButton" to="." method="_on_background_button_button_up"] +[connection signal="pressed" from="BackgroundButton" to="." method="_on_background_button_pressed"] +[connection signal="toggled" from="BackgroundButton" to="." method="_on_background_button_toggled"] +[connection signal="pressed" from="SaveList/DeleteButton" to="." method="_on_delete_button_pressed"] diff --git a/game/src/Game/Menu/SaveLoadMenu/SaveResource.gd b/game/src/Game/Menu/SaveLoadMenu/SaveResource.gd new file mode 100644 index 0000000..5e7faa6 --- /dev/null +++ b/game/src/Game/Menu/SaveLoadMenu/SaveResource.gd @@ -0,0 +1,59 @@ +extends Resource +class_name SaveResource + +signal file_flushed(path : String) +signal file_loaded +signal file_moved_to_trash +signal file_deleted +signal trash_moved +signal deleted + +var save_name : StringName: + get: return save_name + set(v): + save_name = v + file.set_value("Save", "name", save_name) + emit_changed() +var session_tag : StringName: + get: return session_tag + set(v): + session_tag = v + file.set_value("Save", "session_tag", v) + emit_changed() +var file_path : String: + get: return file_path + set(v): + file_path = v + emit_changed() +var file : ConfigFile = ConfigFile.new() + +func set_file_path(name : StringName, path : String): + file_path = path + save_name = name + +func flush_save() -> Error: + file_flushed.emit(file_path) + var result := file.save(file_path) + file.clear() + return result + +func load_save(path : String = file_path) -> Error: + file_loaded.emit() + var result := file.load(path) + session_tag = file.get_value("Save", "session_tag", session_tag) + if path != file_path: + set_file_path(file.get_value("Save", "name", save_name), path) + return result + +func get_save_file_time() -> int: + return FileAccess.get_modified_time(file_path) + +func move_to_trash() -> Error: + trash_moved.emit() + file_moved_to_trash.emit() + return OS.move_to_trash(file_path) + +func delete() -> Error: + deleted.emit() + file_deleted.emit() + return DirAccess.remove_absolute(file_path) -- cgit v1.2.3-56-ga3b1 From b98166b28c47cccff731d30959b8250fb27ff408 Mon Sep 17 00:00:00 2001 From: Spartan322 Date: Sat, 3 Jun 2023 15:03:52 -0400 Subject: Update file contents according to reorganization --- .../addons/openvic-plugin/ReleaseExportEditorPlugin.gd | 2 +- game/project.godot | 16 ++++++++-------- game/src/Game/Autoload/Argument/ArgumentParser.tscn | 4 ++-- game/src/Game/GameMenu.tscn | 12 ++++++------ game/src/Game/GameSession/GameSession.tscn | 18 +++++++++--------- game/src/Game/GameSession/GameSessionMenu.tscn | 4 ++-- game/src/Game/GameSession/GameSpeedPanel.tscn | 2 +- .../GameSession/MapControlPanel/MapControlPanel.tscn | 6 +++--- .../Game/GameSession/MapControlPanel/Minimap.gdshader | 2 +- game/src/Game/GameSession/MapView.tscn | 4 ++-- .../ProvinceOverviewPanel/ProvinceOverviewPanel.tscn | 2 +- game/src/Game/GameSession/TerrainMap.gdshader | 2 +- game/src/Game/GameStart.tscn | 6 +++--- game/src/Game/LocaleButton.tscn | 2 +- game/src/Game/Menu/CreditsMenu/CreditsMenu.tscn | 4 ++-- game/src/Game/Menu/CreditsMenu/GodotEngineButton.tscn | 4 ++-- .../CreditsMenu/logo_vertical_color_dark.svg.import | 6 +++--- game/src/Game/Menu/LobbyMenu/LobbyMenu.gd | 2 +- game/src/Game/Menu/LobbyMenu/LobbyMenu.tscn | 6 +++--- game/src/Game/Menu/LobbyMenu/LobbyPanelButton.tscn | 2 +- game/src/Game/Menu/MainMenu/MainMenu.tscn | 6 +++--- game/src/Game/Menu/MainMenu/ReleaseInfoBox.tscn | 2 +- game/src/Game/Menu/OptionMenu/GeneralTab.tscn | 8 ++++---- game/src/Game/Menu/OptionMenu/OptionsMenu.tscn | 10 +++++----- game/src/Game/Menu/OptionMenu/SoundTab.tscn | 4 ++-- game/src/Game/Menu/OptionMenu/VideoTab.tscn | 16 ++++++++-------- game/src/Game/Menu/OptionMenu/VolumeGrid.tscn | 2 +- game/src/Game/Menu/SaveLoadMenu/SaveLoadMenu.tscn | 4 ++-- game/src/Game/Menu/SaveLoadMenu/SavePanelButton.tscn | 2 +- game/src/Game/MusicConductor/MusicConductor.tscn | 2 +- game/src/Game/MusicConductor/MusicPlayer.tscn | 2 +- game/theme/game_session_menu.tres | 2 +- game/theme/main_menu.tres | 6 +++--- game/theme/options_menu.tres | 4 ++-- 34 files changed, 88 insertions(+), 88 deletions(-) (limited to 'game/src/Game/Menu') diff --git a/game/addons/openvic-plugin/ReleaseExportEditorPlugin.gd b/game/addons/openvic-plugin/ReleaseExportEditorPlugin.gd index ac6c5bc..5deb761 100644 --- a/game/addons/openvic-plugin/ReleaseExportEditorPlugin.gd +++ b/game/addons/openvic-plugin/ReleaseExportEditorPlugin.gd @@ -9,7 +9,7 @@ func _get_name(): return "OpenVic-ReleaseExportEditorPlugin" func _export_file(path: String, type: String, features: PackedStringArray) -> void: - if path != "res://src/Utility/GIT_INFO.gd": return + if path != "res://src/GIT_INFO.gd": return var GitInfoScript : String = "" _get_commit_long() _get_commit_short() diff --git a/game/project.godot b/game/project.godot index 3bb2438..253a54b 100644 --- a/game/project.godot +++ b/game/project.godot @@ -12,7 +12,7 @@ config_version=5 config/name="OpenVic" config/description="A faithful recreation of Victoria 2: Heart of Darkness with a focus on enhancing performance, multiplayer stability, and modability for modern machines." -run/main_scene="res://src/GameStart.tscn" +run/main_scene="res://src/Game/GameStart.tscn" config/features=PackedStringArray("4.0", "Forward Plus") boot_splash/bg_color=Color(0.380392, 0.145098, 0.14902, 1) boot_splash/image="res://splash_assets/splash_image.png" @@ -21,14 +21,14 @@ config/project_settings_override.template="user://settings.cfg" [autoload] -ArgumentParser="*res://src/Autoload/Arguments/ArgumentParser.tscn" -Events="*res://src/Autoload/Events.gd" -Resolution="*res://src/Autoload/Resolution.gd" -SoundManager="*res://src/Autoload/SoundManager.gd" -MusicConductor="*res://src/MusicConductor/MusicConductor.tscn" +ArgumentParser="*res://src/Game/Autoload/Argument/ArgumentParser.tscn" +Events="*res://src/Game/Autoload/Events.gd" +Resolution="*res://src/Game/Autoload/Resolution.gd" +SoundManager="*res://src/Game/Autoload/SoundManager.gd" +MusicConductor="*res://src/Game/MusicConductor/MusicConductor.tscn" Keychain="*res://addons/keychain/Keychain.gd" -GuiScale="*res://src/Autoload/GuiScale.gd" -SaveManager="*res://src/Autoload/SaveManager.gd" +GuiScale="*res://src/Game/Autoload/GuiScale.gd" +SaveManager="*res://src/Game/Autoload/SaveManager.gd" [display] diff --git a/game/src/Game/Autoload/Argument/ArgumentParser.tscn b/game/src/Game/Autoload/Argument/ArgumentParser.tscn index 8fda8f1..09e5e6c 100644 --- a/game/src/Game/Autoload/Argument/ArgumentParser.tscn +++ b/game/src/Game/Autoload/Argument/ArgumentParser.tscn @@ -1,7 +1,7 @@ [gd_scene load_steps=6 format=3 uid="uid://dayjmgc34tqo6"] -[ext_resource type="Script" path="res://src/Autoload/Arguments/ArgumentParser.gd" id="1_pc7xr"] -[ext_resource type="Script" path="res://src/Autoload/Arguments/ArgumentOption.gd" id="2_4hguj"] +[ext_resource type="Script" path="res://src/Game/Autoload/Argument/ArgumentParser.gd" id="1_pc7xr"] +[ext_resource type="Script" path="res://src/Game/Autoload/Argument/ArgumentOption.gd" id="2_4hguj"] [sub_resource type="Resource" id="Resource_tq3y4"] script = ExtResource("2_4hguj") diff --git a/game/src/Game/GameMenu.tscn b/game/src/Game/GameMenu.tscn index 224ae2e..73287a5 100644 --- a/game/src/Game/GameMenu.tscn +++ b/game/src/Game/GameMenu.tscn @@ -1,11 +1,11 @@ [gd_scene load_steps=7 format=3 uid="uid://o4u142w4qkln"] -[ext_resource type="Script" path="res://src/GameMenu.gd" id="1_cafwe"] -[ext_resource type="PackedScene" uid="uid://bp5n3mlu45ygw" path="res://src/MainMenu/MainMenu.tscn" id="2_2jbkh"] -[ext_resource type="PackedScene" uid="uid://cnbfxjy1m6wja" path="res://src/OptionMenu/OptionsMenu.tscn" id="3_111lv"] -[ext_resource type="PackedScene" uid="uid://c8knthxkwj1uj" path="res://src/CreditsMenu/CreditsMenu.tscn" id="4_n0hoo"] -[ext_resource type="PackedScene" uid="uid://do60kx0d3nrh4" path="res://src/LobbyMenu/LobbyMenu.tscn" id="4_nofk1"] -[ext_resource type="PackedScene" uid="uid://cvl76duuym1wq" path="res://src/MusicConductor/MusicPlayer.tscn" id="6_lts1m"] +[ext_resource type="Script" path="res://src/Game/GameMenu.gd" id="1_cafwe"] +[ext_resource type="PackedScene" uid="uid://bp5n3mlu45ygw" path="res://src/Game/Menu/MainMenu/MainMenu.tscn" id="2_2jbkh"] +[ext_resource type="PackedScene" uid="uid://cnbfxjy1m6wja" path="res://src/Game/Menu/OptionMenu/OptionsMenu.tscn" id="3_111lv"] +[ext_resource type="PackedScene" uid="uid://c8knthxkwj1uj" path="res://src/Game/Menu/CreditsMenu/CreditsMenu.tscn" id="4_n0hoo"] +[ext_resource type="PackedScene" uid="uid://do60kx0d3nrh4" path="res://src/Game/Menu/LobbyMenu/LobbyMenu.tscn" id="4_nofk1"] +[ext_resource type="PackedScene" uid="uid://cvl76duuym1wq" path="res://src/Game/MusicConductor/MusicPlayer.tscn" id="6_lts1m"] [node name="GameMenu" type="Control" node_paths=PackedStringArray("_main_menu", "_options_menu", "_lobby_menu", "_credits_menu")] layout_mode = 3 diff --git a/game/src/Game/GameSession/GameSession.tscn b/game/src/Game/GameSession/GameSession.tscn index 188ccde..c9f4095 100644 --- a/game/src/Game/GameSession/GameSession.tscn +++ b/game/src/Game/GameSession/GameSession.tscn @@ -1,14 +1,14 @@ [gd_scene load_steps=10 format=3 uid="uid://bgnupcshe1m7r"] -[ext_resource type="Script" path="res://src/GameSession/GameSession.gd" id="1_eklvp"] -[ext_resource type="PackedScene" uid="uid://cvl76duuym1wq" path="res://src/MusicConductor/MusicPlayer.tscn" id="2_kt6aa"] -[ext_resource type="PackedScene" uid="uid://g524p8lr574w" path="res://src/GameSession/MapControlPanel/MapControlPanel.tscn" id="3_afh6d"] -[ext_resource type="PackedScene" uid="uid://dvdynl6eir40o" path="res://src/GameSession/GameSessionMenu.tscn" id="3_bvmqh"] -[ext_resource type="PackedScene" uid="uid://dkehmdnuxih2r" path="res://src/GameSession/MapView.tscn" id="4_xkg5j"] -[ext_resource type="PackedScene" uid="uid://byq323jbel48u" path="res://src/GameSession/ProvinceOverviewPanel/ProvinceOverviewPanel.tscn" id="5_osjnn"] -[ext_resource type="PackedScene" uid="uid://cnbfxjy1m6wja" path="res://src/OptionMenu/OptionsMenu.tscn" id="6_p5mnx"] -[ext_resource type="PackedScene" uid="uid://dd8k3p7r3huwc" path="res://src/GameSession/GameSpeedPanel.tscn" id="7_myy4q"] -[ext_resource type="PackedScene" uid="uid://d3g6wbvwflmyk" path="res://src/SaveLoadMenu/SaveLoadMenu.tscn" id="8_4g7ko"] +[ext_resource type="Script" path="res://src/Game/GameSession/GameSession.gd" id="1_eklvp"] +[ext_resource type="PackedScene" uid="uid://cvl76duuym1wq" path="res://src/Game/MusicConductor/MusicPlayer.tscn" id="2_kt6aa"] +[ext_resource type="PackedScene" uid="uid://g524p8lr574w" path="res://src/Game/GameSession/MapControlPanel/MapControlPanel.tscn" id="3_afh6d"] +[ext_resource type="PackedScene" uid="uid://dvdynl6eir40o" path="res://src/Game/GameSession/GameSessionMenu.tscn" id="3_bvmqh"] +[ext_resource type="PackedScene" uid="uid://dkehmdnuxih2r" path="res://src/Game/GameSession/MapView.tscn" id="4_xkg5j"] +[ext_resource type="PackedScene" uid="uid://byq323jbel48u" path="res://src/Game/GameSession/ProvinceOverviewPanel/ProvinceOverviewPanel.tscn" id="5_osjnn"] +[ext_resource type="PackedScene" uid="uid://cnbfxjy1m6wja" path="res://src/Game/Menu/OptionMenu/OptionsMenu.tscn" id="6_p5mnx"] +[ext_resource type="PackedScene" uid="uid://dd8k3p7r3huwc" path="res://src/Game/GameSession/GameSpeedPanel.tscn" id="7_myy4q"] +[ext_resource type="PackedScene" uid="uid://d3g6wbvwflmyk" path="res://src/Game/Menu/SaveLoadMenu/SaveLoadMenu.tscn" id="8_4g7ko"] [node name="GameSession" type="Control" node_paths=PackedStringArray("_game_session_menu")] editor_description = "SS-102, UI-546" diff --git a/game/src/Game/GameSession/GameSessionMenu.tscn b/game/src/Game/GameSession/GameSessionMenu.tscn index 025ef3b..196a5d8 100644 --- a/game/src/Game/GameSession/GameSessionMenu.tscn +++ b/game/src/Game/GameSession/GameSessionMenu.tscn @@ -1,8 +1,8 @@ [gd_scene load_steps=4 format=3 uid="uid://dvdynl6eir40o"] [ext_resource type="Theme" uid="uid://cqrfmjt5yeti7" path="res://theme/game_session_menu.tres" id="1_2onog"] -[ext_resource type="Script" path="res://src/GameSession/GameSessionMenu.gd" id="1_usq6o"] -[ext_resource type="PackedScene" uid="uid://o4u142w4qkln" path="res://src/GameMenu.tscn" id="2_xi6a4"] +[ext_resource type="Script" path="res://src/Game/GameSession/GameSessionMenu.gd" id="1_usq6o"] +[ext_resource type="PackedScene" uid="uid://o4u142w4qkln" path="res://src/Game/GameMenu.tscn" id="2_xi6a4"] [node name="GameSessionMenu" type="PanelContainer" node_paths=PackedStringArray("_main_menu_dialog", "_quit_dialog")] process_mode = 3 diff --git a/game/src/Game/GameSession/GameSpeedPanel.tscn b/game/src/Game/GameSession/GameSpeedPanel.tscn index 8a37565..fab988e 100644 --- a/game/src/Game/GameSession/GameSpeedPanel.tscn +++ b/game/src/Game/GameSession/GameSpeedPanel.tscn @@ -1,6 +1,6 @@ [gd_scene load_steps=2 format=3 uid="uid://dd8k3p7r3huwc"] -[ext_resource type="Script" path="res://src/GameSession/GameSpeedPanel.gd" id="1_pfs8t"] +[ext_resource type="Script" path="res://src/Game/GameSession/GameSpeedPanel.gd" id="1_pfs8t"] [node name="GameSpeedPanel" type="PanelContainer" node_paths=PackedStringArray("_longform_date_button", "_play_pause_display_button", "_decrease_speed_button", "_increase_speed_button")] script = ExtResource("1_pfs8t") diff --git a/game/src/Game/GameSession/MapControlPanel/MapControlPanel.tscn b/game/src/Game/GameSession/MapControlPanel/MapControlPanel.tscn index bd4a010..a00f110 100644 --- a/game/src/Game/GameSession/MapControlPanel/MapControlPanel.tscn +++ b/game/src/Game/GameSession/MapControlPanel/MapControlPanel.tscn @@ -1,8 +1,8 @@ [gd_scene load_steps=7 format=3 uid="uid://g524p8lr574w"] -[ext_resource type="Script" path="res://src/GameSession/MapControlPanel/MapControlPanel.gd" id="1_ign64"] -[ext_resource type="Shader" path="res://src/GameSession/MapControlPanel/Minimap.gdshader" id="2_rinsg"] -[ext_resource type="Script" path="res://src/GameSession/MapControlPanel/Minimap.gd" id="3_s4dml"] +[ext_resource type="Script" path="res://src/Game/GameSession/MapControlPanel/MapControlPanel.gd" id="1_ign64"] +[ext_resource type="Shader" path="res://src/Game/GameSession/MapControlPanel/Minimap.gdshader" id="2_rinsg"] +[ext_resource type="Script" path="res://src/Game/GameSession/MapControlPanel/Minimap.gd" id="3_s4dml"] [sub_resource type="ShaderMaterial" id="ShaderMaterial_bhuqb"] shader = ExtResource("2_rinsg") diff --git a/game/src/Game/GameSession/MapControlPanel/Minimap.gdshader b/game/src/Game/GameSession/MapControlPanel/Minimap.gdshader index 608abe2..271b809 100644 --- a/game/src/Game/GameSession/MapControlPanel/Minimap.gdshader +++ b/game/src/Game/GameSession/MapControlPanel/Minimap.gdshader @@ -1,6 +1,6 @@ shader_type canvas_item; -#include "res://src/GameSession/ProvinceIndexSampler.gdshaderinc" +#include "res://src/Game/GameSession/ProvinceIndexSampler.gdshaderinc" // Index of the currently selected province uniform uint selected_index; diff --git a/game/src/Game/GameSession/MapView.tscn b/game/src/Game/GameSession/MapView.tscn index fa6ffcd..fb4ac07 100644 --- a/game/src/Game/GameSession/MapView.tscn +++ b/game/src/Game/GameSession/MapView.tscn @@ -1,7 +1,7 @@ [gd_scene load_steps=5 format=3 uid="uid://dkehmdnuxih2r"] -[ext_resource type="Script" path="res://src/GameSession/MapView.gd" id="1_exccw"] -[ext_resource type="Shader" path="res://src/GameSession/TerrainMap.gdshader" id="1_upocn"] +[ext_resource type="Script" path="res://src/Game/GameSession/MapView.gd" id="1_exccw"] +[ext_resource type="Shader" path="res://src/Game/GameSession/TerrainMap.gdshader" id="1_upocn"] [sub_resource type="ShaderMaterial" id="ShaderMaterial_tayeg"] render_priority = 0 diff --git a/game/src/Game/GameSession/ProvinceOverviewPanel/ProvinceOverviewPanel.tscn b/game/src/Game/GameSession/ProvinceOverviewPanel/ProvinceOverviewPanel.tscn index a233db0..f8c1e65 100644 --- a/game/src/Game/GameSession/ProvinceOverviewPanel/ProvinceOverviewPanel.tscn +++ b/game/src/Game/GameSession/ProvinceOverviewPanel/ProvinceOverviewPanel.tscn @@ -1,6 +1,6 @@ [gd_scene load_steps=2 format=3 uid="uid://byq323jbel48u"] -[ext_resource type="Script" path="res://src/GameSession/ProvinceOverviewPanel/ProvinceOverviewPanel.gd" id="1_3n8k5"] +[ext_resource type="Script" path="res://src/Game/GameSession/ProvinceOverviewPanel/ProvinceOverviewPanel.gd" id="1_3n8k5"] [node name="ProvinceOverviewPanel" type="PanelContainer" node_paths=PackedStringArray("_province_name_label", "_region_name_label", "_life_rating_bar", "_rgo_icon_texture_rect", "_rgo_name_label", "_buildings_container")] editor_description = "UI-56" diff --git a/game/src/Game/GameSession/TerrainMap.gdshader b/game/src/Game/GameSession/TerrainMap.gdshader index 88e7019..852ccc3 100644 --- a/game/src/Game/GameSession/TerrainMap.gdshader +++ b/game/src/Game/GameSession/TerrainMap.gdshader @@ -2,7 +2,7 @@ shader_type spatial; render_mode unshaded; -#include "res://src/GameSession/ProvinceIndexSampler.gdshaderinc" +#include "res://src/Game/GameSession/ProvinceIndexSampler.gdshaderinc" // Province colour texture uniform sampler2D province_colour_tex: source_color, repeat_enable, filter_nearest; diff --git a/game/src/Game/GameStart.tscn b/game/src/Game/GameStart.tscn index 2046bb5..dd683e8 100644 --- a/game/src/Game/GameStart.tscn +++ b/game/src/Game/GameStart.tscn @@ -1,7 +1,7 @@ [gd_scene load_steps=6 format=3 uid="uid://1udsn4mggep2"] -[ext_resource type="PackedScene" uid="uid://o4u142w4qkln" path="res://src/GameMenu.tscn" id="1_wlojq"] -[ext_resource type="Script" path="res://src/SplashContainer.gd" id="2_xmcgv"] +[ext_resource type="PackedScene" uid="uid://o4u142w4qkln" path="res://src/Game/GameMenu.tscn" id="1_vadki"] +[ext_resource type="Script" path="res://src/Game/SplashContainer.gd" id="2_xmcgv"] [ext_resource type="Texture2D" uid="uid://deef5hufq0j61" path="res://splash_assets/splash_end.png" id="3_qfv12"] [ext_resource type="Texture2D" uid="uid://cgdnixsyh7bja" path="res://splash_assets/splash_image.png" id="4_5b6yq"] [ext_resource type="VideoStream" path="res://splash_assets/splash_startup.ogv" id="5_8euyy"] @@ -14,7 +14,7 @@ anchor_bottom = 1.0 grow_horizontal = 2 grow_vertical = 2 -[node name="GameMenu" parent="." instance=ExtResource("1_wlojq")] +[node name="GameMenu" parent="." instance=ExtResource("1_vadki")] visible = false layout_mode = 1 diff --git a/game/src/Game/LocaleButton.tscn b/game/src/Game/LocaleButton.tscn index 55f1c29..c4b58f8 100644 --- a/game/src/Game/LocaleButton.tscn +++ b/game/src/Game/LocaleButton.tscn @@ -1,6 +1,6 @@ [gd_scene load_steps=2 format=3 uid="uid://b7oncobnacxmt"] -[ext_resource type="Script" path="res://src/LocaleButton.gd" id="1_ganev"] +[ext_resource type="Script" path="res://src/Game/LocaleButton.gd" id="1_ganev"] [node name="LocaleButton" type="OptionButton"] custom_minimum_size = Vector2(150, 0) diff --git a/game/src/Game/Menu/CreditsMenu/CreditsMenu.tscn b/game/src/Game/Menu/CreditsMenu/CreditsMenu.tscn index 2d10d2e..df9d0b2 100644 --- a/game/src/Game/Menu/CreditsMenu/CreditsMenu.tscn +++ b/game/src/Game/Menu/CreditsMenu/CreditsMenu.tscn @@ -1,8 +1,8 @@ [gd_scene load_steps=4 format=3 uid="uid://c8knthxkwj1uj"] [ext_resource type="Theme" uid="uid://stfxt4hpsify" path="res://theme/credits_menu.tres" id="1_7y4l8"] -[ext_resource type="Script" path="res://src/CreditsMenu/CreditsMenu.gd" id="1_csd7i"] -[ext_resource type="PackedScene" uid="uid://ddjbee5gj6bkv" path="res://src/CreditsMenu/GodotEngineButton.tscn" id="3_fl02a"] +[ext_resource type="Script" path="res://src/Game/Menu/CreditsMenu/CreditsMenu.gd" id="1_csd7i"] +[ext_resource type="PackedScene" uid="uid://ddjbee5gj6bkv" path="res://src/Game/Menu/CreditsMenu/GodotEngineButton.tscn" id="3_fl02a"] [node name="CreditsMenu" type="Control" node_paths=PackedStringArray("credits_list")] editor_description = "UI-34" diff --git a/game/src/Game/Menu/CreditsMenu/GodotEngineButton.tscn b/game/src/Game/Menu/CreditsMenu/GodotEngineButton.tscn index 8b0c46b..c613553 100644 --- a/game/src/Game/Menu/CreditsMenu/GodotEngineButton.tscn +++ b/game/src/Game/Menu/CreditsMenu/GodotEngineButton.tscn @@ -1,7 +1,7 @@ [gd_scene load_steps=3 format=3 uid="uid://ddjbee5gj6bkv"] -[ext_resource type="Texture2D" uid="uid://rh7l4xuh4ali" path="res://src/CreditsMenu/logo_vertical_color_dark.svg" id="1_b0brk"] -[ext_resource type="Script" path="res://src/CreditsMenu/GodotEngineButton.gd" id="3_gi8fv"] +[ext_resource type="Texture2D" uid="uid://rh7l4xuh4ali" path="res://src/Game/Menu/CreditsMenu/logo_vertical_color_dark.svg" id="1_b0brk"] +[ext_resource type="Script" path="res://src/Game/Menu/CreditsMenu/GodotEngineButton.gd" id="3_gi8fv"] [node name="GodotEngineButton" type="Button"] custom_minimum_size = Vector2(0, 200) diff --git a/game/src/Game/Menu/CreditsMenu/logo_vertical_color_dark.svg.import b/game/src/Game/Menu/CreditsMenu/logo_vertical_color_dark.svg.import index a4fb09a..10681d4 100644 --- a/game/src/Game/Menu/CreditsMenu/logo_vertical_color_dark.svg.import +++ b/game/src/Game/Menu/CreditsMenu/logo_vertical_color_dark.svg.import @@ -3,15 +3,15 @@ importer="texture" type="CompressedTexture2D" uid="uid://rh7l4xuh4ali" -path="res://.godot/imported/logo_vertical_color_dark.svg-1167b3ce62f0747c0e76b17bdbb9f218.ctex" +path="res://.godot/imported/logo_vertical_color_dark.svg-c63a0d0871169a4a2f8b57a5b904d732.ctex" metadata={ "vram_texture": false } [deps] -source_file="res://src/CreditsMenu/logo_vertical_color_dark.svg" -dest_files=["res://.godot/imported/logo_vertical_color_dark.svg-1167b3ce62f0747c0e76b17bdbb9f218.ctex"] +source_file="res://src/Game/Menu/CreditsMenu/logo_vertical_color_dark.svg" +dest_files=["res://.godot/imported/logo_vertical_color_dark.svg-c63a0d0871169a4a2f8b57a5b904d732.ctex"] [params] diff --git a/game/src/Game/Menu/LobbyMenu/LobbyMenu.gd b/game/src/Game/Menu/LobbyMenu/LobbyMenu.gd index db4f2ce..3c857fe 100644 --- a/game/src/Game/Menu/LobbyMenu/LobbyMenu.gd +++ b/game/src/Game/Menu/LobbyMenu/LobbyMenu.gd @@ -116,7 +116,7 @@ func _on_session_tag_edit_text_submitted(new_text): _on_start_button_pressed() func _on_session_tag_dialog_confirmed(): - get_tree().change_scene_to_file("res://src/GameSession/GameSession.tscn") + get_tree().change_scene_to_file("res://src/Game/GameSession/GameSession.tscn") var _requested_node_to_delete : Control func _on_save_node_delete_requested(node : Control) -> void: diff --git a/game/src/Game/Menu/LobbyMenu/LobbyMenu.tscn b/game/src/Game/Menu/LobbyMenu/LobbyMenu.tscn index 3b5796e..081beda 100644 --- a/game/src/Game/Menu/LobbyMenu/LobbyMenu.tscn +++ b/game/src/Game/Menu/LobbyMenu/LobbyMenu.tscn @@ -1,8 +1,8 @@ [gd_scene load_steps=4 format=3 uid="uid://do60kx0d3nrh4"] -[ext_resource type="Script" path="res://src/LobbyMenu/LobbyMenu.gd" id="1_cvwum"] -[ext_resource type="PackedScene" uid="uid://k71f5gibwmtc" path="res://src/LobbyMenu/LobbyPanelButton.tscn" id="2_exh17"] -[ext_resource type="PackedScene" uid="uid://d2s7roinx2or7" path="res://src/SaveLoadMenu/SavePanelButton.tscn" id="3_4otj7"] +[ext_resource type="Script" path="res://src/Game/Menu/LobbyMenu/LobbyMenu.gd" id="1_cvwum"] +[ext_resource type="PackedScene" uid="uid://k71f5gibwmtc" path="res://src/Game/Menu/LobbyMenu/LobbyPanelButton.tscn" id="2_exh17"] +[ext_resource type="PackedScene" uid="uid://d2s7roinx2or7" path="res://src/Game/Menu/SaveLoadMenu/SavePanelButton.tscn" id="3_4otj7"] [node name="LobbyMenu" type="HBoxContainer" node_paths=PackedStringArray("game_select_start_date", "game_select_save_tab", "game_select_save_list", "start_button", "session_tag_line_edit", "session_tag_dialog", "delete_dialog")] editor_description = "UI-36" diff --git a/game/src/Game/Menu/LobbyMenu/LobbyPanelButton.tscn b/game/src/Game/Menu/LobbyMenu/LobbyPanelButton.tscn index f409a2e..f27ddac 100644 --- a/game/src/Game/Menu/LobbyMenu/LobbyPanelButton.tscn +++ b/game/src/Game/Menu/LobbyMenu/LobbyPanelButton.tscn @@ -1,6 +1,6 @@ [gd_scene load_steps=2 format=3 uid="uid://k71f5gibwmtc"] -[ext_resource type="Script" path="res://src/LobbyMenu/LobbyPanelButton.gd" id="1_327u2"] +[ext_resource type="Script" path="res://src/Game/Menu/LobbyMenu/LobbyPanelButton.gd" id="1_327u2"] [node name="LobbyPanelButton" type="Container" node_paths=PackedStringArray("background_button", "name_label")] editor_description = "UI-41" diff --git a/game/src/Game/Menu/MainMenu/MainMenu.tscn b/game/src/Game/Menu/MainMenu/MainMenu.tscn index 0618fe8..71d020a 100644 --- a/game/src/Game/Menu/MainMenu/MainMenu.tscn +++ b/game/src/Game/Menu/MainMenu/MainMenu.tscn @@ -1,10 +1,10 @@ [gd_scene load_steps=6 format=3 uid="uid://bp5n3mlu45ygw"] [ext_resource type="Theme" uid="uid://qoi3oec48jp0" path="res://theme/main_menu.tres" id="1_1yri4"] -[ext_resource type="Script" path="res://src/MainMenu/MainMenu.gd" id="2_nm1fq"] +[ext_resource type="Script" path="res://src/Game/Menu/MainMenu/MainMenu.gd" id="2_nm1fq"] [ext_resource type="Texture2D" uid="uid://dxys0wg0f0ic5" path="res://theme/assets/OpenVicFINALREALTRANS.png" id="3_58ess"] -[ext_resource type="PackedScene" uid="uid://b7oncobnacxmt" path="res://src/LocaleButton.tscn" id="3_amonp"] -[ext_resource type="PackedScene" uid="uid://cen7wkmn6og66" path="res://src/MainMenu/ReleaseInfoBox.tscn" id="3_km0er"] +[ext_resource type="PackedScene" uid="uid://b7oncobnacxmt" path="res://src/Game/LocaleButton.tscn" id="3_amonp"] +[ext_resource type="PackedScene" uid="uid://cen7wkmn6og66" path="res://src/Game/Menu/MainMenu/ReleaseInfoBox.tscn" id="3_km0er"] [node name="MainMenu" type="Control" node_paths=PackedStringArray("_new_game_button")] editor_description = "UI-13" diff --git a/game/src/Game/Menu/MainMenu/ReleaseInfoBox.tscn b/game/src/Game/Menu/MainMenu/ReleaseInfoBox.tscn index 821982b..a10232e 100644 --- a/game/src/Game/Menu/MainMenu/ReleaseInfoBox.tscn +++ b/game/src/Game/Menu/MainMenu/ReleaseInfoBox.tscn @@ -1,6 +1,6 @@ [gd_scene load_steps=2 format=3 uid="uid://cen7wkmn6og66"] -[ext_resource type="Script" path="res://src/MainMenu/ReleaseInfoBox.gd" id="1_y2djw"] +[ext_resource type="Script" path="res://src/Game/Menu/MainMenu/ReleaseInfoBox.gd" id="1_y2djw"] [node name="ReleaseInfoBox" type="HBoxContainer" node_paths=PackedStringArray("_version_label", "_commit_label", "_checksum_label")] editor_description = "UI-31" diff --git a/game/src/Game/Menu/OptionMenu/GeneralTab.tscn b/game/src/Game/Menu/OptionMenu/GeneralTab.tscn index 4e9ff6a..1c49326 100644 --- a/game/src/Game/Menu/OptionMenu/GeneralTab.tscn +++ b/game/src/Game/Menu/OptionMenu/GeneralTab.tscn @@ -1,9 +1,9 @@ [gd_scene load_steps=5 format=3 uid="uid://duwjal7sd7p6w"] -[ext_resource type="Script" path="res://src/OptionMenu/GeneralTab.gd" id="1_gbutn"] -[ext_resource type="PackedScene" uid="uid://b7oncobnacxmt" path="res://src/LocaleButton.tscn" id="2_5cfd7"] -[ext_resource type="Script" path="res://src/OptionMenu/SettingNodes/SettingOptionButton.gd" id="2_msx2u"] -[ext_resource type="Script" path="res://src/OptionMenu/AutosaveIntervalSelector.gd" id="2_t06tb"] +[ext_resource type="Script" path="res://src/Game/Menu/OptionMenu/GeneralTab.gd" id="1_gbutn"] +[ext_resource type="PackedScene" uid="uid://b7oncobnacxmt" path="res://src/Game/LocaleButton.tscn" id="2_5cfd7"] +[ext_resource type="Script" path="res://src/Game/Menu/OptionMenu/SettingNodes/SettingOptionButton.gd" id="2_msx2u"] +[ext_resource type="Script" path="res://src/Game/Menu/OptionMenu/AutosaveIntervalSelector.gd" id="2_t06tb"] [node name="GeneralTab" type="HBoxContainer" node_paths=PackedStringArray("initial_focus")] editor_description = "UI-48, UIFUN-45" diff --git a/game/src/Game/Menu/OptionMenu/OptionsMenu.tscn b/game/src/Game/Menu/OptionMenu/OptionsMenu.tscn index 3156e33..017629a 100644 --- a/game/src/Game/Menu/OptionMenu/OptionsMenu.tscn +++ b/game/src/Game/Menu/OptionMenu/OptionsMenu.tscn @@ -1,12 +1,12 @@ [gd_scene load_steps=8 format=3 uid="uid://cnbfxjy1m6wja"] [ext_resource type="Theme" uid="uid://fbxssqcg1s0m" path="res://theme/options_menu.tres" id="1_0up1d"] -[ext_resource type="Script" path="res://src/OptionMenu/OptionsMenu.gd" id="1_tlein"] -[ext_resource type="PackedScene" uid="uid://bq3awxxjn1tuw" path="res://src/OptionMenu/VideoTab.tscn" id="2_ji8xr"] -[ext_resource type="PackedScene" uid="uid://cbtgwpx2wxi33" path="res://src/OptionMenu/SoundTab.tscn" id="3_4w35t"] -[ext_resource type="PackedScene" uid="uid://duwjal7sd7p6w" path="res://src/OptionMenu/GeneralTab.tscn" id="3_6gvf6"] +[ext_resource type="Script" path="res://src/Game/Menu/OptionMenu/OptionsMenu.gd" id="1_tlein"] +[ext_resource type="PackedScene" uid="uid://bq3awxxjn1tuw" path="res://src/Game/Menu/OptionMenu/VideoTab.tscn" id="2_ji8xr"] +[ext_resource type="PackedScene" uid="uid://cbtgwpx2wxi33" path="res://src/Game/Menu/OptionMenu/SoundTab.tscn" id="3_4w35t"] +[ext_resource type="PackedScene" uid="uid://duwjal7sd7p6w" path="res://src/Game/Menu/OptionMenu/GeneralTab.tscn" id="3_6gvf6"] [ext_resource type="PackedScene" uid="uid://bq7ibhm0txl5p" path="res://addons/keychain/ShortcutEdit.tscn" id="4_vdhjp"] -[ext_resource type="PackedScene" uid="uid://dp2grvybtecqu" path="res://src/OptionMenu/OtherTab.tscn" id="5_ahefp"] +[ext_resource type="PackedScene" uid="uid://dp2grvybtecqu" path="res://src/Game/Menu/OptionMenu/OtherTab.tscn" id="5_ahefp"] [node name="OptionsMenu" type="PanelContainer"] editor_description = "UI-25" diff --git a/game/src/Game/Menu/OptionMenu/SoundTab.tscn b/game/src/Game/Menu/OptionMenu/SoundTab.tscn index 10d7f10..4bb6948 100644 --- a/game/src/Game/Menu/OptionMenu/SoundTab.tscn +++ b/game/src/Game/Menu/OptionMenu/SoundTab.tscn @@ -1,7 +1,7 @@ [gd_scene load_steps=3 format=3 uid="uid://cbtgwpx2wxi33"] -[ext_resource type="Script" path="res://src/OptionMenu/SoundTab.gd" id="1_a7k0s"] -[ext_resource type="PackedScene" uid="uid://dy4si8comamnv" path="res://src/OptionMenu/VolumeGrid.tscn" id="1_okpft"] +[ext_resource type="Script" path="res://src/Game/Menu/OptionMenu/SoundTab.gd" id="1_a7k0s"] +[ext_resource type="PackedScene" uid="uid://dy4si8comamnv" path="res://src/Game/Menu/OptionMenu/VolumeGrid.tscn" id="1_okpft"] [node name="Sound" type="HBoxContainer"] alignment = 1 diff --git a/game/src/Game/Menu/OptionMenu/VideoTab.tscn b/game/src/Game/Menu/OptionMenu/VideoTab.tscn index 244f481..4f5151c 100644 --- a/game/src/Game/Menu/OptionMenu/VideoTab.tscn +++ b/game/src/Game/Menu/OptionMenu/VideoTab.tscn @@ -1,13 +1,13 @@ [gd_scene load_steps=9 format=3 uid="uid://bq3awxxjn1tuw"] -[ext_resource type="Script" path="res://src/OptionMenu/ResolutionSelector.gd" id="1_i8nro"] -[ext_resource type="Script" path="res://src/OptionMenu/VideoTab.gd" id="1_jvv62"] -[ext_resource type="Script" path="res://src/OptionMenu/ScreenModeSelector.gd" id="2_wa7vw"] -[ext_resource type="Script" path="res://src/OptionMenu/GuiScaleSelector.gd" id="3_pgc5d"] -[ext_resource type="Script" path="res://src/OptionMenu/MonitorDisplaySelector.gd" id="3_y6lyb"] -[ext_resource type="Script" path="res://src/OptionMenu/RefreshRateSelector.gd" id="4_381mg"] -[ext_resource type="Script" path="res://src/OptionMenu/QualityPresetSelector.gd" id="5_srg4v"] -[ext_resource type="Script" path="res://src/OptionMenu/ResolutionRevertDialog.gd" id="8_802cr"] +[ext_resource type="Script" path="res://src/Game/Menu/OptionMenu/ResolutionSelector.gd" id="1_i8nro"] +[ext_resource type="Script" path="res://src/Game/Menu/OptionMenu/VideoTab.gd" id="1_jvv62"] +[ext_resource type="Script" path="res://src/Game/Menu/OptionMenu/ScreenModeSelector.gd" id="2_wa7vw"] +[ext_resource type="Script" path="res://src/Game/Menu/OptionMenu/GuiScaleSelector.gd" id="3_pgc5d"] +[ext_resource type="Script" path="res://src/Game/Menu/OptionMenu/MonitorDisplaySelector.gd" id="3_y6lyb"] +[ext_resource type="Script" path="res://src/Game/Menu/OptionMenu/RefreshRateSelector.gd" id="4_381mg"] +[ext_resource type="Script" path="res://src/Game/Menu/OptionMenu/QualityPresetSelector.gd" id="5_srg4v"] +[ext_resource type="Script" path="res://src/Game/Menu/OptionMenu/ResolutionRevertDialog.gd" id="8_802cr"] [node name="Video" type="HBoxContainer" node_paths=PackedStringArray("initial_focus")] editor_description = "UI-46" diff --git a/game/src/Game/Menu/OptionMenu/VolumeGrid.tscn b/game/src/Game/Menu/OptionMenu/VolumeGrid.tscn index 6d4de3c..5dd3c1e 100644 --- a/game/src/Game/Menu/OptionMenu/VolumeGrid.tscn +++ b/game/src/Game/Menu/OptionMenu/VolumeGrid.tscn @@ -1,6 +1,6 @@ [gd_scene load_steps=2 format=3 uid="uid://dy4si8comamnv"] -[ext_resource type="Script" path="res://src/OptionMenu/VolumeGrid.gd" id="1_wb64h"] +[ext_resource type="Script" path="res://src/Game/Menu/OptionMenu/VolumeGrid.gd" id="1_wb64h"] [node name="VolumeGrid" type="GridContainer"] size_flags_vertical = 0 diff --git a/game/src/Game/Menu/SaveLoadMenu/SaveLoadMenu.tscn b/game/src/Game/Menu/SaveLoadMenu/SaveLoadMenu.tscn index e9f068e..adc9bdc 100644 --- a/game/src/Game/Menu/SaveLoadMenu/SaveLoadMenu.tscn +++ b/game/src/Game/Menu/SaveLoadMenu/SaveLoadMenu.tscn @@ -1,7 +1,7 @@ [gd_scene load_steps=5 format=3 uid="uid://d3g6wbvwflmyk"] -[ext_resource type="Script" path="res://src/SaveLoadMenu/SaveLoadMenu.gd" id="1_3jkds"] -[ext_resource type="PackedScene" uid="uid://d2s7roinx2or7" path="res://src/SaveLoadMenu/SavePanelButton.tscn" id="2_fc6r3"] +[ext_resource type="Script" path="res://src/Game/Menu/SaveLoadMenu/SaveLoadMenu.gd" id="1_3jkds"] +[ext_resource type="PackedScene" uid="uid://d2s7roinx2or7" path="res://src/Game/Menu/SaveLoadMenu/SavePanelButton.tscn" id="2_fc6r3"] [sub_resource type="InputEventAction" id="InputEventAction_8vo2t"] action = &"ui_accept" diff --git a/game/src/Game/Menu/SaveLoadMenu/SavePanelButton.tscn b/game/src/Game/Menu/SaveLoadMenu/SavePanelButton.tscn index d2d0a41..94dc8a3 100644 --- a/game/src/Game/Menu/SaveLoadMenu/SavePanelButton.tscn +++ b/game/src/Game/Menu/SaveLoadMenu/SavePanelButton.tscn @@ -1,6 +1,6 @@ [gd_scene load_steps=2 format=3 uid="uid://d2s7roinx2or7"] -[ext_resource type="Script" path="res://src/SaveLoadMenu/SavePanelButton.gd" id="1_rtuo6"] +[ext_resource type="Script" path="res://src/Game/Menu/SaveLoadMenu/SavePanelButton.gd" id="1_rtuo6"] [node name="SavePanelButton" type="Container" node_paths=PackedStringArray("country_flag", "date_label", "delete_button", "background_button", "name_label")] editor_description = "SS-18, UI-40, UI-84, UI-86, UI-91, UI-93" diff --git a/game/src/Game/MusicConductor/MusicConductor.tscn b/game/src/Game/MusicConductor/MusicConductor.tscn index 182de99..3c288be 100644 --- a/game/src/Game/MusicConductor/MusicConductor.tscn +++ b/game/src/Game/MusicConductor/MusicConductor.tscn @@ -1,6 +1,6 @@ [gd_scene load_steps=2 format=3 uid="uid://b1h31mnn8n2nu"] -[ext_resource type="Script" path="res://src/MusicConductor/MusicConductor.gd" id="1_56t1b"] +[ext_resource type="Script" path="res://src/Game/MusicConductor/MusicConductor.gd" id="1_56t1b"] [node name="MusicConductor" type="Node"] script = ExtResource("1_56t1b") diff --git a/game/src/Game/MusicConductor/MusicPlayer.tscn b/game/src/Game/MusicConductor/MusicPlayer.tscn index 80ad641..8d47ba0 100644 --- a/game/src/Game/MusicConductor/MusicPlayer.tscn +++ b/game/src/Game/MusicConductor/MusicPlayer.tscn @@ -1,6 +1,6 @@ [gd_scene load_steps=2 format=3 uid="uid://cvl76duuym1wq"] -[ext_resource type="Script" path="res://src/MusicConductor/MusicPlayer.gd" id="1_gcm4m"] +[ext_resource type="Script" path="res://src/Game/MusicConductor/MusicPlayer.gd" id="1_gcm4m"] [node name="MusicPlayer" type="BoxContainer" node_paths=PackedStringArray("_song_selector_button", "_progress_slider", "_previous_song_button", "_play_pause_button", "_next_song_button", "_visbility_button")] editor_description = "UI-104" diff --git a/game/theme/game_session_menu.tres b/game/theme/game_session_menu.tres index 0cab476..68847d4 100644 --- a/game/theme/game_session_menu.tres +++ b/game/theme/game_session_menu.tres @@ -1,7 +1,7 @@ [gd_resource type="Theme" load_steps=11 format=3 uid="uid://cqrfmjt5yeti7"] [ext_resource type="StyleBox" uid="uid://blwilunhmyvpq" path="res://theme/assets/main_menu_button_normal.tres" id="1_7med2"] -[ext_resource type="Script" path="res://src/Utility/StyleBoxWithSound.gd" id="2_oj3dv"] +[ext_resource type="Script" path="res://src/Game/Theme/StyleBoxWithSound.gd" id="2_oj3dv"] [ext_resource type="AudioStream" uid="uid://bsldcs3l8s7ug" path="res://addons/kenney_ui_audio/click3.wav" id="3_j823n"] [ext_resource type="Texture2D" uid="uid://c0p34i3d3b0pw" path="res://theme/assets/main_menu_button.png" id="4_lno5s"] diff --git a/game/theme/main_menu.tres b/game/theme/main_menu.tres index 0518cd8..e25da4d 100644 --- a/game/theme/main_menu.tres +++ b/game/theme/main_menu.tres @@ -1,12 +1,12 @@ [gd_resource type="Theme" load_steps=32 format=3 uid="uid://qoi3oec48jp0"] -[ext_resource type="Script" path="res://src/Utility/StyleBoxCombinedTexture.gd" id="1_axke7"] -[ext_resource type="Script" path="res://src/Utility/TextureSetting.gd" id="2_7bwl2"] +[ext_resource type="Script" path="res://src/Game/Theme/StyleBoxCombinedTexture.gd" id="1_axke7"] +[ext_resource type="Script" path="res://src/Game/Theme/TextureSetting.gd" id="2_7bwl2"] [ext_resource type="Texture2D" uid="uid://dapuqgpjs56bs" path="res://theme/assets/main_menu_background.png" id="3_cpatd"] [ext_resource type="Texture2D" uid="uid://q25s41oavuxw" path="res://theme/assets/main_menu_border_paper.png" id="4_sl60o"] [ext_resource type="Texture2D" uid="uid://c0p34i3d3b0pw" path="res://theme/assets/main_menu_button.png" id="5_xj7ql"] [ext_resource type="StyleBox" uid="uid://blwilunhmyvpq" path="res://theme/assets/main_menu_button_normal.tres" id="6_dx0aj"] -[ext_resource type="Script" path="res://src/Utility/StyleBoxWithSound.gd" id="7_qo00e"] +[ext_resource type="Script" path="res://src/Game/Theme/StyleBoxWithSound.gd" id="7_qo00e"] [ext_resource type="AudioStream" uid="uid://bsldcs3l8s7ug" path="res://addons/kenney_ui_audio/click3.wav" id="8_etuft"] [sub_resource type="Resource" id="Resource_hxpog"] diff --git a/game/theme/options_menu.tres b/game/theme/options_menu.tres index 04bcb96..58c12ab 100644 --- a/game/theme/options_menu.tres +++ b/game/theme/options_menu.tres @@ -1,7 +1,7 @@ [gd_resource type="Theme" load_steps=8 format=3 uid="uid://fbxssqcg1s0m"] -[ext_resource type="Script" path="res://src/Utility/StyleBoxCombinedTexture.gd" id="1_6eqg5"] -[ext_resource type="Script" path="res://src/Utility/TextureSetting.gd" id="2_d0e1t"] +[ext_resource type="Script" path="res://src/Game/Theme/StyleBoxCombinedTexture.gd" id="1_6eqg5"] +[ext_resource type="Script" path="res://src/Game/Theme/TextureSetting.gd" id="2_d0e1t"] [ext_resource type="Texture2D" uid="uid://dapuqgpjs56bs" path="res://theme/assets/main_menu_background.png" id="3_t863y"] [ext_resource type="Texture2D" uid="uid://q25s41oavuxw" path="res://theme/assets/main_menu_border_paper.png" id="4_ljte1"] -- cgit v1.2.3-56-ga3b1