extends Area2D
class_name Collector
## Area that will pick up [Collectible]s with a given name, keeping track of the amount collected.


## The current amount of collected entities.
var collected_count: int = 0

## The types of [Collectible]s to pick up.
##
## The strings will match only if exactly the same.
@export var collecting_types: Array[StringName]

## The collision mask to check colliding body against.
@export_flags_2d_physics var collecting_collision_mask: int

## The goal amount of entities to collect.
##
## When [collected_count] reaches it, it will be reset to zero, and the "goal" signal will be emitted.
@export var collecting_amount: int

## The collector has picked up an object.
signal collected(body: PhysicsBody2D)

## The collector has received its collection goal and is about to reset.
signal goal


func _on_body_entered(body: Node2D):

	if body is PhysicsBody2D:
		if body.collision_layer & collecting_collision_mask:
			var collectible: Collectible = body.get_node("Collectible")
			if collectible.type in collecting_types:
				collected_count += 1
				collectible.collect()
				emit_signal("collected", body)
				if collected_count >= collecting_amount:
					emit_signal("goal")
					collected_count = 0