added multiple levels, added slime and player damage and death

This commit is contained in:
edgul committed 2026-05-25 21:03:17 -04:00
1 parent 293f106379
commit 3a76ac8145
12 files changed
+1109 -14

No files matched your search

+57 -3
View File
@@ -1,10 +1,41 @@
class_name GameController extends Node2D
extends Node2D
signal destroy(body)
signal level_change_signal(level)
var levels = ["res://scenes/level1.tscn","res://scenes/level2.tscn","res://scenes/level3.tscn"]
var current_level_index = 0
var level_times = [15,20,25]
var time_available = 0
var timer = Timer.new()
var player:Player;
var enemies = {}
func _ready():
get_window().grab_focus() # Replace with function body.
reset()
add_child(timer)
timer.wait_time = 1
timer.one_shot = false
timer.connect("timeout", timer_tick)
timer.start()
func timer_tick():
time_available -= 1
if time_available <= 0:
print("you lose")
level_change_signal.emit(levels[current_level_index])
reset()
func reset():
time_available = level_times[current_level_index]
if player:
player.health = 5
func stop():
timer.stop()
func _process(delta):
pass
@@ -16,6 +47,29 @@ func _on_area_2d_trigger_active_signal(body, intentMessage):
var crate_num : int = 0
func set_crate_num(count: int):
crate_num = count
print("number of crates: " + str(crate_num))
# print("number of crates: " + str(crate_num))
if crate_num <= 0:
print("You Win!")
current_level_index += 1
if current_level_index == levels.size():
print("You Win!")
stop()
else:
level_change_signal.emit(levels[current_level_index])
reset()
func _on_slime_damage(body, slime):
print("game controller sees slime damage")
player.health -= enemies[slime]["damage"]
if player.health <= 0:
print("dead")
level_change_signal.emit(levels[current_level_index])
func add_enemy(slime):
var enemy_stat = {
"health": 5,
"damage": 3
}
enemies[slime] = enemy_stat
func _on_slime_struck(body, slime):
print("game controller sees slime struck")
+6
View File
@@ -6,6 +6,8 @@ class_name Player extends CharacterBody2D
@onready var right_marker: Marker2D = $right_marker
@onready var graphic: AnimatedSprite2D = $graphic
signal new_player(player)
const SPEED = 300.0
const JUMP_VELOCITY = -400.0
var direction : float = 0
@@ -15,6 +17,10 @@ var shove_target: RigidBody2D
enum State { IDLE, RUN, JUMP, APEX, FALL }
var state: State = State.IDLE
var up_jump:bool = false
var health:int = 4
func _ready():
new_player.emit(self)
func _physics_process(delta: float):
handle_input()
+20 -3
View File
@@ -1,12 +1,14 @@
class_name SceneManager extends Node2D
@onready var game_node: Node2D = $".."
@onready var crates: Node2D = $"../crates"
var grenade = preload("res://scenes/grenade.tscn")
@onready var enemies = $"../Enemies"
@onready var player = $"../player"
func _ready() -> void:
print("scene manager is ready")
game_node.destroy.connect(destroy)
GameController.destroy.connect(destroy)
GameController.level_change_signal.connect(change_scene)
build_level()
func _process(delta: float) -> void:
@@ -14,6 +16,21 @@ func _process(delta: float) -> void:
func build_level() -> void:
update_crates()
if enemies:
update_enemies()
if player:
GameController.player = player
func update_enemies():
for enemy in enemies.get_children():
if not enemy.slime_damage.is_connected(GameController._on_slime_damage):
enemy.slime_damage.connect(GameController._on_slime_damage)
enemy.slime_struck.connect(GameController._on_slime_struck)
GameController.add_enemy(enemy)
func change_scene(level):
print("changing scene to ", level)
get_tree().call_deferred("change_scene_to_file", level)
func make_grenade(grenade_pos: Transform2D, grenade_dir: int) -> void:
print("scene manager making grenade")
@@ -30,7 +47,7 @@ func update_crates() -> void:
if not obj.tree_exited.is_connected(update_crates):
obj.tree_exited.connect(update_crates)
crate_total += 1
game_node.set_crate_num(crate_total)
GameController.set_crate_num(crate_total)
func destroy(body):
if body is BrownBox:
+41
View File
@@ -0,0 +1,41 @@
class_name Slime extends Area2D
@onready var animated_sprite_2d = $AnimatedSprite2D
@onready var left_cast = $LeftCast
@onready var right_cast = $RightCast
@onready var left_down_cast = $LeftDownCast
@onready var right_down_cast = $RightDownCast
signal slime_damage(body, slime)
signal slime_struck(body, slime)
var speed:int = 100
var direction = 1
func _ready():
pass
func turn_right():
direction = 1
animated_sprite_2d.flip_h = false
func turn_left():
direction = -1
animated_sprite_2d.flip_h = true
func _process(delta: float):
if right_cast.is_colliding() and not right_cast.get_collider() is Player:
turn_left()
elif left_cast.is_colliding() and not left_cast.get_collider() is Player:
turn_right()
if not right_down_cast.is_colliding():
turn_left()
elif not left_down_cast.is_colliding():
turn_right()
position.x += direction*speed*delta
func _on_body_entered(body):
if body is Player:
slime_damage.emit(body, self)
if body is Grenade:
slime_struck.emit(body, self)
+1
View File
@@ -0,0 +1 @@
uid://bl1mwmhvr6pcx