better coin collecting, level timer, multilevels, badguys with characterstats

This commit is contained in:
OddlyTimbot committed 2025-09-08 20:54:50 -04:00
1 parent 53bae7b109
commit 68b998652c
18 files changed
+1240 -21

No files matched your search

+8
View File
@@ -0,0 +1,8 @@
class_name Coin extends Area2D
signal coinCollectedSignal(body, coin)
func _on_body_entered(body: Node2D) -> void:
print("coin collision")
if body is Player:
coinCollectedSignal.emit(body, self)
+1
View File
@@ -0,0 +1 @@
uid://nqigicsb4oqh
+55 -6
View File
@@ -1,11 +1,43 @@
extends Node2D
signal playerDamage
signal destroySignal(body)
signal levelChangeSignal(level)
var timer = Timer.new()
var timeAvailable:int = 5
var levels = ["res://scenes/game.tscn","res://scenes/level2.tscn","res://scenes/level3.tscn"]
var timers = [15,10,9]
var currentLevel = 0
#character stats
var enemy:CharacterStats
var player:CharacterStats
var playerCurrentHealth:int
# Called when the node enters the scene tree for the first time.
func _ready() -> void:
pass # Replace with function body.
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 reset():
timeAvailable = timers[currentLevel]
func secondCounter():
timeAvailable -=1
#check for time running out
if timeAvailable <=0:
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
@@ -18,8 +50,8 @@ func _on_trigger(effect: Variant, body: Variant) -> void:
if body is Player:
print("hurt the player")
playerDamage.emit()
if not body is Player:
body.queue_free()
#if not body is Player:
# body.queue_free()
func bulletDamage(body, bullet):
print("GC know about bullet hit")
@@ -27,4 +59,21 @@ func bulletDamage(body, bullet):
func coinCollected(body, coin):
print("GC knows coin collected")
destroySignal.emit(coin)
func totalCoinCount(count):
print("GC knows total coins "+str(count))
if count == 0:
currentLevel +=1
if currentLevel >= levels.size():
currentLevel = 0
levelChangeSignal.emit(levels[currentLevel])
func playerAttacked(body, slime):
print("GC knows slime attack")
print("Damge : "+str(enemy.meleeDamage) )
print("Player health : "+str(playerCurrentHealth))
playerCurrentHealth -= enemy.meleeDamage
if playerCurrentHealth <=0:
print("YOU DEAD")
+9
View File
@@ -0,0 +1,9 @@
class_name CharacterStats extends Resource
@export var health:int = 100
@export var max_health: int =100
@export var starting_health:int = 100
# damage dealing
@export var meleeDamage:int = 10
@export var rangeDamage:int = 0
+1
View File
@@ -0,0 +1 @@
uid://r408skwtvisy
+12
View File
@@ -0,0 +1,12 @@
[gd_resource type="Resource" script_class="CharacterStats" load_steps=2 format=3 uid="uid://bff0fewekswn"]
[ext_resource type="Script" uid="uid://r408skwtvisy" path="res://scripts/rscs/characterstats.gd" id="1_sqkfu"]
[resource]
script = ExtResource("1_sqkfu")
health = 100
max_health = 100
starting_health = 100
meleeDamage = 10
rangeDamage = 0
metadata/_custom_type_script = "uid://r408skwtvisy"
+12
View File
@@ -0,0 +1,12 @@
[gd_resource type="Resource" script_class="CharacterStats" load_steps=2 format=3 uid="uid://r5hx4gu0mtog"]
[ext_resource type="Script" uid="uid://r408skwtvisy" path="res://scripts/rscs/characterstats.gd" id="1_ppipo"]
[resource]
script = ExtResource("1_ppipo")
health = 100
max_health = 100
starting_health = 100
meleeDamage = 25
rangeDamage = 0
metadata/_custom_type_script = "uid://r408skwtvisy"
+37 -6
View File
@@ -2,21 +2,47 @@ class_name SceneManager extends Node2D
var bulletArray =[]
var totalAllowedBullets = 7
var bullet = preload("res://scenes/bullet.tscn")
@onready var game: Node2D = $".."
@onready var triggers: Node2D = $"../triggers"
@onready var coins: Node2D = $"../coins"
@onready var enemies: Node2D = $"../enemies"
# Called when the node enters the scene tree for the first time.
func _ready() -> void:
Gamecontroller.reset()
if triggers:
for obj in triggers.get_children():
if obj is Trigger:
obj.areaTriggerSignal.connect(game._on_trigger)
obj.areaTriggerSignal.connect(Gamecontroller._on_trigger)
if coins:
for obj in coins.get_children():
if obj is Coin:
obj.coinCollectedSignal.connect(game.coinCollected)
updateCoins()
if enemies:
updateEnemies()
Gamecontroller.destroySignal.connect(destroy)
Gamecontroller.levelChangeSignal.connect(changeScene)
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)
func updateCoins():
var coinCount = 0
for obj in coins.get_children():
if obj is Coin:
if not obj.coinCollectedSignal.is_connected(Gamecontroller.coinCollected):
obj.coinCollectedSignal.connect(Gamecontroller.coinCollected)
#connect tree exit
if not obj.tree_exited.is_connected(updateCoins):
obj.tree_exited.connect(updateCoins)
coinCount +=1
Gamecontroller.totalCoinCount(coinCount)
# Called every frame. 'delta' is the elapsed time since the previous frame.
func _process(delta: float) -> void:
@@ -28,7 +54,7 @@ func bulletFactory():
if bulletArray.size() < totalAllowedBullets:
#make a new bullet
myBullet = bullet.instantiate()
myBullet.bulletDamageSignal.connect(game.bulletDamage)
myBullet.bulletDamageSignal.connect(Gamecontroller.bulletDamage)
owner.add_child(myBullet)
else:
myBullet = bulletArray.pop_back()
@@ -41,3 +67,8 @@ func makeBullet(position, speed):
someBullet.setSpeed(speed)
# postition the bullet
someBullet.transform = position
func destroy(body):
body.queue_free()
func changeScene(level):
get_tree().call_deferred("change_scene_to_file", level)
+34
View File
@@ -0,0 +1,34 @@
class_name Slime extends Area2D
@onready var slime_graphic: AnimatedSprite2D = $SlimeGraphic
@onready var right_cast: RayCast2D = $RightCast
@onready var left_cast: RayCast2D = $LeftCast
@onready var left_down_cast: RayCast2D = $LeftDownCast
@onready var right_down_cast: RayCast2D = $RightDownCast
var speed:int = 100
var direction = 1
signal playerDamageSignal(body, slime)
# Called when the node enters the scene tree for the first time.
func _ready() -> void:
pass # Replace with function body.
# Called every frame. 'delta' is the elapsed time since the previous frame.
func _process(delta: float) -> void:
if not right_down_cast.is_colliding():
direction = -1
slime_graphic.flip_h = true
if not left_down_cast.is_colliding():
direction = 1
slime_graphic.flip_h = false
position.x += direction * speed * delta
func _on_body_entered(body: Node2D) -> void:
if body is Player:
print("Slime attack!")
playerDamageSignal.emit(body, self)
+1
View File
@@ -0,0 +1 @@
uid://cuaxw7eh73a1i