crew
Procedural builder for every fruit-and-veg character in Banana 2077: the Rotten Crew thugs (tomato, broccoli punk, pineapple bruiser), the boss Don Aubergine, and the five Peel Kabuki civilians (orange, strawberry, carrot vendor, watermelon NCPD cop, grape kid). It also builds th…
game.enemies.crew
Procedural builder for every fruit-and-veg character in Banana 2077: the Rotten Crew thugs (tomato, broccoli punk, pineapple bruiser), the boss Don Aubergine, and the five Peel Kabuki civilians (orange, strawberry, carrot vendor, watermelon NCPD cop, grape kid). It also builds the drop and effect meshes: banana coins, snacks, juice droplets, splats and glow rings.
Crew.build(kind, parent) returns a rig of pivot entities (root, body, armL/armR, legL/legR) plus every Model entity, so a director can animate, tint and outline it. Meshes are generated once per kind and shared between instances.
Called by game.enemies.CrewDirector, which spawns, animates and fights with these rigs.
Interface
What this asset declares: the schema it conforms to, what it exposes, and the rendered structured payload.
conforms to
zero/source-extract/v2game.enemies.crew — the procedural Rotten Crew (tomato thug, broccoli punk, pineapple bruiser, boss Don Aubergine) and the fruit civilians of Peel Kabuki (orange, strawberry, carrot vendor, watermelon NCPD cop, grape kid). local rig = Crew.build(kind, parentEntity) rig.root ground pivot, +Z forward (move / yaw this) rig.body hip pivot for the whole upper body (lean, squash) rig.armL / rig.armR shoulder pivots, the arm hangs along -Y rig.legL / rig.legR hip pivots, the leg hangs along -Y rig.models every Model entity (tint flash, scan outline) Crew.SPECS[kind] hipY, armRoll, height, radius, weaponArm Crew.prop(name, parent, material?) coin, snack, droplet, splat, ring Each part is one mesh per material, so a character is ~20 Model entities and every instance of a kind shares the same GPU meshes.
at(g: any, pos: { number }?, rot: { number }?, scl: { number }?) → any
| arg | type | description |
|---|---|---|
| g | any | |
| pos | { number }? | |
| rot | { number }? | |
| scl | { number }? |
ball(rx: number, ry: number, rz: number, rows: number?, cols: number?, e: number?) → any
| arg | type | description |
|---|---|---|
| rx | number | |
| ry | number | |
| rz | number | |
| rows | number? | |
| cols | number? | |
| e | number? |
qa(axis: { number }, a: number) → void
| arg | type | description |
|---|---|---|
| axis | { number } | |
| a | number |
torus(R: number, r: number, rows: number?, cols: number?) → any
Torus around +Y (ring radius R, tube radius r).
| arg | type | description |
|---|---|---|
| R | number | |
| r | number | |
| rows | number? | |
| cols | number? |
cone(r: number, h: number) → any
Cone along +Y, base radius r, height h.
| arg | type | description |
|---|---|---|
| r | number | |
| h | number |
sphereProf(r: number) → void
| arg | type | description |
|---|---|---|
| r | number |
tube(pts: { { number } }, radii: { number }, rows: number?, cols: number?, opts: any?) → any
| arg | type | description |
|---|---|---|
| pts | { { number } } | |
| radii | { number } | |
| rows | number? | |
| cols | number? | |
| opts | any? |
surface(profile: { { number } }, sz: number?, lobe: any?) → any
A surface of revolution with helpers to put things ON it.
| arg | type | description |
|---|---|---|
| profile | { { number } } | |
| sz | number? | |
| lobe | any? |
R(y: number) → number
| arg | type | description |
|---|---|---|
| y | number |
at(y: number, th: number, off: number?, smooth: boolean?) → void
| arg | type | description |
|---|---|---|
| y | number | |
| th | number | |
| off | number? | |
| smooth | boolean? |
normal(y: number, th: number) → void
| arg | type | description |
|---|---|---|
| y | number | |
| th | number |
front(x: number, y: number) → number
| arg | type | description |
|---|---|---|
| x | number | |
| y | number |
fp(x: number, y: number, off: number?) → void
point + normal on the front at sideways offset x
| arg | type | description |
|---|---|---|
| x | number | |
| y | number | |
| off | number? |
lathe(rows: number, cols: number, uScale: number?, vScale: number?) → any
| arg | type | description |
|---|---|---|
| rows | number | |
| cols | number | |
| uScale | number? | |
| vScale | number? |
sheet(rows: number, cols: number, fn: any, off: number, smooth: boolean?) → any
an open sheet on (off metres above) the surface: fn(u, v) -> y, theta
| arg | type | description |
|---|---|---|
| rows | number | |
| cols | number | |
| fn | any | |
| off | number | |
| smooth | boolean? |
cord(pts: { { number } }, off: number, r: number, cols: number?) → any
a tube lying on the surface through (y, theta) control points
| arg | type | description |
|---|---|---|
| pts | { { number } } | |
| off | number | |
| r | number | |
| cols | number? |
angryEye(put: any, s: any, side: number, y: number, x: number, r: number, lidMat: string, cyber: boolean) → void
| arg | type | description |
|---|---|---|
| put | any | |
| s | any | |
| side | number | |
| y | number | |
| x | number | |
| r | number | |
| lidMat | string | |
| cyber | boolean |
brow(put: any, s: any, side: number, y: number, x: number, r: number, thick: number) → void
| arg | type | description |
|---|---|---|
| put | any | |
| s | any | |
| side | number | |
| y | number | |
| x | number | |
| r | number | |
| thick | number |
sp(xx: number, yy: number) → void
| arg | type | description |
|---|---|---|
| xx | number | |
| yy | number |
mouth(put: any, s: any, y: number, w: number, curve: number, thick: number, skew: number?) → void
| arg | type | description |
|---|---|---|
| put | any | |
| s | any | |
| y | number | |
| w | number | |
| curve | number | |
| thick | number | |
| skew | number? |
cuteFace(put: any, s: any, y: number, x: number, r: number, mouthY: number) → void
| arg | type | description |
|---|---|---|
| put | any | |
| s | any | |
| y | number | |
| x | number | |
| r | number | |
| mouthY | number |
legs(put: any, c: any) → void
| arg | type | description |
|---|---|---|
| put | any | |
| c | any |
arms(put: any, c: any) → void
| arg | type | description |
|---|---|---|
| put | any | |
| c | any |
chain(put: any, part: string, mat: string, pts: { { number } }, n: number, size: number) → void
| arg | type | description |
|---|---|---|
| put | any | |
| part | string | |
| mat | string | |
| pts | { { number } } | |
| n | number | |
| size | number |
spikes(put: any, s: any, mat: string, pts: { { number } }, off: number, r: number, h: number) → void
Spikes along a set of (y, theta) points on a surface.
| arg | type | description |
|---|---|---|
| put | any | |
| s | any | |
| mat | string | |
| pts | { { number } } | |
| off | number | |
| r | number | |
| h | number |
vest(put: any, s: any, c: any) → void
Open leather vest: an open front of half-angle `open`, its top running from yFront at the opening to yBack behind.
| arg | type | description |
|---|---|---|
| put | any | |
| s | any | |
| c | any |
top(th: number) → number
| arg | type | description |
|---|---|---|
| th | number |
fn(u: number, v: number) → void
| arg | type | description |
|---|---|---|
| u | number | |
| v | number |
belt(put: any, s: any, y: number, off: number, buckle: string?) → void
| arg | type | description |
|---|---|---|
| put | any | |
| s | any | |
| y | number | |
| off | number | |
| buckle | string? |
tomato(put: any) → void
| arg | type | description |
|---|---|---|
| put | any |
broccoli(put: any) → void
| arg | type | description |
|---|---|---|
| put | any |
floret(r: number, seed: number) → any
floret crown: bumpy domes
| arg | type | description |
|---|---|---|
| r | number | |
| seed | number |
extra(part: string, side: number, hand: { number }) → void
| arg | type | description |
|---|---|---|
| part | string | |
| side | number | |
| hand | { number } |
p(t: number) → void
| arg | type | description |
|---|---|---|
| t | number |
pineapple(put: any) → void
| arg | type | description |
|---|---|---|
| put | any |
extra(part: string, side: number, hand: { number }) → void
| arg | type | description |
|---|---|---|
| part | string | |
| side | number | |
| hand | { number } |
boss(put: any) → void
| arg | type | description |
|---|---|---|
| put | any |
opening(y: number) → number return 0
| arg | type | description |
|---|---|---|
| y | number |
extra(part: string, side: number, hand: { number }) → void
| arg | type | description |
|---|---|---|
| part | string | |
| side | number | |
| hand | { number } |
civ_orange(put: any) → void
| arg | type | description |
|---|---|---|
| put | any |
open(y: number) → number return 0
glowing translucent raincoat with a hood and neon piping
| arg | type | description |
|---|---|---|
| y | number |
civ_strawberry(put: any) → void
| arg | type | description |
|---|---|---|
| put | any |
civ_carrot(put: any) → void
| arg | type | description |
|---|---|---|
| put | any |
civ_watermelon(put: any) → void
| arg | type | description |
|---|---|---|
| put | any |
civ_grape(put: any) → void
| arg | type | description |
|---|---|---|
| put | any |
R(y: number) → number return 0
| arg | type | description |
|---|---|---|
| y | number |
lemon(put: any) → void
| arg | type | description |
|---|---|---|
| put | any |
chili(put: any) → void
| arg | type | description |
|---|---|---|
| put | any |
extra(part: string, side: number, hand: { number }) → void
| arg | type | description |
|---|---|---|
| part | string | |
| side | number | |
| hand | { number } |
meshes(kind: string) → any
| arg | type | description |
|---|---|---|
| kind | string |
put(part: string, mat: string, g: any) → void
| arg | type | description |
|---|---|---|
| part | string | |
| mat | string | |
| g | any |
v3(p: { number }) → any return
| arg | type | description |
|---|---|---|
| p | { number } |
build(kind: string, parent: any, name: string?) → any
| arg | type | description |
|---|---|---|
| kind | string | |
| parent | any | |
| name | string? |
node(n: string, par: any, pos: { number }) → any
| arg | type | description |
|---|---|---|
| n | string | |
| par | any | |
| pos | { number } |
fill(e: any, part: string) → void
| arg | type | description |
|---|---|---|
| e | any | |
| part | string |
propGroups(name: string) → any
| arg | type | description |
|---|---|---|
| name | string |
put(mat: string, geo: any) → void
| arg | type | description |
|---|---|---|
| mat | string | |
| geo | any |
prop(name: string, parent: any, material: string?) → void
Spawn a prop under `parent`. `juice` / `ring` / `accent` stand in for the material passed as `material` (a juice, ring or neon colour). Returns the prop's root and its Model entities.
| arg | type | description |
|---|---|---|
| name | string | |
| parent | any | |
| material | string? |
umbrellaGrip(kind: string, pitch: number, roll: number) → any
| arg | type | description |
|---|---|---|
| kind | string | |
| pitch | number | |
| roll | number |
Sub-parts
Everything contained inside this part. Assets are composite children (clickable cards). Files are leaf payloads. Expand any row to view its source.
Problems
Everything affecting this asset right now: its own problems, anything wrong inside it, and problems on its direct dependencies.
agent_score is exposed.+ 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".
Scoped to this part · feeds back into the world's score.