ChronoChamber/Scripts/ChronoManager.gd
2025-05-25 14:02:49 +10:00

191 lines
4.9 KiB
GDScript

extends Node3D
# this is basically the level manager
signal broadcast(command : String)
signal tick(time : int)
@export_group("Variables")
@export var level_tick : float = 1 # how often to run a command
@export var level_time : float = 10 # the amoutn of time allowed for the level
@export_multiline var level_name : String = "Level X\nTest Room"
#reset these
var tick_timer : float = 0
var room_started : bool = false
var current_tick = 0
var failed : bool = false
var fail_timer : float = 2
var door_timer : float = 0
@export_group("Resources")
@export var pedestal_off_mat : Material
@export var pedestal_on_mat : Material
@export_group("Node References")
@export var gui : Control
var pedestals : Array[Pedestal]
@export var pedstalContainer : Node3D
@export var chime_player : AudioStreamPlayer
@export var door_player :AudioStreamPlayer
@export var world_env : WorldEnvironment
@export var player : CharacterBody3D
@export var player_spawn : Node3D
@export var left_door : Node3D
@export var right_door : Node3D
@export var fail_sound_player : AudioStreamPlayer
# Called when the node enters the scene tree for the first time.
func _ready():
player.area.area_entered.connect(_player_area_entered)
var temp_pedestals = pedstalContainer.get_children()
for temp in temp_pedestals:
pedestals.append(temp)
for i in pedestals.size():
pedestals[i].mesh.mesh = pedestals[i].mesh.mesh.duplicate()
gui.show_level_title(level_name)
# Called every frame. 'delta' is the elapsed time since the previous frame.
func _process(delta):
if(room_started):
door_timer -= delta
#-1.5 open, -0.5 closed
left_door.position.x = -0.5 + clampf(door_timer*4, -0.995,0)
right_door.position.x = 0.5 + clampf(-door_timer*4, 0,0.995)
#if Input.is_action_just_pressed("debug_start"):
#start_room()
if Input.is_action_just_pressed("interact"):
Input.mouse_mode = Input.MOUSE_MODE_CAPTURED
if Input.is_action_just_pressed("reset"):
gui.show_lose_screen("Reset Pressed", 2)
fail_room()
if room_started and current_tick < level_time+1:
tick_timer += delta
if tick_timer > level_tick: #advance tick
tick_timer = 0
current_tick += 1
if current_tick == 11:
gui.show_lose_screen("Time Expired", 2)
player.clear_effects()
fail_room()
pass
print("Tick: " + str(current_tick))
tick.emit(current_tick)
for i in pedestals.size():
if i+1 == current_tick:
var activated_pedestal = pedestals[i]
activated_pedestal.mesh.mesh.material = pedestal_on_mat
if activated_pedestal.has_command:
print("broadcasting: " + activated_pedestal.placed_command.command_name)
broadcast.emit(activated_pedestal.placed_command.command_name)
chime_player.volume_db = -10
chime_player.pitch_scale = 1
chime_player.play()
else:
chime_player.volume_db = -20
chime_player.pitch_scale = 0.5
chime_player.play()
if failed:
gui.show_lose_screen("", fail_timer)
world_env.environment.background_color = Color.DIM_GRAY
fail_timer -= delta
if(Input.is_action_just_pressed("reset") and fail_timer < 1.95):
fail_timer = 0
if fail_timer < 0:
fail_timer = 2
reset_room()
else:
world_env.environment.background_color = Color.WHITE
if (player.global_position.y < -20):
fail_room()
gui.show_lose_screen("Fell out of world", 2)
func start_room():
print("START")
room_started = true
# open door
# start timers
# start running commands
#hide crosshair
pass
func fail_room():
print("ROOM FAILED")
if not failed:
fail_sound_player.play(18.0)
room_started = false
player.process_mode = Node.PROCESS_MODE_DISABLED
failed = true
# close exit, freeze player?
pass
func reset_room():
print("RESETTING ROOM")
player.global_position = player_spawn.global_position
player.process_mode = Node.PROCESS_MODE_INHERIT
player.rotation_degrees = Vector3(0,0,0)
player.camera.rotation_degrees = Vector3(0,0,0)
gui.hide_lose_screen()
tick_timer = 0
room_started = false
current_tick = 0
failed = false
fail_timer = 2
door_timer = 0
#reset pedestals
for i in pedestals.size():
var activated_pedestal = pedestals[i]
activated_pedestal.mesh.mesh.material = pedestal_off_mat
# run if timer expires, resets puzzle
# replace door
# put player back in start room
# reset timers
player.clear_effects()
gui.show_level_title(level_name)
pass
func finish_room():
# called when player reaches exit
pass
func open_termimal():
gui.terminal_panel.visible = true
Input.mouse_mode = Input.MOUSE_MODE_VISIBLE
#display terminal ui
pass
func _on_player_object_clicked(object):
if(object.name == "StartButton"):
if not room_started:
door_player.play()
start_room()
if(object.name == "MenuButton"):
get_tree().change_scene_to_file(GameManager.menu_scene_path)
func _player_area_entered(area : Area3D):
#print(area.name)
if "kill" in area:
if not player.collider.disabled:
fail_room()
gui.show_lose_screen("Touched a reset block", 2)