Jonas Reith c6d7e6c84e Restructure project into boot/autoload/world/player folders
Flat root layout replaced with a domain-based structure:
- autoload/    the two existing singleton scripts (InteractionManager,
               InteractionUI) — grouped by role, matching project.godot's
               [autoload] section
- world/       the flying island: terrain.gd, and world/poi/ for the POI
               marker + gate scripts/scenes
- player/      everything about the player as a character: player.gd/.tscn,
               camera_rig.gd (it only exists to follow the player)
- boot/        created empty for now, will hold the opening/menu screens

main.tscn renamed to world/island.tscn — "main" stops making sense once
the actual run/main_scene becomes a boot screen (next commit). Verified
via grep that main.tscn was referenced nowhere else by path (only by UID
elsewhere, which self-heals).

Every .gd got its .uid sidecar moved alongside it. Two ext_resource
entries had no UID (poi_gate.tscn's own script ref, and island.tscn's
ref to poi_gate.tscn) and needed their path= fixed by hand; everything
else is UID-based and resolved itself after a project reimport.

Also removed two untracked-looking but actually committed editor temp
files (preview_scene.tscn*.tmp, leftovers from the unused hterrain
addon, referenced nowhere).

Verified headless: all 8 affected scenes (island, poi, poi_gate,
player, interaction_ui, and the three debug prototypes that reference
moved files) load with exit code 0. No behavior change, pure move.
2026-08-27 09:18:17 +02:00

63 lines
1.5 KiB
GDScript
Executable File

extends CharacterBody3D
@export var move_speed: float = 5.0
@export var gravity: float = 9.8
var camera_rig: Node3D
@onready var sprite: AnimatedSprite3D = $AnimatedSprite3D
func _ready() -> void:
camera_rig = get_tree().get_first_node_in_group("camera_rig")
if camera_rig == null:
push_error("CameraRig nicht gefunden! Gruppe 'camera_rig' gesetzt?")
func _physics_process(delta: float) -> void:
# Bewegung sperren während Interaction
if InteractionManager.active:
velocity = Vector3.ZERO
return
# Schwerkraft
if not is_on_floor():
velocity.y -= gravity * delta
# Eingabe
var input_dir = Vector2(
Input.get_axis("move_left", "move_right"),
Input.get_axis("move_forward", "move_backward")
)
if input_dir != Vector2.ZERO:
var cam_basis = camera_rig.global_transform.basis
var forward = -cam_basis.z
var right = cam_basis.x
forward.y = 0
right.y = 0
forward = forward.normalized()
right = right.normalized()
var move_dir = (forward * -input_dir.y + right * input_dir.x).normalized()
velocity.x = move_dir.x * move_speed
velocity.z = move_dir.z * move_speed
_update_animation(input_dir)
else:
velocity.x = move_toward(velocity.x, 0, move_speed)
velocity.z = move_toward(velocity.z, 0, move_speed)
sprite.play("idle")
move_and_slide()
func _update_animation(input_dir: Vector2) -> void:
if input_dir.y > 0.1:
sprite.play("move_down")
elif input_dir.y < -0.1:
sprite.play("move_up")
elif input_dir.x > 0.1:
sprite.play("move_right")
elif input_dir.x < -0.1:
sprite.play("move_left")
else:
sprite.play("idle")