vrp-years-apart/ChronoWatch.gd

113 lines
3.0 KiB
GDScript

extends Node3D
# Wir definieren unsere 2 Altersstufen
enum AgeState { BABY, TEEN }
var current_age = AgeState.BABY
# Referenzen zu den anderen Nodes
@export var controller : XRController3D
@export var player_body : CharacterBody3D
@export var player : XROrigin3D
@export var world_env : WorldEnvironment
@export var movement_direct : Node
# NEU: Referenz zur Kamera für den FOV-Effekt
@export var camera : Camera3D
func _ready():
if not controller:
controller = get_parent().get_parent()
if controller:
controller.button_pressed.connect(_on_button_pressed)
print("Uhr verbunden mit Controller: ", controller.name)
# Initial einmal hart setzen
apply_age_physics(false)
func _on_button_pressed(button_name: String):
match button_name:
"trigger_click": # Älter
change_age(1)
"grip_click": # Jünger
change_age(-1)
func change_age(direction: int):
var new_age_value = current_age + direction
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])
apply_age_physics(true)
func apply_age_physics(animate: bool = true):
# Sicherheitscheck erweitert um Camera
if not player_body or not world_env or not movement_direct or not camera:
printerr("FEHLER: Bitte ALLE Nodes (auch Camera) im Inspektor zuweisen!")
return
# Ziel-Werte 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 # NEU: Variable für FOV
var translation_step = Vector3.ZERO
match current_age:
AgeState.BABY:
target_saturation = 2.0
target_height_min = 0.2
target_height_max = 0.6
target_speed = 1.0
target_fov = 40.0 # NEU: Enger Blick (Baby Tunnelblick)
translation_step = Vector3(0, 0.05, 0)
AgeState.TEEN:
target_saturation = 0.5
target_height_min = 0.6
target_height_max = 2.5
target_speed = 3.0
target_fov = 75.0 # NEU: Normaler Blick
translation_step = Vector3(0, 0.5, 0)
# Sofortige Änderungen (Sicherheit)
if animate:
player.translate(translation_step)
player_body.player_height_min = target_height_min
if animate:
# --- ANIMATION START ---
var tween = create_tween()
tween.set_parallel(true)
tween.set_trans(Tween.TRANS_SINE)
tween.set_ease(Tween.EASE_IN_OUT)
# 1. Environment Sättigung
tween.tween_property(world_env.environment, "adjustment_saturation", target_saturation, 1.0)
# 2. Körpergröße
tween.tween_property(player_body, "player_height_max", target_height_max, 1.0)
# 3. Geschwindigkeit
tween.tween_property(movement_direct, "max_speed", target_speed, 1.0)
# 4. Kamera FOV (NEU)
tween.tween_property(camera, "fov", target_fov, 1.0)
else:
# Start-Setup (Hart setzen)
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 # NEU