SeptemberGame/scripts/scene_manager.gd

193 lines
5.6 KiB
GDScript

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)