尚未检测到更新。GitHub 发布版本后会显示在这里。
个人 GitHub 账号下公开仓库的所有者可以登录并验证所有权,自行管理介绍,无需管理员批准。
登录并生成验证文件,在 30 分钟内将其提交到此仓库的默认分支。其他分支或分叉仓库中的文件无效。然后在下方检查文件,即可无需管理员批准直接管理项目。请保留文件以维持管理权限。
如需登录,将前往登录页面。登录后请回到此处,再次点击所选的验证按钮。
在项目文件夹中运行 /nomorevibe verify,即可验证所有权并自行管理介绍。
一分钟完成验证[[ VECTORCLAD ]]
翻译准备中
取自仓库 README
正在加载完整 README。
查看完整 README ↗A three.js tech demo for VECTORCLAD: an Armored Core-style mech, the FS-07A Vanguard or
the HV-02 Obsidian heavy frame, flown in from the harbor under a heavy lifter and set down
in Port Meridian, a harbor city overrun by spider-frames, six-legged machines
that climb the towers, scorpion-frames that claw and sting, swarms of eight-foot
riftlings that leap onto the mech's hull and burst there, and a black robotic millipede long enough to lie across several city
blocks. In this build nothing comes on its own: a debug menu (the ` key)
summons any of them through portals in the sky. Packs of dropships set
allied tanks down in the streets to hunt them too. The mech walks, boost-dashes,
jump-jets, and fires beam rifles, cannons and full missile salvos. The city is alive:
people walk its sidewalks and fill its buildings, traffic drives its streets and trains
run on its elevated railway, and all of it can be blown apart. Everything is
procedural geometry: the mech and its weapons are textured from two sheets in
textures/, the city from fifty-two more in textures/city-src/ and the eighty
asset packs' sheets in assets/ (facades, storefronts, roofs, bark and foliage, and
car skins) and its sixty billboard ads, the ceilings inside its buildings from five in textures/ceiling-src/,
and the spiders and scorpions from ten in textures/spider-src/. There is no build step.
Serve the repository root with any static server and open it in a browser:
npx http-server -p 8080 .
# then visit http://localhost:8080/
three.js 0.170.0 loads from jsDelivr, so the first load needs a network connection.
It's a sandbox: there are no waves, and the fight starts empty. Monsters come only from the summon menu.
.github/workflows/pages.yml publishes the game to GitHub Pages on every push to main.
To turn it on, go to Settings → Pages → Build and deployment → Source and choose GitHub Actions.
The game is then served at https://agilancer.github.io/vectorclad/.
Before anything else loads, a boot screen downloads the title theme (see Music below).
Then the game opens on a title screen with the live 3D VECTORCLAD logo (from the
vectorclad-brand kit) while textures and the city load behind it. A tap, click or any
key fades it out and hands over to the loading screen or, once loading is done, the
intro card. The game doesn't start rendering until the title is gone, so the two never
compete for the GPU.
On phones held upright, a "Rotate your phone" overlay covers the screen until the phone is turned sideways. Tapping start on a phone also asks for fullscreen and a landscape lock, which Android browsers honor and iOS ignores. Turning a phone upright mid-fight, or leaving the page, pauses the game in the hangar.
The logo files live in js/title/. logo.js and wordmark-data.js are copied from the
brand kit; regenerate them there rather than editing them here. The title's three.js
add-ons (bloom, post-processing) load through the import map in index.html, which
points three at the same 0.170.0 build as js/three.js; keep the two versions in sync.
The soundtrack is eight songs by THEDEMONMECHANIZEDMACHINEDESTROYER in audio/music/.
Vectors is the title theme. js/boot.js downloads it before the title screen or the
game start loading, and it plays on the title screen. Getting past the title lowers the
music to 55% over about a second, so the sound effects sit on top of it. After Vectors the
other seven (Oh No, Robot Insects, Sentient Plague, They Came From the Sky! and
Vectors II to V) play in a shuffled order, then Vectors again, then the seven in a
new order, for as long as the game runs. Each song downloads in full while the one before it plays (from 30 seconds in, so it
doesn't slow the texture download), and the music pauses while the tab is hidden. The
hangar has a Music toggle next to Sound.
Browsers don't play audio until the player taps, clicks or presses a key. When the browser
blocks autoplay, which is usual on a first visit, the boot screen shows "Tap to power up"
once Vectors has loaded, and the music and title start on that tap. On iOS, which ignores
audio.volume, the music goes through a Web Audio gain node that it shares with the
sound effects (audioContext() in js/audio.js).
The masters are 48 kHz WAVs kept outside the repo. To re-encode them as 160 kbps MP3s:
pip install lameenc
python tools/build_music.py "F:/! THEDEMONMECHANIZEDMACHINEDESTROYER"
The song list is at the top of js/music.js.
| Action | Keyboard / mouse | Touch |
|---|---|---|
| Move | W A S D | Left thumb stick |
| Aim | Mouse (click to capture), arrow keys | Drag the right side |
| Lock on / switch target (press again to release) | T | LOCK |
| Right-hand weapon | Left mouse | FIRE |
| Left-hand weapon / raise shield | Right mouse | L |
| Shoulder cannons (vulcan, beam cannon) | F or middle mouse | CNN |
| Single missile | Q | MSL |
| Full missile salvo | E | SALVO |
| Jump (hold to jet upward) | Space | JUMP |
| Boost dash | Shift | DASH |
| Reload | R | Reload |
| Hangar / pause | Tab, M, or Esc | Hangar |
| Summon menu (tech demo) | ` (or ~), or the Summon button | Summon |
| Camera zoom | Mouse wheel |
The aim reaches straight up and straight down, so the weapons fire in any direction. Looking steeply down, the view slides forward so the crosshair rests on the ground just ahead of the feet, where the arms can reach. The camera starts zoomed all the way in.
Dashing and jump-jetting draw on one boost gauge. A full gauge holds about nine seconds of dash and refills in about three once the mech is back on the ground. If it runs dry the boosters overheat and stay off until the gauge is back to 40.
The lock-on button holds one target. Aimed weapons lead it, the arms track it, the camera keeps it in view, and single missiles go to it first. When it is destroyed the lock moves to the next target in view.
Missiles lock onto targets inside the dashed circle. A salvo spreads its missiles across every lock; with nothing locked they fly to the crosshair. Leg pods pop their missiles almost straight up so they arc over the ground in front of the feet.
With the mech standing still on the ground, hold G to climb out. Back beside the frame,
hold G again to climb in. The pilot wears thick sci-fi armor with a jetpack and a
grappling hook on the right forearm, and carries a small copy of the mech's beam rifle in
a dark finish. On foot the armor gauge is the pilot's own (60 points); the frame keeps
what it had.
| Action | Keyboard / mouse |
|---|---|
| Fire the rifle | Left mouse |
| Grappling hook: fire (a new press lets go of the old line and fires again) | Right mouse |
| Sticky grenade | Q (or E) |
| Jump; press again in the air to light the jetpack; on the hook, let go | Space |
| Jetpack dash | Shift |
| First person / over-the-shoulder third person | Mouse wheel |
The view starts in first person, the rifle held in the right hand. The wheel pulls back to a close over-the-shoulder view of the little armored pilot. The jetpack and dash burn the mech's boost gauge at 1.5 times the frame's rate. The grappling hook reaches about a city block. It reels the pilot in fast on a rope that won't stretch, so it swings round corners like a pendulum, and stops the pilot dead at the hook: hanging off a wall or ceiling, or standing on a floor or rooftop. Press Space to let go mid-swing and keep the speed, or fire it again in a new direction, which drops the old line and shoots the new one in one press. A sticky grenade sticks to whatever it hits and, after a short blinking fuse, blows out the one square tile of wall or floor it is stuck to.
The frame select also offers three rides: pick the Kestrel, the Hornet or the Bastion APC there and Deploy goes straight into the fight in it. The Kestrel and the Hornet come in hovering over the seawall on the south coast; the APC rolls in on the riverside esplanade at the east edge of town. The mech is left standing on the starting plaza for the pilot to come back to.
On foot, hold G beside a ride to get in, and hold it again to get out. All three rides are
also parked by the starting plaza when the mech is flown in, and any car in the city can be
stolen, parked or driving.
The two flyers handle like a hovering gunship in Warhawk: W A S D fly along the view,
Space climbs, C or Ctrl sinks, Shift boosts, and the nose turns to follow the aim.
Missiles home on the target nearest the crosshair, and empty pods reload on their own.
| Ride | Weapons and controls |
|---|---|
| Kestrel | The dropship that flies the mech in, flown as a gunship. Left mouse: twin plasma cannons in the chin turret. Right mouse: a rocket barrage from both wing pods. Q one homing missile, E a salvo of all eighteen. |
| Hornet | An attack helicopter. Left mouse: twin chin vulcans. Right mouse: the HEAVY VULCAN, which spins up and fires a little faster than the vulcans, with bigger, faster rounds. Q one missile, E a salvo from every pod. 1-4 swap the pod on each of the four weapon points: missile pod, heavy missile pod, micro missile pod or unguided rocket pod. |
| Bastion APC | W/S drive, A/D steer, the turret follows the view. Left mouse: the twin heavy vulcans. |
| Cars | W/S drive, A/D steer, Shift for more speed. |
A ride has its own armor; losing it ends the fight. js/rides.js holds the rides; the
Hornet's model is built there with the vehicle workshop in js/vehicles/models.js, and the
Kestrel is that file's dropship.
This is still a tech demo and a sandbox: there are no waves, and nothing attacks
until it is called in. Right before the fight starts (the moment the Kestrel H's clamps would
open), the drop holds on a notice saying so; Okay (or Enter) lets the frame go.
Press ` in the fight (or click Summon on the HUD, or tap it on a
touchscreen) to open the summon menu on the left. The game keeps running behind
it, and the pointer is free to use the sliders; ` again or Close takes
the pointer back for aiming (Esc or a click on the view closes it too). Every
monster in the game has a row: a slider for how many and a Summon button. The
HUD's HOSTILES box counts everything out there or on its way through a portal.
On a touchscreen (no ` key) the loadout and pause hangar also have a
Debug button. From the pause hangar it goes back into the fight with the menu
open; from the loadout before a drop it opens the menu over the loadout, where a
Summon only queues the monster (the button reads Queued; press it again to take
it back) and everything queued comes through as soon as the frame is released.
| Monsters | How many per summon |
|---|---|
| Spider-frames: Stalker, Skitterer, Weaver, Lancer, Bombardier | 1 to 20 |
| Medium spider-frames: Bulwark, Warden, Mender, Magnetar, Quarrier | 1 to 5 |
| Scorpion-frames: Burrower, Prowler, Berserker, Shocktail, Scorcher, Venomtail | 1 to 20 |
| Emperor scorpion | 1 to 5 |
| Riftlings: Acid, Blast, Shade, Spire | 1 to 500 |
| Broodmother | 1 to 5 |
| The millipede | 1 (only one at a time) |
A kind's button is disabled for a minute after it summons, counting down on the button. If there's no room left (136 spiders, 128 scorpions and 500 riftlings at once), a summon brings what fits.
Portals. Every monster comes through a portal of its own, about 800 ft straight ahead of where the mech is looking (kept inside the city):
js/millipede.js tries 90 spots and headings near the 800 ft mark for one whose
disc clears whatever is under it and stands clear of the buildings beside it,
in view of the mech, with a route that leaves it lying on the roofs, low and
clear of the mech. The
body crawls out through it, sloping down onto the rooftops; everything still
behind the portal is clipped away (and can't be shot or locked), its legs reach
for holds as they come through, and the portal closes behind the tail.js/summons.js holds the list, the placement and the cooldowns, js/portals.js
draws every portal as one instance of two instanced meshes (two draw calls for a
whole rain of them), and SummonMenu in js/ui.js is the menu.
Launch on the intro card opens the frame select screen, then the loadout, then Deploy flies the frame in (see Insertion). Quick deploy skips straight to the drop with the last frame and loadout. After a lost fight, Hangar goes back to the frame select and Redeploy flies a fresh frame in.
| Frame | Armor | Walk | Dash | Boost | |
|---|---|---|---|---|---|
| FS-07A Vanguard | 1000 AP | 46 km/h | 220 km/h | 9.6 s | The field-trial frame; takes the hangar's paint schemes |
| HV-02 Obsidian | 1450 AP | 39 km/h | 189 km/h | 7.7 s | Heavy armor in black, ivory and gold (assets/heavy-frame) |
| PX-09 Pontifex | 880 AP | 51 km/h | 238 km/h | 10.6 s | White plate on a dark frame, with the longest legs in the bay (assets/pontifex-frame) |
The select screen shows each frame's armor, walk and dash speeds and how long a full
boost gauge lasts, and puts the picked frame on show in the plaza. All the frames are built
on the same rig, sockets and thrusters (HeavyMech and PontifexMech subclass Mech and reskin it; the Pontifex also brings its own leg lengths), so
a loadout moves across unchanged; the world is always scaled from the Vanguard, so the
city's size never changes with the frame. The frame can also be swapped in the pause
hangar mid-fight: it keeps the same share of its armor. The frame list is in
js/frames.js; the pick is saved under vectorclad.frame.
The hangar sets the loadout for six hardpoints (both hands, both shoulders, both
legs), the frame, a frame paint scheme (the Vanguard's; the Obsidian wears its own finish),
and one of eight colorways per weapon. It has five
presets and settings for sound, music, graphics, shadows, ink outlines, look
sensitivity, inverted look and render resolution. Before a drop it is the loadout screen, with Deploy and
a way back to the frames; in a fight it pauses the game. The loadout and settings are saved in localStorage
under vectorclad.* keys (saves from earlier builds under fs07.* still load).
Weapons, from the weapon sheet:
The hangar's Graphics setting picks how each frame is drawn (js/post.js):
| Setting | |
|---|---|
| Low | The scene straight to the screen. Phones and tablets start here. |
| High | Bloom on everything that glows, heat shimmer round it, glare round the sun, a light grade and vignette, and red closing in from the edges as the mech is hit |
| Ultra | High, plus ambient occlusion, god rays and a sun shadow map twice as sharp |
| Auto | Ultra to begin with, then a setting lower whenever play stays under about 45 frames a second for four seconds. The default on desktop. |
On every setting:
js/world.js): measured along the ray, not the view axis, so it doesn't shift as the
camera turns; thickest along the ground and thinning with height, so tower tops stand out
of it; warm toward the sun and cool away from it.batchRigid() in js/atlas.js):
what code still moves, hides or recolors (pistons, thrusters, hatches, barrels) is left
alone. The Vanguard goes from about 500 draw calls to 260. Outlines no longer cast
shadows.Port Meridian: a 15 x 15 grid of blocks on a peninsula between two rivers and a harbor,
with a forest along its west side, built entirely from the city texture sheets and the
asset packs. The mech stands 40 ft (12.2 m) tall: at startup main.js
measures the top of its head in the idle stance and sets the world scale from
that (about 1.71 m per game unit), and the city is laid out in real meters.
Every car wears one of a hundred skins from the car sheets in assets/car-sprites
(ten each of sedans, hatchbacks, coupes, supercars, muscle cars, SUVs, pickups, vans,
wagons and rally cars), and its body is built to fit its skin. Each sheet holds unfolded
car nets: a plan strip (hood, roof, trunk) between two full-length side profiles, the
front fascia above and the rear below. tools/build_asset_atlas.py cuts every net into its
five pieces (where pieces touch, the fascias hang off the plan strip like tabs; they are
cut free along the narrowest gap, row by row, and where a side's windows run into the plan
strip, along the plan strip's edge as it runs there; each piece is trimmed to its opaque
pixels, which drops the sheets' soft fringes, and the plan strip loses its mirror arms) and
measures the side profile and plan at 28 stations from bumper to bumper. The car's sides follow the painted silhouette, wheels,
arches, windshield and roof line included, its top wears the plan strip and its ends the
fascias. All cars share one topology and one draw call: the vertex shader reads each
instance's skin from a data texture and moves the vertices to fit it. Each frame only the
cars in view (out to 1.2 km), and those near the mech whose shadows can fall in view, are
copied into that draw; the rest of the city's thousand-odd cars cost nothing.
The city is full of people, at their true size beside the 12 m mech (js/people.js):
js/gore.js): every death bursts in a small explosion of red droplets and a
puff of red mist. The droplets fly and fall until they hit something (the street, a
sidewalk, a floor, a wall or a ceiling, a piece of falling building), and each one leaves
a splatter stuck flat to that surface, streaked the way it was going. Splatters stay until
the surface under them is shot away, or newer ones take their place (up to 9,000, 2,500 on
phones). Bodies trodden on or slammed down by a blast spray more.death() in js/audio.js): twelve squishes (a wet
slap, a squelch, bones crunching and snapping, a deep splat, a gurgle, dripping, a
suction pop, a squash, a slosh, a thud, a hissing spray) and twelve screams synthesized
from vowel formants (a man's yell, a woman's shriek, a child, a yelp cut off, a scream
through blood, a falling wail, a hoarse shout, "oh, no", a whimper, a choked gasp, a
squeal and a groan). When a blast kills a crowd they come as a chorus, up to sixteen in
a second and a half.Furniture (js/furniture.js): sixteen pieces modeled in three.js from boxes and
cylinders: desks with monitors and office chairs, filing cabinets, bookshelves full of
books, water coolers and potted plants for the offices; sofas, armchairs, beds, tables
and chairs, televisions, fridges, wardrobes and floor lamps for the homes. Blasts throw
them out through the holes, tumbling; a piece whose floor is shot away falls; they bounce
and come to rest on the street, on the rubble or on the floors below.
A train comes in on the elevated railway about once a minute, out of the north end of the
line beyond the barricade (js/train.js): cab cars at both ends and four coaches between, stainless steel
from the silver aluminum facade sheet with ribbed titanium roofs, on bogies. It runs south
down the line, stops at the end of it by the water, crosses over to the other track and
runs back north out of the city.
It brakes to a stop for the mech standing on the track, and for a train stopped ahead of it, so trains held up queue behind each other (and the next one waits to come in). But wherever the deck has been shot away under it, or a wreck is lying on the line, it derails: the cars stay coupled while it brakes, and each one leaves the rails as it runs off the broken end of the track (the leading one as it runs into the wreck ahead), going on as a rigid body with the train's speed. It tumbles off and crashes down onto whatever is below, crushing cars, people and trees. Whatever is left when the train stops lies on the deck for the next one to plough into. The trains keep coming whether or not the line is still there, so the wrecks pile up in and under the gap, each settled car becoming something solid for the next ones to land on and for the mech to climb. A settled wreck stays put only while something holds it up: shoot the deck out from under one, or the wreck it lies on, and it comes down.
All city surfaces sample six texture atlases (textures/city-facade.jpg,
city-surface.jpg, city-ground.jpg, city-panels.jpg, city-roads.jpg,
city-structs.webp) through a shader that tiles inside one atlas cell with
textureGrad, so the whole city is merged into a few dozen meshes. Each vertex carries
its cell's rectangle, so cells can be any size. If the facade, ground or structure
panels ever outgrow one 4096 px page, the build splits them over city-panels2.jpg
(or city-roads2.jpg, city-structs2.webp) and on, keeping each kit on one page, and
the city gives each page its materials. The structure atlas is WebP so its see-through
pieces keep their alpha.
tools/build_city_atlas.py rebuilds the atlases and js/cityTiles.js from the
source sheets in textures/city-src/. The asset packs add four more pages, built by
python3 tools/build_asset_atlas.py [--review DIR] (it needs NumPy, Pillow and SciPy)
into js/kitTiles.js, which merges them into the city's tiles: city-kits.jpg (the
skyscraper facade kits), city-stores.jpg (the storefront kits), city-roofs.jpg (roof
coverings and details), plus trees.jpg (bark and foliage) and cars.webp (the car
skins, with alpha). Every facade, storefront, roof and foliage sheet is a 4 x 4 grid of
modules; the build finds the grid lines near the quarter marks and cuts each module a
little inside them, so no sliver of its neighbor repeats along an edge. --review draws
the car cuts over each car sheet. python3 tools/build_billboard_atlas.py (Pillow and
NumPy) scales the billboard ads into the 16:9 cells of textures/billboards.jpg and
writes where each one sits into js/billboards.js. Collision uses a spatial grid, and rays walk
it with a 2D DDA.
The panel kits (the sheets named in KITS in tools/build_city_atlas.py) are
sheets of loose panels on dark gutters. python3 tools/build_city_atlas.py --segment <review dir> cuts them out along the gutter network (it needs OpenCV), writes each
panel's rectangle to tools/city-panels.json, and draws numbered sheets into the
review directory. Each kit sets the gray level that counts as gutter and, for sheets
whose gutters fade in places, a gap bridge that closes short breaks along a gutter
line; PANEL_FIXES lists the rare panels the cut still gets wrong. The last field of
each panel is its role, picked by hand: B window bay, P pier, S solid wall, V
vent, x unused. Roles carry over when the sheets are cut again. The normal build packs
every panel in use into city-panels.jpg at its own aspect ratio, scaled to a common
texel density from each kit's measured floor height.
The ground kits (GROUND_KITS) are road and sidewalk tiles between thin separator
lines, so --segment cuts them along rows and columns instead: by the separators'
color, by thin lines lighter than their surroundings, along only the lines that cross
the whole sheet, or along lines given by hand for a sheet whose separators are too
faint. Their roles are A asphalt, W sidewalk, Z plaza paving, C crosswalk, L
white lane line, Y yellow center line, X box junction, O round cover, Q square
cover or grate, T tree pit and H damage (cracks and potholes). The build packs them
into city-roads.jpg, and on the way turns crosswalks and lines so their stripes run up
the tile, crops lines to their paint and covers and pits to their outline, and evens out
broad stains on the tiled surfaces so they don't show as a checkerboard.
The structure kits (STRUCT_KITS) are loose pieces on a charcoal background, cut like
the facade panels but keeping sparse shapes such as towers, piers and lamp posts. Their
roles are D road deck, K track deck, F concrete slab, B barrier, G girder face,
C column, S block or pile cap, L cable bundle, T truss, R railing, U
balustrade, H hanger, N steel bent, M lamp post, P pier, W tower and Y pylon.
Tiles are packed as they are; the rest have the background keyed out into the atlas's
alpha, so trusses, railings and balustrades draw as see-through cards (and cast
see-through shadows). Piers, towers and pylons also have their outline traced into
OUTLINES in js/cityTiles.js, holes included, and the city extrudes them into solid
slabs with the piece on both faces. Bridges size their towers and pylons from these
outlines, so the deck always passes through the opening under the crossbeam.
Everything the mech can shoot in the playable city can be shot apart: buildings and towers,
their cornices, penthouses, billboards, solar panels and the old timber water towers on the
walk-up and prewar roofs, lamp posts, signals, kiosks, subway entrances, the El and the
elevated highway. (The bridges and the distant skylines stay whole; trees have their own
physics in js/trees.js.) It lives in js/destruct/.
Hits carve cells. A structure stays part of the city's merged meshes until something hits it. Then it is voxelized into cells of about half a meter (up to 1.25 m for the biggest towers). The grid lines snap to every wall, floor and setback, so cell faces lie exactly on the original surfaces. Each round takes its own bite:
Spider fire chips the city too, but less: plasma bolts, lasers, mortar shells and skitterer blasts.
Holes are cut to the pixel. A damaged structure keeps the triangles it was drawn with as a skin. A 3D mask texture, one texel per cell, drops every fragment whose cell is gone, with torn cladding at the edges and scorch around them, and the shadow map uses the same mask, so light falls through the holes. Behind the skin, the cells are built like a building: one-cell walls of the facade's material (glass curtain wall, stone, brick or panel), floor slabs, a grid of columns about 7 m apart, a core in tall towers, and rooms between them.
Load paths are built in. Where one volume stands on another (a setback tier, the needle's shaft on its lobby drum, its pod on the shaft, a penthouse on a roof), there is a slab between them, and the upper walls carry on down through the rooms below to what holds them up. Flaring and tapering walls are one connected shell, and crowns, masts and halos are tied to what holds them. Nothing in a building floats free until it is cut free.
Structures fail like structures. After damage, a standing structure is checked four ways:
Blow a building open and its floors are lit, each its own way. js/destruct/ceilings.js
draws the ceilings per pixel in the broken faces' shader, so they cost no geometry.
tools/build_ceiling_atlas.py cuts the fixtures, tiles and vents out of the sheets in
textures/ceiling-src/ (a light is trimmed to its opening in the T-bar, which the shader
draws itself) and packs them into textures/ceiling.jpg. It writes a glow map of only the
lit diffusers to textures/ceiling-glow.jpg and the slots and theme tags to
js/ceilingTiles.js.
The test script tools/tests/destruction.js (headless Chromium through Playwright) runs
these scenarios: bullet holes, a tower cut past halfway, a pancake collapse, props, the
needle felled by missiles into one side of its base, a building dropped between its flush
neighbors, a building corner blown out, the El, walking into a breach, activation cost of
the biggest structures, real weapons, ceilings of each theme with a blast and a slice
through them, and a soak with the swarm. It prints timings and
writes screenshots to tools/tests/out/. On a machine without a GPU or without access to
the CDN, SIM=1 runs game time without rendering between screenshots, and THREE_DIR
serves a local copy of the three.js package.
The enemies are six-legged spider machines cut from the spider texture sheets. They're big (a stalker's body alone is longer than the mech is tall) but weak alone (one beam rifle bolt, one missile or a short burst drops most of them; the big Lancers and Bombardiers take two bolts). They come only when summoned, dropping out of portals in the sky:
| Variant | Palette | What it does |
|---|---|---|
| Stalker | Gunmetal, red glow | The all-rounder. Crawls the towers, leaps between perches, fires plasma bursts, and charges a red laser from its perch. |
| Skitterer | Rust, toxic green glow | Small, fast and fragile. Rushes the mech in packs of two to four along streets and walls, pounces on it from up to 60 units away (even off a wall), and bursts on contact. It also bursts when shot, hurting anything nearby, mech and spiders alike. |
| Weaver | Bone white, cyan glow | Long-legged with a long abdomen; leaps the most. Spits pairs of web globs that slow the mech and its boost regen for about three seconds. Dashing tears free faster. |
| Lancer | Blue steel, violet glow | Big and slow, with a dorsal lance over its head. Climbs high and perches far off (55 to 170 units), then charges a heavy violet beam for 1.7 seconds. Takes two rifle bolts. |
| Bombardier | Brass, orange glow | Bulbous mortar sac. Stays on rooftops and lobs shells at where the mech is heading. A pulsing orange ring marks each landing spot. Takes two rifle bolts. |
| Broodmother | Near black, magenta glow | A boss two and a half times a stalker's size with 320 HP. Fires five-bolt fans and sets down pairs of skitterers every seven to ten seconds. |
Locomotion follows how real spiders, and the procedural spider rigs built on them, move:
tools/build_spider_atlas.py traces the parts out of the source sheets along
the dark gaps around each piece (each part is picked by a point inside it),
packs them into textures/spider.jpg, writes a glow map of only the lit red
tubes and slits to textures/spider-glow.jpg, and records each part's rectangle
and outline in js/spiderParts.js. In js/frameParts.js (shared with the
scorpions), the outlines become extruded plates with the art mapped onto them:
curved blades for the upper legs, striped claws for the lower legs (each crossed
with a second plate so it has body from any angle), the skull face, brow, fangs
and spine crest. The ribbed
dome and the slit plate are wrapped onto the abdomen and the carapace. The eyes
are additive glow points.
Palette swaps happen per spider in the shader. Each instance carries a tint for the bare metal, an accent that replaces the red paint (picked out by how much redder a texel is than its green and blue), and a glow color for the lit tubes. So every variant shares the same atlas and the same instanced meshes. Variants also differ in leg length, abdomen shape and size, and lancers carry an extra dorsal lance plate.
Every spider part is an InstancedMesh shared by the whole swarm, so 64 spiders
cost about fifteen draw calls.
Twice the size of a stalker, slow, and built to soak up fire: 170 to 300 HP, six to ten beam rifle bolts or two or three bazooka hits. They're too heavy to leap. To get from one roof to the next a medium spider bridges: it walks to the edge facing the next roof and, if the gap is within its leg span and the roofs are close enough in height, stretches across, rear feet gripping one roof and front feet the other, until its body is over. A gap too wide (any street) means climbing down, crossing and climbing up the other side.
| Variant | Palette | What sets it apart |
|---|---|---|
| Bulwark | Brass, amber glow | A riot-shield plate over its face turns away three quarters of direct fire from in front, and 40% of blasts. Fires twelve-round gatling bursts. Flank it, or shoot it from behind. |
| Mender | White, green glow | Keeps near the other frames and plays medic: a green beam from the emitter on its crane arm repairs the most damaged frame within 70 units, 32 HP a second. Shoots at the mech when nothing needs fixing. Kill it first. |
| Warden | Blue steel, gold glow | Raises a shield dome (240 HP) over itself and whatever stands near it. Shots from outside stop on the dome, blasts outside it don't reach in, and missiles can't lock onto it. Broken, it comes back eight seconds later. Step inside it, or break it and finish the Warden before it's back. |
| Magnetar | Silver, red trim, blue glow | Two spinning coils on its back charge a tractor beam that holds the mech for three seconds and drags it toward the Magnetar a little faster than the mech can walk. Dash to pull away. |
| Quarrier | Sandstone, orange glow | Tears a boulder out of the roof it stands on, holds it overhead and hurls it at where the mech is heading. The boulder smashes what it lands on (about 57 AP on a direct hit). |
js/mediums.js gives them their goals, their bridging and their gear; the
spider code in js/spiders.js walks and draws them like any other spider.
Eight-legged ground hunters built from the same spider sheets and palette swap, summoned the same way, and bigger than the spiders: a Burrower's raised tail stands as tall as the mech, and an Emperor's more than twice as tall. They don't leap or shoot from the rooftops. They drop out of their portals onto the street or a roof and come straight for the mech to fight up close:
Weakness: a scorpion can only climb about 100 ft (30 m) up a wall. Past that its grip gives out: it scrabbles at the wall, slips back down and tries again, so scorpions chasing a mech up a tower end up lined along the wall with their heads at the 100 ft mark. They can still climb over buildings shorter than that, but a mech on a higher roof, or high in the air, is out of reach of everything but their ranged attacks. Their pincers do reach a little past the line, so a mech standing right at the edge of a roof just above it can still be clawed.
| Variant | Palette | What sets it apart |
|---|---|---|
| Burrower | Desert tan, amber glow | Dives into the street and tunnels at the mech, untargetable, straight under buildings, while the street heaves above it. A pulsing ring marks where it will burst out 0.6 seconds later, pincers first (24 AP). |
| Prowler | Black | Runs dark: its lights go out and neither the lock-on button nor missile locks can find it. It swings wide round the mech to strike from behind, where the shield can't help and its hits do 50% more. Its lights flare whenever it strikes or is hit. |
| Berserker | Dark red | Tougher (two rifle bolts). Below half its armor it goes berserk: glow flaring and venting red steam, it moves half again as fast and strikes and recovers far quicker. |
| Venomtail | Neon green | Its sting injects venom that eats 7 AP a second for six seconds and holds off armor regeneration; its pincers inject a little too. Lobs pairs of venom globs from range, or at a mech out of reach. |
| Shocktail | Neon blue | Its sting shorts out the mech's boost (45 drained, regen stalled). From range, and at a mech out of reach, it charges and arcs jagged lightning from its tail that drains boost too. |
| Scorcher | Neon orange | Sprays a stream of fire from its tail that drags after the mech's legs, burning it while it stands in the stream and setting the street alight. Burning patches last a few seconds. |
| Emperor | Royal purple, gold trim | Nearly twice the size of the other scorpions, with 160 HP and hits half again as hard. Its pincer seizes the mech and pins it for 1.8 seconds (dash to break free three times faster) while it reels itself in and stings. |
js/scorpions.js builds scorpions from the spider atlas parts: the thorax plate
on a flat carapace hull, the ribbed dome stretched into the segmented body with
the spine plate along its back, femur and tibia plates for the legs and arms,
heavy hulls for the claw hands, striped claw plates for the fingers and stinger,
and the glowing turbine disc wrapped onto the venom bulb. The neon kinds use a
fourth channel on the palette's accent that makes the paint itself glow.
Every part is an InstancedMesh, drawn only up to the highest scorpion slot in
use, so the 24 scorpions that can be alive at once cost about a dozen draw calls.
Eight-foot, six-limbed predators (the asset in assets/riftlings/): a split crest,
scythe arms and a barbed tail. They come only from the summon menu, up to
five hundred at a time, each through its own small portal, in four packs of one color
apiece. A summon is dealt out into packs of that color's size, and the first of each
pack to come through leads it. Alone they're frail (one rifle bolt, or two machine-gun
rounds), but they're fast and many.
| Pack | Color | Pack size | What sets it apart |
|---|---|---|---|
| Acid | Green | 10 to 18 | The biggest, fastest packs: they run at twice the mech's walking speed and leap from 22 units. Every splat sprays acid that eats armor the way a Venomtail's venom does, and splats add up, to six seconds of it. |
| Blast | Orange | 5 to 9 | Bloated, slower, glowing in pulses, and running in a tight clump behind their leader. Each one goes off like a grenade when it splats (21 AP) or is shot, killing whatever is close, so one shot into the clump sets the rest off in a ripple, and one going off on the hull blows the others there off it. |
| Shade | Purple | 5 to 8 | Runs dark, its glow dimmed and no lock-on able to find it. The pack spreads out to surround the mech 24 units out, keeping low and ducking sideways out of the crosshair, until the leader screams: they light up and all pounce at once, from every side, where the shield can only turn away the ones in front. |
| Spire | Blue | 5 to 8 | Comes over the rooftops, not the streets: climbs every wall in its way but the towers', bounds across the streets from roof to roof, and leaps at the mech from up high (44 units out) and straight off walls, so it can reach a mech up on a roof or in the air. Each latch shorts out 9 boost and stalls its regeneration. |
js/riftlings.js runs them for the swarm (js/spiders.js); js/summons.js calls them
in. They're drawn by the asset's own instanced swarm at its lower detail (about 2,400
triangles each): one InstancedMesh for all of them, posed in the vertex shader from
its thirteen clips baked into a pose texture, so five hundred cost one draw call, plus
one for the soft contact shadows under them (the posed mesh can't
cast real ones). Each riftling is a point on a street, a roof, a wall or the hull,
pushed out of the buildings (the same push-out the mech uses), out of the mech's legs
and away from each other. The way to the mech by street is a flow field: the city's
footprint is a grid of 3-unit cells, blocked under buildings and walls, and a
breadth-first search out from the mech's cell (searched again as it moves) gives every
street cell its distance to the mech, so a riftling only has to head downhill to come
round the blocks, never into a dead end. Clips follow what each one is
doing, their speed matched to its own: falling out of the portals, idle and screaming at the muster, running and
walking, stalking and crawling for the Shades, dodging, leaping (with the clip's own
hop taken out, so the arc it flies is the real one), the climbing clip turned head up
for walls and the hull, hit and death.
Summoned, a black robotic millipede hundreds of feet long crawls out of an upright portal (see Summoning) along the rooftops, and never stops crawling. Draped over the roofs and sagging over the streets between them, it grips roofs and facades with two pairs of legs under each of its ten armored sections.
On the prowl: it doesn't come straight for the mech. It roams the blocks round it, 120 to 250 m out, heading for one spot and then another. It climbs over what it can, up to about 75 m at once; anything taller it bores straight through with the hooks on its face, slowing as it tunnels, when it can't turn away in time. It would rather not crawl over its own coils, but rides up over them when it must.
A menace: every step drives a foot into the building under it, punching holes in roofs and facades, and its head bites anything it runs into.
Turrets: two on its head, two on the section halfway down its body and three on its tail. They turn to track the mech and fire plasma bursts (head), gatling bursts (middle) and fans of bolts (tail) whenever they have a clear line. Each can be locked onto and shot off; three beam rifle hits or a bazooka does it.
Armor: each section carries three layers of plates: black, then steel, then bronze. Weapons break plates off one at a time (they tumble off the body), the outer ones first; a plate is gone after a beam rifle hit or two or three machine gun rounds, and a plate with another still over it takes a third of a blast. Nothing else wears them down: not the roofs it lies on, not its own coils. The keel underneath never comes off.
Reactor cores: a hole through all three layers over the middle of a section opens its reactor core, a rainbow gem in a cage. A few more hits destroy it and the section goes dark. Roughly four bazooka hits per core, or a missile salvo on one spot.
The head can't be hurt while any core still burns. It rides right up against the front of the body and leads it.
Breaking loose: with the last core gone the body dies where it lies. Thrusters in its neck light, the head tears free, climbs, flies off a fair way, turns and hunts the mech from the air with twin solid red beams from its eyes. They charge for a second, then burn for three, dragging after the mech (walking won't shake them, dashing will) and carving through whatever buildings they cross. The head takes 1900 damage, about fifteen direct bazooka hits.
Death: the dying head rams through twenty to thirty buildings, tearing a tunnel through each, then climbs, spins faster and faster, and blows apart in a huge explosion with fireworks and a ring of smoke rolling out. The rest of the body goes up section by section.
The boss bar counts its reactor cores, then the head's armor.
js/millipede.js plans its first stretch from its portal (see Summoning):
a straight run back through the portal for the body still to come, and a gentle
arc forward from it. Over the arc it lays the tightest drape: the lowest line over
every roof it passes that never slopes more steeply than 0.65, starting from the
portal's height. Of 90 tries it takes the one in view of the mech that lies most
on roofs, low and smooth, and clear of the mech.
From then on the head leads and the body follows its trail, which it plans 72 units ahead of the head as it goes, a step at a time. Every few steps it tries nine headings, each turned as sharply as it can (no tighter than a 32-unit radius), and scores the next 54 units of each: how far it bends from the spot it's prowling to, how much it would climb, whether anything is too tall to climb (it would have to bore), whether it would pass over its own body, back behind its portal or out of the city. Each new step drapes down off a roof no more steeply than 1.3, climbs no more steeply than 1 (raising the stretch still ahead of the head to meet a roof), bores level through anything more than 46 units above it, and rises over its own body where that will still be lying when the head gets there. Where the trail bores, the head blasts a tunnel ahead of itself. The trail behind the tail is forgotten. Each section is a rigid piece laid along the trail and lifted until it clears every roof under it, with a ribbed sleeve over each joint.
The 1260 plates are curved tiles in three instanced meshes, one per layer. Shots are tested against each section analytically: the ray moves into the section's frame and meets the three armor cylinders, the keel, the core and the end frames in turn, so it stops on the first plate still there, or on the core through a hole. Blasts reach every plate in range, shielded by whatever is still on top. The legs reuse the spider atlas plates and two-bone IK, finding holds on roofs, walls or nothing (they dangle). The head is built from primitives with the body's own plates on its crown; it's a target of its own, armored until the cores are gone. The turrets are targets of their own too, each riding its frame (the head, the middle section, the tail tip) and turning in its own base's frame. A foot that comes down on a building carves a small hole: up to eight a second in buildings already broken into, and only one every 0.6 s that breaks into a whole one, which is costly.
Every deploy starts with the frame slung under a Kestrel H heavy lifter: a gunmetal variant of the Kestrel dropship, half again its size, with ducted lift fans in place of the rocket pods and a cradle under the belly whose clamp arms hold the mech by the shoulders. There is no control during the flight, about twenty-three seconds behind letterbox bars with a release countdown:
Packs of three to ten Kestrel assault lifters, each with a Bastion armored carrier
slung under it, fly in about every minute (the first a quarter of a minute after the
release), mostly over the harbor, sometimes over the rivers east or west. Both are the
models from the Riftlings preview (assets/riftlings/preview.html), ported to
js/vehicles/models.js.
The headless test tools/tests/allies.js [frames|drop|tanks|soak] checks the frame select
and loadout screens on a desktop and a landscape phone, flies an insertion and checks the
landing, forces a pack in and watches the tanks fight the swarm (and a Kestrel shot down),
and plays two minutes in real time for the frame rate. Screenshots go to tools/tests/out/.
The suit follows Armored Core's style:
Walking is procedural:
The thrusters are built to read as real hardware:
Armor plates are cut straight from the body sheet: js/pieces.js holds the
outlines of the sheet's panels, traced in sheet pixels. pieceGeo() in
js/atlas.js extrudes a plate to that outline and maps the panel's art onto
its face, so the E-07 hatch, R-07 forearm plate, shin plates, hazard pads and
DANGER intake panel all keep their painted shapes on the model. An inverted-hull
pass (addOutline()) draws ink outlines for the anime look; it can be turned off
in the hangar settings.
| File | What it does |
|---|---|
js/regions.js | Pixel rectangles of the panels used from each texture sheet |
js/pieces.js | Traced outlines of the cut-out armor pieces on the body sheet |
js/atlas.js | Texture loading, box-projected atlas UVs, geometry helpers, ink outlines and merging rigid parts, paints and skins |
js/mech.js | Mech model, gimbaled bell-nozzle thrusters with plume shaders, IK foot-planting gait, dash/jump/aim animation |
js/frames.js | The frames in the hangar (FS-07A Vanguard, HV-02 Obsidian): armor, speeds, boost, and how each is built |
assets/heavy-frame/heavy-mech.js | The HV-02 Obsidian: new armor on the stock rig (subclasses Mech) |
js/weapons.js | Weapon definitions and models, projectiles, homing missiles, lock-on |
js/fx.js | Instanced billboard particles (smoke, fire, sparks), explosions, light pool, decals |
js/city.js | Port Meridian: street grid, buildings, houses and row houses, roofs, parks, the forest, street furniture, elevated railway and highway, waterfront, bridges, distant scenery |
js/trees.js | Trees: species, textured trunks and crowns instanced by chunk, uprooting, rigid-body tumbling and rolling, burning |
js/cars.js | Cars: bodies shaped to their skins in the vertex shader, parked cars, lane-following traffic that turns and respawns |
js/pilot.js | The pilot on foot: the armored model, the first person arm and rifle, jetpack movement, the grappling hook, sticky grenades |
js/rides.js | Rides for the pilot: the Kestrel gunship (the dropship), the Hornet helicopter (model, vulcans, heavy vulcan, swappable missile pods), the APC and stolen cars |
js/people.js | People: fifty models, the rig and its animations, sidewalk walkers, panic, building occupants, falls and splats |
js/gore.js | Blood: the spray of droplets when someone dies, and the splatters they leave stuck to floors and walls |
js/furniture.js | Furniture: sixteen modeled pieces, furnishing broken floors, thrown and tumbling pieces |
The atlas mapping in atlas.js (mapUV) assigns each triangle to one of six
directions by its normal and maps it into the region chosen for that direction,
cropping the region to the face's aspect ratio so panels never stretch. To
re-skin a part, change the region names passed in its faces object.
assets/billboards: forty eccentric products (Miracle Office Shrimp, Sleepless Mint, Crunchy Water and the rest) and twenty serious corporate campaigns. The ads are dealt out in a shuffled order, the whole pack before any repeats, so every one of them is up somewhere in the city (each shows on six or seven of its 380 screens).assets/skyscraper-facades): silver aluminum, art deco limestone with bronze, white precast, black steel curtain wall, red brick industrial, brutalist concrete, champagne aluminum, terracotta rainscreen, pale granite, green copper, white ceramic tile, 1920s sandstone, blue-gray metal panel, dark basalt with bronze, travertine fins, weathered 1970s concrete, burgundy metal and brick, pale green enamel, ribbed titanium and neo-gothic limestone. Each sheet's window bays, wall panels (with a pier cut down the middle of each) and louvers join the facade mix by style.assets/street-level-storefronts): bakeries, bookshops, coffee shops, pharmacies, florists, butchers, barbers, laundromats, galleries, record shops, tailors and more. A street front is a run of their shop windows and doorways, now and then one with its shutter down, under a sign board; their upper-floor windows face walk-ups and row houses too.assets/rooftop-textures): rubber membrane, gravel ballast, standing seam, copper, terracotta, slate, white membrane, concrete, bitumen, sedum, solar, corrugated steel, pavers, decking, zinc, shingles and more, with drains, vents and hatches from the same sheet set into them.assets/bark-and-foliage) and its own crown: round heads of leafy clumps on oaks, maples, beeches and lindens, vase-shaped elms, slender birches with pale bark, columnar poplars, tiered pines, spruces and firs, conical cedars, and redwoods with long bare trunks. Every tree is sized and shaped a little differently. The streets and parks have the broadleaf kinds and the odd pine; the forest has them all. Trees are drawn in chunks of the city, so whole chunks drop out of view and out of the sun's shadow pass, and chunks more than 450 m off draw coarser clumps, cones and trunks over the same instances.Tipping is a hinge. When a level tips, its squeezed edge crumbles back to a pivot line just behind where the load bears, in a burst of rubble and dust out of the stump's top and the falling part's foot. The top then pivots there on a hinge. It leans slowly at first, held by the strength left in the hinge, which grinds and groans and sheds grit. Then it speeds up as its weight swings out past the edge. The hinge lets go when it snaps, when it slides off its edge, when the stump under it goes, or when the gap the crumbled edge left closes under the falling part's foot. From there the part pivots on its front edge and topples.
Neighbors don't hold each other up. Buildings in a row stand flush against each other, but a piece that breaks away gets no support from the walls it was flush against, its own stump's sides or the building next door. It slides down them freely until it leans or pushes into them, and then it collides as with anything else.
Nothing broken is left standing. A block pancaking down crushes everything under its whole footprint, hollow or not, so a tapering shaft doesn't slide down inside the wider one below. Walls a cell thick and columns that a collapse left standing free topple a moment later, if they are taller than they could stand unbraced (about 16 times their thickness, 8 to 18 m; steel twice that). Masts, poles and parapets built that way are left alone. Skin backed by nothing that is left disappears with it, torn edges and all: cladding hangs into a hole only from wall still standing, so a felled tower leaves no outline of itself in the air.
Falling pieces are rigid bodies (physics.js). Each is a voxel grid with mass and
inertia summed over its cells. It collides through probes on its outer corners against
the street, unbroken buildings, damaged ones and other pieces, with friction, warm
starting and sleep.
Rubble and dust: up to 2,400 tumbling chunks (900 on touch devices), shaped by material: rocks, glass shards, timber splinters and steel rods. Collapses throw out dust surges, and straining levels groan and shed grit before they go.
Shrapnel: explosions also tear big chunks off what they hit, slabs of wall and floor one to three meters across and lengths of twisted steel, thrown hard out of the crater: one for about every twelve cubic meters blown away, so a bigger hole throws more.
What's inside comes out: people and furniture fill the floors round a hole and spill out of it (see People under The city).
The mech walks into what it breaks open. It stands on broken floors and climbs rubble.
It keeps the frame rate. Hot loops run on typed arrays with no per-cell allocation. Strength calibration weighs only the levels whose section changes. A blast that reaches several unbroken buildings turns them into voxels nearest first, within a per-frame budget (12 ms, 7 ms on touch devices), and carves the rest a frame or two later.
js/train.js | The El's trains: the route, derailing where the track is gone or blocked, wrecks as rigid boxes that pile up |
js/kitTiles.js | Generated: the facade, storefront and roof kits, tree tiles and car skins with their measured outlines |
js/cityTiles.js | Generated: atlas layouts, tile positions, the facade, ground and structure panels and kits, and the traced outlines of solid structure pieces |
js/post.js | Post-processing for High and Ultra: the offscreen scene, the glow pass and bloom, heat shimmer, sun glare, god rays, ambient occlusion, the grade |
js/world.js | Sky and clouds, haze, lights, spatial collision grid (colliders, moving cars and trees), raycasts (through voxel structures and falling pieces), damage routing, filling broken buildings |
js/destruct/destruct.js | Destruction: activating structures, damage, structural checks (islands, bending sections, chunks, spans, remnants), tipping on hinges, breaking away, crushing, shattering, rendering budgets |
js/destruct/grid.js | Voxel grids on lines snapped to the original surfaces, materials, ray marching and push-out |
js/destruct/voxelize.js | Turns a city owner's recorded volumes into walls, floors, columns, cores and rooms |
js/destruct/skin.js | Original triangles lifted out of the city meshes, masked per pixel by a 3D cell texture (and in shadows) |
js/destruct/mesher.js | Greedy mesher for broken faces and the rooms behind them, chunk by chunk |
js/destruct/physics.js | Rigid voxel bodies: probes, contacts, sequential-impulse solver, hinges, sleep |
js/destruct/debris.js | Instanced rubble chunks that tumble, bounce and settle |
js/destruct/textures.js | Painted atlas for broken materials, office floors, ceiling tile and plaster; the broken faces' material |
js/destruct/ceilings.js | Ceiling themes, per-floor layouts, the ceiling and room-lighting shader, and the lights' power: flicker, outages, pieces going dark |
js/ceilingTiles.js | Generated: slots of the ceiling atlas and the theme tags of its fixtures, tiles and vents |
tools/tests/destruction.js | Headless destruction scenarios: timings and screenshots |
tools/tests/allies.js | Headless frame select, loadout, insertion, tank drops and the tanks' fight with the swarm: checks and screenshots |
tools/tests/riftlings.js | Headless riftling packs: each color's hunt, latches, splats and tricks, a Blast chain, climbing to a roof: checks and screenshots |
tools/tests/summons.js | Headless summon menu, cooldowns, every kind's portal drop, the riftling rain and the millipede's portal: checks and screenshots |
js/spiders.js | Spider-frames: variants and palettes, instanced model, surface crawling, tripod gait with IK legs, jumps, falls from portals, plasma, webs, mortars and lasers, and the summoned swarm's bookkeeping (spiders, scorpions, riftlings, the millipede); which foe each one goes after (the mech or an ally) |
js/summons.js | The summon menu's list of monsters, where their portals open (800 ft ahead, in clear sky), the staggered drops and the one-minute cooldowns |
js/portals.js | Summoning portals: instanced vortex and halo shaders, opening, holding and closing, embers |
js/allies.js | The Kestrel H insertion, packs of Kestrels setting Bastion tanks down, tank driving and gunnery, what the swarm does to them, and the instanced fleets that draw them |
js/vehicles/models.js | The Kestrel dropship (and its Kestrel H heavy-lifter variant) and the Bastion armored carrier, from the Riftlings preview |
js/scorpions.js | Scorpion-frames: variants and palettes, instanced model with a CCD tail and pincers, melee AI, the climb limit, and each kind's ability |
js/mediums.js | Medium spider-frames: variants, bridging between roofs, gear, shield domes, repair and tractor beams, thrown boulders |
js/riftlings.js | Riftlings: the four packs, coming through the portals, the flow field through the streets, wall sliding and climbing, leaps and roof-to-roof bounds, latching onto the hull, splats, blasts and acid, the Shades' ring and pounce, squashing and bowling over, contact shadows |
assets/riftlings/riftling.js | The riftling model and its thirteen clips, baked into a pose texture and drawn as one instanced, GPU-posed swarm |
js/millipede.js | The millipede: its first route out of the portal, then its endless prowl (steering, climbing, boring, the drape), sectioned body, three-layer plate armor and reactor cores, legs that punch into buildings, turrets, the head's flight, eye beams, ramming and finale |
js/frameParts.js | Shared by spiders, scorpions and the millipede: plates and hulls cut from the spider atlas, the palette-swap material, leg rigs and IK, beams, the mech's hit capsule |
js/spiderParts.js | Generated: where each spider part sits in the spider atlas, with its traced outline |
js/audio.js | Synthesized Web Audio sound effects |
js/music.js | Soundtrack playlist: title theme, shuffled rotation, volume drop after the title |
js/boot.js | Entry point: downloads the title theme, then loads the title screen and the game |
js/input.js | Keyboard, pointer lock and touch controls |
js/ui.js | HUD (armor, hostiles, damage indicators), the summon menu, frame select cards and hangar menu |
js/main.js | Renderer, world scale, player physics and armor, frame swaps, the screens from intro to drop, camera (and the insertion's), game loop, game over |
js/title/title.js | Title screen: tap/click/key to start, fade out, portrait handling |
js/title/logo.js | Live 3D VECTORCLAD logo (from the brand kit) |
js/title/wordmark-data.js | Generated: wordmark geometry and brand palette |
tools/build_city_atlas.py | Packs the city texture sheets into atlases and cuts the facade, ground and structure kits |
tools/build_asset_atlas.py | Packs the asset packs in assets/: facade, storefront and roof kits, tree tiles, and the car nets cut into pieces and measured |
tools/city-panels.json | Each facade, ground and structure panel's rectangle on its sheet and its hand-picked role |
tools/build_spider_atlas.py | Traces the spider parts out of their sheets and packs them into an atlas and glow map |
tools/build_ceiling_atlas.py | Cuts the light fixtures, ceiling tiles and vents out of their sheets and packs them into the ceiling atlas and glow map |
tools/build_music.py | Encodes the soundtrack WAVs to the MP3s in audio/music/ |