Penguin
How the rockhopper moves up the Luteway. It sits on the player body the scene spawns, reads the `luteway.climb.climb` scheme, and writes `LW.state.player` every frame. What the body LOOKS like belongs to the penguin slice, reached through the handle `LW.provide.makePenguin` retur…
Penguin
How the rockhopper moves up the Luteway. It sits on the player body the scene
spawns, reads the luteway.climb.climb scheme, and writes LW.state.player
every frame. What the body LOOKS like belongs to the penguin slice, reached
through the handle LW.provide.makePenguin returns.
The moves
| Sidle | move — one axis. Lute drags at it; ice takes the feet out from under a penguin not carrying enough lute to grip. |
| Hop | hop — the press launches, the hold decides the height. Letting go while still rising cuts it short. Coyote time after a ledge ends, and a hop asked for just before landing is kept. |
| Cling | Automatic. Airborne, falling, feet at clingNeeds or stickier, and steering into the cliff wall. The penguin sticks and slides down it slowly. |
| Kick off | hop while clinging. It leaves the wall at nearly twice the sidle speed and at FULL height whatever the feet carry — the wall is only reachable because they are sticky, so the lute does not shorten it. For a beat afterwards the kick owns the horizontal, or the steering still pressed into the wall would cancel it. |
| Shake | shake — sheds every trace of lute, grounded only, and roots the penguin for shakeStun seconds. That beat is its whole cost, and the sea keeps rising through it. |
The numbers that matter
A clean full hop clears LW.reach(). One landing on lute takes that down by
about fifteen percent, two by a third, and LW.hopHeight(sticky) /
LW.hopSpan(sticky, rise) give the exact figures — which is how a route's
ledge spacing and this controller stay in agreement. Every one of them lives in
LW.PENGUIN.
What it publishes
LW.state.player — x y vx vy facing grounded clinging sticky shaking surface entityId — plus the events hop, land, cling, slip, shake, sticky,
and an LW.sfx one-shot beside each.
Staying wired
Reloading luteway.game gives it a new event bus and a new blackboard while
this component keeps running, so the controller checks each frame that the
blackboard still names its body and that a probe on the bus comes back. When
either says otherwise it binds the controls and the reset listener again. It
does not re-place the penguin: a reload mid-run must not send it back down to
the beach.
Scoped to this part · feeds back into the world's score.