Pitting a dodging test player against eight enemies

Until October 12, every enemy in Wreckwing’s dogfight run was the same ship, the Raven. Its tier made it harder or easier: how fast it fired, how well it aimed, and how much its shield held. We wanted enemies that differ in what they do, some faster and some slower. The player’s three ships, the Skyhammer, the Brute and the Sniper, gave us the shape for it. Each enemy kind takes one of those three and changes one thing about it.
The roster

| Enemy | Built on | What it does | How to beat it |
|---|---|---|---|
| Wasp | Skyhammer | The smallest and fastest; closes in with its cannon | Lead it and shoot; it dies quickly |
| Bruiser | Brute | Slow and armored, with a scatter gun for close range | Stay more than 60 m away |
| Picket | Sniper | Holds 220 m off and fires bursts that curve onto you | Leave its line of sight and close in by the side streets |
| Stinger | Skyhammer | Two quick-lock missiles 2.4 s apart, then away | Two timed dodges |
| Salvo | Brute | Four slow missiles fanned out on one lock | Break the line behind a building |
| Lancer | Sniper | A long lock that holds behind cover, and a missile that goes through walls | Watch for its beam and get close |
| Dozer | Brute | Boosts straight through glass, wood and brick | Hide behind concrete or steel |
| Warden | Brute | The boss | Whatever the run taught you |
The Wasp, Bruiser and Picket are the easy kinds and carry no missiles. The Stinger, Salvo, Lancer and Dozer are the medium kinds. A run draws its enemies from the roster by its seed, so every run is different and the same seed repeats exactly. Two of the medium kinds fight from long range, and a level holds at most one of those until the fifth. Before the Dozer joined, the fifth level was the same three enemies in every run. With it, 2,000 runs give four different fifth levels and eleven different fourth ones.
The Warden borrows from the run itself. Under two thirds of its hull, its armor plates burst off and it takes the move of the first medium enemy the player met. Under a third, it adds the move of the last one and flies 15% faster. A run that taught the Stinger’s quick pair and the Lancer’s wall-piercing missile ends with a boss that uses both.
Each kind flies a stand-in made of boxes in its family’s shape until its model is made: white wingtips for the Skyhammer’s family, rust armor plates for the Brute’s, and a long needle with a gold stripe for the Sniper’s. A mark beside each enemy’s health bars also shows its family: a chevron, a square or a diamond.
Fixing the first numbers, then balancing
Each kind should be as dangerous as a Raven of the same tier, in its own way. The test flies each kind against a scripted stand-in for the player, on 24 seeds, beside a Raven, and adds up how much the player loses a minute.
The first run said the close-range kinds dealt five to seven times the Raven’s damage, and the Warden six times the old boss’s. Most of that turned out not to come from their weapons. Three things were wrong with the measurement, and each was found by measuring again.
- Units. Shields and hulls take damage differently. A shield loses the whole blow, while the hull’s share is multiplied by how tough the ship is. The first count of each kind’s weapon damage left that multiplier out, so it read eight times too small. Most of what looked like extra damage from an unknown cause was the weapons all along.
- Falling buildings. Splitting the rest by cause found the real extra: buildings around the fight coming down on the player. A scatter gun’s nine pellets a shot wear walls down as fast as the player’s own Brute does. Near the Warden, falling buildings caused more than eight of every ten points of damage the player took. That is the game’s destruction working as intended, so we left it alone.
- A player that never dodged. The stand-in flew straight through every missile. Against it, the Stinger’s 0.8 s lock landed nearly every time, and its missiles did 19 times the Raven’s damage. A real player dodges a missile at the last moment with the juke, the game’s quick sideways boost, and a juke made at that moment beats a missile. Once the stand-in juked as well, the Raven’s missiles almost never landed. We then tuned each kind’s weapons so that its rounds and missiles together match the Raven of its tier.
The missiles taught us one more thing. Making the Stinger’s warhead weaker barely changed the damage it did. A missile hurts a ship through how far its blast reaches, not how much energy it carries, so a smaller warhead now also means a smaller blast.
After tuning, every kind lands within about 12% of its tier’s Raven. The exception is the Salvo, whose four missiles land together or not at all, so its result swings by 30% from one set of runs to the next.
Flown as whole levels against the same juking stand-in, the roster’s levels 5 to 7 match the Ravens’ difficulty. Levels 2 to 4 come out about half as hard. In a group, an easy Raven’s missiles land far more often than they do one on one, and the roster’s easy kinds carry none.
Seeing it coming
The long-range kinds give a warning. A Picket winds up for 0.8 s before each burst, with a thin red beam from its gun to the player. A Lancer shows the same beam for the whole of its 2.4 s lock, the longest warning in the game.
The first beam drew nothing. It was built from the same streak as a cannon round’s tracer, and a tracer’s streak is never longer than the distance the round has flown. A beam that stays put has flown nowhere, so it drew as a stub half a meter long. It is now drawn the way engine exhaust is, at full length from its first frame. A recording from behind a Picket still lost it, because a beam aimed away from the camera is only a few pixels long. The player sees the beam nearly end on, which is worse, so it now comes with a small red glow at the gun that is a few pixels across at any distance.
Changes after the first play-through
The roster’s first real test came on October 14, in a full play-through on Easy and Hard. The kinds read as different fights, and the Warden’s borrowed moves stayed as built. Two of the kinds didn’t read as fights at all. The Bruiser and the Dozer seemed to do nothing.
A measurement set two of each kind against a hunting stand-in for 60 s, on three seeds. The Bruiser and Dozer did engage. They took their turns attacking, spent 64% and 43% of the time in attack, and came close: the Dozer was within 30 m a third of the time. But their scatter guns barely hurt. Over the three fights they did 0.94 and 0.62 blows, the least of the seven kinds, against 5.5 for the Stinger. An enemy that comes up close and does almost no harm looks idle. Their guns now do 3.5 and 4 times the damage. In the same test the Bruiser now does 5.9 blows and the Dozer 1.9 to 2.5.
That change has a cost to watch. The hunting stand-in took 15.3 blows from two Bruisers, against 7.0 from two Stingers, and a Bruiser can turn up in the first level. A whole-run measurement comes next, to check that the early levels didn’t get too hard.
Other changes came out of the same night:
- Difficulty. The old Hard is the new Easy. The new Hard adds one enemy to each of levels 3 to 7. On level 5, three or more enemies now attack at once 19% of the time, up from 5%, and the stand-in loses 6.3 blows a minute, up from 3.2.
- The player’s Brute. Its missiles rarely hit at close range. They now leave along the line to the target, turn at 110° a second instead of 65°, lock out to 65 m instead of 220 m, and fall to the ground past 65 m. Against a live Raven in open air, 30 to 90 m off and up to 20° off the nose, 82% of them hit, up from 58%. The Skyhammer’s hit 81% in the same test.
- Wave defense. Wave defense now draws its fighters from the roster too. Each wave has one more fighter and a third fewer drones, 71 enemies in all instead of 87. With a scripted player hunting, 4 of 6 cities stood through the fourth wave, where none did before.
- The boss falling first. When the Warden goes down before its escorts, the game now says so and tells the player to finish the rest.
- Flight recordings now name each enemy’s kind, so the next play-through can be read kind by kind.
All of this is in the development build as of October 15 and waits on the next play-through. The roster is still behind a switch on the run’s difficulty screen, and every kind still flies its stand-in.
After the next play-through, the roster was cut to five kinds and its missiles were brought near the Raven’s. Finding why the new enemies felt soft covers that change.
Updated 2026-10-17: After the next play-through, the roster was cut to five kinds and its missiles brought near the Raven's.
How this post was made
- Drafted by
- A Claude Code session in the trilithon.games repository, October 15, 2026, working from the game's dev journal, changelog, commits and tracker.
- What it did
- Drafted this post from the game session's journal entry of October 12, added what the first play-through found and what changed after it, and checked each number against the changelog, the commit messages and the tracker.
- Reviewed by
- Alex van Rossum,
On the roadmap: The run: a ladder of cities
Linear MIP2-423, MIP2-802, MIP2-800, MIP2-804, MIP2-801, MIP2-806commits fda396c, b5525ea, ef1931d, f64836e, 6c104ba, 6babd72, bcc177b