Voxel Space lineage · Python + Numba

VoxelStrike

A combined-arms combat sim built on the per-column raycaster the Comanche games used, with the hot loop JIT-compiled across every core. Fly helicopters and jets, drive armour, take a warship to sea, or stand a hundred-tonne battlemech up out of a tank — over terrain you can dig holes in.

Flyable machines
Battlemechs
Weapons
Missions
Voxel models
Destructible props
Biomes
World presets
Trailer Real gameplay, filmed on the GPU render path the game ships — every shot is a live session, cut to its own score.

In motion

Captured from the real render path — terrain, entities and HUD through the same Session.draw the game runs, stepped at a fixed rate over a pinned world so every rebuild produces the same clip.

The fleet machines

Each class runs its own flight model, and each machine is a sidegrade rather than a rung on a ladder — speed is paid for in armour, payload or reach. The bars are scaled against the fleet’s own range, so full means “the most in the game”.

RotorcraftCollective and cyclic, a real rotor: spool-up, ground effect, retreating blade stall and a power curve with a minimum-power speed in the middle of it.

Fixed wingA 3-DOF point-mass wing. Bank splits the lift vector, so you pull in a turn; a V-n limit means a slow aeroplane cannot pull the g a fast one can.

GroundSprung bodies over four wheel stations, a track that bridges a hollow, and a hull that steers while the turret trains independently.

SeaDisplacement, a rudder that only works with water flowing past it, and a bridge you look out from over your own bow.

Battlemechs machines

Not a skin on a tank: a two-segment leg gait with a real knee, a waist that lets the torso train independently of the legs, limbs that come off where you shot them, and a stride whose length is what actually carries the machine forward. Shown walking, because standing still hides all of it.

Every silhouette, one camera distanceEvery machine rotating at the same distance from the same camera, so the sizes are their real proportions against each other rather than each fitted to its own frame.

Arsenal weapons

Damage is resolved as type against armour class, so the best weapon depends on what you are shooting at. A guided round carries a guidance type that decides what defeats it, and a restriction on what it will engage at all.

Ordnance round models

What a weapon puts in the air is derived from the weapon’s own fields, so an AMRAAM and a Hellfire look different because they ARE different. A lobbed rack round is a small boxy thing; a round that must fly a long way cruises on a wing; an anti-ship round is a sea-skimmer; a radar hunter gets long anti-radiation strakes; anything very fast is an interceptor needle; the rest is a short fat anti-armour round. Each card lists the weapons that fly that shape.

Opposition unit types

Every unit carries an intent rather than a script: it closes, holds a firing position, works round your flank or breaks contact when it is losing, and how readily it does each of those is what the difficulty dial actually changes.

Campaign missions

Multi-stage operations briefed in the cockpit rather than on a cutscene screen, with a spoken controller calling the beats as they happen.

Worlds presets

Terrain is generated from scalar dials rather than authored, so a world is a point in parameter space; the streamed presets turn those dials into slow spatial fields, which is what makes one continuous world hold badlands, alpine spine and atoll without repeating.

Every preset, from aboveThe generator’s own colour map for each world, resampled — a 4096² landform in one picture, from a pinned seed so the same preset always shows the same world. The counts are what the generator reports it actually placed.

Biomes places

A biome is ONE registry entry with its palette, climate window and planting density as fields — which is why adding a place touches one table instead of forty. The swatches are that entry’s actual ground, rock and accent colours, and the climate window is the band of temperature, moisture and elevation in which the world decides you are standing in it.

The world’s objects models

Every one of these is a voxel model you can shoot, crash into or bring down, and each carries four facts as fields on one registry entry: how much damage it takes, whether an aircraft collides with it, what it is MADE of — which decides the sound, the debris colour and the dust — and how it comes apart. The tags on each card are those fields. Within a group every model is rendered at ONE camera distance, so the sizes are their real proportions against each other.

City blocksThe building styles a city is stamped from. They are baked into the terrain itself, so the raycaster casts them in true 3-D and a bomb takes the corner off one.

Settlement & landmarksThe things you navigate by and the things a village is made of — a church tower, a windmill, a water tower, a radio telescope. Every one comes down.

Street & yardWhat fills the space between the buildings: parked traffic, signage, plant, rolling boulders, agricultural clutter. Small, numerous, and none of it invulnerable.

PeopleA crowd stands in a settlement’s streets at the street level of the building it belongs to, dressed from a palette — one model, and a module behind it.

Flora species

The world is not planted with one oak repeated. Each species is built as a base model plus procedural re-rolls, and every strip is those rolls side by side at ONE camera distance — so the variation you can see is the variation the forest has. Which biome plants which species, and how densely, is a field on the biome entry.

Engine

The terrain is a per-column raycast over a heightmap, JIT-compiled with Numba and run across every core; the GPU path casts the same field per pixel, which is what lets you look straight down over a city and see buildings rather than a tilted map. The full story, in plain language, is in the engine write-up.

Destructible terrain
Every explosion digs a real crater into the heightmap, revealing underground strata. The carve is a fused parallel kernel, so a bomb costs about half a millisecond instead of scaling with the square of its radius.
Damage down to the voxel
A hit is recorded in the model’s own frame, so the mark stays on the plate it struck while the machine yaws, banks and walks. Charred hole, molten rim, and on a battlemech the limb itself comes off.
One firing solution
The HUD lead pip, the gun convergence and the regression tests all read the same solver, so the predicted impact cannot disagree with where rounds land.
Guidance you can beat
Missiles bleed energy in a hard turn, break their seeker gimbal, lose lock behind terrain and chase flares or chaff. The same rules apply to what you fire and what is fired at you.
Procedural audio
No sound files. Every engine, weapon, impact and collapse is synthesized: a voice per vehicle, a footfall per machine, and a hit that tells you whether your round went through the armour or bounced off it.
Streaming worlds
An endless world generated in worker processes running ahead of where you are flying, with settlements, forests and destructible buildings that are a pure function of position rather than of the route you took.

The numbersread from the source at build time

Every figure here is read out of the game when the data is built — none of it is transcribed.

Voxel modelsevery model the game can build
Destructible propsone registry entry each
Flyable machineshelicopters, jets, armour, ships
Battlemechseach a distinct rig
Weaponson a DPS x range x utility curve
Enemy typeswith their own sensors and intent
Missionsplus free flight and sandbox
Biomespalette, climate and planting per entry
World presetsstreamed or authored
Engine modulesin game/
Lines of enginePython, JIT-compiled where it is hot

How it is kept honestCorrectness is gated by a headless battery that drives the real session — not by unit tests around it.

A dozen of them, sampled across the battery:

What was done lastStraight from the commit log — the subject lines in this repository are written as statements about the game, so this is a changelog nobody has to keep.