151 lines
4.2 KiB
GDScript
151 lines
4.2 KiB
GDScript
@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
|
|
var current_guest: MaskedChara
|
|
var selected_seat: Seat
|
|
|
|
@onready var camera_2d: Camera2D = $"../Camera2D"
|
|
|
|
|
|
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 face_mask = mask if mask.region == MaskResource.Region.EYES else null
|
|
var mouth_mask = mask if mask.region == MaskResource.Region.MOUTH else null
|
|
var masked_chara = MaskedChara.new(chara, face_mask, mouth_mask)
|
|
|
|
current_chara_roster.append(masked_chara)
|
|
print("Added %s to roster" % chara.name)
|
|
|
|
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
|
|
current_guest = current_chara_roster.pop_front()
|
|
if current_guest == null:
|
|
current_game_state = GameState.FINISHED
|
|
compute_ending()
|
|
return
|
|
|
|
# Process next guest
|
|
print("Guest is %s" % current_guest.character.name)
|
|
character.chara_resource = current_guest.character
|
|
character.mask_eyes.mask_resource = current_guest.face_mask
|
|
character.mask_mouth.mask_resource = current_guest.mouth_mask
|
|
|
|
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()
|
|
|
|
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 on_seat_clicked(seat: Seat) -> void:
|
|
if current_guest == null and not current_game_state == GameState.GUEST_REVIEW:
|
|
return
|
|
|
|
selected_seat = seat
|
|
var camera_tween = get_tree().create_tween()
|
|
camera_tween.set_ease(Tween.EASE_IN_OUT)
|
|
camera_tween.set_trans(Tween.TRANS_CUBIC)
|
|
camera_tween.tween_property(camera_2d, "position", Vector2.ZERO, 1.0)
|
|
camera_tween.tween_callback(camera_tween_cb)
|
|
|
|
func camera_tween_cb() -> void:
|
|
selected_seat.set_guest(current_guest)
|
|
review_next_guest()
|