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

This commit is contained in:
OddlyTimbot committed 2025-11-03 20:56:50 -05:00
1 parent bdaeeec44f
commit d5c87727b9
17 files changed
+1290 -46

No files matched your search

+6 -2
View File
@@ -2,7 +2,7 @@ class_name Bullet extends Area2D
var speed:float = 700
@onready var bullet_graphic = $BulletGraphic
signal bulletDamageSignal(area, bullet)
# Called when the node enters the scene tree for the first time.
func _ready():
pass # Replace with function body.
@@ -12,9 +12,13 @@ func _ready():
func _process(delta):
position += transform.x * speed * delta
func xz(value)->void:
func setSpeed(value)->void:
speed = value
if speed<0:
bullet_graphic.flip_h = true
else:
bullet_graphic.flip_h = false
func _on_area_entered(area):
bulletDamageSignal.emit(area, self)
+5
View File
@@ -16,3 +16,8 @@ func _on_body_entered(body):
print("body connected with coin")
if body is Player:
coinCollectedSignal.emit(body, self)
if body is Grenade:
body.queue_free()
self.queue_free()
+85 -11
View File
@@ -3,10 +3,48 @@ 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
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():
pass # Replace with function body.
#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
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):
@@ -18,21 +56,57 @@ func _on_trigger_fired(intent, body):
match intent:
"destroy":
print("destroy this thing")
body.queue_free()
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!")
func totalCoins(value):
totalCoinsAvailable = value
destroySignal.emit(coin)
func _on_slime_damage(body, slime):
func totalCoins(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 totalEnemies(value):
print("GC knows total enemies "+str(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")
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)
+1
View File
@@ -25,3 +25,4 @@ func _on_body_entered(body):
if body.is_in_group("splodable"):
body.queue_free()
explode()
+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://oewo8kn4jbkl
+8
View File
@@ -0,0 +1,8 @@
[gd_resource type="Resource" script_class="CharacterStats" load_steps=2 format=3 uid="uid://4yftkv4qq0bd"]
[ext_resource type="Script" uid="uid://oewo8kn4jbkl" path="res://scripts/rscs/characterstats.gd" id="1_sqkfu"]
[resource]
script = ExtResource("1_sqkfu")
rangeDamage = 10
metadata/_custom_type_script = "uid://oewo8kn4jbkl"
+11
View File
@@ -0,0 +1,11 @@
[gd_resource type="Resource" script_class="CharacterStats" load_steps=2 format=3 uid="uid://8cwcd0phesw4"]
[ext_resource type="Script" uid="uid://oewo8kn4jbkl" path="res://scripts/rscs/characterstats.gd" id="1_ppipo"]
[resource]
script = ExtResource("1_ppipo")
health = 50
max_health = 50
starting_health = 50
meleeDamage = 5
metadata/_custom_type_script = "uid://oewo8kn4jbkl"
+45 -19
View File
@@ -5,36 +5,54 @@ var grenade = preload("res://scenes/grenade.tscn")
@onready var coins = $"../Coins"
@onready var enemies = $"../Enemies"
@onready var game = $".."
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
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 game controller
obj.slimeDamageSignal.connect(game._on_slime_damage)
pass
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 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
@@ -43,7 +61,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()
@@ -59,6 +78,13 @@ 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:
print("Change to level "+level)
get_tree().call_deferred("change_scene_to_file", level)
func destroy(body)->void:
body.queue_free()
+8 -1
View File
@@ -1,4 +1,11 @@
class_name Slime extends Area2D
@onready var right_cast = $RightCast
@onready var left_cast = $LeftCast
@onready var right_down_cast = $RightDownCast
@onready var left_down_cast = $LeftDownCast
var speed:int = 100
var direction = 1
signal slimeDamageSignal(body, slime)
# Called when the node enters the scene tree for the first time.
@@ -8,7 +15,7 @@ func _ready():
# Called every frame. 'delta' is the elapsed time since the previous frame.
func _process(delta):
pass
position.x += direction * speed * delta
func _on_body_entered(body):