extends Area2D class_name CursorMagnet signal dragged(node: Draggable) signal dropped(node: Draggable) func find_closest_target() -> Draggable: var bodies = get_overlapping_bodies() var min_distance: float = INF var to_drag: Node = null for body in bodies: for target in body.find_children("Draggable", "Draggable", false, false): var distance = position.distance_to(target.position) if distance < min_distance: min_distance = distance to_drag = target return to_drag var dragging: Draggable = null func drag(): var target = find_closest_target() if target: dragging = target target.drag() dragged.emit(target) func drop(): if dragging: var target = dragging dragging = null target.drop() dropped.emit(target) func _input(event: InputEvent) -> void: if event is InputEventMouseButton: if event.button_index == MOUSE_BUTTON_LEFT: if event.pressed: drag() else: drop() func _on_dragged(node: Draggable) -> void: Log.p(self, "Dragged: %s" % node) func _on_dropped(node: Draggable) -> void: Log.p(self, "Dropped: %s" % node) func _on_move(movement: Vector2) -> void: position += movement