aboutsummaryrefslogtreecommitdiff
path: root/game/src/Game/Menu/LobbyMenu
diff options
context:
space:
mode:
Diffstat (limited to 'game/src/Game/Menu/LobbyMenu')
-rw-r--r--game/src/Game/Menu/LobbyMenu/LobbyMenu.gd165
-rw-r--r--game/src/Game/Menu/LobbyMenu/LobbyMenu.tscn138
-rw-r--r--game/src/Game/Menu/LobbyMenu/LobbyPanelButton.gd102
-rw-r--r--game/src/Game/Menu/LobbyMenu/LobbyPanelButton.tscn31
4 files changed, 436 insertions, 0 deletions
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"]