extends Node3D # Wir definieren unsere 2 Altersstufen enum AgeState { BABY, TEEN } var current_age = AgeState.BABY # --- REFERENZEN (Müssen im Inspektor zugewiesen werden) --- # 1. Player & Controller @export var controller : XRController3D @export var player_body : CharacterBody3D @export var player : XROrigin3D @export var movement_direct : Node @export var camera : Camera3D # 2. Environment @export var world_env : WorldEnvironment # 3. Audio @export var audio_baby : AudioStreamPlayer3D @export var audio_teen : AudioStreamPlayer3D # 4. Tipi / Burg Meshes @export var mesh_castle : Node3D @export var mesh_fort : Node3D # 5. Interaktive Objekte @export var heavy_object : RigidBody3D # Das Regal @export var age_paper : Node3D # Das Papier mit dem Hinweis func _ready(): # Automatisch Controller finden, falls vergessen if not controller: controller = get_parent().get_parent() if controller: controller.button_pressed.connect(_on_button_pressed) print("Uhr verbunden mit Controller: ", controller.name) else: printerr("FEHLER: Kein Controller gefunden!") # Initial einmal hart setzen (ohne Animation) apply_age_physics(false) func _on_button_pressed(button_name: String): match button_name: "trigger_click": # Älter werden change_age(1) "grip_click": # Jünger werden change_age(-1) func change_age(direction: int): var new_age_value = current_age + direction # Begrenzen: Nicht jünger als Baby, nicht älter als Teen if new_age_value < AgeState.BABY: print("Du bist schon ein Baby!") return elif new_age_value > AgeState.TEEN: print("Du bist schon erwachsen!") return current_age = new_age_value print("Wechsle Alter zu: ", AgeState.keys()[current_age]) # Physik und Aussehen aktualisieren (mit Animation) apply_age_physics(true) func apply_age_physics(animate: bool = true): # Sicherheitscheck: Sind alle Nodes zugewiesen? if not player_body or not world_env or not movement_direct or not camera or not audio_baby or not audio_teen or not mesh_castle or not mesh_fort or not heavy_object or not age_paper: printerr("FEHLER: Bitte ALLE Referenzen (auch Age Paper!) im Inspektor der Uhr zuweisen!") return # --- ZIELWERTE DEFINIEREN --- var target_saturation = 1.0 var target_height_max = 0.0 var target_height_min = 0.0 var target_speed = 0.0 var target_fov = 75.0 var target_vol_baby = -80.0 var target_vol_teen = -80.0 var translation_step = Vector3.ZERO # Logik-Status Variablen var show_castle = false var show_fort = false var make_object_movable = false var is_teen_state = false match current_age: AgeState.BABY: # BABY WERTE target_saturation = 2.0 # Bunt target_height_min = 0.2 target_height_max = 0.6 # Klein target_speed = 1.0 # Langsam target_fov = 40.0 # Tunnelblick # Audio: Baby an, Teen aus target_vol_baby = 0.0 target_vol_teen = -80.0 # Sicherheitsabstand beim Schrumpfen translation_step = Vector3(0, 0.05, 0) # Meshes: Burg sichtbar show_castle = true show_fort = false # Interaktionen make_object_movable = false # Regal fest is_teen_state = false # Papier = Gekritzel AgeState.TEEN: # TEEN WERTE target_saturation = 0.5 # Grau target_height_min = 0.6 target_height_max = 2.5 # Groß target_speed = 3.0 # Schnell target_fov = 75.0 # Weitblick # Audio: Baby aus, Teen an target_vol_baby = -80.0 target_vol_teen = 0.0 # Sicherheitsabstand beim Wachsen translation_step = Vector3(0, 0.5, 0) # Meshes: Deckenburg sichtbar show_castle = false show_fort = true # Interaktionen make_object_movable = true # Regal beweglich is_teen_state = true # Papier = Klartext # --- ANWENDUNG --- # 1. Sofortige Schaltungen (Visuelles & Physik Logik) mesh_castle.visible = show_castle mesh_fort.visible = show_fort # Regal update if heavy_object.has_method("set_movable"): heavy_object.set_movable(make_object_movable) # Papier update (NEU) if age_paper.has_method("update_texture"): age_paper.update_texture(is_teen_state) # 2. Sofortige Positionierung (gegen Stuck-Bugs) if animate: player.translate(translation_step) player_body.player_height_min = target_height_min # 3. Animationen (Tweening) if animate: var tween = create_tween() tween.set_parallel(true) tween.set_trans(Tween.TRANS_SINE) tween.set_ease(Tween.EASE_IN_OUT) # Alle Werte über 1 Sekunde blenden tween.tween_property(world_env.environment, "adjustment_saturation", target_saturation, 1.0) tween.tween_property(player_body, "player_height_max", target_height_max, 1.0) tween.tween_property(movement_direct, "max_speed", target_speed, 1.0) tween.tween_property(camera, "fov", target_fov, 1.0) tween.tween_property(audio_baby, "volume_db", target_vol_baby, 1.0) tween.tween_property(audio_teen, "volume_db", target_vol_teen, 1.0) else: # Start-Setup (Hart setzen ohne Animation) world_env.environment.adjustment_saturation = target_saturation player_body.player_height_max = target_height_max movement_direct.max_speed = target_speed camera.fov = target_fov audio_baby.volume_db = target_vol_baby audio_teen.volume_db = target_vol_teen