What it does
The playfield is a web: any open or closed silhouette of lanes, running from a near rim to a far end. Lanes are numbered, depth runs from 0 at the rim to 1 at the far end, and a closed web wraps round. The claw steps exactly one lane per tap, accelerates when held, or glides to a lane under a pointer or spinner, and always settles on a lane centre. It fires repeatedly down its lane with a cap on shots in flight, and with the right power-up it jumps above the rim under gravity.
Enemy kinds each run one of eight behaviours, with every parameter exposed. Flippers climb by a climb program, straight, random, spiral, chase, zigzag or avoid, then chase along the rim. Tankers split into their cargo. Spikers lay spikes and retreat. Fuseballs ride lane edges and can only be hit mid-cross. Pulsars electrify their lane on the level's pulse. Sparks run the rim, mirrors reflect shots back down the lane, and UFOs hover above the rim zapping lanes. Demon heads and mutant flippers are flipper kinds with extra hit and rim parameters, so a new enemy is usually a new set of numbers.
Around that sit the rule sets that make a full game: a superzapper with one full clear and then single random kills
each level, power-up tokens that fly toward the rim after every so many kills, the fly-down between levels where a
spike in your lane kills you, and a warp bonus round of rings that can skip levels. Everything runs headless at a
fixed step, reports events through drain, and is the same for a seed and an input sequence.
Features
- Any web — open or closed, up to 256 lanes, from 37 and 16-web libraries or
generateWeb's polygons, stars, ellipses, lines, arcs, zigzags and spirals. - A precise claw — one lane per tap with queued taps, held acceleration, pointer or spinner targeting, rapid fire and an optional jump.
- Eight enemy behaviours — flippers, tankers, spikers, fuseballs, pulsars, sparks, mirrors and UFOs, plus enemies that fire up their lane.
- Climb programs — straight, random, spiral, chase, zigzag and avoid, set per kind and per level.
- Superzapper — a full clear then single random kills each level, optionally recharged after a death.
- Power-ups — particle laser, jump, an autonomous helper droid, superzapper recharge, bonus points, warp tokens and a rare clear-the-level bonus, in a sequence you set.
- Fly-down and bonus round — a dive between levels past the spikes, and a ring run that warps levels ahead.
- Levels as data — enemy totals, timed or quota releases, the most on the web at once, speeds, fire, initial spikes, pulse rate and power-up rate per level, with a loop point after the last.
- Scoring and starts — kind scores, spike hits, extra lives, and skill-step start levels with a bonus on clearing them.
- Drawing helpers —
webViewandperspectivefor presenters, and validation for any web.
Good for
- Tube shooters in the style of the 1981 arcade Tempest, with its sixteen wells and skill contour.
- Neon tube shooters in the style of Tempest 2000, with power-ups, a helper droid and a warp bonus round.
- Tube shooters of your own design, with a custom roster, generated webs and your own progression.
- Short arcade sessions on tiny or flat webs, with quota releases and few lives.
- Spinner or pointer controls, since the claw can glide to an absolute lane as well as step.
Make it yours
tempest2000Preset takes lives, the extra-life interval, power-ups on or off, the bonus round, a speed scale, the webs
and a seed; tempestPreset takes lives, the extra-life interval, an easy, medium or hard difficulty, the webs and a
seed. Any field of the returned config can then be replaced: the web library and the web per level, palettes, enemy
kinds and every behaviour parameter, the level list, the claw, hit tolerance, spikes, the superzapper, lives,
power-ups, fly-down, bonus round, start levels, timings and message texts. withWebs puts any list of webs on every
level of a definition.
The same rules run very different games. One is the classic sixteen-well arcade climb with its own enemy contour and skill-step starts. Another is a six-lane open zigzag with two enemy kinds of your own, quota releases, no superzapper and two lives. A third keeps the classic level contour but plays it on a 24-lane generated star.
A quick look
A game from the preset, the frame loop and the helpers for drawing the web:
const rs = game.rimShooter;
const g = rs.createRimShooter(rs.tempest2000Preset()); // or rs.tempestPreset()
g.reset(1); // a start level
g.tick(dt, { move: -1 | 0 | 1, target: laneOrNull, fire, zap, jump, aimX, aimY });
for (const e of g.drain()) { /* level-start, message, enemy-killed, split, token, power, zap, flydown, ring, player-died ... */ }
const s = g.state; // claw, enemies, shots, spikes, tokens, droid, score, lives, level ...
const view = rs.webView(g.web); // unit-space rim, eye, far ratio for drawing
const scale = rs.perspective(depth, view.far, camera); // where a depth sits between the rim and the eye
Works with
vector-tube— builds the rim geometry from the web's view.vector-2d,vector-fontandpost-bloom— for a glowing line-art look.trippatron,backdrop-trippatronandpost-trippatron— for a shaded, psychedelic raster look.
Good to know
- The pack draws nothing; your presenter reads the state and uses
webViewandperspective. - One player; the sequel's duel and other modes, two-player alternation, attract mode, sound and the high-score table are not modelled.
- The bonus round is a ring run standing in for the sequel's track-following rounds.
- Each web's eye position and depth ratio are judged from the sources and screenshots, not taken from the cabinet's camera arithmetic.
- It is not for free-roaming or scrolling shooters, or for radial formation shooters.






