193 lines
5.6 KiB
GDScript
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)
|