diff --git a/Saves/save_1.json b/Saves/save_1.json new file mode 100644 index 0000000..778e002 --- /dev/null +++ b/Saves/save_1.json @@ -0,0 +1 @@ +{"day_count":1,"patient_count":1,"patient_id":"564","save_date":"06/15/2025, 20:48"} \ No newline at end of file diff --git a/Saves/save_2.json b/Saves/save_2.json new file mode 100644 index 0000000..4642317 --- /dev/null +++ b/Saves/save_2.json @@ -0,0 +1 @@ +{"day_count":2,"patient_count":2,"patient_id":"564","save_date":"06/15/2025, 18:28"} \ No newline at end of file diff --git a/Saves/save_3.json b/Saves/save_3.json new file mode 100644 index 0000000..2573a6f --- /dev/null +++ b/Saves/save_3.json @@ -0,0 +1 @@ +{"day_count":3,"patient_count":1,"patient_id":"564","save_date":"06/15/2025, 18:28"} \ No newline at end of file diff --git a/Saves/save_4.json b/Saves/save_4.json new file mode 100644 index 0000000..3c6629a --- /dev/null +++ b/Saves/save_4.json @@ -0,0 +1 @@ +{"day_count":4,"patient_count":1,"patient_id":"564","save_date":"06/15/2025, 18:29"} \ No newline at end of file diff --git a/confirmation_dialog.tscn b/confirmation_dialog.tscn index 51d6065..65a0589 100644 --- a/confirmation_dialog.tscn +++ b/confirmation_dialog.tscn @@ -1,8 +1,73 @@ -[gd_scene load_steps=2 format=3 uid="uid://c0kyheol06kes"] +[gd_scene load_steps=3 format=3 uid="uid://c0kyheol06kes"] -[ext_resource type="Theme" uid="uid://dn1n15xwt8ucv" path="res://Art/DialogTheme.tres" id="1_pvdac"] +[ext_resource type="FontFile" uid="uid://ckg5x0oonnjtn" path="res://Art/XanhMono-Regular.ttf" id="1_6let0"] -[node name="ConfirmationDialog" type="ConfirmationDialog"] -initial_position = 1 -size = Vector2i(300, 100) -theme = ExtResource("1_pvdac") +[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_jjq8m"] +border_width_left = 2 +border_width_top = 2 +border_width_right = 2 +border_width_bottom = 2 +border_color = Color(0.629675, 0.629675, 0.629674, 1) + +[node name="ConfirmationDialog" type="CanvasLayer"] +layer = 128 + +[node name="ConfirmationDialog" type="PanelContainer" parent="."] +anchors_preset = 8 +anchor_left = 0.5 +anchor_top = 0.5 +anchor_right = 0.5 +anchor_bottom = 0.5 +offset_left = -200.0 +offset_top = -75.0 +offset_right = 300.0 +offset_bottom = 85.0 +grow_horizontal = 2 +grow_vertical = 2 +theme_override_styles/panel = SubResource("StyleBoxFlat_jjq8m") + +[node name="Background" type="ColorRect" parent="ConfirmationDialog"] +layout_mode = 2 +color = Color(0, 0, 0, 1) + +[node name="MarginContainer" type="MarginContainer" parent="ConfirmationDialog"] +layout_mode = 2 +theme_override_constants/margin_left = 10 +theme_override_constants/margin_top = 20 +theme_override_constants/margin_right = 10 +theme_override_constants/margin_bottom = 10 + +[node name="VBoxContainer" type="VBoxContainer" parent="ConfirmationDialog/MarginContainer"] +layout_mode = 2 + +[node name="ConfirmationText" type="RichTextLabel" parent="ConfirmationDialog/MarginContainer/VBoxContainer"] +layout_mode = 2 +size_flags_vertical = 3 +size_flags_stretch_ratio = 3.0 +theme_override_fonts/normal_font = ExtResource("1_6let0") +theme_override_font_sizes/normal_font_size = 25 +bbcode_enabled = true + +[node name="MarginContainer" type="MarginContainer" parent="ConfirmationDialog/MarginContainer/VBoxContainer"] +layout_mode = 2 +size_flags_vertical = 3 +theme_override_constants/margin_left = 70 +theme_override_constants/margin_right = 70 + +[node name="HBoxContainer" type="HBoxContainer" parent="ConfirmationDialog/MarginContainer/VBoxContainer/MarginContainer"] +layout_mode = 2 +theme_override_constants/separation = 70 + +[node name="YesButton" type="Button" parent="ConfirmationDialog/MarginContainer/VBoxContainer/MarginContainer/HBoxContainer"] +layout_mode = 2 +size_flags_horizontal = 3 +theme_override_fonts/font = ExtResource("1_6let0") +theme_override_font_sizes/font_size = 20 +text = "YES" + +[node name="NoButton" type="Button" parent="ConfirmationDialog/MarginContainer/VBoxContainer/MarginContainer/HBoxContainer"] +layout_mode = 2 +size_flags_horizontal = 3 +theme_override_fonts/font = ExtResource("1_6let0") +theme_override_font_sizes/font_size = 20 +text = "NO" diff --git a/globals.gd b/globals.gd index 5f14f76..a792529 100644 --- a/globals.gd +++ b/globals.gd @@ -2,8 +2,8 @@ extends Node var is_transitioning = false var day_count = 1 -var patient_count = 0 -var daily_patient_limit = 2 +var patient_count = 1 +var daily_patient_limit = 3 var patient_id = "564" var dialogue_intro = load("res://Dialogues/intro.dialogue") var dialogue_recovery = load("res://Dialogues/recovery.dialogue") @@ -15,6 +15,15 @@ func _ready() -> void: +func get_save_date() -> String: + var dt = Time.get_datetime_dict_from_system() + return "%02d/%02d/%04d, %02d:%02d" % [ + dt.month, dt.day, dt.year, + dt.hour, dt.minute + ] + + + # Called every frame. 'delta' is the elapsed time since the previous frame. func _process(delta: float) -> void: pass diff --git a/main_hub.gd b/main_hub.gd index 553f175..f998da9 100644 --- a/main_hub.gd +++ b/main_hub.gd @@ -35,11 +35,13 @@ func _ready() -> void: #Connecting Signals title_screen.connect("new_game_pressed", self._on_new_game_pressed) - title_screen.connect("load_pressed", self._on_load_pressed) - title_screen.connect("settings_pressed", self._on_settings_pressed) + UI.connect("save_slot_pressed", self._on_save_slot_pressed) + UI.connect("load_slot_pressed", self._on_load_slot_pressed) + UI.connect("main_menu_pressed", self._on_main_menu_pressed) screening_desk.connect("recovery_pressed", self._on_recovery_pressed) - pass + #Updating Save/Load Slots Information based on Existing Saves + update_slots() @@ -51,35 +53,17 @@ func _process(delta: float) -> void: # Starts a new game func _on_new_game_pressed(): - - #Offering to skip Introduction - UI.confirmation_text.text = "[center]Do you wish to skip the introduction ?[/center]" - UI.confirmation_yes.pressed.connect(skip_intro, CONNECT_ONE_SHOT) - UI.confirmation_no.pressed.connect(play_intro, CONNECT_ONE_SHOT) - UI.confirmation_dialog.show() - TransitionScreen.mask.visible = true - - - -#Skips the introduction -func skip_intro(): - - #Disconnecting the other Signal from the Confirmation Dialogue - UI.confirmation_no.disconnect("pressed", play_intro) - - #Starting Day Loop - start_day_loop() + Globals.day_count = 1 + #Offering to skip the introduction + var choice_text = "[center]Do you wish to skip the introduction ?[/center]" + UI.ask_confirmation(start_day, play_intro, choice_text) #Plays the entire introduction func play_intro(): - #Disconnecting the other Signal from the Confirmation Dialogue - UI.confirmation_yes.disconnect("pressed", skip_intro) - - #Playing the Intro - #Text Slides + #Text Slides var text_container = $TextScreens/MarginContainer/IntroBoxContainer/TextContainer TransitionScreen.transition("big", [$TitleScreen], [$TextScreens, $TextScreens/MarginContainer/IntroBoxContainer/Header, text_container.get_child(0), UI, UI.get_node("UI/SkipContainer")]) @@ -88,74 +72,71 @@ func play_intro(): TransitionScreen.transition("small", [text_container.get_child(i)], [text_container.get_child(i+1)]) await UI.next_slide - #Meeting Room Dialogue + #Meeting room dialogue TransitionScreen.transition("big", [$TextScreens, $TextScreens/MarginContainer, text_container.get_child(4), UI, UI.get_node("UI/SkipContainer")], [$DialogueScreens]) await TransitionScreen.transition_finished DialogueManager.show_dialogue_balloon(Globals.dialogue_intro, "start") await DialogueManager.dialogue_ended - #Starting Day Loop - start_day_loop() + #Starting the day + start_day() -#Starts the Day Loop -func start_day_loop(): +#Starts the day +func start_day(): - #Transitioning to Day Screen + #Transitioning to day screen $TextScreens/Day.text = "[center]DAY " + str(Globals.day_count) + "[/center]" - TransitionScreen.transition("big", [$DialogueScreens, $TitleScreen], [$TextScreens, $TextScreens/Day]) + + var scenes_to_hide: Array[Node] = [$DialogueScreens, $TitleScreen, $Bedroom] + var scenes_to_show: Array[Node] = [$TextScreens, $TextScreens/Day] + TransitionScreen.transition("big", scenes_to_hide, scenes_to_show) await TransitionScreen.transition_finished await get_tree().create_timer(3.0).timeout - #Transitioning to the Screening Desk + #Transitioning to the screening desk TransitionScreen.transition("big", [$TextScreens, $TextScreens/Day], [$ScreeningDesk, $ScreeningDesk.alone_controls, UI, UI.get_node("UI/UpperContainer")]) await TransitionScreen.transition_finished - #Finally starting the Game Loop + #Setting up new patient $ScreeningDesk.new_patient(Globals.patient_id) +#Ends the day and starts the next one func _on_recovery_pressed(): - var scenes_to_hide = [$ScreeningDesk.end_of_day_controls, $ScreeningDesk] - var scenes_to_show:Array[Node] = [$Bedroom] + #Transitioning to the bedroom + var scenes_to_hide: Array[Node] = [$ScreeningDesk.end_of_day_controls, $ScreeningDesk] + var scenes_to_show: Array[Node] = [$Bedroom] TransitionScreen.transition("big", scenes_to_hide, scenes_to_show) await TransitionScreen.transition_finished + #End of day dialogue DialogueManager.show_dialogue_balloon(Globals.dialogue_recovery, "end_of_day_" + str(Globals.day_count)) await DialogueManager.dialogue_ended + #Start of the next day Globals.day_count += 1 - - #Transitioning to Day Screen - $TextScreens/Day.text = "[center]DAY " + str(Globals.day_count) + "[/center]" - scenes_to_hide = [$Bedroom] - scenes_to_show = [$TextScreens, $TextScreens/Day] - TransitionScreen.transition("big", scenes_to_hide, scenes_to_show) - await TransitionScreen.transition_finished - await get_tree().create_timer(3.0).timeout - - #Transitioning to Screening Desk - scenes_to_hide = scenes_to_show - scenes_to_show = [$ScreeningDesk, $ScreeningDesk.alone_controls] - TransitionScreen.transition("big", scenes_to_hide, scenes_to_show) - await TransitionScreen.transition_finished - $ScreeningDesk.new_patient(Globals.patient_id) + start_day() -func save_game(save_slot:String): +#Saves game state on the selected save slot +func save_game(save_slot_number:int): + #Setting up save data var save_data = { "day_count": Globals.day_count, "patient_count": Globals.patient_count, - "patient_id": Globals.patient_id + "patient_id": Globals.patient_id, + "save_date": Globals.get_save_date() } - - var file = FileAccess.open("res://Saves/save_" + save_slot + ".json", FileAccess.WRITE) + + #Creating save file + var file = FileAccess.open("res://Saves/save_" + str(save_slot_number) + ".json", FileAccess.WRITE) if file: var json_string = JSON.stringify(save_data) print(json_string) @@ -164,26 +145,104 @@ func save_game(save_slot:String): print("Game saved successfully!") else: print("Failed to open file for saving.") - - - -func load_game(save_slot:String): - var file = FileAccess.open("res://Saves/save_" + save_slot + ".json", FileAccess.READ) + #Updating save/load slots information + var save_slot_path = "UI/Save/MarginContainer/VBoxContainer/SaveSlot" + str(save_slot_number) + var load_slot_path = "UI/Load/MarginContainer/VBoxContainer/LoadSlot" + str(save_slot_number) + var save_slot = UI.get_node(save_slot_path) + var load_slot = UI.get_node(load_slot_path) + + save_slot.text = "DAY " + str(save_data["day_count"]) + ", PATIENT " + str(save_data["patient_count"]) + "\nSAVE DATE : " + str(save_data["save_date"]) + load_slot.text = save_slot.text + + + +#Loads save file from the selected load slot +func load_game(load_slot_number:int): + + #Hiding loading menus and masks + TransitionScreen.mask.visible = false + UI.get_node("UI/Load").hide() + UI.get_node("UI/LoadTitle").hide() + UI.get_node("UI/Menu").hide() + + #Opening save file + var file = FileAccess.open("res://Saves/save_" + str(load_slot_number) + ".json", FileAccess.READ) if file: var json_string = file.get_as_text() file.close() var load_data = JSON.parse_string(json_string) - if load_data == OK: + if typeof(load_data) == 27: #Checks if loaded data is a Dictionary print(load_data) Globals.day_count = load_data["day_count"] Globals.patient_count = load_data["patient_count"] Globals.patient_id = load_data["patient_id"] else: print("Failed to parse Loading Data.") - - - -func _on_save_pressed(): + #Transitioning to loaded Save + var scenes_to_hide = [$TitleScreen, $Bedroom, $TextScreens, $TextScreens/Day, $ScreeningDesk.patient_controls, $ScreeningDesk.end_of_day_controls, $ScreeningDesk.patient_texture, $ScreeningDesk.panel_container, $ScreeningDesk.face_zoom] + $ScreeningDesk.margin_container.get_children() + var scenes_to_show = [$ScreeningDesk, $ScreeningDesk.alone_controls, UI.get_node("UI/UpperContainer")] + TransitionScreen.transition("big", scenes_to_hide, scenes_to_show) + await TransitionScreen.transition_finished + $ScreeningDesk.new_patient(Globals.patient_id) + + + +func _on_save_slot_pressed(save_slot): + save_game(save_slot) + + + +func _on_load_slot_pressed(load_slot): + load_game(load_slot) + + + +func _on_main_menu_pressed(): + + #Hiding menu + UI.get_node("UI/Menu").hide() + UI.get_node("UI/UpperContainer").hide() + TransitionScreen.mask.visible = false + + #Going back to main menu + var scenes_to_hide = [$ScreeningDesk, $Bedroom, $TextScreens, $TextScreens/Day, $ScreeningDesk.patient_controls, $ScreeningDesk.end_of_day_controls, $ScreeningDesk.patient_texture, $ScreeningDesk.panel_container, $ScreeningDesk.face_zoom] + $ScreeningDesk.margin_container.get_children() + var scenes_to_show = [$TitleScreen] + TransitionScreen.transition("big", scenes_to_hide, scenes_to_show) + await TransitionScreen.transition_finished + + + +#Updates Save/Load Slots based on Existing Saves +func update_slots(): + + #Loops over the 4 save/load slots + for save_number in range(1, 5): + + #Retrieves save and load slots + var save_slot_path = "UI/Save/MarginContainer/VBoxContainer/SaveSlot" + str(save_number) + var load_slot_path = "UI/Load/MarginContainer/VBoxContainer/LoadSlot" + str(save_number) + var load_title_slot_path = "UI/LoadTitle/MarginContainer/VBoxContainer/LoadSlot" + str(save_number) + var save_slot = UI.get_node(save_slot_path) + var load_slot = UI.get_node(load_slot_path) + var load_title_slot = UI.get_node(load_title_slot_path) + + #Retrieves save path + var save_path = "res://Saves/save_" + str(save_number) + ".json" + + + if FileAccess.file_exists(save_path): + var file = FileAccess.open(save_path, FileAccess.READ) #Loads the save if it exists + var json_string = file.get_as_text() + file.close() + var load_data = JSON.parse_string(json_string) + if typeof(load_data) == 27: #Checks if loaded data is a Dictionary + #Updates save and load slots texts + print(load_data) + save_slot.text = "DAY " + str(load_data["day_count"]) + ", PATIENT " + str(load_data["patient_count"]) + "\nSAVE DATE : " + str(load_data["save_date"]) + load_slot.text = save_slot.text + load_title_slot.text = save_slot.text + else: + print("Failed to parse Loading Data.") diff --git a/screening_desk.gd b/screening_desk.gd index 82a01a4..54b0332 100644 --- a/screening_desk.gd +++ b/screening_desk.gd @@ -178,24 +178,19 @@ func _change_emotion(dialogue_line) -> void: func _on_containment_pressed(): - #Asking for Confirmation var lambda = func(): clear_patient("containment") - UI.confirmation_text.text = "[center]Do you really want to send this patient to [color=darkred]Containment[/color] ?[/center]" - UI.confirmation_yes.pressed.connect(lambda, CONNECT_ONE_SHOT) - UI.confirmation_no.pressed.connect(func(): UI.confirmation_yes.disconnect("pressed", lambda)) - UI.confirmation_dialog.show() - TransitionScreen.mask.visible = true + var choice_text = "[center]Do you really want to send this patient to [color=darkred]Containment[/color] ?[/center]" + + UI.ask_confirmation(lambda, Callable(), choice_text) + func _on_psych_ward_pressed(): - #Asking for Confirmation var lambda = func(): clear_patient("psych_ward") - UI.confirmation_text.text = "[center]Do you really want to send this patient to the [color=darkgreen]Psych Ward[/color] ?[/center]" - UI.confirmation_yes.pressed.connect(lambda, CONNECT_ONE_SHOT) - UI.confirmation_no.pressed.connect(func(): UI.confirmation_yes.disconnect("pressed", lambda)) - UI.confirmation_dialog.show() - TransitionScreen.mask.visible = true + var choice_text = "[center]Do you really want to send this patient to the [color=darkgreen]Psych Ward[/color] ?[/center]" + + UI.ask_confirmation(lambda, Callable(), choice_text) @@ -244,7 +239,7 @@ func clear_patient(choice:String): #Setting Up Next Patient new_patient("564") else: - Globals.patient_count = 0 + Globals.patient_count = 1 #Starting End of Day Dialogue var start_title = "end_of_day_" + str(Globals.day_count) diff --git a/title_screen.gd b/title_screen.gd index 9e3773f..a21f88f 100644 --- a/title_screen.gd +++ b/title_screen.gd @@ -28,10 +28,9 @@ func _on_new_game_pressed() -> void: -func _on_load_pressed() -> void: - load_pressed.emit() - pass - +func _on_load_pressed(): + UI.get_node("UI/LoadTitle").show() + TransitionScreen.mask.visible = true func _on_settings_pressed() -> void: diff --git a/ui.gd b/ui.gd index 14f2e79..cd24d27 100644 --- a/ui.gd +++ b/ui.gd @@ -1,36 +1,91 @@ extends CanvasLayer @onready var next = $UI/SkipContainer/NextButton -@onready var confirmation_dialog = $UI/ConfirmationDialog -@onready var confirmation_text = $UI/ConfirmationDialog/MarginContainer/VBoxContainer/ConfirmationText -@onready var confirmation_yes = $UI/ConfirmationDialog/MarginContainer/VBoxContainer/MarginContainer/HBoxContainer/YesButton -@onready var confirmation_no = $UI/ConfirmationDialog/MarginContainer/VBoxContainer/MarginContainer/HBoxContainer/NoButton +@onready var confirmation_mask = $ConfirmationMask signal next_request signal next_slide +signal save_slot_pressed(save_slot_number: int) +signal load_slot_pressed(load_slot_number: int) +signal main_menu_pressed - +var confirmation_dialog = preload("res://confirmation_dialog.tscn") # Called when the node enters the scene tree for the first time. func _ready() -> void: #Connecting signals + #Next Signals next.pressed.connect(_on_next_pressed) self.connect("next_request", _on_next_request) - #Setting up the Confirmation Dialog - confirmation_yes.text = ("YES") - confirmation_no.text = ("NO") - UI.confirmation_yes.pressed.connect(func(): UI.confirmation_dialog.hide()) - UI.confirmation_yes.pressed.connect(func(): TransitionScreen.mask.visible = false) - UI.confirmation_no.pressed.connect(func(): UI.confirmation_dialog.hide()) - UI.confirmation_no.pressed.connect(func(): TransitionScreen.mask.visible = false) + #Menu Signals + $UI/UpperContainer/Menu.pressed.connect(_on_menu_pressed) + + $UI/Menu/MarginContainer/VBoxContainer/Resume.pressed.connect(_on_resume_pressed) + $UI/Menu/MarginContainer/VBoxContainer/Save.pressed.connect(_on_save_pressed) + $UI/Menu/MarginContainer/VBoxContainer/Load.pressed.connect(_on_load_pressed) + $UI/Menu/MarginContainer/VBoxContainer/Settings.pressed.connect(_on_settings_pressed) + $UI/Menu/MarginContainer/VBoxContainer/MainMenu.pressed.connect(_on_main_menu_pressed) + $UI/Menu/MarginContainer/VBoxContainer/Quit.pressed.connect(_on_quit_game_pressed) + $UI/Save/MarginContainer/VBoxContainer/Back.pressed.connect(_on_back_pressed) + $UI/Load/MarginContainer/VBoxContainer/Back.pressed.connect(_on_back_pressed) + $UI/LoadTitle/MarginContainer/VBoxContainer/Back.pressed.connect(_on_back_title_pressed) + $UI/Settings/MarginContainer/VBoxContainer/Back.pressed.connect(_on_back_pressed) + + #Save Slots Signals + $UI/Save/MarginContainer/VBoxContainer/SaveSlot1.pressed.connect(func(): _on_save_slot_pressed(1)) + $UI/Save/MarginContainer/VBoxContainer/SaveSlot2.pressed.connect(func(): _on_save_slot_pressed(2)) + $UI/Save/MarginContainer/VBoxContainer/SaveSlot3.pressed.connect(func(): _on_save_slot_pressed(3)) + $UI/Save/MarginContainer/VBoxContainer/SaveSlot4.pressed.connect(func(): _on_save_slot_pressed(4)) + + #Load Slots Signals + $UI/Load/MarginContainer/VBoxContainer/LoadSlot1.pressed.connect(func(): _on_load_slot_pressed(1)) + $UI/Load/MarginContainer/VBoxContainer/LoadSlot2.pressed.connect(func(): _on_load_slot_pressed(2)) + $UI/Load/MarginContainer/VBoxContainer/LoadSlot3.pressed.connect(func(): _on_load_slot_pressed(3)) + $UI/Load/MarginContainer/VBoxContainer/LoadSlot4.pressed.connect(func(): _on_load_slot_pressed(4)) + + #Load Title Slots Signals + $UI/LoadTitle/MarginContainer/VBoxContainer/LoadSlot1.pressed.connect(func(): _on_load_slot_pressed(1)) + $UI/LoadTitle/MarginContainer/VBoxContainer/LoadSlot2.pressed.connect(func(): _on_load_slot_pressed(2)) + $UI/LoadTitle/MarginContainer/VBoxContainer/LoadSlot3.pressed.connect(func(): _on_load_slot_pressed(3)) + $UI/LoadTitle/MarginContainer/VBoxContainer/LoadSlot4.pressed.connect(func(): _on_load_slot_pressed(4)) #Hiding everything at start #self.hide() - confirmation_dialog.hide() self.get_node("UI/UpperContainer").hide() self.get_node("UI/SkipContainer").hide() + confirmation_mask.visible = false + + + +#Brings up a Confirmation Dialog +func ask_confirmation(function_yes: Callable, function_no: Callable, choice_text: String): + + var choice_dialog = confirmation_dialog.instantiate() + add_child(choice_dialog) + + var choice_text_label = choice_dialog.get_node("ConfirmationDialog/MarginContainer/VBoxContainer/ConfirmationText") + var choice_yes = choice_dialog.get_node("ConfirmationDialog/MarginContainer/VBoxContainer/MarginContainer/HBoxContainer/YesButton") + var choice_no = choice_dialog.get_node("ConfirmationDialog/MarginContainer/VBoxContainer/MarginContainer/HBoxContainer/NoButton") + + #Clears the Confirmation Dialog and Remove the Mask no matter what choice is made + choice_yes.pressed.connect(func(): confirmation_mask.visible = false) + choice_yes.pressed.connect(func(): choice_dialog.queue_free()) + choice_no.pressed.connect(func(): confirmation_mask.visible = false) + choice_no.pressed.connect(func(): choice_dialog.queue_free()) + + choice_yes.text = ("YES") + choice_no.text = ("NO") + choice_text_label.text = choice_text + + #Connects Choices to their Functions + choice_yes.pressed.connect(function_yes, CONNECT_ONE_SHOT) + if function_no.is_valid(): + choice_no.pressed.connect(function_no, CONNECT_ONE_SHOT) + + choice_dialog.show() + confirmation_mask.visible = true @@ -54,6 +109,107 @@ func _on_next_request(): +func _on_menu_pressed(): + TransitionScreen.mask.visible = true + $UI/Menu.show() + + + +#Back to the game +func _on_resume_pressed(): + TransitionScreen.mask.visible = false + $UI/Menu.hide() + + + +#Shows Save Slots +func _on_save_pressed(): + $UI/Menu.hide() + $UI/Save.show() + + + +#Shows Load Slots +func _on_load_pressed(): + $UI/Menu.hide() + $UI/Load.show() + + + +#Goes back to Menu +func _on_back_pressed(): + $UI/Save.hide() + $UI/Load.hide() + $UI/Settings.hide() + $UI/Menu.show() + + + +#Goes back to title screen +func _on_back_title_pressed(): + $UI/LoadTitle.hide() + TransitionScreen.mask.visible = false + + + +#Shows Settings Menu +func _on_settings_pressed(): + $UI/Menu.hide() + $UI/Settings.show() + + + +#Goes back to the main menu +func _on_main_menu_pressed(): + + #Asking for confirmation + var lambda = func(): main_menu_pressed.emit() + var choice_text = "[center]Go back to main menu ? Unsaved changes will be lost.[/center]" + ask_confirmation(lambda, Callable(), choice_text) + + + +#Quits the game +func _on_quit_game_pressed(): + get_tree().quit() + + + +#Emits save_slot signal +func _on_save_slot_pressed(save_slot_number: int): + + var save_slot_path = "UI/Save/MarginContainer/VBoxContainer/SaveSlot" + str(save_slot_number) + var save_slot = UI.get_node(save_slot_path) + + #Asking for confirmation if replacing existing save + if save_slot.text != "EMPTY": + var lambda = func(): save_slot_pressed.emit(save_slot_number) + var choice_text = "[center]Replace existing save ?[/center]" + ask_confirmation(lambda, Callable(), choice_text) + else: + save_slot_pressed.emit(save_slot_number) + + + +#Emits load_slot signal +func _on_load_slot_pressed(load_slot_number: int): + + var load_slot_path = "UI/Load/MarginContainer/VBoxContainer/LoadSlot" + str(load_slot_number) + var load_slot = UI.get_node(load_slot_path) + + #Asking for confirmation before loading + if load_slot.text != "EMPTY": + var lambda = func(): load_slot_pressed.emit(load_slot_number) + var choice_text = "[center]Load save ? Any unsaved games will be lost.[/center]" + ask_confirmation(lambda, Callable(), choice_text) + else: + pass + + + + + + # Called every frame. 'delta' is the elapsed time since the previous frame. func _process(delta: float) -> void: pass diff --git a/ui.tscn b/ui.tscn index 1050da0..acaf319 100644 --- a/ui.tscn +++ b/ui.tscn @@ -1,4 +1,4 @@ -[gd_scene load_steps=6 format=3 uid="uid://dy40jygog8t3k"] +[gd_scene load_steps=5 format=3 uid="uid://dy40jygog8t3k"] [ext_resource type="Script" path="res://ui.gd" id="1_mg12k"] [ext_resource type="FontFile" uid="uid://ckg5x0oonnjtn" path="res://Art/XanhMono-Regular.ttf" id="2_cohu5"] @@ -10,15 +10,8 @@ border_width_top = 2 border_width_right = 2 border_width_bottom = 2 -[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_0joc6"] -border_width_left = 2 -border_width_top = 2 -border_width_right = 2 -border_width_bottom = 2 -border_color = Color(0.629675, 0.629675, 0.629674, 1) - [node name="UILayer" type="CanvasLayer"] -layer = 128 +layer = 127 script = ExtResource("1_mg12k") [node name="UI" type="Control" parent="."] @@ -32,6 +25,7 @@ grow_vertical = 2 mouse_filter = 2 [node name="Menu" type="PanelContainer" parent="UI"] +visible = false layout_mode = 1 anchors_preset = 8 anchor_left = 0.5 @@ -52,20 +46,20 @@ color = Color(0, 0, 0, 1) [node name="MarginContainer" type="MarginContainer" parent="UI/Menu"] layout_mode = 2 -theme_override_constants/margin_left = 40 -theme_override_constants/margin_top = 40 -theme_override_constants/margin_right = 40 -theme_override_constants/margin_bottom = 40 +theme_override_constants/margin_left = 25 +theme_override_constants/margin_top = 25 +theme_override_constants/margin_right = 25 +theme_override_constants/margin_bottom = 25 [node name="VBoxContainer" type="VBoxContainer" parent="UI/Menu/MarginContainer"] layout_mode = 2 -[node name="Continue" type="Button" parent="UI/Menu/MarginContainer/VBoxContainer"] +[node name="Resume" type="Button" parent="UI/Menu/MarginContainer/VBoxContainer"] layout_mode = 2 size_flags_vertical = 3 theme_override_fonts/font = ExtResource("2_cohu5") theme_override_font_sizes/font_size = 27 -text = "CONTINUE" +text = "RESUME" [node name="Save" type="Button" parent="UI/Menu/MarginContainer/VBoxContainer"] layout_mode = 2 @@ -81,12 +75,12 @@ theme_override_fonts/font = ExtResource("2_cohu5") theme_override_font_sizes/font_size = 27 text = "LOAD" -[node name="Options" type="Button" parent="UI/Menu/MarginContainer/VBoxContainer"] +[node name="Settings" type="Button" parent="UI/Menu/MarginContainer/VBoxContainer"] layout_mode = 2 size_flags_vertical = 3 theme_override_fonts/font = ExtResource("2_cohu5") theme_override_font_sizes/font_size = 27 -text = "OPTIONS" +text = "SETTINGS" [node name="MainMenu" type="Button" parent="UI/Menu/MarginContainer/VBoxContainer"] layout_mode = 2 @@ -95,14 +89,14 @@ theme_override_fonts/font = ExtResource("2_cohu5") theme_override_font_sizes/font_size = 27 text = "MAIN MENU" -[node name="Exit" type="Button" parent="UI/Menu/MarginContainer/VBoxContainer"] +[node name="Quit" type="Button" parent="UI/Menu/MarginContainer/VBoxContainer"] layout_mode = 2 size_flags_vertical = 3 theme_override_fonts/font = ExtResource("2_cohu5") theme_override_font_sizes/font_size = 27 -text = "EXIT GAME" +text = "QUIT GAME" -[node name="ConfirmationDialog" type="PanelContainer" parent="UI"] +[node name="Save" type="PanelContainer" parent="UI"] visible = false layout_mode = 1 anchors_preset = 8 @@ -111,58 +105,272 @@ anchor_top = 0.5 anchor_right = 0.5 anchor_bottom = 0.5 offset_left = -200.0 -offset_top = -75.0 -offset_right = 300.0 -offset_bottom = 85.0 +offset_top = -300.0 +offset_right = 200.0 +offset_bottom = 300.0 grow_horizontal = 2 grow_vertical = 2 -theme_override_styles/panel = SubResource("StyleBoxFlat_0joc6") +theme_override_styles/panel = SubResource("StyleBoxFlat_fo2i3") -[node name="Background" type="ColorRect" parent="UI/ConfirmationDialog"] +[node name="Background" type="ColorRect" parent="UI/Save"] layout_mode = 2 color = Color(0, 0, 0, 1) -[node name="MarginContainer" type="MarginContainer" parent="UI/ConfirmationDialog"] +[node name="MarginContainer" type="MarginContainer" parent="UI/Save"] layout_mode = 2 -theme_override_constants/margin_left = 10 -theme_override_constants/margin_top = 20 -theme_override_constants/margin_right = 10 -theme_override_constants/margin_bottom = 10 +theme_override_constants/margin_left = 25 +theme_override_constants/margin_top = 10 +theme_override_constants/margin_right = 25 +theme_override_constants/margin_bottom = 0 -[node name="VBoxContainer" type="VBoxContainer" parent="UI/ConfirmationDialog/MarginContainer"] +[node name="VBoxContainer" type="VBoxContainer" parent="UI/Save/MarginContainer"] layout_mode = 2 -[node name="ConfirmationText" type="RichTextLabel" parent="UI/ConfirmationDialog/MarginContainer/VBoxContainer"] +[node name="RichTextLabel" type="RichTextLabel" parent="UI/Save/MarginContainer/VBoxContainer"] layout_mode = 2 size_flags_vertical = 3 -size_flags_stretch_ratio = 3.0 theme_override_fonts/normal_font = ExtResource("2_cohu5") -theme_override_font_sizes/normal_font_size = 25 +theme_override_font_sizes/normal_font_size = 30 bbcode_enabled = true +text = " +[center]SAVE GAME[/center]" -[node name="MarginContainer" type="MarginContainer" parent="UI/ConfirmationDialog/MarginContainer/VBoxContainer"] +[node name="SaveSlot1" type="Button" parent="UI/Save/MarginContainer/VBoxContainer"] layout_mode = 2 size_flags_vertical = 3 -theme_override_constants/margin_left = 70 -theme_override_constants/margin_right = 70 +theme_override_fonts/font = ExtResource("2_cohu5") +theme_override_font_sizes/font_size = 27 +text = "EMPTY" -[node name="HBoxContainer" type="HBoxContainer" parent="UI/ConfirmationDialog/MarginContainer/VBoxContainer/MarginContainer"] +[node name="SaveSlot2" type="Button" parent="UI/Save/MarginContainer/VBoxContainer"] layout_mode = 2 -theme_override_constants/separation = 70 +size_flags_vertical = 3 +theme_override_fonts/font = ExtResource("2_cohu5") +theme_override_font_sizes/font_size = 27 +text = "EMPTY" -[node name="YesButton" type="Button" parent="UI/ConfirmationDialog/MarginContainer/VBoxContainer/MarginContainer/HBoxContainer"] +[node name="SaveSlot3" type="Button" parent="UI/Save/MarginContainer/VBoxContainer"] layout_mode = 2 -size_flags_horizontal = 3 +size_flags_vertical = 3 +theme_override_fonts/font = ExtResource("2_cohu5") +theme_override_font_sizes/font_size = 27 +text = "EMPTY" + +[node name="SaveSlot4" type="Button" parent="UI/Save/MarginContainer/VBoxContainer"] +layout_mode = 2 +size_flags_vertical = 3 +theme_override_fonts/font = ExtResource("2_cohu5") +theme_override_font_sizes/font_size = 27 +text = "EMPTY" + +[node name="Back" type="Button" parent="UI/Save/MarginContainer/VBoxContainer"] +custom_minimum_size = Vector2(80, 40) +layout_mode = 2 +size_flags_horizontal = 4 +size_flags_vertical = 6 theme_override_fonts/font = ExtResource("2_cohu5") theme_override_font_sizes/font_size = 20 -text = "YES" +text = "BACK" -[node name="NoButton" type="Button" parent="UI/ConfirmationDialog/MarginContainer/VBoxContainer/MarginContainer/HBoxContainer"] +[node name="Load" type="PanelContainer" parent="UI"] +visible = false +layout_mode = 1 +anchors_preset = 8 +anchor_left = 0.5 +anchor_top = 0.5 +anchor_right = 0.5 +anchor_bottom = 0.5 +offset_left = -200.0 +offset_top = -300.0 +offset_right = 200.0 +offset_bottom = 300.0 +grow_horizontal = 2 +grow_vertical = 2 +theme_override_styles/panel = SubResource("StyleBoxFlat_fo2i3") + +[node name="Background" type="ColorRect" parent="UI/Load"] layout_mode = 2 -size_flags_horizontal = 3 +color = Color(0, 0, 0, 1) + +[node name="MarginContainer" type="MarginContainer" parent="UI/Load"] +layout_mode = 2 +theme_override_constants/margin_left = 25 +theme_override_constants/margin_top = 10 +theme_override_constants/margin_right = 25 +theme_override_constants/margin_bottom = 0 + +[node name="VBoxContainer" type="VBoxContainer" parent="UI/Load/MarginContainer"] +layout_mode = 2 + +[node name="RichTextLabel" type="RichTextLabel" parent="UI/Load/MarginContainer/VBoxContainer"] +layout_mode = 2 +size_flags_vertical = 3 +theme_override_fonts/normal_font = ExtResource("2_cohu5") +theme_override_font_sizes/normal_font_size = 30 +bbcode_enabled = true +text = " +[center]LOAD GAME[/center]" + +[node name="LoadSlot1" type="Button" parent="UI/Load/MarginContainer/VBoxContainer"] +layout_mode = 2 +size_flags_vertical = 3 +theme_override_fonts/font = ExtResource("2_cohu5") +theme_override_font_sizes/font_size = 27 +text = "EMPTY" + +[node name="LoadSlot2" type="Button" parent="UI/Load/MarginContainer/VBoxContainer"] +layout_mode = 2 +size_flags_vertical = 3 +theme_override_fonts/font = ExtResource("2_cohu5") +theme_override_font_sizes/font_size = 27 +text = "EMPTY" + +[node name="LoadSlot3" type="Button" parent="UI/Load/MarginContainer/VBoxContainer"] +layout_mode = 2 +size_flags_vertical = 3 +theme_override_fonts/font = ExtResource("2_cohu5") +theme_override_font_sizes/font_size = 27 +text = "EMPTY" + +[node name="LoadSlot4" type="Button" parent="UI/Load/MarginContainer/VBoxContainer"] +layout_mode = 2 +size_flags_vertical = 3 +theme_override_fonts/font = ExtResource("2_cohu5") +theme_override_font_sizes/font_size = 27 +text = "EMPTY" + +[node name="Back" type="Button" parent="UI/Load/MarginContainer/VBoxContainer"] +custom_minimum_size = Vector2(80, 40) +layout_mode = 2 +size_flags_horizontal = 4 +size_flags_vertical = 6 theme_override_fonts/font = ExtResource("2_cohu5") theme_override_font_sizes/font_size = 20 -text = "NO" +text = "BACK" + +[node name="LoadTitle" type="PanelContainer" parent="UI"] +visible = false +layout_mode = 2 +anchor_left = 0.5 +anchor_top = 0.5 +anchor_right = 0.5 +anchor_bottom = 0.5 +offset_left = -200.0 +offset_top = -300.0 +offset_right = 200.0 +offset_bottom = 300.0 +grow_horizontal = 2 +grow_vertical = 2 +theme_override_styles/panel = SubResource("StyleBoxFlat_fo2i3") + +[node name="Background" type="ColorRect" parent="UI/LoadTitle"] +layout_mode = 2 +color = Color(0, 0, 0, 1) + +[node name="MarginContainer" type="MarginContainer" parent="UI/LoadTitle"] +layout_mode = 2 +theme_override_constants/margin_left = 25 +theme_override_constants/margin_top = 10 +theme_override_constants/margin_right = 25 +theme_override_constants/margin_bottom = 0 + +[node name="VBoxContainer" type="VBoxContainer" parent="UI/LoadTitle/MarginContainer"] +layout_mode = 2 + +[node name="RichTextLabel" type="RichTextLabel" parent="UI/LoadTitle/MarginContainer/VBoxContainer"] +layout_mode = 2 +size_flags_vertical = 3 +theme_override_fonts/normal_font = ExtResource("2_cohu5") +theme_override_font_sizes/normal_font_size = 30 +bbcode_enabled = true +text = " +[center]LOAD GAME[/center]" + +[node name="LoadSlot1" type="Button" parent="UI/LoadTitle/MarginContainer/VBoxContainer"] +layout_mode = 2 +size_flags_vertical = 3 +theme_override_fonts/font = ExtResource("2_cohu5") +theme_override_font_sizes/font_size = 27 +text = "EMPTY" + +[node name="LoadSlot2" type="Button" parent="UI/LoadTitle/MarginContainer/VBoxContainer"] +layout_mode = 2 +size_flags_vertical = 3 +theme_override_fonts/font = ExtResource("2_cohu5") +theme_override_font_sizes/font_size = 27 +text = "EMPTY" + +[node name="LoadSlot3" type="Button" parent="UI/LoadTitle/MarginContainer/VBoxContainer"] +layout_mode = 2 +size_flags_vertical = 3 +theme_override_fonts/font = ExtResource("2_cohu5") +theme_override_font_sizes/font_size = 27 +text = "EMPTY" + +[node name="LoadSlot4" type="Button" parent="UI/LoadTitle/MarginContainer/VBoxContainer"] +layout_mode = 2 +size_flags_vertical = 3 +theme_override_fonts/font = ExtResource("2_cohu5") +theme_override_font_sizes/font_size = 27 +text = "EMPTY" + +[node name="Back" type="Button" parent="UI/LoadTitle/MarginContainer/VBoxContainer"] +custom_minimum_size = Vector2(80, 40) +layout_mode = 2 +size_flags_horizontal = 4 +size_flags_vertical = 6 +theme_override_fonts/font = ExtResource("2_cohu5") +theme_override_font_sizes/font_size = 20 +text = "BACK" + +[node name="Settings" type="PanelContainer" parent="UI"] +visible = false +custom_minimum_size = Vector2(800, 800) +layout_mode = 1 +anchors_preset = 8 +anchor_left = 0.5 +anchor_top = 0.5 +anchor_right = 0.5 +anchor_bottom = 0.5 +offset_left = -200.0 +offset_top = -300.0 +offset_right = 200.0 +offset_bottom = 300.0 +grow_horizontal = 2 +grow_vertical = 2 +theme_override_styles/panel = SubResource("StyleBoxFlat_fo2i3") + +[node name="Background" type="ColorRect" parent="UI/Settings"] +layout_mode = 2 +color = Color(0, 0, 0, 1) + +[node name="MarginContainer" type="MarginContainer" parent="UI/Settings"] +layout_mode = 2 +theme_override_constants/margin_left = 25 +theme_override_constants/margin_top = 10 +theme_override_constants/margin_right = 25 +theme_override_constants/margin_bottom = 0 + +[node name="VBoxContainer" type="VBoxContainer" parent="UI/Settings/MarginContainer"] +layout_mode = 2 + +[node name="RichTextLabel" type="RichTextLabel" parent="UI/Settings/MarginContainer/VBoxContainer"] +layout_mode = 2 +size_flags_vertical = 3 +theme_override_fonts/normal_font = ExtResource("2_cohu5") +theme_override_font_sizes/normal_font_size = 30 +bbcode_enabled = true +text = " +[center]SETTINGS[/center]" + +[node name="Back" type="Button" parent="UI/Settings/MarginContainer/VBoxContainer"] +custom_minimum_size = Vector2(80, 40) +layout_mode = 2 +size_flags_horizontal = 4 +size_flags_vertical = 6 +theme_override_fonts/font = ExtResource("2_cohu5") +theme_override_font_sizes/font_size = 20 +text = "BACK" [node name="UpperContainer" type="HBoxContainer" parent="UI"] visible = false @@ -191,3 +399,12 @@ layout_mode = 2 theme_override_fonts/font = ExtResource("3_e3v1e") theme_override_font_sizes/font_size = 20 text = " Press Space to Next " + +[node name="ConfirmationMask" type="ColorRect" parent="."] +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +grow_horizontal = 2 +grow_vertical = 2 +mouse_force_pass_scroll_events = false +color = Color(0, 0, 0, 0.470588)