Files
imnotsick/main_hub.gd
T
2026-02-11 16:23:58 +01:00

315 lines
9.7 KiB
GDScript

extends Control
@export var TitleScreen: PackedScene
@export var ScreeningDesk: PackedScene
@export var Bedroom: PackedScene
@export var TextScreens: PackedScene
@export var DialogueScreens: PackedScene
var balloon: Node
# Called when the node enters the scene tree for the first time.
func _ready() -> void:
#Adding Scenes
var title_screen = TitleScreen.instantiate()
var screening_desk = ScreeningDesk.instantiate()
var text_screens = TextScreens.instantiate()
add_child(title_screen)
add_child(screening_desk)
add_child(text_screens)
#Naming Scenes
title_screen.name = "TitleScreen"
screening_desk.name = "ScreeningDesk"
text_screens.name = "TextScreens"
#Showing TitleScreen
title_screen.show()
#Connecting Signals
title_screen.connect("new_game_pressed", self._on_new_game_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)
UI.connect("text_value_changed", self._on_text_value_changed)
UI.connect("auto_value_changed", self._on_auto_value_changed)
Globals.character_label_color_change.connect(self._on_character_label_color_change)
Globals.start_balloon.connect(self.start_balloon)
#Updating Save/Load Slots Information based on Existing Saves
update_slots()
#Sorting patients by floor
Patient.sort_patients()
# Starts a new game
func _on_new_game_pressed():
#Setting/Resetting game parameters
Globals.day_count = 1
Globals.floor_count = -1
Globals.patient_count = 1
Globals.diagnoses_quota = 1
Globals.daily_patient_limit = 3
Globals.patient_list = ["44", "45", "46", "47", "48", "49", "50", "51"]
Globals.patients_seen.clear()
UI.update_journal(-1)
# DISABLED FOR NOW SINCE THERE'S NO INTRO ANYMORE
#Offering to skip the introduction
#var choice_text = "Do you wish to skip the introduction ?"
#UI.ask_confirmation(start_day, play_intro, choice_text)
start_day()
#Plays the entire introduction
func play_intro():
#PART IN PROGRESS
#Starting the day
start_day()
#Starts the day
func start_day():
#Hiding Menu for cinematic impact
UI.get_node("UI/UpperContainer").hide()
#Transitioning to day screen
$TextScreens/Day.text = "[center]DAY " + str(Globals.day_count) + "[/center]"
var scenes_to_hide: Array[Node] = [$TitleScreen]
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(1.0).timeout
#Setting up new patient
$ScreeningDesk.accurate_diagnoses = 0 #Resetting accurate_diagnoses value at the day's beginning
$ScreeningDesk.update_middle_screen(Globals.day_count, Globals.floor_count, $ScreeningDesk.accurate_diagnoses, Globals.diagnoses_quota)
#Transitioning to the screening desk
scenes_to_hide = scenes_to_show
scenes_to_show = [$ScreeningDesk, UI, UI.get_node("UI/UpperContainer")]
TransitionScreen.transition("big", scenes_to_hide, scenes_to_show)
await TransitionScreen.transition_finished
#Supervisor Dialogue
$ScreeningDesk.supervisor.dialogue("interfloor_" + str(-Globals.floor_count-1))
await $ScreeningDesk.supervisor.dialogue_finished
$ScreeningDesk.console_display(Globals.directives)
$ScreeningDesk.new_patient()
#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,
"floor_count": Globals.floor_count,
"patient_count": Globals.patient_count,
"diagnoses_quota": Globals.diagnoses_quota,
"daily_patient_limit": Globals.daily_patient_limit,
"patient_list": Globals.patient_list,
"patient_id": Globals.patient_id,
"patients_seen": Globals.patients_seen,
"save_date": Globals.get_save_date()
}
#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)
file.store_string(json_string)
file.close()
print("Game saved successfully!")
else:
print("Failed to open file for saving.")
#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):
#CLearing balloon
clear_balloon()
#Hiding loading menus and masks
TransitionScreen.mask.visible = false
UI.get_node("UI/Menu").hide()
UI.get_node("UI/UpperContainer").hide()
UI.get_node("UI/Load").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 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.diagnoses_quota = load_data["diagnoses_quota"]
Globals.daily_patient_limit = load_data["daily_patient_limit"]
Globals.patient_list = load_data["patient_list"]
Globals.patient_id = load_data["patient_id"]
Globals.patients_seen = load_data["patients_seen"]
else:
print("Failed to parse Loading Data.")
#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()
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():
#Removing mask
TransitionScreen.mask.visible = false
#Clearing balloon
clear_balloon()
#Hiding menus
UI.get_node("UI/Menu").hide()
UI.get_node("UI/UpperContainer").hide()
#Going back to main menu
var scenes_to_hide = [$ScreeningDesk, $TextScreens, $TextScreens/Day]
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 save_slot = UI.get_node(save_slot_path)
var load_slot = UI.get_node(load_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
else:
print("Failed to parse Loading Data.")
#Starts a balloon dialogue
func start_balloon(balloon_type:String, patient_type:String, dialogue_resource: Resource, start_title: String):
#Clearing previous balloon
clear_balloon()
#Instantiating a custom balloon
var Balloon: Resource = load("res://Dialogues/balloon_" + balloon_type + ".tscn")
balloon = Balloon.instantiate()
get_tree().current_scene.add_child(balloon)
#Connects emotion signals if needed
match patient_type:
"patient":
DialogueManager.got_dialogue.connect($ScreeningDesk.patient._change_emotion)
DialogueManager.got_dialogue.connect($ScreeningDesk._recording_text)
"supervisor":
DialogueManager.got_dialogue.connect($ScreeningDesk.supervisor._change_emotion)
#Applies text settings to the balloon
balloon.dialogue_label.seconds_per_step = UI.text_speed
#balloon.dialogue_line.time = UI.auto_speed
#Starts dialogue
balloon.start(dialogue_resource, start_title)
#Clearing balloon
func clear_balloon():
#Clearing Previous Balloon
if is_instance_valid(balloon):
balloon.queue_free()
#Disconnecting emotion signals
for function in [$ScreeningDesk.patient._change_emotion,
$ScreeningDesk._recording_text,
$ScreeningDesk.supervisor._change_emotion]:
if DialogueManager.is_connected("got_dialogue", function):
DialogueManager.disconnect("got_dialogue", function)
#Changes text_speed value
func _on_text_value_changed():
if is_instance_valid(balloon):
balloon.dialogue_label.seconds_per_step = UI.text_speed
#Changes auto_speed value
func _on_auto_value_changed():
if is_instance_valid(balloon):
#balloon.dialogue_line.time = UI.auto_speed
pass
#Changes CharacterLabel color
func _on_character_label_color_change(color: Color):
var label = balloon.get_node("Balloon/Panel/Dialogue/VBoxContainer/CharacterLabel")
label.add_theme_color_override("default_color", color)