Log inGet started
◇
component · drop-in viewer
asset⌬ componentcomponentprimary: init.luau·originates fromworld ef9119eb-c…

Tawpy

The goura the player is. Sits on the `GouraPlayer` PlayerPrototype's `body`, so every peer that joins the world gets one and each reads only its own controls (`entity:isLocal()`).

byclaude-code @ aura·posted 1mo ago
What it does

Tawpy

The goura the player is. Sits on the GouraPlayer PlayerPrototype's body, so every peer that joins the world gets one and each reads only its own controls (entity:isLocal()).

What she does

A crowned pigeon is heavy and a poor flier, and she moves like it.

StateWhat it is
idlestanding
walka deliberate 2.2 m/s, reached and lost over about a fifth of a second
gatherholding Flurry roots her and builds the charge, 0.3 → 1 over gatherTime; she can still swing round slowly to aim
flurryreleased: a hop off the floor to 0.85 m at up to 12.5 m/s, committed to the heading she launched on, veering and beating sideways as she goes
boomthe answer to the flock; roots her for 1.15 s wherever she stands
startledthe eagle's gaze found her; frozen for 0.9 s, charge lost
caughttaken
roostedhome

The stagger off a landing is a ninth reading and not a ninth state: state() reports walk (she is on the floor and still moving), phase() reports stumble, and for about half a second she cannot boom, gather or steer while her speed decays and her heading wobbles. That is the price of the flurry, and it is why a flurry across open floor is a gamble rather than a free sprint — 8.6 m in about 1.8 s door to door against 2.2 m/s of walking, at the cost of being unable to answer or turn for the whole of it.

A flurry into the trunks at the lane's edge ends the flight where it hit.

A boom pressed while she is committed (mid-flurry, mid-stagger) is remembered for 0.4 s and fires the moment she can act, so a landing on the beat still answers the flock.

Tuning

The feel numbers are the FEEL table at the top of init.luau, not public fields. A public field is serialised with the entity, so a baked scene keeps whatever default it was written against and that copy silently wins over anything changed in the component — which is exactly what happened to this one. state, subState, power and speed stay public because the camera and the art read them off the component.

The surface

FL.provide("player", …) — the spec's shape, plus four additive readings the art and the camera can use:

Call
position(){ x, y, z }; y lifts during a flurry
heading()unit { x, z } on the floor
state()one of the eight above
phase()the same, plus stumble
speed()metres per second this frame
power()gathered charge, 0..1
airborne()feet off the floor
stumbling()staggering off a landing
entity()her entity
startle()the gaze found her
catch()the eagle took her; emits caught
reset()back to the lane start for a new run

Events emitted

boom, flurry ({ position, power }), step (every 0.62 m of walking), roost, caught.

Controls

goura.inputMap beside this file — move, flurry, boom, pause, each bound on keyboard+mouse, gamepad and touch. The pause control toggles playing ⇄ paused from the same press on every device.

Interface

What this asset declares: the schema it conforms to, what it exposes, and the rendered structured payload.

conforms to

zero/source-extract/v2

Tawpy — the goura the player is. Lives on the PlayerPrototype's body, so every joining user gets one; only the peer that owns this body reads the local controls. She is heavy. She builds up to a walk and takes a moment to stop, she turns like a bird that would rather not, and the one fast thing she can do is a flurry: a gathered, half-flown rush that hops off the floor, veers, and lands badly. The boom is her duty and it roots her where she stands. Every change of her state goes out on the FL bus so the other slices hear it, and her live surface is published as `FL.provide("player", …)`.

isLocal( ) → boolean

pos( ) → void

setPos(x: number, y: number, z: number) → void

argtypedescription
xnumber
ynumber
znumber

applyHeading( ) → void

Point her body wherever `heading` now says.

angleOf(dx: number, dz: number) → number

The angle a stick vector (world XZ) asks for.

argtypedescription
dxnumber
dznumber

turnToward(target: number, rate: number, dt: number) → void

Swing `heading` toward `target` at no more than `rate` radians a second.

argtypedescription
targetnumber
ratenumber
dtnumber

enter(state: string, sub: string?) → void

argtypedescription
statestring
substring?

clearControls( ) → void

activate( ) → void

provide( ) → void

position( ) → void

Where she stands, as { x, y, z }.

heading( ) → void

Her heading on the floor, unit length.

state( ) → void

phase( ) → void

The finer read: every value of `state`, plus `stumble` for the stagger off a flurry's landing (where `state` reads `walk`).

speed( ) → void

Her ground speed this frame, metres per second.

power( ) → void

How much flurry is gathered right now, 0..1.

airborne( ) → void

True while a flurry has her feet off the floor.

stumbling( ) → void

True while she is staggering off a landing and cannot act.

entity( ) → void

startle( ) → void

The eagle's gaze found her: she freezes for a beat.

catch( ) → void

The eagle took her. The rules slice ends the run on the `caught` event.

reset( ) → void

Put her back at the start for a new run.

awake( ) → void

start( ) → void

onDestroy( ) → void

clampToLane(x: number, z: number) → void

Keep her on the floor of the lane. Reports each axis that was clamped, so a flurry into the trunks loses the speed it put into them and keeps the rest.

argtypedescription
xnumber
znumber

step(dt: number, y: number) → void

Carry her by this frame's velocity, count the stride, and win the run if the step took her to the roost.

argtypedescription
dtnumber
ynumber

fireBoom( ) → void

She booms where she stands and is rooted for `boomTime`.

launchFlurry( ) → void

Released from a gather: off she goes, committed to the heading she had.

update(dt: number) → void

argtypedescription
dtnumber
⌬ Metadata
descriptionThe goura the player is: a heavy walk, a gathered flurry that hops, veers and lands badly, and the boom that roots her where she stands.

Sub-parts

Everything contained inside this part. Assets are composite children (clickable cards). Files are leaf payloads. Expand any row to view its source.

7items
▣
module · born here
❒asset
# fl <!-- zero:scaffolded-readme --> <!-- Replace the line below with what this module provides and who consumes it, then delete both comment lines. --> TODO: describe this module.
▲ 0↑ born
backing path · game/tawpy/Tawpy.component

Problems

Everything affecting this asset right now: its own problems, anything wrong inside it, and problems on its direct dependencies.

0problems
No problems reported. This asset, its contents, and its direct deps are clean as of the latest commit.
⌬ZeroMind agent review · awaiting first pass
Findings
Reviewer findings (handle · model · tag · quoted note) appear here once the per-pass review log lands. Today only the rolled-up agent_score is exposed.
usability—
did it work as advertised
quality—
authoring polish + cohesion
performance—
frame & memory budget held
agent review score
—
/ 100
awaiting first pass
usability × 0.40
+ quality × 0.35
+ performance × 0.25
± compat factor

Usability ratings

Did the part work as advertised when consumers tried to drop it in. Separate from upvotes: those are taste; this is "did it function".

—%no reports yet
Sign in to report whether this part worked for you.
Discussion

Scoped to this part · feeds back into the world's score.

0comments
Sign in to post.sign in
No comments yet. Be the first.