What it does
The crowd runs up the lane on its own; you steer it across with move, or towards a point with aim as a drag does.
Gates come in pairs, one each side of a divider, and the one the crowd's middle passes through changes the count: +,
-, x or / by a number. The crowd is a sunflower of members packed round its middle and squeezed to fit the lane,
and that formation is what makes steering matter. A saw, a wall or a pit kills exactly the members in line with it as
they reach it, so steering past saves the crowd, a clip costs the members that touch, and a crowd too wide to miss loses
the part that does not fit.
An enemy crowd stops yours, and the two close up and fall one for one; the smaller is gone first. At the finish the crowd either climbs a staircase as a tower, leaving a few members on each step for a multiplier that grows with every step, or fights a boss that loses hit points to each member and fells a few at intervals. The score is the members at the finish times the multiplier.
Courses can be generated by seed. planRunnerCourse places gates, obstacles and enemy crowds along the lane by a mix
you choose, gives every gate pair a good side, always leaves a gap past an obstacle, and sizes each enemy crowd from the
count the best gate choices would give at that point, less what the obstacles must cost a crowd too wide to miss them,
so the enemy crowds stay beatable on the best route. The run advances in fixed steps of 1/60 s and reports events for
each gate, loss, clash, step climbed and the result.
Features
- Number gates — add, take away, multiply and divide, in pairs with a divider you can move, and helpers that do a gate's arithmetic and write its label.
- A packed formation — members placed round the crowd's middle at a set spacing, with
formation(count)giving their places for any count. - Obstacles that cost members — saws, walls and pits sized across and along, and any of them can swing side to side.
- Enemy crowds — clashes that trade one for one, with a time for an equal clash.
- Two finishes — a staircase tower with a multiplier for every step, or a boss with hit points and an attack.
- Courses by seed or by hand — a generator with a feature mix, gate set, obstacle kinds and enemy sizing, or a course written as data.
- A view to draw — up to 600 member positions, the enemy crowds still standing and where every obstacle is now.
- Autopilot — takes the gate that leaves the bigger crowd and steers to where the fewest members touch each obstacle, swing included.
- Snapshot and restore — the run and its course as plain JSON, with
checkCrowdRunnerSaveto say why a save will not load.
Good for
- Hyper-casual crowd runners in the style of Count Masters, with gates, saws and a tower at the end.
- Number-gate runners where the choice of gate is the game, with an autopilot to prove a course is winnable.
- Crowd-versus-crowd clashes along a lane, ending in a boss fight.
- Seeded and daily levels, a new course from each seed with enemies sized to the route.
- Attract modes and level tuning, driven by the autopilot.
Make it yours
createCrowdRunner takes the seed, the course or the generator's options, the starting crowd, run and steering speeds,
the spacing between members, the most members a crowd can hold, and how long a clash of equal crowds takes. The
generator takes the lane's length and width, the spacing between features, the mix of gates, obstacles and enemies, the
gate set, the obstacle kinds and the share of the best count each enemy crowd is. A hand-written course lists gate
pairs, obstacles, enemy crowds and a finish.
Two different runs from one pack: a generated course of 320 units, five members at the start, gates from +5 to +30 and x2 or x3, and a staircase at the end; or a hand-built boss level, short and narrow, with swinging saws between harsh divide gates and a boss with many hit points that fells members quickly.
A quick look
A run steered by dragging and drawn member by member:
const run = game.crowdRunner.create({ seed: 4 });
run.aim(dragX); // or run.move(keys)
run.step(dt);
for (const m of run.view().members) drawMember(m.x, m.z);
Works with
crowd-cannon— for units fired from a cannon through gates at an enemy base.collect-build— for a race that lays bricks on staircases.
Good to know
- The lane is straight, and members are points in a packed formation, not bodies pushing each other.
- A gate goes by the crowd's middle: the crowd does not split across a pair.
- The view lists up to 600 members, whatever the count.
- The pack draws nothing: your game draws the crowd, the gates and the obstacles.






