From 92e989c331d1f9369a3c9a1667ba7f4969d9bd32 Mon Sep 17 00:00:00 2001 From: Autumn Mayes Date: Mon, 30 Jun 2025 21:04:01 -0400 Subject: [PATCH] autoload, timer, win condition, lose condition, custom resources, enemy, multi-levels --- Assets/Graphics/Enemies/slime_purple.png | Bin 0 -> 1030 bytes .../Graphics/Enemies/slime_purple.png.import | 34 ++ Scenes/game.tscn | 39 +- Scenes/level2.tscn | 490 ++++++++++++++++++ Scenes/level3.tscn | 490 ++++++++++++++++++ Scenes/slime.tscn | 75 +++ Scripts/character_body_2d.gd | 9 +- Scripts/gamecontroller.gd | 67 ++- 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 | 38 +- Scripts/slime.gd | 42 ++ Scripts/slime.gd.uid | 1 + project.godot | 4 + 16 files changed, 1294 insertions(+), 29 deletions(-) create mode 100644 Assets/Graphics/Enemies/slime_purple.png create mode 100644 Assets/Graphics/Enemies/slime_purple.png.import create mode 100644 Scenes/level2.tscn create mode 100644 Scenes/level3.tscn create mode 100644 Scenes/slime.tscn 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.png b/Assets/Graphics/Enemies/slime_purple.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: match current_state: State.JUMP: upJump = false + +func playerTakesDamage(health): + print("Player sees remaining health "+str(health)) + +func playerDies(): + print("Player sees they died.") + diff --git a/Scripts/gamecontroller.gd b/Scripts/gamecontroller.gd index c78d1a3..9d197be 100644 --- a/Scripts/gamecontroller.gd +++ b/Scripts/gamecontroller.gd @@ -2,11 +2,47 @@ extends Node2D var totalCoinsAvailable +var timer = Timer.new() +var timeAvailable = 5 +var level="res://Scenes/game.tscn" +var levelTwo = "res://Scenes/level2.tscn" + +var levels = ["res://Scenes/game.tscn", "res://Scenes/level2.tscn", "res://Scenes/level3.tscn"] +var timers = [10,15,9] +var currentLevel = 0 + +signal destroySignal(body) +signal levelChangeSignal(level) +signal playerTakesDamageSignal(health) +signal playerDiesSignal + +var player:CharacterStats +var enemy:CharacterStats + +var playerHealth:int + # Called when the node enters the scene tree for the first time. func _ready() -> void: - pass # Replace with function body. - + player = load("res://Scripts/rscs/playerStats.tres") + enemy = load("res://Scripts/rscs/slimeStats.tres") + + playerHealth = 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("LOSE") + #reload the current scene + levelChangeSignal.emit(levels[currentLevel]) +func reset() -> void: + timeAvailable = timers[currentLevel] + # Called every frame. 'delta' is the elapsed time since the previous frame. func _process(delta: float) -> void: pass @@ -17,12 +53,29 @@ func _on_areatrigger(effect, body) -> void: if effect == "destroy": print("Destroy this thing") body.queue_free() - if effect == "powerup": - print("Power up the player") + if effect == "lavaBurn": + if body is Player: + playerHealth -= 10 + print("Player health is now "+str(playerHealth)) + func totalCoinCount(totalCoins): - print("GC knows total coins"+str(totalCoins) ) + print("GC knows the total coins is "+str(totalCoins) ) totalCoinsAvailable = totalCoins func coinCollected(body, coin): - print("GC knows coin collected") - coin.queue_free() + destroySignal.emit(coin) + totalCoinsAvailable -=1 + if totalCoinsAvailable <= 0: + currentLevel +=1 + if currentLevel >= levels.size(): + currentLevel = 0 + levelChangeSignal.emit(levels[currentLevel]) + +func playerAttacked(body, slime): + print("GC knows player attacked") + playerHealth -= enemy.meleeDamage + if playerHealth <=0: + playerDiesSignal.emit() + else: + print("Received damage...") + playerTakesDamageSignal.emit(playerHealth) diff --git a/Scripts/rscs/characterstats.gd b/Scripts/rscs/characterstats.gd new file mode 100644 index 0000000..500b003 --- /dev/null +++ b/Scripts/rscs/characterstats.gd @@ -0,0 +1,9 @@ +class_name CharacterStats extends Resource + +@export var max_health:int = 100 +@export var starting_health:int = 100 +@export var 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..667885b --- /dev/null +++ b/Scripts/rscs/characterstats.gd.uid @@ -0,0 +1 @@ +uid://b4t8cviiuvt18 diff --git a/Scripts/rscs/playerStats.tres b/Scripts/rscs/playerStats.tres new file mode 100644 index 0000000..88763dc --- /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://bui3rirgh7w6h"] + +[ext_resource type="Script" uid="uid://b4t8cviiuvt18" path="res://Scripts/rscs/characterstats.gd" id="1_eiyfu"] + +[resource] +script = ExtResource("1_eiyfu") +max_health = 100 +starting_health = 100 +health = 100 +meleeDamage = 5 +rangeDamage = 10 +metadata/_custom_type_script = "uid://b4t8cviiuvt18" diff --git a/Scripts/rscs/slimeStats.tres b/Scripts/rscs/slimeStats.tres new file mode 100644 index 0000000..f8e8f82 --- /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://dtrmy5w0xcd0u"] + +[ext_resource type="Script" uid="uid://b4t8cviiuvt18" path="res://Scripts/rscs/characterstats.gd" id="1_g41dv"] + +[resource] +script = ExtResource("1_g41dv") +max_health = 50 +starting_health = 50 +health = 50 +meleeDamage = 10 +rangeDamage = 0 +metadata/_custom_type_script = "uid://b4t8cviiuvt18" diff --git a/Scripts/scene_manager.gd b/Scripts/scene_manager.gd index e8c0075..3ab3cb5 100644 --- a/Scripts/scene_manager.gd +++ b/Scripts/scene_manager.gd @@ -4,20 +4,43 @@ var bullet = preload("res://Scenes/bullet.tscn") var bulletArray =[] var totalAllowedBullets = 7 @onready var triggers: Node2D = $"../Triggers" -@onready var gameController: Node2D = $".." @onready var coins: Node2D = $"../Coins" +@onready var enemies: Node2D = $"../Enemies" +@onready var player: Player = $"../Player" func _ready() -> void: + Gamecontroller.reset() + for obj in triggers.get_children(): - obj.areatrigger.connect(gameController._on_areatrigger) + obj.areatrigger.connect(Gamecontroller._on_areatrigger) + + if enemies: + for obj in enemies.get_children(): + if obj is Slime: + obj.playerDamageSignal.connect(Gamecontroller.playerAttacked) + + updateCoins() + + Gamecontroller.destroySignal.connect(destroyItem) + Gamecontroller.levelChangeSignal.connect(changeScene) + Gamecontroller.playerTakesDamageSignal.connect(player.playerTakesDamage) + Gamecontroller.playerDiesSignal.connect(player.playerDies) + +#call this any time the coins change +func updateCoins() -> void: var coinCount = 0 for obj in coins.get_children(): - obj.coinCollectedSignal.connect(gameController.coinCollected) + #connect coin collected to game controller + if not obj.coinCollectedSignal.is_connected(Gamecontroller.coinCollected): + obj.coinCollectedSignal.connect(Gamecontroller.coinCollected) + #connect tree_exited signal for updates + if not obj.tree_exited.is_connected(updateCoins): + obj.tree_exited.connect(updateCoins) coinCount +=1 #send information to the game controller - gameController.totalCoinCount(coinCount) - + Gamecontroller.totalCoinCount(coinCount) + #makes bullets func bulletFactory(): var mybullet @@ -42,3 +65,8 @@ func makeBullet(position, speed): #position the bullet mybullet.transform = position +func destroyItem(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..fbcc338 --- /dev/null +++ b/Scripts/slime.gd @@ -0,0 +1,42 @@ +class_name Slime extends Area2D +@onready var slime_graphic: AnimatedSprite2D = $slimeGraphic +@onready var right_side_cast: RayCast2D = $RightSideCast +@onready var left_side_cast: RayCast2D = $LeftSideCast +@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 + + if right_side_cast.is_colliding(): + direction = -1 + slime_graphic.flip_h = true + + if left_side_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..f5a8fea --- /dev/null +++ b/Scripts/slime.gd.uid @@ -0,0 +1 @@ +uid://vjdcp0a4i0j8 diff --git a/project.godot b/project.godot index 7d68f5e..8e566bf 100644 --- a/project.godot +++ b/project.godot @@ -15,6 +15,10 @@ run/main_scene="uid://c6mxse0hqjro7" config/features=PackedStringArray("4.4", "Forward Plus") config/icon="res://icon.svg" +[autoload] + +Gamecontroller="*res://Scripts/gamecontroller.gd" + [display] window/size/viewport_width=320