158 lines
4.2 KiB
GDScript
158 lines
4.2 KiB
GDScript
extends Node2D
|
|
|
|
var coinsCollectedTotal:int = 0
|
|
var totalCoinsAvailable:int = 0
|
|
|
|
var levels=["res://scenes/game.tscn","res://scenes/level2.tscn","res://scenes/level3.tscn"]
|
|
var timers=[16,10,15]
|
|
var timeAvailable:int =0
|
|
var currentLevel = 0
|
|
var timer = Timer.new()
|
|
|
|
#signals
|
|
signal levelChangeSignal(level)
|
|
signal destroySignal(body)
|
|
signal playerDamagedSignal(health, maxHealth)
|
|
signal playerDeathSignal
|
|
signal gameSaveSignal(level, timeRemaining, playerHealth, enemiesDictionary)
|
|
signal gameLoadSignal(stash)
|
|
signal countDownSignal(timeRemaining)
|
|
signal coinUpdateSignal(remainingCoins)
|
|
|
|
var enemy:CharacterStats
|
|
var player:CharacterStats
|
|
var enemiesDict = {}
|
|
var playerCurrentHealth:int =0
|
|
|
|
var stashData={}
|
|
|
|
|
|
# Called when the node enters the scene tree for the first time.
|
|
func _ready():
|
|
#load in characters
|
|
enemy = load("res://scripts/rscs/slimeStats.tres")
|
|
player = load("res://scripts/rscs/playerStats.tres")
|
|
playerCurrentHealth = player.starting_health
|
|
|
|
add_child(timer)
|
|
timer.wait_time = 1
|
|
timer.one_shot = false
|
|
timer.connect("timeout", secondCounter)
|
|
timer.start()
|
|
|
|
|
|
func secondCounter()->void:
|
|
timeAvailable -=1
|
|
countDownSignal.emit(timeAvailable)
|
|
|
|
if timeAvailable <=0:
|
|
print("YOu LOOSAE Baby!")
|
|
print(levels[currentLevel])
|
|
levelChangeSignal.emit(levels[currentLevel])
|
|
|
|
func reset()->void:
|
|
timeAvailable = timers[currentLevel]
|
|
enemiesDict.clear()
|
|
playerCurrentHealth = player.starting_health
|
|
|
|
# Called every frame. 'delta' is the elapsed time since the previous frame.
|
|
func _process(delta):
|
|
if Input.is_action_just_pressed("save"):
|
|
print("save the game")
|
|
saveGame()
|
|
if Input.is_action_just_pressed("load"):
|
|
print("load the game")
|
|
loadGame()
|
|
|
|
|
|
func _on_trigger_fired(intent, body):
|
|
print("GC knows trigger fired "+intent)
|
|
match intent:
|
|
"destroy":
|
|
print("destroy this thing")
|
|
destroySignal.emit(body)
|
|
"powerup":
|
|
print("power up this thing")
|
|
|
|
func _on_coin_collected(body, coin):
|
|
destroySignal.emit(coin)
|
|
|
|
func totalCoins(value):
|
|
coinUpdateSignal.emit(value)
|
|
if value == 0:
|
|
#you won
|
|
currentLevel +=1
|
|
if currentLevel >= levels.size():
|
|
currentLevel = 0
|
|
levelChangeSignal.emit(levels[currentLevel])
|
|
|
|
func _on_slime_damage(_body, slime):
|
|
print("GC knows slime damage")
|
|
print("Damage "+str(enemiesDict[slime]["damage"]))
|
|
print("Player Health "+str(playerCurrentHealth)+" of "+str(player.starting_health))
|
|
playerCurrentHealth -= enemiesDict[slime]["damage"]
|
|
if playerCurrentHealth <=0:
|
|
print("YOU DED")
|
|
playerDeathSignal.emit()
|
|
else:
|
|
print("Taking damage")
|
|
playerDamagedSignal.emit(playerCurrentHealth, player.starting_health)
|
|
|
|
func deathComplete()->void:
|
|
levelChangeSignal.emit(levels[currentLevel])
|
|
|
|
func totalEnemies(value):
|
|
print("GC knows total enemies "+str(value))
|
|
|
|
func addEnemyToLevel(slime, _stat=null)->void:
|
|
print("GC adding enemy")
|
|
var randDamage:int = randi() % 10
|
|
|
|
var enemyStat = {
|
|
"health": enemy.health,
|
|
"damage": enemy.meleeDamage+randDamage
|
|
}
|
|
if _stat:
|
|
enemyStat = {
|
|
"health":_stat.health,
|
|
"damage":_stat.damage
|
|
}
|
|
enemiesDict[slime]= enemyStat
|
|
|
|
func bulletDamage(area,bullet)->void:
|
|
print("Bullet hitting area")
|
|
if area is Slime:
|
|
print("Hitting a slime")
|
|
print("Slime health "+str(enemiesDict[area]["health"]))
|
|
enemiesDict[area]["health"]-=player.rangeDamage
|
|
if enemiesDict[area]["health"] <=0:
|
|
print("enemy killed")
|
|
removeEnemyFromLevel(area)
|
|
destroySignal.emit(area)
|
|
else:
|
|
print("enemy damaged")
|
|
func removeEnemyFromLevel(slime)->void:
|
|
enemiesDict.erase(slime)
|
|
|
|
func saveGame()->void:
|
|
gameSaveSignal.emit(currentLevel, timeAvailable, playerCurrentHealth, enemiesDict)
|
|
|
|
func loadGame()->void:
|
|
if ResourceLoader.exists("res://scripts/rscs/level"+str(currentLevel)+"_gameSaveStats.tres"):
|
|
var saved_game:SaveObject = load("res://scripts/rscs/level"+str(currentLevel)+"_gameSaveStats.tres")
|
|
enemiesDict.clear()
|
|
#get from loaded game save
|
|
stashData = saved_game.gameSave
|
|
print("loading the game")
|
|
gameLoadSignal.emit(stashData)
|
|
|
|
func stashGame(stash)->void:
|
|
print("stashing game")
|
|
stashData = stash
|
|
var stashObject = SaveObject.new()
|
|
stashObject.gameSave=stashData
|
|
ResourceSaver.save(stashObject, "res://scripts/rscs/level"+str(currentLevel)+"_gameSaveStats.tres")
|
|
|
|
func playerHealth(value)->void:
|
|
playerCurrentHealth = value
|