197 lines
5.6 KiB
GDScript
197 lines
5.6 KiB
GDScript
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 castle : Node3D
|
|
@export var fort : Node3D
|
|
|
|
# 5. Interaktive Objekte
|
|
@export var heavy_object : RigidBody3D # Das Regal
|
|
@export var age_paper : Node3D # Das Papier mit dem Hinweis
|
|
|
|
@export var codepad : XRToolsViewport2DIn3D
|
|
|
|
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:
|
|
"ax_button": # Älter werden
|
|
change_age(1)
|
|
"by_button": # 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 castle or not 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
|
|
|
|
codepad.visible = false
|
|
|
|
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
|
|
|
|
codepad.visible = true
|
|
|
|
# --- ANWENDUNG ---
|
|
|
|
# 1. Sofortige Schaltungen (Visuelles & Physik Logik)
|
|
castle.visible = show_castle
|
|
castle.get_child(0).disabled = not show_castle
|
|
castle.get_child(1).disabled = not show_castle
|
|
castle.get_child(2).disabled = not show_castle
|
|
castle.get_child(3).disabled = not show_castle
|
|
castle.get_child(4).disabled = not show_castle
|
|
castle.get_child(5).disabled = not show_castle
|
|
fort.visible = show_fort
|
|
fort.get_child(0).disabled = not show_fort
|
|
fort.get_child(1).disabled = not show_fort
|
|
fort.get_child(2).disabled = not 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
|