This is the code of the "Level" tile:
extends Area2D
var nodetype = "Level"
var Hitbox
var Levelpreenter = false
var Player
onready var Overworldx = self.global_position.x
onready var Overworldy = self.global_position.y
export var Level = "res://Levels/LevelT01.tscn"
export var Levellabel = "NAME OF LEVEL"
export var Spawnnode = "Spawner01"
signal enterlevel
func _ready():
self.connect("body_entered", self, "_on_body_entered")
self.connect("body_exited", self, "_on_body_exited")
self.connect("enterlevel", gbl.root.get_node("Main"), "_enterlevel", [Level,Spawnnode,Overworldx,Overworldy])
func _on_body_entered(body):
print(Levellabel)
Levelpreenter = true
Player = body
func _on_body_exited(body):
Levelpreenter = false
Player = null
func _process(delta):
if Levelpreenter == true and Input.is_action_just_pressed('ui_accept'):
Levelpreenter = false
Player.stopinput = true
gbl.MainCamera._unlockcamera()
emit_signal("enterlevel")
This is the code of the Door node used for spawning on that level:
extends Node2D
var Hitbox
var collisiontype = "Door"
var playerteleported = false
var playerorig
var playerindexorig
var playerorigtemp
var entertimer = Timer.new()
var teletimer = Timer.new()
var refreshtimer = Timer.new()
var stopgap = false
signal teleportready
export var Destination = "Door1-2"
export var Level = "LEAVE EMPTY FOR CURRENT LEVEL"
export (int, "Open", "Locked", "Unopenable") var Locked
var DestinationDoor
func _ready():
$DoorAnims.play("Closed")
entertimer.set_name("entertimer")
entertimer.one_shot = true
entertimer.wait_time = 1
add_child(entertimer)
entertimer.connect("timeout", self, "_enteranims",[3])
teletimer.set_name("teletimer")
teletimer.one_shot = true
teletimer.wait_time = 1
add_child(teletimer)
teletimer.connect("timeout", self, "_teleport", [1])
refreshtimer.set_name("refreshtimer")
refreshtimer.one_shot = true
refreshtimer.wait_time = 1
add_child(refreshtimer)
refreshtimer.connect("timeout", self, "_teleport", [3])
Hitbox = self.get_node("Hitbox")
Hitbox.connect("body_entered", self, "_on_body_entered")
Hitbox.connect("body_exited", self, "_on_body_exited")
self.connect("teleportready", gbl.root.get_node("Main"), "_changelevel", [Level,Destination])
if Level == "":
DestinationDoor = get_tree().get_current_scene().get_node("Level").find_node(Destination)
if Level != "":
DestinationDoor = self
func _on_body_entered(body):
if body.get("collisiontype"):
if body.collisiontype == "Player":
print("Press Up to enter")
self.playerorig = body
func _on_body_exited(body):
self.playerorig = null
func _physics_process(delta):
if playerorig != null:
if Input.is_action_just_pressed('ui_up') and playerorig.is_on_floor() and !stopgap and DestinationDoor.stopgap == false and Locked != 2:####1 = needs key 2 = cannot be opened
self.stopgap = true
DestinationDoor.stopgap = true
playerorig.stopinput = true
playerorig.ishurt = false
playerorig.velocity.x = 0
playerorig.global_position.x = self.global_position.x
#playerorig._animationmode(true)
playerorig.get_node("Hitbox").set_deferred("disabled", true)
playerindexorig = playerorig.get_z_index()
get_tree().set_pause(true)
_enteranims(1)
if $DoorAnims.get_animation() == "Opening":
if $DoorAnims.get_frame() == 9:
_enteranims(2)
entertimer.start()
if $DoorAnims.get_animation() == "Closing":
if !playerteleported:
teletimer.start()
self.playerteleported = true
DestinationDoor.playerteleported = true
if $DoorAnims.get_frame() == 9:
_enteranims(4)
func _enteranims(frame):
if frame == 1:
$DoorAnims.play("Opening")
$SFX/Opening.play()
playerorig.get_node("PlayerAnimations").play("idleBack01")
if frame == 2:
$DoorAnims.play("Open")
var playerindex = self.get_z_index() - 0.5
playerorig.set_z_index(playerindex)
playerorig.get_node("PlayerAnimations").play("walkBack01")
if frame == 3:
$DoorAnims.play("Closing")
$SFX/Closing.play()
if frame == 4:
$DoorAnims.play("Closed")
$SFX/Closed.play()
func _teleport(phase):
if phase == 1:
if Level != "":
emit_signal("teleportready")
if Level == "":
#var DestDoor = get_tree().get_current_scene().find_node(Destination)
var teleportx = DestinationDoor.global_position.x
var teleporty = DestinationDoor.global_position.y
playerorig.global_position = Vector2(teleportx,teleporty)
playerorigtemp = playerorig
playerorigtemp.set_z_index(playerindexorig)
if playerorigtemp.direction == true:
playerorigtemp.get_node("PlayerAnimations").play("idleL")
if playerorigtemp.direction == false:
playerorigtemp.get_node("PlayerAnimations").play("idle")
DestinationDoor.get_node("DoorAnims").play("Closing")
refreshtimer.start()
if phase == 2:
playerorigtemp.stopinput = true
playerorigtemp.ishurt = false
playerorigtemp.velocity.x = 0
playerorigtemp.global_position.x = self.global_position.x
self.playerteleported = true
DestinationDoor = self
self.get_node("DoorAnims").play("Closing")
refreshtimer.start()
if phase == 3:
get_tree().set_pause(false)
#playerorigtemp._animationmode(false)
DestinationDoor.playerteleported = false
self.playerteleported = false
playerorigtemp.stopinput = false
playerorigtemp.get_node("Hitbox").set_deferred("disabled", false)
playerorigtemp = null
self.stopgap = false
DestinationDoor.stopgap = false
And also the code for the level spawning routine i have for the level:
extends "CUSTOMSCRIPTFORLEVELLOADING
func _backgroundmusic():
var leveltheme = load(gbl.Musicdir + levelthemefile)
gbl._playMusic(leveltheme,true)
func _spawnplayer(Player, Playerhealth, spawnvalue1):
#spawnvalue1 = ""
Player.hitpoints = Playerhealth
Player.get_node("PlayerAnimations").play("idle")
if spawnvalue1 != "":
self.find_node(spawnvalue1).get_node("DoorAnims").play("Open")
self.find_node(spawnvalue1).playerorigtemp = Player
self.find_node(spawnvalue1)._teleport(2)
Player.position.x = self.find_node(spawnvalue1).position.x
Player.position.y = self.find_node(spawnvalue1).position.y
if spawnvalue1 == "":
Player.position.x = self.get_node("Spawner").position.x
Player.position.y = self.get_node("Spawner").position.y
get_tree().set_pause(false)
Player.set_z_index(2)
add_child(Player)