CrewDirector
The Rotten Crew and the people of Peel Kabuki. Attached by the scene entrypoint to `mount_enemies` in play.
CrewDirector
The Rotten Crew and the people of Peel Kabuki. Attached by the scene entrypoint to mount_enemies in play.
- Spawns the 8 thugs (tomato, broccoli punk, pineapple bruiser) at
R.layout.thugSpawns, and Don Aubergine atR.layout.bossSpawnonbossCue, with a drop-in landing. - Runs their AI: idle → chase → windup → strike → recover, plus flinch and death. Every third boss attack is a telegraphed ground slam with a shockwave.
- Registers each enemy as a baton target with
game.rules. A hit knocks back, flashes white, splatters juice in the enemy's colour, and reports the kill. - Drops banana-coin eddies and healing snacks that the player collects by walking over them.
- While the sunglasses are on, outlines enemies within scan range.
- A crowd of fruit civilians (
crowd, 16 by default) walks both sidewalks and scatters from fights. Every other one (never the watermelon cop) carries a Neo-Tokyo light-up umbrella fromgame.enemies.crew(Crew.prop("umbrella")), its neon picked fromUMBRELLAS, held in the right hand with the arm locked in place while the legs walk. - Hides distant characters, and puts everything back on
reset.
Fields: cullDistance (metres), civilians (bool), crowd (how many civilians).
Interface
What this asset declares: the schema it conforms to, what it exposes, and the rendered structured payload.
conforms to
zero/source-extract/v2strict
q4(q: { number }) → any return
| arg | type | description |
|---|---|---|
| q | { number } |
qax(a: { number }, ang: number) → void
| arg | type | description |
|---|---|---|
| a | { number } | |
| ang | number |
qm(a: { number }, b: { number }) → void
| arg | type | description |
|---|---|---|
| a | { number } | |
| b | { number } |
now( ) → number return R
rnd(a: number, b: number) → number return a
| arg | type | description |
|---|---|---|
| a | number | |
| b | number |
smooth(t: number) → number
| arg | type | description |
|---|---|---|
| t | number |
angDiff(a: number, b: number) → number
| arg | type | description |
|---|---|---|
| a | number | |
| b | number |
despawn(e: any) → void
| arg | type | description |
|---|---|---|
| e | any |
groundY(x: number, z: number) → number
Walkable height of the street at (x, z): road, raised sidewalks, plaza.
| arg | type | description |
|---|---|---|
| x | number | |
| z | number |
clampPos(x: number, z: number) → void
| arg | type | description |
|---|---|---|
| x | number | |
| z | number |
armQ(roll: number, pitch: number, side: number) → any
side -1 = right arm, +1 = left arm; pitch swings the arm forward.
| arg | type | description |
|---|---|---|
| roll | number | |
| pitch | number | |
| side | number |
pose(c: any, P: any) → void
| arg | type | description |
|---|---|---|
| c | any | |
| P | any |
walkPose(c: any, speed: number, dt: number, P: any) → void
| arg | type | description |
|---|---|---|
| c | any | |
| speed | number | |
| dt | number | |
| P | any |
idlePose(c: any, P: any, guard: boolean) → void
| arg | type | description |
|---|---|---|
| c | any | |
| P | any | |
| guard | boolean |
attackPose(c: any, P: any, k: number, phase: string) → void
Attack choreography; k runs 0..1 through each phase.
| arg | type | description |
|---|---|---|
| c | any | |
| P | any | |
| k | number | |
| phase | string |
setVisible(c: any, on: boolean) → void
| arg | type | description |
|---|---|---|
| c | any | |
| on | boolean |
tint(c: any, k: number, col: { number }?) → void
| arg | type | description |
|---|---|---|
| c | any | |
| k | number | |
| col | { number }? |
baseTint(c: any) → void
The tint a character rests at: orange while it burns, none otherwise.
| arg | type | description |
|---|---|---|
| c | any |
outline(c: any, col: { number }?) → void
| arg | type | description |
|---|---|---|
| c | any | |
| col | { number }? |
newDrop(mat: string) → any
| arg | type | description |
|---|---|---|
| mat | string |
takeDrop(mat: string) → any
| arg | type | description |
|---|---|---|
| mat | string |
burst(mat: string, p: { number }, dx: number, dz: number, n: number, power: number, gy: number?) → void
`gy` pins the floor the drops land on (an encounter off the street); nil reads the street's own ground.
| arg | type | description |
|---|---|---|
| mat | string | |
| p | { number } | |
| dx | number | |
| dz | number | |
| n | number | |
| power | number | |
| gy | number? |
flames(x: number, y: number, z: number, n: number, spread: number) → void
Short-lived additive bits from the same drop pools: flames rise and wink out, sparks spit and fall. Neither leaves a splat.
| arg | type | description |
|---|---|---|
| x | number | |
| y | number | |
| z | number | |
| n | number | |
| spread | number |
sparks(x: number, y: number, z: number, n: number, mat: string?) → void
| arg | type | description |
|---|---|---|
| x | number | |
| y | number | |
| z | number | |
| n | number | |
| mat | string? |
splat(mat: string, x: number, z: number, size: number, y: number?) → void
| arg | type | description |
|---|---|---|
| mat | string | |
| x | number | |
| z | number | |
| size | number | |
| y | number? |
ringFx(mat: string, x: number, z: number, r0: number, r1: number, dur: number, y: number?) → any
| arg | type | description |
|---|---|---|
| mat | string | |
| x | number | |
| z | number | |
| r0 | number | |
| r1 | number | |
| dur | number | |
| y | number? |
updateFx(dt: number) → void
| arg | type | description |
|---|---|---|
| dt | number |
dropRing(fx: any) → void
| arg | type | description |
|---|---|---|
| fx | any |
pop(x: number, y: number, z: number, content: string, height: number) → void
| arg | type | description |
|---|---|---|
| x | number | |
| y | number | |
| z | number | |
| content | string | |
| height | number |
updatePops(dt: number) → void
| arg | type | description |
|---|---|---|
| dt | number |
spawnDrop(kind: string, x: number, z: number, y: number, value: any, gy: number?) → void
| arg | type | description |
|---|---|---|
| kind | string | |
| x | number | |
| z | number | |
| y | number | |
| value | any | |
| gy | number? |
updateDrops(dt: number) → void
| arg | type | description |
|---|---|---|
| dt | number |
newChar(kind: string, x: number, z: number, yaw: number) → any
| arg | type | description |
|---|---|---|
| kind | string | |
| x | number | |
| z | number | |
| yaw | number |
scare(x: number, z: number, radius: number) → void
| arg | type | description |
|---|---|---|
| x | number | |
| z | number | |
| radius | number |
spawnEnemy(kind: string, x: number, z: number, opts: any?) → any
opts (optional) = { level, enc (encounter record), gy (pinned floor y), ambient (a respawning street thug after the Don), yaw }
| arg | type | description |
|---|---|---|
| kind | string | |
| x | number | |
| z | number | |
| opts | any? |
level( ) → void
hp( ) → void
maxHp( ) → void
position( ) → void
takeHit(damage: number, dir: any, heavy: boolean) → void
| arg | type | description |
|---|---|---|
| damage | number | |
| dir | any | |
| heavy | boolean |
applyEffect(effect: string, params: any) → void
| arg | type | description |
|---|---|---|
| effect | string | |
| params | any |
ensureTag(c: any) → void
One Text3D billboard per enemy, hung off its root, made the first time it aggroes or is hurt. Its text changes only when a health segment does.
| arg | type | description |
|---|---|---|
| c | any |
setTag(c: any) → void
| arg | type | description |
|---|---|---|
| c | any |
showTag(c: any, on: boolean) → void
| arg | type | description |
|---|---|---|
| c | any | |
| on | boolean |
clearTelegraph(c: any) → void
| arg | type | description |
|---|---|---|
| c | any |
blankMesh( ) → any
newSlot(root: any) → any
| arg | type | description |
|---|---|---|
| root | any |
newShell( ) → any
warmShells( ) → void
One Model a frame until the pool holds SHELL_WARM shells of SLOT_WARM slots.
flushGrave(all: boolean) → void
| arg | type | description |
|---|---|---|
| all | boolean |
freePiece(pc: any) → void
A piece goes back to the pool as an empty shell; its meshes are released once nothing draws them.
| arg | type | description |
|---|---|---|
| pc | any |
bakeRig(rig: any) → void
A crew rig as it stands this frame: every Model's geometry in world space, merged per material.
| arg | type | description |
|---|---|---|
| rig | any |
bakePiece(pc: any) → void
A lying piece's parts in world space, from its body's pose.
| arg | type | description |
|---|---|---|
| pc | any |
hullProxy(parts: { any }) → any
The points a piece's convex hull needs, as a small mesh for the collider to wrap: the extremes on each axis and an even sample of the rest.
| arg | type | description |
|---|---|---|
| parts | { any } |
spawnPiece(parts: { any }, vel: { number }, cuts: number, juice: string) → any
One piece: a pooled shell at the parts' centre, a Model slot per material, and the shell's hidden hull proxy for the collider to follow.
| arg | type | description |
|---|---|---|
| parts | { any } | |
| vel | { number } | |
| cuts | number | |
| juice | string |
sliceCorpse(c: any, slice: any, dx: number, dz: number) → boolean
Cut a dying thug along the blade's planes; the rig goes and the pieces fly apart from the cut, carried on along the hit.
| arg | type | description |
|---|---|---|
| c | any | |
| slice | any | |
| dx | number | |
| dz | number |
onSlash(e: any) → void
A katana slash through lying pieces cuts each again, through its centre.
| arg | type | description |
|---|---|---|
| e | any |
updatePieces(dt: number) → void
| arg | type | description |
|---|---|---|
| dt | number |
rollLoot( ) → string
What a thug leaves besides its eddies: usually junk, now and then a consumable, rarely a quickhack shard.
die(c: any, dx: number, dz: number, slice: any?) → void
| arg | type | description |
|---|---|---|
| c | any | |
| dx | number | |
| dz | number | |
| slice | any? |
hurt(c: any, dmg: number, content: string, height: number) → void
Damage with no knockback or flinch: burn ticks, shocks.
| arg | type | description |
|---|---|---|
| c | any | |
| dmg | number | |
| content | string | |
| height | number |
takeHit(c: any, damage: number, dir: any, heavy: boolean) → void
| arg | type | description |
|---|---|---|
| c | any | |
| damage | number | |
| dir | any | |
| heavy | boolean |
breakAttack(c: any) → void
| arg | type | description |
|---|---|---|
| c | any |
applyEffect(c: any, effect: string, params: any) → void
R.applyEffect lands here: stun / burn / shock / reveal.
| arg | type | description |
|---|---|---|
| c | any | |
| effect | string | |
| params | any |
spawnBoss( ) → void
turnTo(c: any, target: number, rate: number, dt: number) → void
| arg | type | description |
|---|---|---|
| c | any | |
| target | number | |
| rate | number | |
| dt | number |
hitPlayer(c: any, amount: number, from: any, slam: boolean) → void
An enemy's blow meets V's guard. A parry (block pressed in the 0.2 s before the hit, facing the attacker) cancels it and staggers the attacker, slowing it and its mates nearby a moment; a held block takes 30%. A boss slam can be blocked but not parried.
| arg | type | description |
|---|---|---|
| c | any | |
| amount | number | |
| from | any | |
| slam | boolean |
leashed(c: any, pp: any) → boolean
Has V run far enough from an encounter that its crew gives up the chase?
| arg | type | description |
|---|---|---|
| c | any | |
| pp | any |
updateEnemy(c: any, dt: number, playing: boolean, pp: any, active: boolean) → void
`active` = playing and no dialogue / shop / breach / menu holds V: the crew holds off (idle, no approach, no attacks) while it is false.
| arg | type | description |
|---|---|---|
| c | any | |
| dt | number | |
| playing | boolean | |
| pp | any | |
| active | boolean |
spawnCiv(kind: string, wp: number, along: number, umbrella: string?) → void
A civilian walking its own side's route, set down `along` (0..1) of the way from waypoint `wp` to the next one, with a light-up umbrella in its right hand when `umbrella` names the neon it glows in.
| arg | type | description |
|---|---|---|
| kind | string | |
| wp | number | |
| along | number | |
| umbrella | string? |
updateCiv(c: any, dt: number, pp: any) → void
| arg | type | description |
|---|---|---|
| c | any | |
| dt | number | |
| pp | any |
separate(list: { any }, pp: any) → void
| arg | type | description |
|---|---|---|
| list | { any } | |
| pp | any |
refreshCars( ) → void
keepOutOfCars(list: { any }) → void
| arg | type | description |
|---|---|---|
| list | { any } |
encGround(x: number, z: number, y0: number) → number
The floor at (x, z): nil on the street itself (groundY reads it there), the first surface below y0 + 4 m otherwise.
| arg | type | description |
|---|---|---|
| x | number | |
| z | number | |
| y0 | number |
encPoint(e: any, x: number, z: number) → void
Enemy positions are world x, z; a list written as offsets from `at` is read as offsets (only when the absolute point is nowhere near the fight).
| arg | type | description |
|---|---|---|
| e | any | |
| x | number | |
| z | number |
spawnEncounter(id: string, def: any) → void
| arg | type | description |
|---|---|---|
| id | string | |
| def | any |
dropEncounter(id: string) → void
| arg | type | description |
|---|---|---|
| id | string |
spawnAmbient(pp: any) → boolean
After the Don falls the 8 street thugs are gone for good; a few stragglers walk in from the crew's corners, out of V's sight, on a long timer.
| arg | type | description |
|---|---|---|
| pp | any |
clearAll( ) → void
populate( ) → void
start( ) → void
update(dt: number) → void
| arg | type | description |
|---|---|---|
| dt | number |
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.
Showing up to 3 levels deep. Open a part to see what it holds further down.
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.