41 lines
1.3 KiB
GDScript
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)
|