metro.sceneModule
The rest of Banana City around the Peel Kabuki street, built on the curving plan in `game.city.map`: Banana Crescent's ring round the old town, Gold Row's diagonal to its roundabout, the winding Mikan and Kiwi streets, Cliffside Way, Neon Boulevard and the outer avenues. Every ro…
game.city.metro
The rest of Banana City around the Peel Kabuki street, built on the curving plan in game.city.map: Banana Crescent's ring round the old town, Gold Row's diagonal to its roundabout, the winding Mikan and Kiwi streets, Cliffside Way, Neon Boulevard and the outer avenues. Every road becomes a strip that follows its curve: asphalt, curb, sidewalk, edge lines, centre and lane dashes, crosswalks at junctions, puddles and staggered lamps. Lots line each road turned to face it (shops, flats, offices, low warehouses and Gold Row's gold towers, chosen by the map's styleAt), back lots fill the ground between, and each building's faces are dressed by what they look onto: storefronts, neon, signs and billboards on the street, fire escapes on alleys, plain walls where they are buried. It also builds the elevated highway's run south and east over the Undercroft along its spline, the cliffside promenade with its railings, barriers where a road runs off the city, edge walls, the water off the docks, and a ring of towers on the horizon that leaves every road's vista open.
Placed once by scenes/main.scene/build.luau under mount_city, beside game.city.district. It builds the plan in game.city.map with the materials in game.city.look (shared with the district), and needs nothing else from the scene.
Static geometry is batched per material per 130 m tile and written as one mesh per batch under metro_geometry. Collision (curbs, sidewalks, buildings, pillars, railings, barriers) is batched the same way into static triangle-mesh colliders (MeshCollider, fit = "exact") under metro_colliders, beside a ground box. Lights stand under metro_lights, kept within the renderer's light cap by the district's LightBudget.
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.metro — the rest of Banana City around the Peel Kabuki street, built on the curving plan in game.city.map: every road as a strip of sidewalk, curb, edge line, centre dashes, crosswalks and lamps that follows its curve; buildings on lots turned to face the street they front (shops, flats, offices, low warehouses and Gold Row's gold towers) with back lots filling the ground between; the elevated highway's run south and out east over the Undercroft; the cliffside promenade; the city's edge and the ring of towers beyond it, which leaves every road's vista open. The open places of game.city.map (the docks, the park, the arcade lot, the promenade, Megabuilding H10's lot on Kiwi Street) are paved, never built on: their own scene modules stand there. OWNED BY THE CITY SLICE. Placed once by scenes/main.scene/build.luau under `mount_city`, beside game.city.district. The plan it builds is game.city.map; its materials are game.city.look's, shared with the district. Static geometry is batched per material key per CHUNK-metre tile of the city, so the renderer can cull what is behind the camera, and written as one mesh per batch. Collision is batched the same way into static triangle-mesh colliders under `metro_colliders`. Lights stand under `metro_lights`, managed by the district's LightBudget (its roots name `metro`).
inRect(r: { number }, x: number, z: number) → boolean
| arg | type | description |
|---|---|---|
| r | { number } | |
| x | number | |
| z | number |
subtract(rs: { { number } }, c: { number }) → void
r minus c, as up to four rectangles
| arg | type | description |
|---|---|---|
| rs | { { number } } | |
| c | { number } |
rr(a: number, b: number) → number return a
| arg | type | description |
|---|---|---|
| a | number | |
| b | number |
pick(t: { any }) → any return t
| arg | type | description |
|---|---|---|
| t | { any } |
getMat(key: string) → any
| arg | type | description |
|---|---|---|
| key | string |
frame(px: number, py: number, pz: number, yaw: number) → void
| arg | type | description |
|---|---|---|
| px | number | |
| py | number | |
| pz | number | |
| yaw | number |
noFrame( ) → void
toWorld(x: number, y: number, z: number) → void
| arg | type | description |
|---|---|---|
| x | number | |
| y | number | |
| z | number |
add(key: string, g: any) → void
| arg | type | description |
|---|---|---|
| key | string | |
| g | any |
box(key: string, x0: number, y0: number, z0: number, x1: number, y1: number, z1: number, tu: number?, tv: number?, skip: any?) → void
| arg | type | description |
|---|---|---|
| key | string | |
| x0 | number | |
| y0 | number | |
| z0 | number | |
| x1 | number | |
| y1 | number | |
| z1 | number | |
| tu | number? | |
| tv | number? | |
| skip | any? |
collider(x0: number, y0: number, z0: number, x1: number, y1: number, z1: number) → void
| arg | type | description |
|---|---|---|
| x0 | number | |
| y0 | number | |
| z0 | number | |
| x1 | number | |
| y1 | number | |
| z1 | number |
light(x: number, y: number, z: number, c: { number }, intensity: number, radius: number) → void
| arg | type | description |
|---|---|---|
| x | number | |
| y | number | |
| z | number | |
| c | { number } | |
| intensity | number | |
| radius | number |
groundPanel(key: string, r: { number }, y: number, step: number) → void
ground: wet asphalt everywhere the district's own floor is not, the dark apron beyond the city, and the black water off the docks UVs continue the district's road panel (6 m tiles anchored at -60, -60)
| arg | type | description |
|---|---|---|
| key | string | |
| r | { number } | |
| y | number | |
| step | number |
inCore(x: number, z: number) → boolean
| arg | type | description |
|---|---|---|
| x | number | |
| z | number |
frameAt(r: any, i: number) → void
the tangent and side +1 normal at sample i (a closed road wraps; its last sample repeats its first)
| arg | type | description |
|---|---|---|
| r | any | |
| i | number |
strip(key: string, A: { { number } }, Bv: { { number } }, N: { { number } }, UA: { { number } }, UB: { { number } }, col: boolean) → void
a strip of quads between two rails of points, wound to face N
| arg | type | description |
|---|---|---|
| key | string | |
| A | { { number } } | |
| Bv | { { number } } | |
| N | { { number } } | |
| UA | { { number } } | |
| UB | { { number } } | |
| col | boolean |
band(key: string, r: any, side: number, i0: number, i1: number, oA: number, yA: number, oB: number, yB: number, facing: string, col: boolean) → void
a band along road r's side between offsets oA (at height yA) and oB (at yB), over samples i0..i1, facing up, in (to the road) or out
| arg | type | description |
|---|---|---|
| key | string | |
| r | any | |
| side | number | |
| i0 | number | |
| i1 | number | |
| oA | number | |
| yA | number | |
| oB | number | |
| yB | number | |
| facing | string | |
| col | boolean |
runs(ok: { boolean }, nseg: number) → void
the sample ranges { i0, i1 } over which every segment is kept
| arg | type | description |
|---|---|---|
| ok | { boolean } | |
| nseg | number |
pieces(i0: number, i1: number, fn: (number, number) → void
| arg | type | description |
|---|---|---|
| i0 | number | |
| i1 | number | |
| fn | (number, number |
segMid(r: any, i: number, side: number, o: number) → void
the middle of segment i, offset `o` to `side`
| arg | type | description |
|---|---|---|
| r | any | |
| i | number | |
| side | number | |
| o | number |
cap(r: any, side: number, i: number, w: number, y: number, dir: number) → void
the end face of a sidewalk at sample i, facing dir along the road
| arg | type | description |
|---|---|---|
| r | any | |
| side | number | |
| i | number | |
| w | number | |
| y | number | |
| dir | number |
deckSeg(a0: number, a1: number) → void
one stretch of deck in a frame whose z runs along the highway
| arg | type | description |
|---|---|---|
| a0 | number | |
| a1 | number |
bx(key: string, c0: number, y0: number, c1: number, y1: number, tu: number?, tv: number?) → void
| arg | type | description |
|---|---|---|
| key | string | |
| c0 | number | |
| y0 | number | |
| c1 | number | |
| y1 | number | |
| tu | number? | |
| tv | number? |
pillar( ) → void
a pillar centred on the current frame's origin
lamp(accent: string) → void
street lamps along every sidewalk, arms over the road in a frame with the pole at the origin and its arm along +x
| arg | type | description |
|---|---|---|
| accent | string |
okey(ix: number, iz: number) → number return
| arg | type | description |
|---|---|---|
| ix | number | |
| iz | number |
lotCells(L: any, fn: (number, number) → void
calls fn for every 1 m cell whose centre falls inside lot L (shrunk by 0.3 m so neighbours may touch); stops early when fn returns true
| arg | type | description |
|---|---|---|
| L | any | |
| fn | (number, number |
groundOk(x: number, z: number) → boolean
| arg | type | description |
|---|---|---|
| x | number | |
| z | number |
lotFits(L: any) → boolean
| arg | type | description |
|---|---|---|
| L | any |
tryLot(L: any) → boolean
| arg | type | description |
|---|---|---|
| L | any |
classify(x: number, z: number, selfId: number) → string
| arg | type | description |
|---|---|---|
| x | number | |
| z | number | |
| selfId | number |
fpt(fc: any, along: number, y: number, out: number) → void
face helpers: a face is a lot side, `along` runs over [a, b] on its plane
| arg | type | description |
|---|---|---|
| fc | any | |
| along | number | |
| y | number | |
| out | number |
fbox(key: string, fc: any, a0: number, a1: number, o0: number, o1: number, y0: number, y1: number, tu: number?, tv: number?) → void
| arg | type | description |
|---|---|---|
| key | string | |
| fc | any | |
| a0 | number | |
| a1 | number | |
| o0 | number | |
| o1 | number | |
| y0 | number | |
| y1 | number | |
| tu | number? | |
| tv | number? |
fpanel(key: string, fc: any, along: number, y: number, out: number, w: number, h: number, uv: { number }?) → void
| arg | type | description |
|---|---|---|
| key | string | |
| fc | any | |
| along | number | |
| y | number | |
| out | number | |
| w | number | |
| h | number | |
| uv | { number }? |
ftiled(key: string, fc: any, along: number, y: number, out: number, w: number, h: number, tu: number, tv: number, u0: number?) → void
| arg | type | description |
|---|---|---|
| key | string | |
| fc | any | |
| along | number | |
| y | number | |
| out | number | |
| w | number | |
| h | number | |
| tu | number | |
| tv | number | |
| u0 | number? |
signLight(fc: any, along: number, y: number, out: number, col: string, k: number, rad: number) → void
| arg | type | description |
|---|---|---|
| fc | any | |
| along | number | |
| y | number | |
| out | number | |
| col | string | |
| k | number | |
| rad | number |
wallSign(fc: any, name: string, along: number, y: number, w: number, h: number, uv: { number }?, col: string?) → void
| arg | type | description |
|---|---|---|
| fc | any | |
| name | string | |
| along | number | |
| y | number | |
| w | number | |
| h | number | |
| uv | { number }? | |
| col | string? |
projSign(fc: any, name: string, along: number, y0: number, y1: number, w: number) → void
| arg | type | description |
|---|---|---|
| fc | any | |
| name | string | |
| along | number | |
| y0 | number | |
| y1 | number | |
| w | number |
streetFace(fc: any, H: number, st: any, tower: boolean, kindOverride: string?) → void
| arg | type | description |
|---|---|---|
| fc | any | |
| H | number | |
| st | any | |
| tower | boolean | |
| kindOverride | string? |
alleyFace(fc: any, H: number) → void
| arg | type | description |
|---|---|---|
| fc | any | |
| H | number |
side(axis: string, s: number, f: number, a: number, b: number, dir: string, forced: string?) → void
| arg | type | description |
|---|---|---|
| axis | string | |
| s | number | |
| f | number | |
| a | number | |
| b | number | |
| dir | string | |
| forced | string? |
barrierRow(r: any, atStart: boolean) → void
the city's edge: road-closed barriers, a wall nobody walks through
| arg | type | description |
|---|---|---|
| r | any | |
| atStart | boolean |
vistaBlocked(x: number, z: number, half: number) → boolean
| arg | type | description |
|---|---|---|
| x | number | |
| z | number | |
| half | 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.
Showing the 199 items nearest this part. It holds more than this page lists.
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.