extends Window class_name Dragon @export var dragon_speed: float = 20.0 @onready var _actual_position: Vector2 = position var main_window_rect: Rect2i @onready var draggable: Draggable = $DragDropDetector var _walking: bool = false var _thinking_path: bool = false var _target_pos: Vector2 var rng: RandomNumberGenerator = RandomNumberGenerator.new() signal place_back(dragon: Dragon) func on_place_back() -> void: place_back.emit(self) func _ready() -> void: _pick_random_screen_position() func _process(delta: float) -> void: if draggable.dragging: _actual_position = position return if not _walking: if not _thinking_path: _thinking_path = true await get_tree().create_timer(rng.randf_range(2, 7)).timeout _pick_random_screen_position() _move_to_target(delta) func _move_to_target(delta: float): if _actual_position.distance_to(_target_pos) > 10.0: var direction: Vector2 = (_target_pos - _actual_position).normalized() _actual_position += dragon_speed * direction * delta position = _actual_position return _walking = false func _pick_random_screen_position() -> void: _walking = true _thinking_path = false var display_index: int = DisplayServer.window_get_current_screen() var work_area_position: Vector2i = DisplayServer.screen_get_usable_rect(display_index).position var work_area_size: Vector2i = DisplayServer.screen_get_usable_rect(display_index).size var random_pos: Vector2i = Vector2i( work_area_position.x + rng.randi_range(10, work_area_size.x - 10 - size.x), work_area_position.y + rng.randi_range(10, work_area_size.y - 10 - size.y) ) _target_pos = random_pos