SiteDirector
Slice C. Attached to the scene's `SitesRoot` mount point. Owns every place the Aurelian travels to and everything that happens when it gets there.
SiteDirector — the voyage
Slice C. Attached to the scene's SitesRoot mount point. Owns every place
the Aurelian travels to and everything that happens when it gets there.
- Five sites and the Gate. The Long Vigil (relic), The Sable Orchard,
Kiln Station (waystation), Cold Wake (relic), The Chorus Buoy (relic), and
The Aurelian Gate. Each is a landmark built from parts under its own
site_<id>root, with a world-space Text3D nameplate. Nothing is saved into the scene — every entity is spawnedtemporary. - The scan. Hold
Scan(E / pad west / the on-screen Scan button) insideDrift.config.scan.rangeof the nearest unread site. A dotted beam runs from the ship to the site while the lock holds, the nameplate reads out the percentage, and the site claims throughDrift.claimSiteon completion — which is what pays out charge, salvage, the relic and the codex fragment. A lock survives a short drift back out of range. - The yard. Alongside Kiln Station the trade opens:
Cycle(Q) moves the selection,Confirm(B) fits it. A board beside the station lists the refits, their marks and their prices. Salvage is only ever spent here. - The Gate. Dark until three relics are aboard, then its inner iris lights and crossing it wins the run.
- Both endings. Crossing the open Gate wins; the run ending any other way gets its own closing codex fragment.
Controls — sites.voyage.inputMap
| Control | Keyboard | Gamepad | Touch |
|---|---|---|---|
scan | E | west | Scan |
cycle | Q | north | Cycle |
buy | B | east | Confirm |
Outside the yard, cycle re-points the nav at the next unread site.
What this publishes on Drift.state
Everything below is written by this component and free for any other slice
to read. Drift.state is the contract's documented extension point, so none
of it needs an edit to drift.module.
Drift.state.targetDistance -- number, distance to the nav target
Drift.state.scan = {
active, -- boolean, a lock is being held right now
siteId, -- string, what is being scanned
siteName, -- string, its display name
t, -- 0..1 progress
inRange, -- boolean, something is close enough to scan
rangeSite, -- string, which site that is
}
Drift.state.shop = {
docked, -- boolean, alongside a waystation
station, -- string site id
selected, -- 1-based index into offers()
offers(), -- { { id, name, blurb, level, maxLevel, cost, maxed, affordable } }
cycle(), -- advance the selection, returns the new index
buy(id?), -- purchase; returns ok, message
describe(), -- the yard board as text
}
Drift.state.upgradeMul = {
thrust, maxSpeed, scanRange, scanSeconds, -- multipliers, start at 1
hullMax, chargeMax, -- additions, start at 0
}
A note for the helm (Slice A). A refit is held as a multiplier, not as a
one-off write. This component captures the un-upgraded numbers the first time
anything is bought and re-derives Drift.config.ship.thrust,
.boostThrust, .maxSpeed, Drift.config.hull.max,
Drift.config.charge.max and the two Drift.config.scan fields from that
base every frame. A helm that keeps its own base constants and writes them
each frame should multiply them by Drift.state.upgradeMul.thrust /
.maxSpeed — do that and this component's write becomes a no-op and the
refit the player paid for still lands.
Events it emits
Through the contract, never directly: scanStarted, scanProgress,
siteScanned, relicFound, codex, charged, salvage, upgraded,
gateOpened, targetChanged, notice, won.
It listens for gateOpened (lights the Gate), won and lost (appends the
closing codex fragment, whoever ended the run), and reset (puts every
landmark back the way it was built).
Scoped to this part · feeds back into the world's score.