Add collectable types and implement level unlocking mechanics; enhance player state management

This commit is contained in:
2025-05-03 07:03:44 +02:00
parent 4e5427e731
commit c58cc7da88
19 changed files with 255 additions and 24 deletions

View File

@@ -7,7 +7,7 @@ var has_fade_away: bool = false
@export var area2d: Area2D
@export var collectable_data: CollectableResource
@export var sfx: AudioStreamPlayer2D
signal collected(amount: int)
signal collected(amount: int, type: CollectableResource.CollectableType)
func _ready() -> void:
@@ -24,7 +24,7 @@ func _ready() -> void:
func _on_area2d_body_entered(body: Node2D) -> void:
if body.has_node("CanPickUpComponent"):
collected.emit(collectable_data.amount)
collected.emit(collectable_data.amount, collectable_data.type)
if sfx:
sfx.play()
if not has_fade_away:

View File

@@ -0,0 +1,34 @@
class_name ExitDoorComponent
extends Node
@export var locked: bool = true
@export var exit_area: Area2D
@export var door_sprite: Sprite2D
@export var opened_door_sfx: AudioStreamPlayer2D
@export var opened_door_frame: int = 0
signal exit_triggered
@onready var gm: GM = $"/root/GameManager"
func _ready() -> void:
if not exit_area:
printerr("ExitDoorComponent: exit_area is not set.")
return
exit_area.body_entered.connect(on_exit_area_body_entered)
func unlock() -> void:
locked = false
if door_sprite:
door_sprite.frame = opened_door_frame
if opened_door_sfx:
opened_door_sfx.play()
func on_exit_area_body_entered(_body: Node2D) -> void:
if locked:
return
exit_triggered.emit()
gm.try_to_go_to_next_level()

View File

@@ -0,0 +1 @@
uid://bwamqffvpa452

View File

@@ -24,5 +24,6 @@ func _on_health_component_on_death() -> void:
gm.reset_player_state()
else:
gm.remove_lives(1)
gm.set_coins(0)
call_deferred("reset_scene")

View File

@@ -0,0 +1,32 @@
class_name RequirementComponent
extends Node
@export var requirement_type: CollectableResource.CollectableType
@export var required_amount: int = 1
var current_amount: int = 0
signal requirement_met(requirement_type: CollectableResource.CollectableType)
@onready var gm: GM = $"/root/GameManager"
func _ready() -> void:
if not gm:
printerr("RequirementComponent: GameManager not found.")
return
var collectables: Array[CollectableComponent] = gm.get_colllectable_nodes()
for collectable in collectables:
collectable.collected.connect(on_collected)
func on_collected(amount: int, type: CollectableResource.CollectableType) -> void:
print("Collected: ", amount, " of type: ", str(type))
if type != requirement_type:
return
add_progress(amount)
func add_progress(amount: int = 1) -> void:
current_amount += amount
if current_amount >= required_amount:
requirement_met.emit(requirement_type)

View File

@@ -0,0 +1 @@
uid://cmh8k0rdsyh7j

View File

@@ -3,17 +3,18 @@ extends Node
@onready var game_manager: GM = $"/root/GameManager"
func _ready():
await get_tree().process_frame
var coins = get_tree().get_nodes_in_group("coins")
for coin in coins:
coin.connect("collected", on_collected)
func on_collected(amount: int) -> void:
func on_collected(amount: int, type: CollectableResource.CollectableType) -> void:
if not game_manager:
return
if type != CollectableResource.CollectableType.COIN:
return
game_manager.add_coins(amount)
# todo: play sound
# todo: update ui

View File

@@ -0,0 +1,26 @@
class_name UnlockOnRequirementComponent
extends Node
@export var requirement_component: RequirementComponent
@export var unlock_target: Node
func _ready() -> void:
if not requirement_component:
printerr("UnlockOnRequirementComponent: requirement_component is not set.")
return
if not unlock_target:
printerr("UnlockOnRequirementComponent: unlock_target is not set.")
return
requirement_component.requirement_met.connect(on_requirement_met)
func on_requirement_met(requirement_type: CollectableResource.CollectableType) -> void:
if requirement_type == requirement_component.requirement_type:
if unlock_target.has_method("unlock"):
unlock_target.unlock()
else:
printerr("UnlockOnRequirementComponent: unlock_target does not have an unlock method.")

View File

@@ -0,0 +1 @@
uid://c8xhgkg8gcqu6