ghost-delivery/DropZone/drop_zone.gd

41 lines
1.3 KiB
GDScript

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)