← All work

Simulation · Game AI

The AI plays. The numbers decide.

Three-a-side AI fighters play a bomb-plant mode in a 3D spectator view, while the same simulation runs headless to measure balance across hundreds of matches.

PROJECTAI Arena
MY ROLEIndependent developer
STAGEComplete local build · not released
A 3D spectator view of two blocky fighters exchanging fire across a bomb site, with team panels in the corners

A duel as the camera director frames it: six AI fighters, an automatic camera, and a panel for every fighter. The game itself, final build.

The context

A problem worth solving.

A match between AI fighters has no correct output to test against. The useful question is whether the game is balanced, and that cannot be answered by watching one match.

My contribution

What I brought to the work.

Built a deterministic fixed-step simulation, with seeded randomness, a 60 Hz step and physics stepped in a fixed order, that the browser renders and a headless runner batches. Built the fighters' perception, cover, routes, morale and weapon timing.

The product

What it makes possible.

Four parts follow: a match as a spectator sees it, the map, replays, and the balance laboratory.

01

Spectator view

A 3D scene with an automatic camera director and a match HUD. Any seed can be replayed, paused or fast-forwarded.

02

Fighter decisions

Perception, cover, routes, morale and weapon timing produce the contest: simulation logic, not chat agents.

03

Balance laboratory

Headless batches report team wins, the attack and defense split, round outcomes and each fighter’s impact; every shot is logged with its probability factors.

04

Decisions from data

470 logged matches across three batches. In the final 100 matches, attackers won 44.9% of rounds, inside the balance gate, while one team still took 63% of matches, an edge recorded rather than hidden.

At a glance / simplified product view

  1. 01Seed
  2. 02Deterministic simulation
  3. 03Rendered match or balance report

The spectator view

Six AI fighters, one automatic camera.

Complete local build · not released

Two teams of three fighters play a bomb-plant mode while a camera director decides what to show: an establishing shot as a round opens, a side-on frame when two fighters duel, slow motion on a kill, an orbit when the match ends. These pictures are the game itself, run on 1 October 2026 from a copy of the final build. The fighters are simulation logic; no language model is involved.

A 3D spectator view of two blocky fighters exchanging fire across a bomb site, with team panels in the corners
Two fighters in one frameThe camera director holds a duel from the side: one fighter firing from the bomb site, the other answering from the ramp, the tracer between them. The game itself, final build.
A high view over a yard with a school bus, a car and planters, and team panels in the corners
A round opensAn establishing shot from above as a round begins. The panels show each fighter’s role, rifle, ammunition and what it intends to do. The game itself, final build.
A fallen fighter at the edge of a container yard with a slow-motion label and a kill feed
Slow motion on a killThe camera cuts to the fallen fighter in slow motion, and the feed names who made the shot. The game itself, final build.
A fighter standing guard on a bomb site with a red countdown and a fuse bar
The bomb is downAfter a plant the clock turns red and counts down while the planter guards the site. The game itself, final build.
A fighter kneeling at a bomb inside a painted ring, with a defusing progress bar
A defuse under coverA defender kneels at the bomb with a progress bar while the rest of the team covers. The game itself, final build.
An explosion on a bomb site under a banner announcing the round
A round endsDetonation in slow motion, with the round banner and the score. The game itself, final build.
A fighter running along a corrugated wall, seen from the side
Movement the fighters chooseA fighter runs along a warehouse wall and the camera swings side-on to show it. The game itself, final build.
A fighter behind concrete barriers under a banner reading VIPERS WIN
The match endsThe winning team’s banner with the final score and the seed, while the camera circles a survivor. The game itself, final build.

Crossfire District

One map, built for long sight lines and close corners.

The fighters all carry a bolt-action rifle and a knife, so the map decides the contest: open ground to cross, high positions to hold and two bomb sites to fight over.

Six views of one map: a yard, a street, an overpass, a warehouse, a trench and a container yard
Six zones, two bomb sitesYard, street, overpass, warehouse, trench and container yard: each gives the fighters different cover and different angles. The game itself, final build.
A fighter walking towards a cloud of smoke under an overpass
Smoke changes a sight lineA smoke grenade hangs under the overpass as a fighter advances up the street towards it. The game itself, final build.

Seeds

Any second of any match can be reopened.

A match is fully decided by its seed, so the same seed always plays the same match. A moment can be reopened from the page address: which seed, how many seconds in, paused or live, and which fighter the camera follows.

Two views of the same paused moment of a match, each under its page address
The same second, twiceThe address above each picture names the seed, the second and whether to hold the frame; adding a fighter’s number moves the camera to that fighter. There are no on-screen controls for this yet. The game itself, final build.

Headless runs

The numbers decide.

The same simulation runs without graphics, a hundred matches at a time. Every shot is logged with the factors behind its hit chance, and a batch reports who wins, how rounds end and what each fighter contributed. These are real outputs of the runner, produced on 1 October 2026.

Terminal output listing shots with their hit probability and the factors behind it
Why a shot hit or missedThe first lines of one match’s shot log: distance, hit chance, the roll, and the factors behind the chance, such as aim, sway, flinch, the target’s speed, stress and exposure. The game itself: real output of its headless runner.
Terminal output of a balance batch with team wins, round outcomes and a per-fighter table
A hundred matches at onceThe balance batch, run again on 1 October 2026: 100 seeds, 923 rounds, attackers winning 44.9% of rounds, one team taking 63 of 100 matches, and each fighter’s totals. The report it wrote matches the committed one byte for byte. The game itself: real output of its headless runner.
Terminal output comparing two runs of one seed and reporting them identical
Same seed, same matchOne seed run twice: the two outputs are identical, down to the checksum. The game itself: real output of its headless runner.
A report titled WHO WINS with a headline section and an explanation of why defence wins
The written verdictThe balance report the numbers led to: which team is stronger, why defence wins rounds, and each fighter ranked by impact. The game itself: real output of its headless runner.

Where it stands

Complete as a local build.

Complete as a local build. Two runs of the same seed already produce byte-identical results (checked 1 October 2026); making that a committed test is next.

Keep exploringLunar Base