extends TextureRect var original_texture: Texture2D var start_position: Vector2 var organ_name := "bubble" var was_dropped := false var start_camera_position: Vector2 var start_camera_zoom: Vector2 var click_locked := false var hint_shown := false func _ready() -> void: original_texture = texture start_position = global_position mouse_filter = MOUSE_FILTER_STOP $"../SnapSoundPlayer".finished.connect(_on_snap_finished) func _gui_input(event: InputEvent) -> void: if event is InputEventMouseButton and event.pressed: var main = get_tree().root.get_node("Main") if main.interaction_locked: print("⛔️ Interaktion noch gesperrt!") return if click_locked: return if not hint_shown and not was_dropped: _play_hint() func _get_drag_data(_position: Vector2) -> Variant: var main = get_tree().root.get_node("Main") if main.interaction_locked or was_dropped: return null if not main.is_correct_organ(organ_name): main.play_wrong_order_sound() return var preview := Control.new() var preview_texture := TextureRect.new() preview_texture.texture = original_texture preview_texture.expand_mode = TextureRect.EXPAND_FIT_WIDTH_PROPORTIONAL preview_texture.size = size preview_texture.pivot_offset = size * 0.5 preview_texture.position = -preview_texture.pivot_offset preview.add_child(preview_texture) set_drag_preview(preview) texture = null return { "organ": organ_name, "node": self, "texture": original_texture } func _notification(what: int) -> void: if what == NOTIFICATION_DRAG_END and not get_viewport().gui_is_drag_successful(): _reset_drag() func _reset_drag() -> void: if was_dropped: return texture = original_texture global_position = start_position visible = true print("🔁 Drag zurückgesetzt") func start_zoom_and_animation() -> void: var main = get_tree().root.get_node("Main") if click_locked: return main.interaction_locked = true var cam = get_tree().root.get_node("Main/Camera2D") as Camera2D cam.make_current() start_camera_position = cam.global_position start_camera_zoom = cam.zoom var target = global_position - Vector2(75, 350) var sprite = $"../BlasenAnimation" sprite.visible = false sprite.z_index = 100 var tween = create_tween() click_locked = true tween.tween_property(cam, "global_position", target, 1.0).set_ease(Tween.EASE_OUT) tween.parallel().tween_property(cam, "zoom", Vector2(2.3, 2.3), 1.0).set_ease(Tween.EASE_OUT) tween.tween_callback(Callable(self, "_play_gif")) func _play_gif() -> void: AudioManager.stop_all_audio_players() $"../SnapSoundPlayer".play() $"../BlasenAnimation".visible = true $"../BlasenAnimation".play("default") func _on_snap_finished() -> void: $"../BlasenAnimation".visible = false $"../BlasenAnimation".stop() _start_zoom_back() func _start_zoom_back() -> void: var cam = get_tree().root.get_node("Main/Camera2D") as Camera2D var tween = create_tween() tween.tween_property(cam, "zoom", start_camera_zoom, 1.0).set_ease(Tween.EASE_OUT) tween.parallel().tween_property(cam, "global_position", start_camera_position, 1.0).set_ease(Tween.EASE_OUT) tween.tween_callback(Callable(self, "_unlock")) var main = get_tree().root.get_node("Main") main.advance_organ_order() func _unlock() -> void: var main = get_tree().root.get_node("Main") main.interaction_locked = false click_locked = false print("✅ Wieder klickbar!") func _play_hint() -> void: print("🧠 Hinweis wird abgespielt") AudioManager.stop_all_audio_players() $"../HintSoundPlayer".play()