katheterkompass/organ_magen.gd

121 lines
3.4 KiB
GDScript

extends TextureRect
var original_texture: Texture2D
var start_position: Vector2
var organ_name := "stomach"
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(110, 250)
var sprite = $"../MagenAnimation"
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()
$"../MagenAnimation".visible = true
$"../MagenAnimation".play("default")
func _on_snap_finished() -> void:
$"../MagenAnimation".visible = false
$"../MagenAnimation".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"))
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()