extends Node2D class_name DragComponent @export var MouseIntComp: MouseInteractionComponent ##Where the player klicks to drag the component @export var intBox: InteractBoxMinigame ##Used to determine if this component interacts with another component @export var canDrag: bool = true ##If true the component can be moved by dragging it @export var singleDrag: bool = true ##If true the component can only be moved when its the only dragged component @export var resetWhenLetGo: bool = false ##If the player stops dragging the component returns to its home pos @export var lockWhenatGoal: bool = false ##If the component reaches a goal, it cannot be dragged anymore @export var openLockOnClick: bool = false ##If the component is clicked (Impulse) it will stop being locked at its goal (THIS REQUIRES LOCK WHEN AT GOAL TO BE TRUE) @export var goalID: int = 0 ##What goals this component can interact with (All goals of the same ID) @export var homePos: Vector2 = Vector2(0,0) ##If this is 0,0 it gets set to the current position on ready @export var goalPos: Vector2 = Vector2(0,0) ##Position of goal where to component can be dragged to stay there var leftMouseClicked: bool = false var atGoal: bool = false var goalSocket: GoalBox var mousePos: Vector2 = Vector2(0,0) func _ready() -> void: if intBox: intBox.area_entered.connect(areaEntered) intBox.area_exited.connect(areaExited) if MouseIntComp: MouseIntComp.stickyHold = true MouseIntComp.actionPressed.connect(interactionClicked) if !homePos: homePos = self.position else: self.position = homePos func _input(event: InputEvent) -> void: if event is InputEventMouse: mousePos = event.position func _process(_delta: float) -> void: if atGoal and lockWhenatGoal: self.position = goalPos canDrag = false MouseIntComp.monitorable = false return else: MouseIntComp.monitorable = true if openLockOnClick and !atGoal: lockWhenatGoal = true if !canDrag: return if MouseIntComp.actionHeld: self.position = mousePos elif atGoal: self.position = goalPos elif resetWhenLetGo: self.position = homePos func interactionClicked() -> void: if openLockOnClick and atGoal: lockWhenatGoal = false canDrag = true func areaEntered(area: Area2D) -> void: if area is GoalBox: if area.goalID == goalID: goalPos = area.position atGoal = true goalSocket = area if area is MouseInteractionComponent and singleDrag and canDrag: MouseIntComp.actionHeld = false self.position = homePos func areaExited(area: Area2D) -> void: if area is GoalBox: if area.goalID == goalID: atGoal = false if area == goalSocket: goalSocket = null func adaptCoordinateScale(input: Vector2) -> Vector2: return input / Vector2(1152,648) * Vector2(DisplayServer.window_get_size())