2 Commits

Author SHA1 Message Date
6eb6758216 Right-size POIs and fix interaction prompt visibility + terrain snap
Three compounding issues, found via user testing:

1. Sprite was 2.56x2.56 units (raw 256px checkerboard at default
   pixel_size) — 5x wider than the player, and collision shapes sized
   to roughly match. Gave AnimatedSprite3D an explicit pixel_size
   (0.004) for a ~1 unit sprite, shrunk the solid CylinderShape3D to
   radius 0.4/height 1.0 and the Area3D trigger sphere to radius 0.6
   accordingly (still >= the solid radius, so touching = interactable
   holds).

2. InteractionPrompt had zero vertical offset, sitting dead center of
   the (huge) sprite — rendering behind/inside it, so the "[F]
   Interact" hint never appeared even though proximity detection and
   the keypress itself worked (confirmed by the user: pressing F did
   work, the hint just never showed telling them to). Gave both
   NameLabel and InteractionPrompt proper offsets above the sprite.

3. Once the collision shapes shrank, a pre-existing ~0.7 unit gap
   between each POI's hand-placed Y (computed with the same
   radius-only height approximation that's only exact along a
   facet's straight edges, not its interior — same class of error as
   the earlier Ort6 out-of-bounds bug) and the true terrain surface
   became consequential: the small collider mostly floated above the
   real ground, giving wildly direction-dependent, sometimes entirely
   missing contact/interaction depending on approach angle. Root-fixed
   rather than re-deriving 36+ positions' exact heights by hand again:
   poi.gd/poi_gate.gd now raycast straight down against the terrain
   in _ready() (after one physics_frame, so the terrain's collision
   shape has had time to register) and snap themselves onto the real
   surface plus a small clearance.

Verified headless: approaching a POI from 4 different directions now
gives consistent ~0.56 unit contact distance and player_nearby=true
in all four (previously: two directions barely touched at ~0.05 units
with interaction never triggering, the other two behaved correctly —
direction-dependent failure, now gone). Re-ran the full 6-gate chain
(still passes) and gate-to-border-prop clearance across 3 randomized
layouts (still 1.3-1.9 units clear, no regression).
2026-08-27 10:05:11 +02:00
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