@tool extends Node class_name GameManager @export_category("Complete rosters") @export var character_roster: Array[CharacterResource] @export var mask_roster: Array[MaskResource] @export_category("References") @export var character: Character @export var guest_list: List @export var mask_list: List @export_category("Predetermined levels") @export_group("Level 1") @export var lvl1_guest_1: MaskedChara @export var lvl1_guest_2: MaskedChara @export_group("Level 2") @export var lvl2_guest_1: MaskedChara @export var lvl2_guest_2: MaskedChara @export_category("Random levels") @export var max_roster_size: int = 3; @export_tool_button("Create chara roster") var create_roster_action = create_new_roster var current_chara_roster: Array[MaskedChara] enum GameState { READY, GUEST_REVIEW, FINISHED } enum Levels { LVL1, LVL2, RANDOM } var current_game_state = GameState.READY var current_level = Levels.LVL1 var first_guest = true func create_new_roster() -> void: print("Create new roster") current_chara_roster = [] var already_picked_charas: Array[String] = [] for i in range(max_roster_size): # Make sure we don't plan on more people than available if already_picked_charas.size() >= character_roster.size(): break # Pick unique characters for the roster var chara: CharacterResource var is_chara_already_in_roster = true while is_chara_already_in_roster: chara = character_roster.pick_random() for already_there in already_picked_charas: if already_there != chara.name: already_picked_charas.append(chara.name) is_chara_already_in_roster = false # Associate a single mask (for now) to the character var mask: MaskResource = mask_roster.pick_random() var all_masks: Array[MaskResource] = [mask] var masked_chara = MaskedChara.new(chara, all_masks) current_chara_roster.append(masked_chara) print("Added %s to roster" % chara.name) func on_ready_bell_pressed() -> void: if(current_game_state != GameState.READY): return print("ready bell pressed") if current_level == Levels.LVL1: print("prepare_level_one") current_chara_roster = [lvl1_guest_1, lvl1_guest_2] elif current_level == Levels.LVL2: print("prepare_level_two") current_chara_roster = [lvl2_guest_1, lvl2_guest_2] else: create_new_roster() current_game_state = GameState.GUEST_REVIEW first_guest = true review_next_guest() func review_next_guest(): # See previous guest out if not first_guest: character.go_out() var timer = get_tree().create_timer(2) await timer.timeout # Check if we have more guests, if not we go to the ending print(current_chara_roster) var guest: MaskedChara = current_chara_roster.pop_front() if guest == null: current_game_state = GameState.FINISHED compute_ending() return # Process next guest print("Guest is %s" % guest.character.name) character.chara_resource = guest.character var eyes_mask_index = guest.masks.find_custom(func(mask: MaskResource): return mask.region == MaskResource.Region.EYES) var mouth_mask_index = guest.masks.find_custom(func(mask: MaskResource): return mask.region == MaskResource.Region.MOUTH) if eyes_mask_index != -1: character.mask_eyes.mask_resource = guest.masks[eyes_mask_index] if mouth_mask_index != -1: character.mask_mouth.mask_resource = guest.masks[mouth_mask_index] first_guest = false character.come_in() func compute_ending(): print("to ending") # Called when the node enters the scene tree for the first time. func _ready() -> void: character.visible = false # Called every frame. 'delta' is the elapsed time since the previous frame. func _process(delta: float) -> void: pass func _on_ready_bell_input_event(viewport: Node, event: InputEvent, shape_idx: int) -> void: if event is InputEventMouseButton and event.is_pressed(): if current_game_state == GameState.READY: on_ready_bell_pressed() else: # debug review_next_guest()