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

CrowVisual

What the Old Crow looks like, and what its body is doing. Sits beside `game.CrowController` on the player prototype's `body` and owns everything under a single child named `crow_visual`, rebuilt on every awake so a clone made for a joining player carries exactly one bird.

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

game.CrowVisual

What the Old Crow looks like, and what its body is doing. Sits beside game.CrowController on the player prototype's body and owns everything under a single child named crow_visual, rebuilt on every awake so a clone made for a joining player carries exactly one bird.

Three modules under it, each with one job:

ModuleJob
game.crow.shapesarrays in, geometry out — the sweep every part is made by
game.crow.rigthe anatomy: which mesh, on which joint, where
game.crow.poseswhat the body does, and the springs that get it there

The bird is built at whatever size the anatomy came out and then scaled once so it stands exactly CF.RULES.crowHeight from claw to crown — the reach the climb slice's CF.grabbable catches a lip with. Change the anatomy and the scale follows; nothing here is a measured constant.

What drives it

The pose is chosen from CF.state every frame — hanging, airborne, weak, moving, still, won, lost — and interrupted by one-shots the CF events fire: hop, land (longer for a harder landing), grab, pullup, drop, peck, eat, fall. crumble and tooWeak set a startle that snaps the neck up and flicks the wings. reset puts it back to idle.

On top of the pose blend sit the overlays — the things a body does continuously rather than in poses: the breath, the wingbeat, the stride while sidling, the head keeping itself level against the hunch below it, the toes closing on what they are standing on, the tail answering the fall, and a blink.

API

local cv = entity.component.get("game.CrowVisual")
cv:setPose("fly", 3)     -- force a pose for N seconds — a staged moment
cv:poseState()           -- { pose, scale, restHeight, yaw, shot, shotT }

Owned by the crow slice. See /zero/source/design/spec.md.

Interface

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

conforms to

zero/source-extract/v2

CrowVisual — what the Old Crow looks like, and what its body is doing. Sits beside CrowController on the prototype's body and owns everything under a single child named "crow_visual", rebuilt every time the component wakes so a clone made for a joining player carries exactly one bird. Three modules under it, each with one job: game.crow.shapes arrays in, geometry out — the sweep every part is made by game.crow.rig the anatomy: which mesh, on which joint, where game.crow.poses what the body does, and the springs that get it there The bird is BUILT at whatever size the anatomy came out, and then scaled once so it stands exactly CF.RULES.crowHeight from claw to crown — the reach the climb slice's `CF.grabbable` catches a lip with. Change the anatomy and the scale follows; nothing here is a measured constant. The pose is chosen from CF.state every frame (hanging, airborne, weak, moving, still) and interrupted by one-shots the CF events fire (land, peck, pull-up). `ref:setPose(name, hold)` overrides it from outside for a staged moment. Owned by the `crow` slice. See /zero/source/design/spec.md.

shoot(name: string, seconds: number) → void

argtypedescription
namestring
secondsnumber

build( ) → void

Tear down whatever is under the mount and put a whole new bird there. Called on every awake, so a hot reload and a joining peer both get exactly one.

chooseBase( ) → string

What the body should be doing, from what is true right now.

apply(dt: number) → void

argtypedescription
dtnumber

ang(name: string) → number

argtypedescription
namestring

write(name: string, extra: number) → void

argtypedescription
namestring
extranumber

setPose(name: string, hold: number?) → void

Force a pose from outside — a staged moment, an end card, a test. `hold` is how many seconds it wins over what CF.state would have chosen.

argtypedescription
namestring
holdnumber?

poseState( ) → void

What the visual is doing right now, for anyone verifying it.

awake( ) → void

update(dt: number) → void

argtypedescription
dtnumber

editorUpdate(dt: number) → void

argtypedescription
dtnumber

onDestroy( ) → void

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
# CF The blackboard of *First Light: Crowfeet*. One module every part of the game requires: ```luau local CF = require("game.CF") ``` ## What is in it | | | |---|---| | `CF.RULES` | every number the game is tuned by | | `CF.PALETTE` | the colours everything composes to | | `CF.FILMED` | the shape the run films at (1080x1440) | | `CF.layout` | the cliff: `ledges`, `food`, `summitY`, `top`, `halfWidth`, `apex` | | `CF.state` | what is true right now | | `CF.landing` / `CF.grabbable` | the two ledging tests | | `CF.on` / `CF.off` / `CF.emit` | the event bus | | `CF.setPhase` / `CF.reset` / `CF.say` / `CF.progress` / `CF.sz` | | | `CF.camera` | filled in by the camera: `panTo` `zoomTo` `release` `kick` | ## The cliff `CF.layout.ledges` is 28 shelves from the strand at y 0 to the roost at `summitY`, each `{ id, x, y, w, kind, fallen }` with `kind` one of `strand` `rock` `crumble` `roost`. A shelf's TOP is at `y` and it spans `x ± w/2`. `CF.layout.food` is `{ id, ledge, kind, x, y, eaten }` with `kind` one of `grub` `limpet` `crowfoot`. It is built deterministically, so every peer and every slice sees the same cliff. Two numbers shape it. `CF.layout.apex` is how high one hop rises. Every SHORT gap is under it and is landed on; every TALL gap is over it, so the only way up is to catch the lip. And the shelf above a crumble shelf is placed back over the shelf below it, so a crumble that has given way never seals the climb. ## The two ledging tests - `CF.landing(x, yFrom, yTo)` — the shelf whose top the crow's feet crossed going down this frame, highest first. Returns nil, or the ledge. - `CF.grabbable(x, feetY, facing)` — the shelf whose near lip is within reach of an airborne crow's crown, in the direction it is facing. Returns nil, or the ledge and the x of that lip. Both ignore a shelf whose `fallen` is set. ## The state `phase` (`title` `opening` `climb` `won` `lost`) · `hunger` · `dawn` 0..1 · `time` · `crow { x, y, vx, vy, facing, grounded, hanging, ledge }` · `altitude` · `eaten` · `hops` · `crumbled` · `lostReason` (`starved` `sea` `late`) · `paused`. The climb slice writes it; everyone else reads it. `CF.reset()` puts a round back — the state, the food and the fallen shelves — and `restart` is answered here, so a round can always be put back. ## The events `start` `restart` `reset` `phase` `pause` · `hop` `land` `grab` `pullup` `drop` `peck` `eat` `tooWeak` `crumble` `crumbled` `fall` · `hungerLow` `firstLight` · `line` `ui`. `crumble` fires when the crow's weight first lands on a crumble shelf, and it has `RULES.crumbleDelay` left to stand. `crumbled` fires when it goes. ## Laying out for any screen `CF.sz(fraction)` is a fraction of the SHORTER screen edge, read live from `ui.screenSize()`, so one number lays out the same on a phone held either way and on a television.
▲ 0↑ born
backing path · game/CrowVisual.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.