2025-03-24 18:13:08 +01:00
|
|
|
class_name Level
|
2025-02-23 00:46:23 +01:00
|
|
|
extends Node3D
|
|
|
|
|
2025-03-25 23:18:33 +01:00
|
|
|
signal ring_collected
|
|
|
|
signal completed
|
|
|
|
|
2025-04-24 14:54:54 +02:00
|
|
|
## Lowercase, spaceless name of the level
|
|
|
|
var id: String
|
2025-04-25 16:03:36 +02:00
|
|
|
var thumbnail: CompressedTexture2D
|
2025-03-24 18:13:08 +01:00
|
|
|
var music: Music
|
2025-03-25 23:18:33 +01:00
|
|
|
var rings: Array[Ring] = []
|
|
|
|
var finished_rings_count: int = 0
|
2025-04-25 16:03:36 +02:00
|
|
|
var velocity: float = 0.0
|
2025-02-23 00:46:23 +01:00
|
|
|
|
2025-04-25 16:03:36 +02:00
|
|
|
func _init() -> void:
|
2025-04-24 14:54:54 +02:00
|
|
|
assert(len(id) > 0, self.name + " has no id!")
|
2025-04-25 16:03:36 +02:00
|
|
|
|
|
|
|
func _ready() -> void:
|
2025-03-24 18:13:08 +01:00
|
|
|
var children = get_children()
|
|
|
|
for child in children:
|
|
|
|
if is_instance_of(child, Music):
|
|
|
|
music = child
|
|
|
|
assert(is_instance_valid(music), self.name + " has no music!")
|
2025-02-23 10:59:42 +01:00
|
|
|
|
2025-02-23 00:46:23 +01:00
|
|
|
var rings_node = get_node("Rings")
|
2025-03-25 23:18:33 +01:00
|
|
|
assert(is_instance_valid(rings_node), self.name + " has no Rings node!")
|
|
|
|
var rings_node_children = rings_node.get_children()
|
|
|
|
for ring in rings_node_children:
|
|
|
|
if is_instance_of(ring, Ring):
|
|
|
|
rings.push_back(ring)
|
|
|
|
ring.connect("collect_signal", collect_ring)
|
2025-02-23 00:46:23 +01:00
|
|
|
|
2025-03-25 23:18:33 +01:00
|
|
|
func collect_ring():
|
|
|
|
finished_rings_count = len(rings.filter(func(ring: Ring): return ring.collected))
|
|
|
|
ring_collected.emit()
|
|
|
|
|
2025-03-25 17:48:00 +01:00
|
|
|
if finished_rings_count >= len(rings):
|
2025-03-25 23:18:33 +01:00
|
|
|
completed.emit()
|