kit
Geometry builders for Banana City, called by the `game.city.district` sceneModule at build time: world-UV boxes and facade panels, cables, paper lanterns, the peel-faceted banana (ramen awning), curved ribbed gold megatowers and dome towers, wrap-around ad bands, hover car parts,…
game.city.kit
Geometry builders for Banana City, called by the game.city.district sceneModule at build time: world-UV boxes and facade panels, cables, paper lanterns, the peel-faceted banana (ramen awning), curved ribbed gold megatowers and dome towers, wrap-around ad bands, hover car parts, rain-streak tiles, splash rings and puddles, plus a batch() that merges geometry per material key so each material becomes one mesh.
Interface
What this asset declares: the schema it conforms to, what it exposes, and the rendered structured payload.
conforms to
zero/source-extract/v2game.city.kit — geometry builders for Banana City. Everything returns plain geometry tables { positions, normals, uvs, indices } (the shape build.asset("mesh") takes and game.shared.geo produces). Boxes and quads carry world-scaled UVs so a texture tiles continuously across neighbouring pieces. A Batch collects geometry per material key so the district builder can merge each material into one mesh (few draw calls).
newGeo( ) → Geo
push(g: Geo, p: { number }, n: { number }, u: number, v: number) → void
| arg | type | description |
|---|---|---|
| g | Geo | |
| p | { number } | |
| n | { number } | |
| u | number | |
| v | number |
quadInto(g: Geo, c: { number }, r: { number }, up: { number }, w: number, h: number, uv: { number }) → void
| arg | type | description |
|---|---|---|
| g | Geo | |
| c | { number } | |
| r | { number } | |
| up | { number } | |
| w | number | |
| h | number | |
| uv | { number } |
corner(a: number, b: number) → void
| arg | type | description |
|---|---|---|
| a | number | |
| b | number |
quad(c: { number }, r: { number }, up: { number }, w: number, h: number, uv: { number }?) → Geo
A single quad centred at c, spanning `r` (right) and `up`; it faces cross(r, up). uv defaults to the whole image.
| arg | type | description |
|---|---|---|
| c | { number } | |
| r | { number } | |
| up | { number } | |
| w | number | |
| h | number | |
| uv | { number }? |
facing(dir: string) → void
| arg | type | description |
|---|---|---|
| dir | string |
panel(c: { number }, dir: string, w: number, h: number, uv: { number }?) → Geo
| arg | type | description |
|---|---|---|
| c | { number } | |
| dir | string | |
| w | number | |
| h | number | |
| uv | { number }? |
tiledPanel(c: { number }, dir: string, w: number, h: number, tileU: number, tileV: number, u0: number?) → Geo
World-tiled facade quad: UVs repeat every tileU x tileV world units, anchored at the panel's own left/top so a storefront starts on a shop edge.
| arg | type | description |
|---|---|---|
| c | { number } | |
| dir | string | |
| w | number | |
| h | number | |
| tileU | number | |
| tileV | number | |
| u0 | number? |
box(x0: number, y0: number, z0: number, x1: number, y1: number, z1: number, tileU: number?, tileV: number?, skip: { [string]: boolean }?) → Geo
Axis-aligned box from min to max corner with world-scaled UVs (tileU along the face's horizontal, tileV along its vertical). skip = { ["+y"]=true, ...}
| arg | type | description |
|---|---|---|
| x0 | number | |
| y0 | number | |
| z0 | number | |
| x1 | number | |
| y1 | number | |
| z1 | number | |
| tileU | number? | |
| tileV | number? | |
| skip | { [string]: boolean }? |
face(key: string, c: { number }, w: number, h: number, ua: number, va: number) → void
| arg | type | description |
|---|---|---|
| key | string | |
| c | { number } | |
| w | number | |
| h | number | |
| ua | number | |
| va | number |
boxAt(pos: { number }, size: { number }, q: { number }?, tileU: number?, tileV: number?) → Geo
Box of size (sx, sy, sz) centred at the origin, then rotated by quat q and moved to pos. For pieces that follow a curve (the highway bend).
| arg | type | description |
|---|---|---|
| pos | { number } | |
| size | { number } | |
| q | { number }? | |
| tileU | number? | |
| tileV | number? |
cylinder(x: number, z: number, y0: number, y1: number, r: number, cols: number?) → Geo
Vertical cylinder (open or capped) from y0 to y1.
| arg | type | description |
|---|---|---|
| x | number | |
| z | number | |
| y0 | number | |
| y1 | number | |
| r | number | |
| cols | number? |
cable(a: { number }, b: { number }, sag: number, r: number?) → Geo
A sagging cable between two points.
| arg | type | description |
|---|---|---|
| a | { number } | |
| b | { number } | |
| sag | number | |
| r | number? |
lantern(c: { number }, s: number) → Geo
Paper lantern, centred at c (height ~0.5 * s).
| arg | type | description |
|---|---|---|
| c | { number } | |
| s | number |
pentagon(th: number) → number
A peel-faceted banana lying along +X (length L, max radius r), its tips curling up by `curl`. Used for the ramen awning and plaza props.
| arg | type | description |
|---|---|---|
| th | number |
banana(L: number, r: number, curl: number, flat: number?) → Geo
| arg | type | description |
|---|---|---|
| L | number | |
| r | number | |
| curl | number | |
| flat | number? |
radial(th: number, _t: number) → void
| arg | type | description |
|---|---|---|
| th | number | |
| _t | number |
megatower(x: number, y0: number, z: number, h: number, r: number, bend: number, ribs: number, tile: number?) → Geo
Curved, peel-ribbed gold megatower: base at y0, height h, base radius r, `bend` leans the top along +X (negative leans -X), `ribs` facets, and a banana stem crown. UVs are world-scaled (tile metres per repeat).
| arg | type | description |
|---|---|---|
| x | number | |
| y0 | number | |
| z | number | |
| h | number | |
| r | number | |
| bend | number | |
| ribs | number | |
| tile | number? |
radial(th: number, _t: number) → void
| arg | type | description |
|---|---|---|
| th | number | |
| _t | number |
offset(t: number) → void
| arg | type | description |
|---|---|---|
| t | number |
megatowerRibs(x: number, y0: number, z: number, h: number, r: number, bend: number, ribs: number, thick: number) → Geo
Glowing rib lines that sit on a K.megatower's facet corners (thick) and on its mid-facet ridges (thin), following the same smoothed profile and bend.
| arg | type | description |
|---|---|---|
| x | number | |
| y0 | number | |
| z | number | |
| h | number | |
| r | number | |
| bend | number | |
| ribs | number | |
| thick | number |
domeRibs(x: number, y0: number, z: number, h: number, r: number, thick: number) → Geo
Crown ribs for K.domeTower: the 12 glowing seams of the banana-bunch dome.
| arg | type | description |
|---|---|---|
| x | number | |
| y0 | number | |
| z | number | |
| h | number | |
| r | number | |
| thick | number |
domeTower(x: number, y0: number, z: number, h: number, r: number, tile: number?) → Geo
Dome-topped round tower (the "banana bunch" crowns in the skyline).
| arg | type | description |
|---|---|---|
| x | number | |
| y0 | number | |
| z | number | |
| h | number | |
| r | number | |
| tile | number? |
band(x: number, z: number, y0: number, y1: number, r: number, repeats: number) → Geo
Open cylinder band (wrap-around ad screen), uv 0..1 around x repeats.
| arg | type | description |
|---|---|---|
| x | number | |
| z | number | |
| y0 | number | |
| y1 | number | |
| r | number | |
| repeats | number |
hovercar( ) → void
Hover car pieces, nose along +Z, about 4.2 m long.
rainTile(count: number, W: number, H: number, seed: number) → Geo
Rain: `count` streaks scattered in a box W wide, H tall (y 0..H), each a pair of crossed thin quads leaning with the wind.
| arg | type | description |
|---|---|---|
| count | number | |
| W | number | |
| H | number | |
| seed | number |
rnd( ) → number
splash( ) → Geo
Splash: a flat ring (radius 1) plus a few droplet spikes; scaled at runtime.
puddle(x: number, y: number, z: number, rx: number, rz: number, rot: number) → Geo
Flat disc puddle (top-facing), radii rx, rz.
| arg | type | description |
|---|---|---|
| x | number | |
| y | number | |
| z | number | |
| rx | number | |
| rz | number | |
| rot | number |
batch( ) → Batch
add(key: string, g: Geo) → void
| arg | type | description |
|---|---|---|
| key | string | |
| g | Geo |
keys( ) → void
merged(key: string) → Geo
| arg | type | description |
|---|---|---|
| key | string |
count(key: string) → number
| arg | type | description |
|---|---|---|
| key | string |
Geo = anyBatch = { add: (key: string, g: Geo) -> (), keys: () -> { string }, merged: (key: string) -> Geo, count: (key: string) -> 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.