mirror of
https://github.com/JHDev2006/Super-Mario-Bros.-Remastered-Public.git
synced 2025-10-22 07:28:14 +00:00
131 lines
3.7 KiB
GDScript
131 lines
3.7 KiB
GDScript
class_name Door
|
|
extends Node2D
|
|
|
|
@export_range(0, 99) var door_id := 0
|
|
|
|
@export_enum("0", "1", "2", "3", "4") var sublevel_id := 0
|
|
|
|
@export var locked := false:
|
|
set(value):
|
|
locked = value
|
|
pass
|
|
@export var start_locked := false
|
|
|
|
signal updated
|
|
|
|
static var exiting_door_id := -1
|
|
|
|
var can_enter := true
|
|
|
|
static var door_found := false
|
|
|
|
static var unlocked_doors := []
|
|
|
|
static var same_scene_exiting_door: Door = null
|
|
|
|
func _ready() -> void:
|
|
if start_locked:
|
|
locked = true
|
|
await get_tree().physics_frame
|
|
if locked:
|
|
check_if_unlocked(false)
|
|
if exiting_door_id != -1:
|
|
run_door_check()
|
|
|
|
func _physics_process(_delta: float) -> void:
|
|
for i in $PlayerDetection.get_overlapping_areas():
|
|
if i.owner is Player and can_enter:
|
|
if Global.player_action_just_pressed("move_up", i.owner.player_id) and i.owner.is_on_floor():
|
|
if locked:
|
|
if KeyItem.total_collected > 0:
|
|
unlock_door(i.owner)
|
|
else:
|
|
AudioManager.play_sfx("door_locked", global_position)
|
|
$Sprite.play("Locked")
|
|
$AnimationPlayer.play("Locked")
|
|
else:
|
|
player_enter(i.owner)
|
|
|
|
func check_if_unlocked(do_animation := true) -> void:
|
|
if locked:
|
|
print(unlocked_doors)
|
|
if unlocked_doors.has(door_id):
|
|
locked = false
|
|
$Sprite.play("Idle")
|
|
if do_animation:
|
|
$AnimationPlayer.play("Unlock")
|
|
|
|
func run_door_check() -> void:
|
|
if same_scene_exiting_door != null:
|
|
if same_scene_exiting_door != self and exiting_door_id == door_id:
|
|
door_found = true
|
|
get_tree().call_group("CameraLimits", "return_camera_to_normal")
|
|
for i in get_tree().get_nodes_in_group("Players"):
|
|
player_exit(i)
|
|
return
|
|
else:
|
|
if exiting_door_id == door_id:
|
|
door_found = true
|
|
for i in get_tree().get_nodes_in_group("Players"):
|
|
player_exit(i)
|
|
return
|
|
await get_tree().physics_frame
|
|
if door_found == false:
|
|
for i in get_tree().get_nodes_in_group("Players"):
|
|
player_exit(i)
|
|
|
|
func unlock_door(player: Player) -> void:
|
|
AudioManager.play_sfx("door_unlock", global_position)
|
|
Global.p_switch_timer_paused = true
|
|
KeyItem.total_collected -= 1
|
|
freeze_player(player)
|
|
$Sprite.play("Idle")
|
|
unlocked_doors.append(door_id)
|
|
get_tree().call_group("Doors", "check_if_unlocked", true)
|
|
$AnimationPlayer.play("Unlock")
|
|
await get_tree().create_timer(0.5, false).timeout
|
|
player_enter(player)
|
|
|
|
func player_exit(player: Player) -> void:
|
|
exiting_door_id = -1
|
|
can_enter = false
|
|
LevelEditor.play_door_transition = false
|
|
if same_scene_exiting_door != null: same_scene_exiting_door.get_node("Sprite").play("Idle")
|
|
same_scene_exiting_door = null
|
|
player.global_position = global_position
|
|
player.recenter_camera()
|
|
$Sprite.play("Close")
|
|
await get_tree().create_timer(0.2, false).timeout
|
|
$Sprite.play("Close")
|
|
player.state_machine.transition_to("Normal")
|
|
AudioManager.play_sfx("door_close", global_position)
|
|
can_enter = true
|
|
Global.p_switch_timer_paused = false
|
|
|
|
func player_enter(player: Player) -> void:
|
|
Global.p_switch_timer_paused = true
|
|
can_enter = false
|
|
door_found = false
|
|
exiting_door_id = door_id
|
|
freeze_player(player)
|
|
$Sprite.play("Open")
|
|
LevelEditor.play_door_transition = true
|
|
AudioManager.play_sfx("door_open", global_position)
|
|
await get_tree().create_timer(0.5, false).timeout
|
|
if Global.current_level.sublevel_id == sublevel_id:
|
|
Global.do_fake_transition()
|
|
if Global.fade_transition:
|
|
await get_tree().create_timer(0.25, false).timeout
|
|
same_scene_exiting_door = self
|
|
for i in get_tree().get_nodes_in_group("Doors"):
|
|
i.run_door_check()
|
|
else:
|
|
same_scene_exiting_door = null
|
|
Global.transition_to_scene(NewLevelBuilder.sub_levels[sublevel_id])
|
|
can_enter = true
|
|
|
|
func freeze_player(player: Player) -> void:
|
|
player.state_machine.transition_to("Freeze")
|
|
player.sprite.play("Idle")
|
|
player.velocity = Vector2.ZERO
|