class_name SceneManager extends Node2D var bullet = preload("res://scenes/bullet.tscn") var grenade = preload("res://scenes/grenade.tscn") var coinScene = preload("res://scenes/coin.tscn") var crateScene = preload("res://scenes/crate.tscn") var enemyScene = preload("res://scenes/slime.tscn") @onready var coins = $"../Coins" @onready var enemies = $"../Enemies" @onready var player = $"../Player" @onready var crates = $"../Crates" @onready var ui = $"../CanvasLayer/ui" var bulletArray = [] var totalAllowedBullets = 7 # Called when the node enters the scene tree for the first time. func _ready(): Gamecontroller.reset() buildLevel() func buildLevel()->void: # hook up coins if coins: updateCoins() if enemies: updateEnemies() #Wire up signals from Gamecontroller Gamecontroller.levelChangeSignal.connect(changeScene) Gamecontroller.destroySignal.connect(destroy) Gamecontroller.gameSaveSignal.connect(saveGameByLevel) Gamecontroller.gameLoadSignal.connect(loadGameByLevel) Gamecontroller.playerDamagedSignal.connect(player.handleDamage) Gamecontroller.playerDamagedSignal.connect(ui.healthUpdate) Gamecontroller.playerDeathSignal.connect(player.handleDeath) Gamecontroller.countDownSignal.connect(ui.timerUpdate) Gamecontroller.coinUpdateSignal.connect(ui.coinUpdate) player.playerDeathCompleteSignal.connect(Gamecontroller.deathComplete) func updateEnemies()->void: var totalEnemies = 0 for obj in enemies.get_children(): if obj is Slime: totalEnemies +=1 #hook up a listener at game controller if not obj.slimeDamageSignal.is_connected(Gamecontroller._on_slime_damage): obj.slimeDamageSignal.connect(Gamecontroller._on_slime_damage) Gamecontroller.addEnemyToLevel(obj) Gamecontroller.totalEnemies(totalEnemies) func updateCoins()->void: var totalCoins = 0 for obj in coins.get_children(): if obj is Coin: if not obj.coinCollectedSignal.is_connected(Gamecontroller._on_coin_collected): #hook up a listener at the game controller obj.coinCollectedSignal.connect(Gamecontroller._on_coin_collected) if not obj.tree_exited.is_connected(updateCoins): obj.tree_exited.connect(updateCoins) totalCoins +=1 #tell GC how many coins total Gamecontroller.totalCoins(totalCoins) # Called every frame. 'delta' is the elapsed time since the previous frame. func _process(delta): pass func bulletFactory()->Bullet: var myBullet:Bullet if bulletArray.size() < totalAllowedBullets: #make a new bullet myBullet = bullet.instantiate() myBullet.bulletDamageSignal.connect(Gamecontroller.bulletDamage) owner.add_child(myBullet) else: myBullet = bulletArray.pop_back() bulletArray.push_front(myBullet) return myBullet func makeBullet(_bulletPosition, _bulletSpeed)->void: print("make a bullet, put it in the world") var myBullet = bulletFactory() myBullet.transform = _bulletPosition myBullet.setSpeed(_bulletSpeed) func makeGrenade(_grenadePosition, _grenadeDirection)->void: print("SM make a grenade") var myGrenade:Grenade = grenade.instantiate() owner.add_child(myGrenade) myGrenade.apply_central_impulse(Vector2(_grenadeDirection, -1)*200) myGrenade.transform = _grenadePosition func changeScene(level)->void: print("Change to level "+level) get_tree().call_deferred("change_scene_to_file", level) func destroy(body)->void: body.queue_free() func loadGameByLevel(stash)->void: print("load the game") #get the player data from the stash var playerData = stash.playerData var coinsData = stash.coinsData var cratesData = stash.cratesData var enemiesData = stash.enemiesData #get rid of any existing coins if coins: for coin in coins.get_children(): #remove the listeners coin.tree_exited.disconnect(updateCoins) coins.remove_child(coin) coin.queue_free() for trans in coinsData: var coinObj:Coin = coinScene.instantiate() coins.add_child(coinObj) coinObj.transform = trans updateCoins() #crates if crates: for crate in crates.get_children(): crates.remove_child(crate) crate.queue_free() for crate in cratesData: var crateObj:RigidBody2D = crateScene.instantiate() crates.add_child(crateObj) crateObj.transform = crate #enemies if enemies: for enemy in enemies.get_children(): enemies.remove_child(enemy) enemy.queue_free() for enemy in enemiesData: var enemyObj:Slime = enemyScene.instantiate() enemies.add_child(enemyObj) enemyObj.transform = enemy.position Gamecontroller.addEnemyToLevel(enemyObj, enemy) player.transform = playerData.position #tell the game controller the players health Gamecontroller.playerHealth(playerData.health) func saveGameByLevel(currentLevel:int, timeAvailable:int, playerCurrentHealth:float, enemiesDict:Dictionary)->void: print("Saving Game") print(playerCurrentHealth) print(player.transform) var playerData={ "health":playerCurrentHealth, "position":player.transform } # coin save info var coinDataArray:Array if coins: for coin in coins.get_children(): print(coin.transform) coinDataArray.push_front(coin.transform) var crateDataArray:Array if crates: for crate in crates.get_children(): crateDataArray.push_front(crate.transform) #enemies var enemyDataArray:Array for enemyKey in enemiesDict: print("ENEMY FOUND") print(enemyKey.transform) print(enemiesDict[enemyKey].health) print(enemiesDict[enemyKey].damage) var enemy={ "position":enemyKey.transform, "health":enemiesDict[enemyKey].health, "damage":enemiesDict[enemyKey].damage } enemyDataArray.push_front(enemy) var stash={ "playerData":playerData, "coinsData": coinDataArray, "cratesData": crateDataArray, "enemiesData":enemyDataArray } Gamecontroller.stashGame(stash)