Skip to content
Devlog

The muzzle flashed, but the rounds never showed up

The Sniper, a white and orange fighter with a long cannon barrel on its nose, hovering over a flat gray ground

In play, a ship’s cannon would flash at the muzzle and no rounds would appear. Every ship had the problem to some degree, and the Brute, the heavy gunship with a scatter gun, had it worst. The same day, the Brute and the Sniper each got a cannon of their own, and the Sniper got a lock and a missile that work against buildings. The ships themselves are covered in Five textured ships in the game.

Shots that started inside the ship

The Sniper’s tracers also started a little to the right of its gun.

The game finds what a shot hits by casting a ray, a line from the muzzle that reports the first thing it touches. Each ship’s muzzle sits on the face of its collision box, the simple box the physics uses for the hull. A ray that starts on or inside a convex body (a solid with no dents) hits that body at once, so a shot’s first hit could be the ship’s own nose.

We fired one shot from each ship at each of 24 headings.

Ship Struck its own hull, before After
Brute 180 of 216 pellets, from 20 of its 24 shots none
Sniper 85 rounds, from 24 bursts none
Skyhammer 19 rounds, from 24 shots none

The weapons code had also added the offset used for firing on foot to the ship’s muzzle, which started every flown ship’s tracers 1.2 m from the muzzle, off to the right.

A ray can now be told to ignore one body, and every weapon a flown ship fires passes through that ship. In the same test every Brute pellet now reaches the ground ahead, and tracers start at the muzzle. Nothing changes on foot or in replays.

The Brute’s scatter gun

The Brute’s textured model, white with orange stripes, twin rear engines and a cannon under its nose

The Brute, as the asset studio renders it.

The Brute fires nine pellets a shot at three shots a second. The first pellet goes down the aim line and the other eight spread evenly within about 2° of it. Damage is counted in hulls, where 1 is a whole hull. Each pellet does 0.015 and is spent at 120 m, so nine landing pellets do 0.405 a second, against 0.30 for the Skyhammer’s stream.

Each pellet keeps a full round’s fracture energy, the force it breaks things with, which makes 27 strikes a second against the stream’s 12. We timed two scripted cannon sweeps in a test scene, twice each, with the Mac’s Low Power Mode off. The p50 is the median time of a simulation step, and the p95 is the time that 95% of steps stay under.

Stream, p50 / p95 Scatter gun, p50 / p95
Run 1 4.35 / 4.93 ms 4.69 / 6.04 ms
Run 2 4.40 / 5.24 ms 4.73 / 6.15 ms

That is about 0.3 ms more at p50 and 1 ms at p95.

The Sniper’s tracking burst

The Sniper fires bursts of five rounds, 0.06 s apart, one burst every 0.8 s. A round does 0.036 damage, which makes 0.225 a second, the lowest of the three. It travels at 400 m/s and is spent at 700 m.

When a burst starts, the game picks the enemy nearest the crosshair within 15°, as long as it is in clear sight. The rounds then curve toward it, turning at most 60° a second, and fly straight on if they pass it or it is gone. The aim does not snap. A white ring on the HUD marks what a burst would track.

A lock that survives a building

A ship flying at 30 m/s passes behind a 40 m wide building in 1.3 s. A completed Sniper lock now holds a target that is out of sight for 3 s, which covers about two such buildings, as long as the target stays within the 400 m lock range and 1.5 times the lock cone. While it is held without sight, the HUD’s brackets go hollow. The other classes keep the usual 1 s grace.

A missile through six pieces

The Sniper’s missile breaks through up to six pieces of standing or falling structure and goes off at the seventh. Glass does not count as a piece, and the missile flies through debris and props. The ground, a ship or a piece that will not break sets it off at once. Other classes’ missiles still go off at the first thing they hit.

The plan left five or six to a count. We cast 7,360 lines through the middle of every building in four seeds (each seed generates a different city) of the run’s four kinds of city, at three heights. A line crossed a median of 5 solid pieces. Five pieces would let a missile through 59% of the lines and six through 73%, so six takes it through about three buildings in four.

In a release build with Low Power Mode off, a missile through a pane and six concrete walls cost at most 2.08 ms a step in two runs, and a missile that went off at the pane cost at most 0.67 ms.

A visible shield

Earlier that day every ship’s shield became a shell that flares where a blow lands, 25° across for a round and 60° for a missile. It is blue-white while the shield holds, amber at a quarter left and red-orange under a tenth. Bumps count as blows, so when the Sniper meets a wall, the shell flares at its nose.

The Sniper seen from behind over a city street, inside an amber ring of shield shell

The shield shell in amber, with the shield running low.

Provenance

How this post was made

Drafted by
A Claude Code session in the trilithon.games repository, October 11, 2026, working from the game's changelog, docs and tracker.
What it did
Drafted this post from the game's changelog, commit messages and ship-class notes, and checked each number against them.
Reviewed by
Alex van Rossum,

On the roadmap: The run: a ladder of cities

Linear MIP2-760, MIP2-751, MIP2-752, MIP2-753, MIP2-747commits 4b1f004, c7f2e2d, a4dd330, 86bcdaa, 1471675, 0d78b27, 3b55c4c