From 68b998652c1e54787684c00e8a19ca67b98b3573 Mon Sep 17 00:00:00 2001 From: OddlyTimbot Date: Mon, 8 Sep 2025 20:54:50 -0400 Subject: [PATCH] better coin collecting, level timer, multilevels, badguys with characterstats --- assets/graphics/enemies/slime_purple (1).png | Bin 0 -> 1030 bytes .../enemies/slime_purple (1).png.import | 34 ++ project.godot | 4 + scenes/coin.tscn | 2 +- scenes/game.tscn | 18 +- scenes/level2.tscn | 474 +++++++++++++++++ scenes/level3.tscn | 480 ++++++++++++++++++ scenes/slime.tscn | 73 +++ {scenes => scripts}/coin.gd | 3 +- {scenes => scripts}/coin.gd.uid | 0 scripts/gamecontroller.gd | 61 ++- scripts/rscs/characterstats.gd | 9 + scripts/rscs/characterstats.gd.uid | 1 + scripts/rscs/playerStats.tres | 12 + scripts/rscs/slimeStats.tres | 12 + scripts/scene_manager.gd | 43 +- scripts/slime.gd | 34 ++ scripts/slime.gd.uid | 1 + 18 files changed, 1240 insertions(+), 21 deletions(-) create mode 100644 assets/graphics/enemies/slime_purple (1).png create mode 100644 assets/graphics/enemies/slime_purple (1).png.import create mode 100644 scenes/level2.tscn create mode 100644 scenes/level3.tscn create mode 100644 scenes/slime.tscn rename {scenes => scripts}/coin.gd (70%) rename {scenes => scripts}/coin.gd.uid (100%) create mode 100644 scripts/rscs/characterstats.gd create mode 100644 scripts/rscs/characterstats.gd.uid create mode 100644 scripts/rscs/playerStats.tres create mode 100644 scripts/rscs/slimeStats.tres create mode 100644 scripts/slime.gd create mode 100644 scripts/slime.gd.uid diff --git a/assets/graphics/enemies/slime_purple (1).png b/assets/graphics/enemies/slime_purple (1).png new file mode 100644 index 0000000000000000000000000000000000000000..76f564e1d18d3f4b59c032ee8233ebf4665af431 GIT binary patch literal 1030 zcmeAS@N?(olHy`uVBq!ia0vp^2|(<@!3HEb(?2AGr~;43Vg?3oVGw3ym^DX&fq{94 zr;B4q#hkZu_UB)A5IH_yFgSBs)oT$}vmn=*zw9@ptqPdBe?d}nV{fk>$4CBvg?)Ed z_vO50>IiWPSm-r%m!<3^wh~P~_4RS~ zpI=Gub+-QhIeq%h`RaxX{5TJNc>dLzfkEQSwe9u4|AzdIT*^2{!A86~-QWe|7ymwB zC>Ti{|81}_`+UPPl@+TN=sEg&On58UrMgnvLQXF0_ys@bQ1@EdnLWo=s>t&5b6*sD zcFMcwU?tm(D_Xg)W-Wc$-E!h}Crjk()1K3gUwWA?xq;Wdw18cHo3k~Zx-$Fb`AU$*-@DD zmGPf?jG6V$dCTQj>{2>(Zt>F0fcfj}50vb4xa*Xko3|y%e%9UPUyOMTg5ncDvEEv- z-pIj{ckVgygWdnMA2Z(bzqjb#^{`seQ^pPQ$9_6a&90O2#S*<mC1;UMyZZkxfN& z@uKHWkGnrH91Z`H^EmwCk41a3FUGWg-!^5J_|wx1K5Uz!#D3x7Zw}ELVrNTt9P8IR z_1(WOXsY%rc>^6i*W&vj&+HC_UuW8s@vbNLPX_a void: print("coin collision") - coinCollectedSignal.emit(body, self) + if body is Player: + coinCollectedSignal.emit(body, self) diff --git a/scenes/coin.gd.uid b/scripts/coin.gd.uid similarity index 100% rename from scenes/coin.gd.uid rename to scripts/coin.gd.uid diff --git a/scripts/gamecontroller.gd b/scripts/gamecontroller.gd index 4fcac18..a764299 100644 --- a/scripts/gamecontroller.gd +++ b/scripts/gamecontroller.gd @@ -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") + diff --git a/scripts/rscs/characterstats.gd b/scripts/rscs/characterstats.gd new file mode 100644 index 0000000..5361989 --- /dev/null +++ b/scripts/rscs/characterstats.gd @@ -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 diff --git a/scripts/rscs/characterstats.gd.uid b/scripts/rscs/characterstats.gd.uid new file mode 100644 index 0000000..e1553d9 --- /dev/null +++ b/scripts/rscs/characterstats.gd.uid @@ -0,0 +1 @@ +uid://r408skwtvisy diff --git a/scripts/rscs/playerStats.tres b/scripts/rscs/playerStats.tres new file mode 100644 index 0000000..239a5df --- /dev/null +++ b/scripts/rscs/playerStats.tres @@ -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" diff --git a/scripts/rscs/slimeStats.tres b/scripts/rscs/slimeStats.tres new file mode 100644 index 0000000..beda283 --- /dev/null +++ b/scripts/rscs/slimeStats.tres @@ -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" diff --git a/scripts/scene_manager.gd b/scripts/scene_manager.gd index f32695b..50cd7f8 100644 --- a/scripts/scene_manager.gd +++ b/scripts/scene_manager.gd @@ -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) diff --git a/scripts/slime.gd b/scripts/slime.gd new file mode 100644 index 0000000..6a8c112 --- /dev/null +++ b/scripts/slime.gd @@ -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) diff --git a/scripts/slime.gd.uid b/scripts/slime.gd.uid new file mode 100644 index 0000000..9877604 --- /dev/null +++ b/scripts/slime.gd.uid @@ -0,0 +1 @@ +uid://cuaxw7eh73a1i