class_name SceneManager extends Node2D @onready var triggers: Node2D = $"../Triggers" @onready var crates: Node2D = $"../Crates" @onready var level: Node2D = $"../Level" @onready var coins: Node2D = $"../Coins" @onready var enemies: Node2D = $"../Enemies" var bullet = preload("res://scenes/bullet.tscn") var bulletArray:Array[Bullet] = [] var totalAllowedBullets:int = 7 # Called when the node enters the scene tree for the first time. func _ready() -> void: # Reset all the stuff in the level Gamecontroller.reset() buildLevel() # Called every frame. 'delta' is the elapsed time since the previous frame. func _process(delta: float) -> void: pass func buildLevel()->void: print("building level") updateCoins() updateCrates() updateTriggers() updateEnemies() #wire up signals from GameController Gamecontroller.destroySignal.connect(destroy) Gamecontroller.teleportSignal.connect(teleport) Gamecontroller.levelChangeSignal.connect(loadLevel) func updateEnemies()->void: if enemies: var totalEnemies = 0 for obj in enemies.get_children(): if obj is Slime: totalEnemies +=1 if not obj.slimeDamageSignal.is_connected(Gamecontroller._on_slime_damage): print("Hooking up slime") obj.slimeDamageSignal.connect(Gamecontroller._on_slime_damage) Gamecontroller.addEnemyToLevel(obj) if not obj.tree_exited.is_connected(updateEnemies): obj.tree_exited.connect(updateEnemies) Gamecontroller.totalEnemies(totalEnemies) func updateCoins()->void: if coins: var totalCoins = 0 for obj in coins.get_children(): if obj is Coin: totalCoins +=1 print("coin found") if not obj.coinCollectedSignal.is_connected(Gamecontroller._on_coin_collected): obj.coinCollectedSignal.connect(Gamecontroller._on_coin_collected) #Any time a coin is destroyed, let game controller know how many remain if not obj.tree_exited.is_connected(updateCoins): obj.tree_exited.connect(updateCoins) Gamecontroller.totalCoins(totalCoins) func updateTriggers()->void: if triggers: for obj in triggers.get_children(): if obj is Trigger: if not obj.AreaTrigger.is_connected(Gamecontroller._on_trigger): obj.AreaTrigger.connect(Gamecontroller._on_trigger) func updateCrates()->void: #check that there is a crates node if crates: var totalCrates = 0 for obj in crates.get_children(): if obj is Crate: if not obj.tree_exited.is_connected(updateCrates): obj.tree_exited.connect(updateCrates) totalCrates +=1 Gamecontroller.crateUpdate(totalCrates) func destroy(body)->void: if body is Bullet: stashBullet(body) return body.queue_free() func teleport(body)->void: if body is Crate: var viewport_size = get_viewport().get_visible_rect().size var random_x = randf_range(0, viewport_size.x) var random_y = randf_range(0, viewport_size.y) var newPosition = Vector2(random_x,random_y) body.teleport_to(newPosition) func loadLevel(level:String)->void: get_tree().call_deferred("change_scene_to_file", level) func stashBullet(bullet:Bullet)->void: var stashPosition:Vector2 = Vector2(-100,100) bullet.position = stashPosition bullet.setSpeed(0) bullet.set_process(false) func bulletFactory()->Bullet : var myBullet:Bullet #how many bullets have been made? if bulletArray.size() <= totalAllowedBullets: myBullet = bullet.instantiate() if not myBullet.bulletDamageSignal.is_connected(Gamecontroller.bulletDamage): myBullet.bulletDamageSignal.connect(Gamecontroller.bulletDamage) #Gamecontroller.add_child(myBullet) #Gamecontroller is pure code now, so switch to add_sibling add_sibling(myBullet) else: myBullet = bulletArray.pop_back() bulletArray.push_front(myBullet) return myBullet func makeBullet(targetPosition, speed)->void: print("Make a bullet!") print("bullets created: "+str( bulletArray.size() )) var myBullet:Bullet = bulletFactory() myBullet.transform = targetPosition myBullet.setSpeed(speed) myBullet.set_process(true)