save game, player damage, player death, enemy damage, enemy death

This commit is contained in:
OddlyTimbot committed 2025-09-22 21:07:24 -04:00
1 parent 68b998652c
commit a5fa34bd4a
19 files changed
+422 -26

No files matched your search

+7
View File
@@ -21,3 +21,10 @@ func _on_body_entered(body: Node2D) -> void:
if body.is_in_group("shootables"):
print("This is shootable")
bulletDamageSignal.emit(body, self)
func _on_area_entered(area: Area2D) -> void:
print("Bullet hitting")
if area.is_in_group("shootables"):
print("This is shootable")
bulletDamageSignal.emit(area, self)
+82 -8
View File
@@ -1,6 +1,7 @@
extends Node2D
signal playerDamage
signal playerDamageSignal(health, maxhealth)
signal playerDeathSignal
signal destroySignal(body)
signal levelChangeSignal(level)
@@ -16,6 +17,11 @@ var enemy:CharacterStats
var player:CharacterStats
var playerCurrentHealth:int
var enemiesDict = {}
var saveObject = {}
var loadIntent = false
# Called when the node enters the scene tree for the first time.
func _ready() -> void:
enemy = load("res://scripts/rscs/slimeStats.tres")
@@ -29,7 +35,20 @@ func _ready() -> void:
timer.start()
func reset():
enemiesDict.clear()
timeAvailable = timers[currentLevel]
playerCurrentHealth = player.max_health
if loadIntent:
var saved_game:SavedGame = load("res://scripts/rscs/gameSaveStats.tres")
saveObject = saved_game.gameData
playerCurrentHealth = saveObject["PlayerHealth"]
timeAvailable = saveObject["TimeAvailable"]
loadIntent = false
return saveObject
return{}
func secondCounter():
timeAvailable -=1
@@ -38,9 +57,12 @@ func secondCounter():
print("You lose")
levelChangeSignal.emit(levels[currentLevel])
# Called every frame. 'delta' is the elapsed time since the previous frame.
func _process(delta: float) -> void:
pass
if Input.is_action_just_pressed("save"):
saveGame()
if Input.is_action_just_pressed("load"):
loadGame()
func _on_trigger(effect: Variant, body: Variant) -> void:
@@ -49,14 +71,25 @@ func _on_trigger(effect: Variant, body: Variant) -> void:
"player_hurt":
if body is Player:
print("hurt the player")
playerDamage.emit()
#playerDamage.emit()
#if not body is Player:
# body.queue_free()
func bulletDamage(body, bullet):
print("GC know about bullet hit")
body.queue_free()
if body is Slime:
#give damage to this individual enemy
enemiesDict[body]["health"] -= player.rangeDamage
if enemiesDict[body]["health"] <=0:
print("enemy is dead")
removeEnemyFromLevel(body)
destroySignal.emit(body)
else:
print("enemy is damaged")
body.handle_damage()
func removeEnemyFromLevel(body)->void:
enemiesDict.erase(body)
func coinCollected(body, coin):
print("GC knows coin collected")
destroySignal.emit(coin)
@@ -71,9 +104,50 @@ func totalCoinCount(count):
func playerAttacked(body, slime):
print("GC knows slime attack")
print("Damge : "+str(enemy.meleeDamage) )
print("Damge : "+str(enemiesDict[slime]["damage"]) )
print("Player health : "+str(playerCurrentHealth))
playerCurrentHealth -= enemy.meleeDamage
playerCurrentHealth -= enemiesDict[slime]["damage"]
if playerCurrentHealth <=0:
print("YOU DEAD")
playerDeathSignal.emit()
else:
print("taking damage")
playerDamageSignal.emit(playerCurrentHealth, player.max_health)
func deathComplete()->void:
levelChangeSignal.emit(levels[currentLevel])
func addEnemyToLevel(slime)->void:
var randHealth:int = randi() % 20
var randDamage:int = randi() % 10
var enemyStat = {
"health": enemy.health + randHealth,
"damage": enemy.meleeDamage + randDamage
}
enemiesDict[slime] = enemyStat
func saveGame()->void:
saveObject["enemies"]={}
var index = 0
#create an object with all critical game data
print("Game Level "+str(currentLevel) )
print("Time Remaining "+str(timeAvailable))
print("Player Health "+str(playerCurrentHealth))
# bad guy stuff....
for key in enemiesDict:
var tempObj = {}
tempObj["health"]=enemiesDict[key]["health"]
tempObj["damage"]=enemiesDict[key]["damage"]
tempObj["global_position"] = key.global_position
saveObject["enemies"]["slime"+str(index)]=tempObj
index +=1
saveObject["GameLevel"] = currentLevel
saveObject["TimeAvailable"] = timeAvailable
saveObject["PlayerHealth"] = playerCurrentHealth
var saved_game:SavedGame = SavedGame.new()
saved_game.gameData = saveObject
ResourceSaver.save(saved_game, "res://scripts/rscs/gameSaveStats.tres")
func loadGame()->void:
loadIntent = true
levelChangeSignal.emit(levels[saveObject["GameLevel"]])
+23 -3
View File
@@ -15,21 +15,33 @@ var upJump:bool = false
var direction
enum FaceDirection{LEFT, RIGHT}
var facing:FaceDirection = FaceDirection.RIGHT
enum State{IDLE, RUN,JUMP,FALLING}
enum State{IDLE, RUN,JUMP,FALLING, HURT, DEATH}
var current_state:State = State.IDLE
var pushTarget
var pushEnabled := false
signal playerDeathCompleteSignal
func _physics_process(delta: float) -> void:
# Add the gravity.
handle_input()
if current_state != State.HURT and current_state != State.DEATH:
handle_input()
handle_movement(delta)
handle_states()
handle_animation()
move_and_slide()
handle_collisions()
func handle_damage(health, maxhealth)->void:
print("player takes damage")
current_state = State.HURT
func handle_death()->void:
print("player is dead")
current_state = State.DEATH
func handle_states() -> void:
match current_state:
State.IDLE when velocity.x !=0:
@@ -60,6 +72,10 @@ func handle_animation() -> void:
State.JUMP:
if upJump:
player_graphic.play("jump")
State.HURT:
player_graphic.play("hurt")
State.DEATH:
player_graphic.play("death")
func handle_movement(delta:float) -> void:
if direction == 0:
@@ -131,3 +147,7 @@ func _on_animation_finished() -> void:
match current_state:
State.JUMP:
upJump = false
State.HURT:
current_state = State.IDLE
State.DEATH:
playerDeathCompleteSignal.emit()
+23
View File
@@ -0,0 +1,23 @@
[gd_resource type="Resource" script_class="SavedGame" load_steps=2 format=3 uid="uid://cib08qg83a6o6"]
[ext_resource type="Script" uid="uid://c3kd5uh5y8ml1" path="res://scripts/rscs/savedgame.gd" id="1_v2d26"]
[resource]
script = ExtResource("1_v2d26")
gameData = {
"GameLevel": 0,
"PlayerHealth": 100,
"TimeAvailable": 7,
"enemies": {
"slime0": {
"damage": 33,
"global_position": Vector2(489.403, 343),
"health": 66
},
"slime1": {
"damage": 25,
"global_position": Vector2(626.901, 280),
"health": 61
}
}
}
+1 -1
View File
@@ -8,5 +8,5 @@ health = 100
max_health = 100
starting_health = 100
meleeDamage = 10
rangeDamage = 0
rangeDamage = 30
metadata/_custom_type_script = "uid://r408skwtvisy"
+3
View File
@@ -0,0 +1,3 @@
class_name SavedGame extends Resource
@export var gameData:Dictionary
+1
View File
@@ -0,0 +1 @@
uid://c3kd5uh5y8ml1
+3 -3
View File
@@ -4,9 +4,9 @@
[resource]
script = ExtResource("1_ppipo")
health = 100
max_health = 100
starting_health = 100
health = 50
max_health = 50
starting_health = 50
meleeDamage = 25
rangeDamage = 0
metadata/_custom_type_script = "uid://r408skwtvisy"
+32 -1
View File
@@ -2,15 +2,21 @@ class_name SceneManager extends Node2D
var bulletArray =[]
var totalAllowedBullets = 7
var bullet = preload("res://scenes/bullet.tscn")
var slime=preload("res://scenes/slime.tscn")
@onready var triggers: Node2D = $"../triggers"
@onready var coins: Node2D = $"../coins"
@onready var enemies: Node2D = $"../enemies"
@onready var player: Player = $"../Player"
# Called when the node enters the scene tree for the first time.
func _ready() -> void:
Gamecontroller.reset()
var loadObject = Gamecontroller.reset()
print("LOAD OBJECT:::::")
print(loadObject)
loadSceneInfo(loadObject)
if triggers:
for obj in triggers.get_children():
@@ -24,12 +30,18 @@ func _ready() -> void:
Gamecontroller.destroySignal.connect(destroy)
Gamecontroller.levelChangeSignal.connect(changeScene)
Gamecontroller.playerDamageSignal.connect(player.handle_damage)
Gamecontroller.playerDeathSignal.connect(player.handle_death)
player.playerDeathCompleteSignal.connect(Gamecontroller.deathComplete)
func updateEnemies():
for obj in enemies.get_children():
if obj is Slime:
if not obj.playerDamageSignal.is_connected(Gamecontroller.playerAttacked):
obj.playerDamageSignal.connect(Gamecontroller.playerAttacked)
Gamecontroller.addEnemyToLevel(obj)
func updateCoins():
@@ -72,3 +84,22 @@ func destroy(body):
body.queue_free()
func changeScene(level):
get_tree().call_deferred("change_scene_to_file", level)
func loadSceneInfo(loadObject)->void:
print("make the scene")
if loadObject.size()<1:
print("bailing out")
return
#remove current bad guys
if enemies:
for obj in enemies.get_children():
if obj is Slime:
obj.queue_free()
#build and place save game badguys
var enemiesList = loadObject["enemies"]
for key in enemiesList:
print(enemiesList[key])
# create a slime
var badguy = slime.instantiate()
enemies.add_child(badguy)
badguy.global_position = enemiesList[key]["global_position"]
+21 -3
View File
@@ -10,11 +10,23 @@ var direction = 1
signal playerDamageSignal(body, slime)
enum State{IDLE, HURT, DEATH}
var currentState = State.IDLE
# Called when the node enters the scene tree for the first time.
func _ready() -> void:
pass # Replace with function body.
func updateAnimation()->void:
match currentState:
State.IDLE:
slime_graphic.play("idle")
State.HURT:
slime_graphic.play("hurt")
func handle_damage()->void:
currentState = State.HURT
# Called every frame. 'delta' is the elapsed time since the previous frame.
func _process(delta: float) -> void:
if not right_down_cast.is_colliding():
@@ -26,9 +38,15 @@ func _process(delta: float) -> void:
slime_graphic.flip_h = false
position.x += direction * speed * delta
updateAnimation()
func _on_body_entered(body: Node2D) -> void:
if body is Player:
print("Slime attack!")
playerDamageSignal.emit(body, self)
func _on_slime_graphic_animation_finished() -> void:
match currentState:
State.HURT:
currentState = State.IDLE