extends Node #Dialogue variables var dialog_tree: Dictionary var marker: Array[int] var dialogue_resource: Resource #Patient attributes var texture := TextureRect.new() var image : Texture2D var original_color: Color var emotions : Dictionary var abnormal: bool var id : String var type: String #Patient file var file_text : String #Patient symptoms ordered from floor to floor var symptoms_arrays: Array[Array] = [ ["SUICIDAL IDEATIONS", "PERSECUTORY DELUSIONS", "UNNATURAL BEHAVIOUR", "AUDITORY HALLUCINATIONS"], ["SOMATIC HALLUCINATIONS", "MEGALOMANIAC DELUSIONS"], ["MYSTICAL DELUSIONS", "MANIA"], ["CHEMOSENSORY HALLUCINATIONS", "SELF-MUTILATION"], ["VISUAL HALLUCINATIONS", "HETERO-AGRESSIVE BEHAVIOUR"] ] #Lists of possible patients sorted by floor var og_patient_list : Array[Dictionary] var patient_list: Array[Dictionary] var og_its_list = ["its_01", "its_02", "its_03", "its_04"] var its_list = [] var og_ite_list = ["ite_01", "ite_02", "ite_03", "ite_04"] var ite_list = [] var og_entities_list = ["entity_01"] var patients_seen = [] var its_seen = [] var ite_seen = [] #Supervisor file path var supervisor_name = "loeveth" # Called when the node enters the scene tree for the first time. func _ready() -> void: #Setting up dialogue marker marker.resize(100) marker.fill(0) #Setting up patient lists og_patient_list.resize(len(symptoms_arrays)) patient_list.resize(len(symptoms_arrays)) its_list = og_its_list ite_list = og_ite_list original_color = texture.modulate #Saving original modulation color to reset it after modification func build_dialog_tree(tree_model: Array[int]) -> Dictionary: #Builds the dialog tree for each dialogue var branch : Dictionary var tree : Dictionary for branch_id in tree_model: branch = {branch_id: "not_asked"} tree.merge(branch) return tree func load_patient(patient_info: Dictionary): #Loads new patient #Storing patient info id = patient_info["id"] type = patient_info["type"] #Loading Subject resources var file_path: String var config := ConfigFile.new() match type: #Setting right file path depending on subject type "patient": file_path = "Patients/" "its": file_path = "ITS/" "ite": file_path = "ITE/" "entity": file_path = "Entities/" "supervisor": file_path = "Supervisors/" config.load("res://Dialogues/" + file_path + id + "_file.cfg") #Loading Subject file dialogue_resource = load("res://Dialogues/" + file_path + id + ".dialogue") #Loading Dialogue Resource load_emotions(config, "res://Art/Subjects/" + file_path + id + "/" + id + "_") #Loading Subject emotions #Setting up Patient File var patient_name = config.get_value("", "name") var age = config.get_value("", "age") var profession = config.get_value("", "profession") var psychiatric_assessment = config.get_value("", "psychiatric_assessment") file_text = "NAME: " + patient_name + "\nAGE: " + age + "\n\nPROFESSION: " + profession + "\n\nPRE-SCREENING PSYCHIATRIC ASSESSMENT:\n\n" + "[color=orange_red]" + psychiatric_assessment + "[/color]" #Randomizing abnormal status if required var status = config.get_value("", "status") match status: "random": abnormal = randf() < 0.5 #50/50 abnormal/normal print("Abnormal value: " + str(abnormal)) "normal": abnormal = false "abnormal": abnormal = true func load_emotions(config, patient_path): #Loading Patient Initial Face var initial_emotion = config.get_value("", "initial_emotion") var file_path = patient_path + initial_emotion + ".png" image = load(file_path) #Loading Face Emotions var face: Resource var emotion_branch: Dictionary var emotion_list = ["neutral", "peaceful", "praying", "puzzled", "suspicious", "sadsmiling", "crazysmiling", "shockedcrying", "smiling", "aroused", "excited", "laughing", "happy", "elated", "maniac", "ecstatic", "irritated", "angry", "furious", "sad", "depressed", "crying", "surprised", "worried", "scared", "shocked", "panicked", "terrified", "itthatsmiles1", "itthatsmiles2", "itthateats1", "itthateats2", "abnormal", "abnormal1", "abnormal2", "abnormal3", "special"] emotions.clear() #Clearing previous patient emotions for emotion in emotion_list: file_path = patient_path + emotion + ".png" face = load(file_path) if face != null: emotion_branch = {emotion: face} emotions.merge(emotion_branch) #Sorts the patients to determine who can appear on what floor depending on the symptoms unlocked func sort_patients(): var config := ConfigFile.new() var file_path : String var patient_symptoms: Array var symptom_matched : bool var symptom_list: Array for patient_id in Globals.patient_list: #Loads symptoms for each patient patient_symptoms.clear() file_path = "res://Dialogues/Patients/" + patient_id + "_file.cfg" config.load(file_path) symptom_list = config.get_value("", "psychiatric_assessment").split("\n", false) patient_symptoms = symptom_list symptom_list = config.get_value("", "abnormal_symptoms").split("\n", false) patient_symptoms.append_array(symptom_list) print("Patient #" + patient_id + " symptom list: " + str(patient_symptoms)) #Goes through the symptoms_arrays from the last to the first, #If a symptom matches with the patient symptoms, #Add that patient to the floors from that floor to the last one for j in range(len(symptoms_arrays)-1, -1, -1): for symptom in patient_symptoms: if symptoms_arrays[j].has(symptom): symptom_matched = true print("Symptom matched: " + str(symptoms_arrays[j]) + " and " + str(symptom)) break if symptom_matched: for k in range(j, symptoms_arrays.size()): og_patient_list[k].merge({patient_id: j+1}) # Adds the patient to every floor compatible symptom_matched = false break for i in range(len(patient_list)): patient_list[i] = og_patient_list[i] print("Floor " + str(i) + " possible patients: " + str(patient_list[i])) #Weighted random selection from an Array func weighted_random(patients: Dictionary): #Calculating total weight var total_weight : int = 0 for weight in patients.values(): total_weight += weight print("Total weight: " + str(total_weight)) var r = randf() * total_weight print("r :" + str(r)) var weight_sum : int = 0 for patient_id in patients: weight_sum += patients[patient_id] if weight_sum >= r: print("Patient selected: " + patient_id + ", Weight: " + str(patients[patient_id])) return patient_id return null func generate_next_id(patient_type: String): var floor_index = -Globals.floor_count -1 print("Floor Index: " + str(floor_index)) var next_id : String = "" match patient_type: "patient": next_id = weighted_random(patient_list[floor_index]) #Picks a random patient depending on floor, with weighted odds print("Patient selected : " + str(next_id)) "its": next_id = its_list.pick_random() print("ITS selected: " + str(next_id)) "ite": next_id = ite_list.pick_random() print("ITE selected: " + str(next_id)) return next_id func next_patient() -> Dictionary: #Decides next patient ID var next_id: String var next_type: String match Globals.floor_count: -2: if Globals.patient_count == 0: next_id = "its_00" next_type = "its" else: next_type = next_patient_type() next_id = generate_next_id(next_type) -3: if Globals.patient_count == 0: next_id = "it_that_feels_01" next_type = "entity" else: next_type = next_patient_type() next_id = generate_next_id(next_type) -4: if Globals.patient_count == 0: next_id = "ite_04" next_type = "ite" else: next_type = next_patient_type() next_id = generate_next_id(next_type) _: next_type = next_patient_type() next_id = generate_next_id(next_type) print("NEXT SUBJECT CHARACTERISTICS - ID: " + next_id + ", Type: " + next_type) return {"id": next_id, "type": next_type} #Randomizes next patient type (human, it, its) func next_patient_type(): var type_list = [] var next_type: String match Globals.floor_count: -1: type_list.append("patient") -2: type_list.append("patient") -3: for i in range(int(Globals.diagnoses_quota)): if len(its_list) > 0: type_list.append("its") -4: for i in range(int(Globals.diagnoses_quota)): if len(its_list) > 0: type_list.append("its") -5: for i in range(int(Globals.diagnoses_quota)): if len(its_list) > 0: type_list.append("its") if len(ite_list) > 0: type_list.append("ite") _: for i in range(int(Globals.diagnoses_quota)): if len(its_list) > 0: type_list.append("its") if len(ite_list) > 0: type_list.append("ite") for i in range(2*int(Globals.diagnoses_quota)): type_list.append("patient") print("Type List generated: " + str(type_list)) next_type = type_list.pick_random() print("Next subject type picked: " + str(next_type)) return next_type #Erases current subject ID from the corresponding subject list, so it can't be seen twice func update_list(): print("Patient type: " + str(Patient.type)) match type: "patient": patients_seen.append(id) for i in range(len(patient_list)): if len(patient_list[i])>1: patient_list[i].erase(id) for j in range(len(patient_list)): print("Updated Floor " + str(j) + " patient list: " + str(patient_list[j])) "its": its_seen.append(id) its_list.erase(id) print("Updated ITS list: " + str(its_list)) "ite": ite_seen.append(id) ite_list.erase(id) print("Updated ITE list: " + str(ite_list))