class_name DropZone extends Area2D ## Target location for a specific delivery item. Registers a task on ready and ## completes it when the Ghost drops the matching item here. @export var required_item_id: String = "" @export var task_description: String = "" ## Where the delivered item is placed, in this zone's local space. @export var drop_offset: Vector2 = Vector2.ZERO var delivered: bool = false @onready var _marker: Label = get_node_or_null("Marker") func _ready() -> void: add_to_group("drop_zone") if not required_item_id.is_empty(): var desc := task_description if not task_description.is_empty() else required_item_id GameManager.register_task(required_item_id, desc) _update_marker() func accepts(item: Collectable) -> bool: return not delivered and item != null and item.item_id == required_item_id func deliver(item: Collectable) -> void: if not accepts(item): return delivered = true var target := to_global(drop_offset) item.reparent(self) item.global_position = target item.show_behind_parent = false item.mark_delivered() GameManager.complete_task(required_item_id) _update_marker() func _update_marker() -> void: if _marker: _marker.text = "✓" if delivered else "?" _marker.modulate = Color(0.4, 0.9, 0.4) if delivered else Color(1, 1, 1)