2024-08-10 17:00:15 +10:00
|
|
|
extends Node3D
|
|
|
|
|
# this is basically the level manager
|
|
|
|
|
|
|
|
|
|
signal broadcast(command : String)
|
2024-08-11 11:05:16 +10:00
|
|
|
signal tick(time : int)
|
2024-08-10 17:00:15 +10:00
|
|
|
|
|
|
|
|
@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
|
2024-08-13 02:32:14 +10:00
|
|
|
@export_multiline var level_name : String = "Level X\nTest Room"
|
2024-08-11 10:23:00 +10:00
|
|
|
|
|
|
|
|
#reset these
|
2024-08-10 22:24:26 +10:00
|
|
|
var tick_timer : float = 0
|
|
|
|
|
var room_started : bool = false
|
|
|
|
|
var current_tick = 0
|
2024-08-11 10:43:02 +10:00
|
|
|
var failed : bool = false
|
2024-08-11 10:53:26 +10:00
|
|
|
var fail_timer : float = 2
|
2024-08-11 22:19:23 +10:00
|
|
|
var door_timer : float = 0
|
2024-08-11 10:23:00 +10:00
|
|
|
|
|
|
|
|
@export_group("Resources")
|
2024-08-10 22:24:26 +10:00
|
|
|
@export var pedestal_off_mat : Material
|
|
|
|
|
@export var pedestal_on_mat : Material
|
2025-05-25 15:14:49 +10:00
|
|
|
@export var pedestal_activated_cols : Array[Material]
|
2024-08-10 17:20:39 +10:00
|
|
|
|
2024-08-10 17:00:15 +10:00
|
|
|
@export_group("Node References")
|
|
|
|
|
@export var gui : Control
|
2024-08-11 10:43:02 +10:00
|
|
|
var pedestals : Array[Pedestal]
|
|
|
|
|
@export var pedstalContainer : Node3D
|
2024-08-10 23:10:36 +10:00
|
|
|
@export var chime_player : AudioStreamPlayer
|
2024-08-14 02:49:09 +10:00
|
|
|
@export var door_player :AudioStreamPlayer
|
2024-08-10 23:10:36 +10:00
|
|
|
@export var world_env : WorldEnvironment
|
2024-08-11 10:23:00 +10:00
|
|
|
@export var player : CharacterBody3D
|
2024-08-11 10:43:02 +10:00
|
|
|
@export var player_spawn : Node3D
|
2024-08-11 22:19:23 +10:00
|
|
|
@export var left_door : Node3D
|
|
|
|
|
@export var right_door : Node3D
|
2024-08-14 02:49:09 +10:00
|
|
|
@export var fail_sound_player : AudioStreamPlayer
|
2024-08-10 17:00:15 +10:00
|
|
|
|
|
|
|
|
# Called when the node enters the scene tree for the first time.
|
|
|
|
|
func _ready():
|
2025-05-25 14:31:14 +10:00
|
|
|
tick.connect(gui.onTick)
|
2024-08-14 00:45:21 +10:00
|
|
|
player.area.area_entered.connect(_player_area_entered)
|
2024-08-11 10:43:02 +10:00
|
|
|
var temp_pedestals = pedstalContainer.get_children()
|
|
|
|
|
for temp in temp_pedestals:
|
|
|
|
|
pedestals.append(temp)
|
2024-08-10 22:24:26 +10:00
|
|
|
for i in pedestals.size():
|
|
|
|
|
pedestals[i].mesh.mesh = pedestals[i].mesh.mesh.duplicate()
|
2024-08-11 21:29:44 +10:00
|
|
|
gui.show_level_title(level_name)
|
2024-08-10 17:00:15 +10:00
|
|
|
|
|
|
|
|
|
|
|
|
|
# Called every frame. 'delta' is the elapsed time since the previous frame.
|
|
|
|
|
func _process(delta):
|
2024-08-11 22:19:23 +10:00
|
|
|
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)
|
|
|
|
|
|
2024-08-14 01:58:28 +10:00
|
|
|
#if Input.is_action_just_pressed("debug_start"):
|
|
|
|
|
#start_room()
|
|
|
|
|
|
2025-05-25 15:14:49 +10:00
|
|
|
#if Input.is_action_just_pressed("interact"):
|
|
|
|
|
#Input.mouse_mode = Input.MOUSE_MODE_CAPTURED
|
2024-08-10 22:24:26 +10:00
|
|
|
|
2024-08-10 23:10:36 +10:00
|
|
|
if Input.is_action_just_pressed("reset"):
|
2024-08-11 12:47:57 +10:00
|
|
|
gui.show_lose_screen("Reset Pressed", 2)
|
2024-08-10 23:10:36 +10:00
|
|
|
fail_room()
|
|
|
|
|
|
|
|
|
|
if room_started and current_tick < level_time+1:
|
2024-08-10 22:24:26 +10:00
|
|
|
tick_timer += delta
|
|
|
|
|
|
2024-08-11 10:43:02 +10:00
|
|
|
if tick_timer > level_tick: #advance tick
|
2024-08-11 10:53:26 +10:00
|
|
|
|
2024-08-10 22:24:26 +10:00
|
|
|
tick_timer = 0
|
|
|
|
|
current_tick += 1
|
2024-08-11 10:53:26 +10:00
|
|
|
if current_tick == 11:
|
2024-08-11 12:47:57 +10:00
|
|
|
gui.show_lose_screen("Time Expired", 2)
|
2024-08-11 11:05:16 +10:00
|
|
|
player.clear_effects()
|
2024-08-11 10:53:26 +10:00
|
|
|
fail_room()
|
|
|
|
|
pass
|
2024-08-10 22:24:26 +10:00
|
|
|
print("Tick: " + str(current_tick))
|
2024-08-11 11:05:16 +10:00
|
|
|
tick.emit(current_tick)
|
2024-08-10 22:24:26 +10:00
|
|
|
for i in pedestals.size():
|
|
|
|
|
if i+1 == current_tick:
|
2024-08-10 22:37:32 +10:00
|
|
|
var activated_pedestal = pedestals[i]
|
2025-05-25 15:14:49 +10:00
|
|
|
#activated_pedestal.mesh.mesh.material = pedestal_on_mat
|
|
|
|
|
activated_pedestal.mesh.mesh.material = pedestal_activated_cols[i]
|
2024-08-10 22:37:32 +10:00
|
|
|
if activated_pedestal.has_command:
|
|
|
|
|
print("broadcasting: " + activated_pedestal.placed_command.command_name)
|
|
|
|
|
broadcast.emit(activated_pedestal.placed_command.command_name)
|
2024-08-13 23:13:16 +10:00
|
|
|
chime_player.volume_db = -10
|
2024-08-10 23:10:36 +10:00
|
|
|
chime_player.pitch_scale = 1
|
|
|
|
|
chime_player.play()
|
|
|
|
|
else:
|
2024-08-13 23:13:16 +10:00
|
|
|
chime_player.volume_db = -20
|
2024-08-10 23:10:36 +10:00
|
|
|
chime_player.pitch_scale = 0.5
|
|
|
|
|
chime_player.play()
|
2024-08-11 10:43:02 +10:00
|
|
|
|
|
|
|
|
if failed:
|
2024-08-11 10:53:26 +10:00
|
|
|
gui.show_lose_screen("", fail_timer)
|
2024-08-11 10:43:02 +10:00
|
|
|
world_env.environment.background_color = Color.DIM_GRAY
|
|
|
|
|
fail_timer -= delta
|
2024-08-11 21:29:44 +10:00
|
|
|
if(Input.is_action_just_pressed("reset") and fail_timer < 1.95):
|
|
|
|
|
fail_timer = 0
|
2024-08-11 10:43:02 +10:00
|
|
|
if fail_timer < 0:
|
2024-08-11 10:53:26 +10:00
|
|
|
fail_timer = 2
|
2024-08-11 10:43:02 +10:00
|
|
|
reset_room()
|
|
|
|
|
else:
|
|
|
|
|
world_env.environment.background_color = Color.WHITE
|
|
|
|
|
|
|
|
|
|
|
2024-08-10 23:10:36 +10:00
|
|
|
|
2024-08-11 12:47:57 +10:00
|
|
|
if (player.global_position.y < -20):
|
|
|
|
|
fail_room()
|
|
|
|
|
gui.show_lose_screen("Fell out of world", 2)
|
|
|
|
|
|
2025-05-25 15:36:34 +10:00
|
|
|
check_player_killzone()
|
2024-08-10 17:00:15 +10:00
|
|
|
|
2024-08-10 21:55:26 +10:00
|
|
|
|
2024-08-10 17:00:15 +10:00
|
|
|
|
|
|
|
|
func start_room():
|
2024-08-10 22:24:26 +10:00
|
|
|
print("START")
|
|
|
|
|
room_started = true
|
|
|
|
|
|
2024-08-10 17:00:15 +10:00
|
|
|
# open door
|
|
|
|
|
# start timers
|
|
|
|
|
# start running commands
|
|
|
|
|
#hide crosshair
|
|
|
|
|
pass
|
|
|
|
|
|
2024-08-10 23:10:36 +10:00
|
|
|
func fail_room():
|
|
|
|
|
print("ROOM FAILED")
|
2024-08-14 02:49:09 +10:00
|
|
|
if not failed:
|
|
|
|
|
fail_sound_player.play(18.0)
|
2024-08-11 10:43:02 +10:00
|
|
|
room_started = false
|
2024-08-10 23:10:36 +10:00
|
|
|
player.process_mode = Node.PROCESS_MODE_DISABLED
|
2024-08-11 10:43:02 +10:00
|
|
|
failed = true
|
2024-08-10 23:10:36 +10:00
|
|
|
# close exit, freeze player?
|
|
|
|
|
pass
|
|
|
|
|
|
2024-08-10 17:00:15 +10:00
|
|
|
func reset_room():
|
2024-08-10 23:10:36 +10:00
|
|
|
print("RESETTING ROOM")
|
2024-08-11 10:43:02 +10:00
|
|
|
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)
|
|
|
|
|
|
2024-08-11 10:53:26 +10:00
|
|
|
gui.hide_lose_screen()
|
2024-08-11 10:23:00 +10:00
|
|
|
|
2024-08-11 10:43:02 +10:00
|
|
|
tick_timer = 0
|
|
|
|
|
room_started = false
|
2024-08-10 23:10:36 +10:00
|
|
|
current_tick = 0
|
2024-08-11 10:43:02 +10:00
|
|
|
failed = false
|
2024-08-11 21:29:44 +10:00
|
|
|
fail_timer = 2
|
2024-08-11 22:19:23 +10:00
|
|
|
door_timer = 0
|
2024-08-11 10:43:02 +10:00
|
|
|
|
|
|
|
|
#reset pedestals
|
2024-08-10 23:10:36 +10:00
|
|
|
for i in pedestals.size():
|
|
|
|
|
var activated_pedestal = pedestals[i]
|
|
|
|
|
activated_pedestal.mesh.mesh.material = pedestal_off_mat
|
2024-08-10 17:00:15 +10:00
|
|
|
# run if timer expires, resets puzzle
|
2024-08-10 22:24:26 +10:00
|
|
|
# replace door
|
|
|
|
|
# put player back in start room
|
|
|
|
|
# reset timers
|
2024-08-11 21:29:44 +10:00
|
|
|
|
|
|
|
|
player.clear_effects()
|
|
|
|
|
gui.show_level_title(level_name)
|
|
|
|
|
|
2024-08-10 17:00:15 +10:00
|
|
|
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
|
2024-08-10 17:12:20 +10:00
|
|
|
|
|
|
|
|
|
|
|
|
|
func _on_player_object_clicked(object):
|
2024-08-11 21:36:38 +10:00
|
|
|
if(object.name == "StartButton"):
|
2024-08-14 02:49:09 +10:00
|
|
|
if not room_started:
|
|
|
|
|
door_player.play()
|
|
|
|
|
start_room()
|
2024-08-14 02:14:09 +10:00
|
|
|
if(object.name == "MenuButton"):
|
|
|
|
|
get_tree().change_scene_to_file(GameManager.menu_scene_path)
|
2024-08-13 01:24:47 +10:00
|
|
|
|
2024-08-14 00:45:21 +10:00
|
|
|
func _player_area_entered(area : Area3D):
|
|
|
|
|
#print(area.name)
|
|
|
|
|
if "kill" in area:
|
2024-08-14 01:58:28 +10:00
|
|
|
if not player.collider.disabled:
|
|
|
|
|
fail_room()
|
|
|
|
|
gui.show_lose_screen("Touched a reset block", 2)
|
2025-05-25 15:14:49 +10:00
|
|
|
|
2025-05-25 15:36:34 +10:00
|
|
|
func check_player_killzone():
|
|
|
|
|
var hitbox : Area3D = player.area
|
|
|
|
|
if(hitbox.get_overlapping_areas().size() > 0):
|
|
|
|
|
for area in hitbox.get_overlapping_areas():
|
|
|
|
|
if "kill" in area:
|
|
|
|
|
if not player.collider.disabled:
|
|
|
|
|
if(room_started):
|
|
|
|
|
fail_room()
|
|
|
|
|
gui.show_lose_screen("Touched a reset block", 2)
|
|
|
|
|
|
2025-05-25 15:14:49 +10:00
|
|
|
func pause():
|
|
|
|
|
Input.mouse_mode = Input.MOUSE_MODE_VISIBLE
|
|
|
|
|
gui.open_pause()
|
|
|
|
|
process_mode = Node.PROCESS_MODE_DISABLED
|