multi levels, closed loop for coins, custom resources for character stats, enemy attacks, player attacks, started enemy movement

This commit is contained in:
RudyIm committed 2025-11-03 20:56:14 -05:00
1 parent 8d07c7630f
commit b40f2baaa7
17 files changed
+981 -52

No files matched your search

+6
View File
@@ -3,6 +3,8 @@ class_name Bullet extends Area2D
var speed:float = 700
@onready var bullet_graphic: Sprite2D = $BulletGraphic
signal bulletDamageSignal(area, bullet)
# Called when the node enters the scene tree for the first time.
func _ready() -> void:
pass # Replace with function body.
@@ -16,3 +18,7 @@ func setSpeed(value)->void:
speed = value
if speed<0:
bullet_graphic.flip_h = true
func _on_area_entered(area: Area2D) -> void:
bulletDamageSignal.emit(area, self)
+3
View File
@@ -16,3 +16,6 @@ func _on_body_entered(body: Node2D) -> void:
print("body entered in coin")
if body is Player:
coinCollectedSignal.emit(body, self)
if body is Grenade:
body.queue_free()
self.queue_free()
+89 -17
View File
@@ -3,53 +3,125 @@ extends Node2D
var totalCrates = 2 #This will be updated in the future, see SceneManager
var cratesDestroyed = 0
var timeLimit = 10
var timer:= Timer.new()
#var timer:= Timer.new()
#var timerLabel =
var coinsCollectedTotal:int = 0
var totalCoinsAvailable:int = 0
var levels = ["res://scenes/game.tscn", "res://scenes/level2.tscn", "res://scenes/level3.tscn"]
var timers = [6, 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
var enemy:CharacterStats
var player:CharacterStats
var enemiesDict = {}
var playerCurrentHealth:int = 0
# Called when the node enters the scene tree for the first time.
func _ready():
# load in characters
enemy = load("res://scripts/rscs/slime_stats.tres")
player = load("res://scripts/rscs/player_stats.tres")
playerCurrentHealth = player.starting_health
add_child(timer)
timer.wait_time = 1
timer.one_shot = false
timer.connect("timeout", secondCounter)
timer.start()
$TimerLabel.text = str(timeLimit)
#$TimerLabel.text = str(timeLimit)
func secondCounter():
timeLimit -= 1
$TimerLabel.text = str(timeLimit)
if timeLimit <=0:
func secondCounter() -> void:
#timeLimit -= 1
#$TimerLabel.text = str(timeLimit)
#if timeLimit <=0:
# print("You lose baby!")
# get_tree().reload_current_scene()
#class
timeAvailable -= 1
if timeAvailable <= 0:
print("You lose baby!")
get_tree().reload_current_scene()
levelChangeSignal.emit(levels[currentLevel])
func reset() -> void:
timeAvailable = timers[currentLevel]
enemiesDict.clear()
playerCurrentHealth = player.starting_health
func _on_trigger_fired(intent: Variant, body) -> void:
#print("GC knows trigger fired " +intent)
match intent:
"destroy":
if body.name.begins_with("Crate"):
cratesDestroyed +=1
body.queue_free() # destroy the crate - again will move to SceneManager
if cratesDestroyed>=totalCrates:
print("You win baby!")
get_tree().reload_current_scene()
#if body.name.begins_with("Crate"):
# cratesDestroyed +=1
# body.queue_free() # destroy the crate - again will move to SceneManager
#if cratesDestroyed>=totalCrates:
# print("You win baby!")
# get_tree().reload_current_scene()
destroySignal.emit(body)
"powerup":
print("power up this thing")
func _on_coin_collected(body, coin):
print("GC knows coin collected")
coinsCollectedTotal += 1
coin.queue_free()
if coinsCollectedTotal >= totalCoinsAvailable:
print("You won the level!")
destroySignal.emit(coin)
func totalCoins(value):
totalCoinsAvailable = value
if value == 0:
# you won
print("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"]))
playerCurrentHealth -= enemiesDict[slime]["damage"]
if playerCurrentHealth <= 0:
print("YOU DIED")
playerDeathSignal.emit()
else:
print("Player Health " + str(playerCurrentHealth) + " of " + str(player.starting_health))
playerDamagedSignal.emit(playerCurrentHealth, player.starting_health)
func totalEnemies(value):
print("GC knows total enemies " + str(value))
#totalEnemies = value
func addEnemyToLevel(slime) -> void:
print("GC adding enemy")
var randDamage:int = randi() % 10
var enemyStat = {
"health": enemy.health,
"damage": enemy.meleeDamage + randDamage
}
enemiesDict[slime] = enemyStat
func bulletDamage(area, bullet) -> void:
print("Bullet hitting area")
if area is Slime:
print("Hitting a slime")
enemiesDict[area]["health"] -= player.rangeDamage
if enemiesDict[area]["health"] <= 0:
print("enemy killed")
removeEnemyFromLevel(area)
destroySignal.emit(area)
else:
print("Slime health " + str(enemiesDict[area]["health"]))
func removeEnemyFromLevel(slime) -> void:
enemiesDict.erase(slime)
+11
View File
@@ -0,0 +1,11 @@
class_name CharacterStats extends Resource
@export_category("Health")
@export var health:int = 100
@export var max_health:int = 100
@export var starting_health:int = 100
# dealing damage
@export_category("Damage")
@export var meleeDamage:int = 10
@export var rangeDamage:int = 0
+1
View File
@@ -0,0 +1 @@
uid://cvat5tqlqhakd
+8
View File
@@ -0,0 +1,8 @@
[gd_resource type="Resource" script_class="CharacterStats" load_steps=2 format=3 uid="uid://deoygngkmis5q"]
[ext_resource type="Script" uid="uid://cvat5tqlqhakd" path="res://scripts/rscs/character_stats.gd" id="1_828p3"]
[resource]
script = ExtResource("1_828p3")
rangeDamage = 10
metadata/_custom_type_script = "uid://cvat5tqlqhakd"
+10
View File
@@ -0,0 +1,10 @@
[gd_resource type="Resource" script_class="CharacterStats" load_steps=2 format=3 uid="uid://tgmiodedtib6"]
[ext_resource type="Script" uid="uid://cvat5tqlqhakd" path="res://scripts/rscs/character_stats.gd" id="1_i64ta"]
[resource]
script = ExtResource("1_i64ta")
health = 10
max_health = 10
starting_health = 10
metadata/_custom_type_script = "uid://cvat5tqlqhakd"
+40 -20
View File
@@ -5,8 +5,6 @@ var bullet = preload("res://scenes/bullet.tscn")
@onready var coins: Node2D = $"../Coins"
@onready var enemies: Node2D = $"../Enemies"
@onready var game: Node2D = $".."
var bulletArray = []
var totalAllowedBullets = 7
@@ -14,28 +12,44 @@ var grenade = preload("res://scenes/grenade.tscn")
# Called when the node enters the scene tree for the first time.
func _ready() -> void:
Gamecontroller.reset()
buildLevel()
func buildLevel() -> void:
# hook up coins
var totalCoins = 0
if coins:
for obj in coins.get_children():
if obj is Coin:
totalCoins += 1
# hook up a listener at the game controller
obj.coinCollectedSignal.connect(game._on_coin_collected)
# tell GC how many coins total
game.totalCoins(totalCoins)
updateCoins()
var totalEnemies = 0
if enemies:
for obj in enemies.get_children():
if obj is Slime:
totalEnemies += 1
# hook up a listener at the game controller
obj.slimeDamageSignal.connect(game._on_slime_damage)
game.totalEnemies(totalEnemies)
updateEnemies()
# wire up signals from GameController
Gamecontroller.levelChangeSignal.connect(changeScene)
Gamecontroller.destroySignal.connect(destroy)
func updateEnemies() -> void:
var totalEnemies = 0
for obj in enemies.get_children():
if obj is Slime:
totalEnemies += 1
# hook up a listener at the 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:
totalCoins += 1
# hook up a listener at the game controller
if not obj.coinCollectedSignal.is_connected(Gamecontroller._on_coin_collected):
obj.coinCollectedSignal.connect(Gamecontroller._on_coin_collected)
if not obj.tree_exited.is_connected(updateCoins):
obj.tree_exited.connect(updateCoins)
# tell GC how many coins total
Gamecontroller.totalCoins(totalCoins)
# Called every frame. 'delta' is the elapsed time since the previous frame.
func _process(delta: float) -> void:
@@ -46,7 +60,8 @@ func bulletFactory()->Bullet:
if bulletArray.size() < totalAllowedBullets:
# make a new bullet
myBullet = bullet.instantiate()
game.add_child(myBullet)
myBullet.bulletDamageSignal.connect(Gamecontroller.bulletDamage)
owner.add_child(myBullet)
else:
myBullet = bulletArray.pop_back()
@@ -62,7 +77,12 @@ func makeBullet(_bulletPosition, _bulletSpeed)->void:
func makeGrenade(_grenadePosition, _grenadeDirection)->void:
print("SM make a grenade")
var myGrenade:Grenade = grenade.instantiate()
game.add_child(myGrenade)
owner.add_child(myGrenade)
myGrenade.apply_central_impulse(Vector2(_grenadeDirection, -1)*200)
myGrenade.transform = _grenadePosition
func changeScene(level) -> void:
get_tree().call_deferred("change_scene_to_file", level)
func destroy(body) -> void:
body.queue_free()
+9 -1
View File
@@ -1,5 +1,13 @@
class_name Slime extends Area2D
@onready var right_cast: RayCast2D = $RightCast
@onready var left_cast: RayCast2D = $LeftCast
@onready var right_down_cast: RayCast2D = $RightDownCast
@onready var left_down_cast: RayCast2D = $LeftDownCast
var speed:int = 100
var direction = 1
signal slimeDamageSignal(body, slime)
# Called when the node enters the scene tree for the first time.
@@ -9,7 +17,7 @@ func _ready() -> void:
# Called every frame. 'delta' is the elapsed time since the previous frame.
func _process(delta: float) -> void:
pass
position.x += direction * speed * delta
func _on_body_entered(body: Node2D) -> void: