←  Astral Polity

Damage built from
published impact mechanics

Nothing in this simulation has hit points. A collision arrives carrying energy, and every outcome it can buy — a fold, a tear, a thrown fragment, a degree of heat, a cubic metre of excavated rock — has a price taken from the materials literature. When the energy is spent, the damage stops. Below is every law the model uses, with its citation.

A wrecked airframe lying broken on a dark plain under an aurora
What the model is for. Every number on this page exists to decide which parts of a hull leave it, how large the pieces are, and where the energy went. Photograph — the Sólheimasandur wreck, Iceland. A real airframe, not a render: the model is checked against measured impact mechanics, so the page is illustrated with something measured too.
Nomenclature — every symbol used below

σp projectile strength, Pa · σc target strength, Pa · ρp projectile density, kg/m³ · V impact velocity, m/s · Ea absorbed energy, J · wp specific plastic work, J/m³ · Gc critical energy release rate, J/m² · ε̇ strain rate, s⁻¹ · KIc fracture toughness, Pa·m½ · c wave speed, m/s · β Taylor–Quinney coefficient, dimensionless · ρcp volumetric heat capacity, J/(m³·K) · Z scaled distance, m/kg · R standoff, m · W charge mass, kg TNT-equivalent · ex specific excavation energy, J/m³.

A dimension of 1 means dimensionless.

Mode selection — the impact regime

σp+ρpV2σc

σp projectile strength · ρp dynamic pressure · σc target strength

One inequality decides everything that follows. Below target strength the contact is elastic; above it the softer body yields; far above it neither body can transmit load and both come apart. The same expression, evaluated per component rather than per ship.

Consequence the model had to handle: incidence angle is not in the inequality, so a grazing hit and a square one at identical speed would classify identically. Grazing is therefore branched before this test — and the split is the difference between a hull that skids and one that craters.

The energy ledger

Ea=Epl+Esep+Efrag+Eheat+Eexc

Ea absorbed energy · the five sinks: plastic work, separation, fragment kinetics, heat, excavation

The budget is the whole design. Outcomes are purchased in order of price until the energy runs out, so nothing needs balancing — granite craters less than sand because granite costs more, not because a table says granite is tough.

The term that is easy to get wrong: Ea is the absorbed energy, not the kinetic energy. A ship that bounces keeps most of its ½mv². Spending the total instead of the absorbed fraction over-damages every glancing contact.

The card says outcomes are “purchased in order of price until the energy runs out”. That is a simulatable claim, so here it is. Available energy climbs across four decades and each sink is bought at its own price as it becomes affordable, saturating when there is no more of that outcome left to buy — the crumple volume runs out, then the surface a hull can create runs out, and everything past that goes into the ground. Then, part way through, the ground changes from sand to granite and nothing else is touched. Watch the crater collapse. No branch anywhere in the film reads the material’s name — granite craters less because a cubic metre of it costs 112× what sand costs, which is the card’s point, arriving as an output. The readout prints the closure: the four purchased terms sum to Ea, every frame, to 100.0 %. ⚠ And building it surfaced a tension in this page’s own text. The ledger equation lists heat as a fifth additive sink; the thermal card says heat is 0.9× the plastic work. Read literally together those double-count — heat is not a sixth thing the energy is spent on, it is where the plastic work went. So heat is drawn here as the dashed line over the plastic band rather than as a competing band, and the disagreement is stated rather than silently resolved. Illustrative constants, named in the source. Not the shipped chain.

Plastic work — the fold

Epl=wpVol

wp specific plastic work, J/m³ · Vol volume actually deformed, m³

Crumple is the cheapest outcome per joule and therefore the one most impacts buy. The volume is measured from the geometry that moved — destroyed cells at full volume, dented cells at their dent depth — never inferred from the energy.

Why it is measured and not inferred: deriving the deformed volume from the energy cancels the energy out of the temperature entirely, and the hull then heats by a fixed amount regardless of how hard it was hit. The measurement is the only thing keeping the thermal term honest.

What you will actually see — and where its ceiling comes from: a dent is stored by displacing the corners of the voxel lattice, and how far a corner may move is a tuning decision rather than a law of the format. Ships imported at 0.125 m resolution allow up to 0.375 m of cumulative displacement per corner — about 0.85 % of a 44 m hull — which is why deep crumple reads as a wide fold rather than a deep pit. Widening it was measured rather than assumed: the wider cap produced fewer inverted faces than the coarser hull it refines. Editing vertices by hand is capped separately and more tightly, at one cell, so the building tools cannot wander. A destroyed cell, by contrast, removes its whole volume. So removal is the only outcome whose visible amplitude clears the cap — and on the heaviest impacts the fold is not merely small but may receive no energy at all, so there is nothing for the cap to limit — which is why heavy damage reads as cut blocks rather than as folded metal. The ledger above accounts for the energy; it is not a description of what the surface ends up looking like.

Separation — tearing costs area

Esep=GcA

Gc critical energy release rate, J/m² · A new surface created, m²

Tearing is priced by the surface it creates, which is why a long clean split can cost less than a small ragged one. Separation is expensive and therefore rare — most impacts cannot afford it, which is the correct outcome and the reason hulls dent far more often than they tear.

A correction this project had to make: using JIc here overprices separation by orders of magnitude for a thin plate. Separation is expensive only when it genuinely tears — not when it shears along a seam the builder already put there.

Fragmentation — how many pieces, and how big

s(KIcρcε̇)2/3

s characteristic fragment size · KIc fracture toughness · ε̇ strain rate · ρc density × wave speed

Fragment size falls as strain rate rises — a fast impact makes many small pieces, a slow one makes few large ones. The sizes are drawn from a power law rather than an average, because an average fragment size produces a debris field that looks manufactured.

Known limitation, visible in play: at the energies a landing accident produces, this law correctly returns fragments of 11–33 cm. On a 44 m hull those are physically right and effectively invisible. The law is not wrong; the presentation is unfinished.

The exponent is the claim, and the readout checks it against the code every frame. Strain rate climbs four decades; the block on the left is partitioned at the characteristic size the law returns, with sizes drawn from a power law rather than an average — which is the card’s own reason, because an average fragment size produces a debris field that looks manufactured. On the right is the law itself, log–log. The printed d log s / d log ε̇ is measured from two live samples of the solver, not asserted: it reads −0.667 because the law is a two-thirds power, and if the code ever drifted from the equation printed above it, that number would move and this caption would be caught. The shaded band is this page’s own admitted limitation — 11–33 cm, where a landing accident actually lands, physically right and effectively invisible on a 44 m hull. It is on the axis so you can see which part of the curve the game operates in. Illustrative steel constants, named in the source. Not the shipped chain.

Heat — where the plastic work goes

ΔT=βEplρcpVol

β ≈ 0.9, the fraction of plastic work becoming heat · ρcp volumetric heat capacity · Vol the volume it lands in

About nine tenths of plastic work becomes heat. The denominator decides whether that is visible: steel's ρcp is ~3.9 MJ/(m³·K), so spreading a 22 MJ crash over a 316 t hull raises it 0.09 K — correct, and completely invisible.

Which is why bulk crumple does not glow. Confined to the cubic metres that actually deformed it is a few degrees; confined to the millimetres-thin skin a grind heats, it is hundreds of kelvin per second. Crash sites smoke and skidding hulls glow, from one equation.

Excavation — the ground has a price

Eexc=exVol

ex specific excavation energy, J/m³ · per surface type, calibrated against Mellor’s dimensionless performance index Esc

A crater is energy spent lifting material out of the world, so it is billed to the impact. Forty-four surface types carry physical properties, and the spread across rock, soil and sand is roughly 66 : 5 : 1.

The consequence is the whole point: energy spent digging is energy not spent on the hull. Hitting stone damages the ground less and the ship more — and no rule anywhere says so.

Why the spread is not a bug. That 66 : 1 was twice challenged as implausible — the intuition being that specific energy ought to track material strength in proportion. It does not, and the reason is that soil and rock obey different laws, not different constants. Rock is fracture-controlled, so its specific energy falls as the removed fragment gets larger; soil is shear-and-lift controlled, so by Reece’s earthmoving equation its specific energy rises with cut depth. Opposite signs. Flattening the spread into proportionality would have been a regression dressed as a correction.

Blast — scaled distance

Z=RW3

Z scaled distance · R standoff, m · W charge mass, kg TNT-equivalent

Two charges produce the same overpressure at the same scaled distance, so one curve covers every charge size. Overpressure and impulse are read from it and handed to the same four-number reduction every other cause uses.

Not yet shipped, and stated plainly: the law is chosen and cited, the code path exists, and it has never been fired in a build. Its coefficient is uncalibrated. Nothing on this page should be read as claiming blast damage works today.

Damage budget of a real crash

Readings, not targets — and stated with what they were measured on and under, because a number a reader cannot re-check is an assertion.

Capture session_2026-08-25_161124.log · binary Construct.dll 2026-08-25 15:36:17 · subject an imported 44 m hull, 0.125 m cells, 660,704 voxels · conditions repeated ground impacts staged with the manoeuvre tool, at sea level · n = 30 flushes.

Cells removed, typical impact
1–35
Cells removed, hardest impact
321
Cells displaced, hardest impact
742
Bench, previous path, per event
43 ms
Bench, worst of the 30
6 ms
Bench, median of the 30
1 ms

These are harness figures, and the comparison between them has been withdrawn. They were measured on a build dated 25 August 2026 against thirty impacts placed with the manoeuvre tool. Twelve changes have landed in the damage chain since, and several repaired the path declining to do its work: ship debris that had never once appeared, detached chunks that vanished, a wing that could never break off, damage that was computed and then withheld. The “after” number therefore describes a subsystem that was partly idle, and every one of those repairs can only have made the work more expensive — so the improvement ratio this block used to state is not defensible and is gone.

Two further limits, stated rather than hedged. The staged impacts are not what a player creates: the hardest removed 321 cells, while a real crash excavates thousands of cubic metres and overflows to the full rebuild. And no recorded play session can corroborate any of it — across 1,962 damage-gate samples in one 62,000-line capture, zero damage events dispatched, so the live population is empty and the bench is the only witness.

The measurements are kept because they are real and their harness is named. Read them as what a bench recorded on a build that has since been repaired — not as what happens when you hit something. Figures for the current chain will be published when they are measured against impacts a player can actually produce, with the build named on them.

These cell counts describe a superseded model, and are kept rather than quietly restated. The capture above was taken while the chain was being handed the ship’s velocity after the contact solver had already removed it — so a 480 km/h impact reached the energy model as roughly 12 m/s, and every figure in this section was measured against about one percent of the real crash energy. The read was corrected on 2026-08-26. The timings stand, because they measure the mesh path and not the energy; the cell counts will rise and have not yet been re-measured. They are left in place with this note because a measurement that is quietly replaced teaches nobody why it was wrong.

The material catalogue

Every voxel in the game is made of something, and that something carries measured physical properties rather than a damage multiplier.

Three hundred-odd build materials each hold density, compressive and tensile strength, ductility, melting point and fracture toughness — sourced, where a real analogue exists, from the published datasheet for that alloy or mineral rather than from taste. The naval plate behind the hull is a 100 ksi-yield steel with its real yield, tensile and elongation figures. The aerospace aluminium is 7075-T6, at an ultimate tensile strength of 572 MPa. Gold is annealed gold: soft, heavy, and useless as structure. Glass fails elastically at a fraction of a percent of strain and has no plastic range at all, because that is what glass does.

What that buys in play: nothing in the model asks what kind of object it is hitting. A decorative panel and a structural plate behave differently because their numbers differ, not because a rule was written for each. Materials that were never anticipated still behave sensibly, and a material that behaves absurdly is a wrong number — findable, and fixable — rather than a missing special case.

The problem underneath it, stated honestly

A voxel is not a solid block of steel. It is a metre of structure — plate, rib and void — averaged into one cell, and a structure fails long before its material does. Feeding solid-material strength into an impact model is the single easiest way to build a ship that cannot be hurt, and this project did exactly that for a while: at solid strength no ground in the game could take more than a few percent of a crash, so the hull kept almost none of it and every collision was survivable.

The fix is the distinction between material strength and structural strength, which is well-established physics — Gibson & Ashby’s cellular-solids scaling, and the superfolding analysis Wierzbicki and Abramowicz built for crushed box sections. The honest part is that this literature also says the mapping is not determined by density alone: at one fixed relative density, six standard topologies span roughly an order of magnitude in crush strength, because the exponent itself changes with how the cell is built. Ours is therefore a stated, documented modelling choice constrained by that literature — not a law we are pretending to have derived.

And the constraint we did not expect. The textbook-correct exponent for this load case turns out to be unusable here, and for a reason that has nothing to do with physics: our fill fractions were assigned by asset-import batch, not by structure. Applied to those inputs the correct exponent inverts the material hierarchy and makes a wooden voxel stronger than a hull plate. We shipped that for about an hour and an audit caught it. The exponent in the build is the largest one our inputs can carry without that inversion, the crossover is recorded as a number, and the real fix — correcting the inputs — is open work. We would rather publish that than a clean-sounding derivation.

What the ledger does with that energy

Everything above computes a budget in joules. This is what it buys — the part of the system that decides which cells leave the hull, what they become, and what the impact is not allowed to do. It is the newest work on this page and it is annotated with its real status.

Pulverising is not fracturing, and the selector conflated them

DamageModeSelector.Select opened with if (IsConsumed(speed, K)) return DamageType.Pulverise; — the first branch, so that is what any sufficiently energetic impact selected. IsConsumed is ½v² > K, where K is specific fracture energy. That asks is there enough energy per kilogram to fracture this material throughout — and its answer was being used to select atomisation.

Measured, 2026-08-29: a 400 km/h impact logged Pulverise@0 · 0 removed · 0.00 of 520.83 MJ spent. Half a gigajoule chose the powder path and produced nothing. The two are now separate outcomes: pulverising requires the energy to reduce material to micrometre scale, and fracture below that threshold detaches Voronoi chunks that keep their own physics — mass, velocity, rotation — and fall.

Damage travels inward through layers, rather than across one surface

Two mechanisms already existed and are not being rebuilt: MATMIX-1 samples a 7×7×7 neighbourhood and takes a count-weighted mean σ for the energy split with the dominant material for categorical properties; MATDIFF-1 then judges survival per cell, by that cell’s own material, so steel girders already stand where marble shatters.

What both are missing is direction. They answer which cells survive this one operation, not what does the damage meet as it travels in. A crater was priced and stamped in a single pass against one dominant material, so a nose of marble over plastic over girders was treated as one homogeneous shell whose survivors happened to differ. The energy is now spent through the marble, meets the plastic at whatever remains, then the girders, and stops when the purse cannot pay for the next layer.

One impact may not destroy a whole ship — as an invariant, not a tendency

This failed twice, by two unrelated routes. A connectivity pass once logged 71 connected component(s) … vanishing 11,816 cell(s) in 70 detached piece(s) and deleted every one of them; detached pieces now fall as debris instead. Separately, the volumetric removal path was bounded by a cap on cell count — and a cap is a number, not a guarantee.

The distinction the fix rests on: keep the largest connected component is a property that happens to hold, not a guard, and nothing anywhere stated a maximum fraction of a hull that a single impact may remove. There is now a stated fraction, and the ledger refuses to buy past it rather than being trimmed afterwards. Refusal is the point: a budget that is corrected after the fact cannot tell you it was ever exceeded.

A fix that shipped, was credited with the answer, and removed nothing

A repair for unbaked damage types shipped on 2026-08-29 and was journalled as the resolution of eleven separate reports. It removed zero cells, for two independent reasons, either one sufficient. It was priced at zero — every unbaked type was handed a purchase of 0f, and the applier’s first line divides by it, so the requested volume was zero. And it was unreachable — an earlier continue skipped unbaked types before the applier was ever called.

The detail worth keeping: its own diagnostic line sat inside if (wantCells > 0), so the one code path that could have reported the zero was the one the zero switched off. An instrument that goes quiet when it fails is worse than no instrument, because silence gets read as success — which is exactly how it collected the credit for eleven fixes.

Status, stated plainly: the three changes above are written and gate-clean in the source tree and are not yet in a build anyone has played. They are on this page because the reasoning is checkable now; they are labelled because a page that lets written work read as shipped work is doing the same thing the silent instrument above was doing. When a build carries them, this paragraph changes and the date changes with it.

How the numbers were checked

Roughly forty primary sources, read adversarially, with the explicit goal of refuting our own constants.

Two constants were challenged and upheld

Independent reviewers argued that our rock and ice excavation energies were 3–30× too low. Both challenges were traced to continuous-cutting and confined-indentation regimes — laboratory conditions a metre-scale dig does not operate in. Read against Mellor’s dimensionless performance index, the shipped values sit inside the published attainable band. Nothing changed; the reasoning is now written down so the same challenge does not have to be re-litigated.

One of our own citations did not survive

A comment in this codebase credited a published aircraft-impact paper with a strength-versus-density exponent. Two agents obtained the source independently: it contains no such relation, and states positively that target geometry has no bearing on its criterion. The numbers we used were genuinely theirs; the law we fitted to them was ours. The attribution was wrong and has been corrected.

An arithmetic error worth 9.56×

Relative density and wall-thickness ratio are not the same quantity — they differ by roughly a factor of four, and the crush law is a 5/3 power, so substituting one for the other is wrong by an order of magnitude. Inverted correctly, our hull lands exactly on the specimen geometry Abramowicz & Jones actually tested in 1984. Inverted naively it lands outside the theory’s stated validity range entirely.

A regression we shipped and withdrew

Documented above, and kept on this page deliberately. It was caught in about an hour by printing the resulting strength ordering and reading it — a check that costs five seconds and was not run before shipping.

The standard applied throughout: a number earns its place only with a source, a date, and a statement of what would refute it. Where a value is a design decision rather than a measurement, this page says so. Where a figure has been superseded it is annotated rather than quietly replaced, because a measurement that is silently corrected teaches nobody why it was wrong.

What this model does not do

Every impact is against terrain

Two constructs cannot collide. The model is two-body throughout — it carries a second mass, a reduced mass, and a hull-versus-hull branch that has never been exercised — but the flight solver does not test constructs against each other, so the contact never arrives. Scoped as HULLSTRIKE; not started.

Three types have no cause

Rupture, buckling and back-breaking are baked, priced and reachable by nothing. The catalogue can select them and the game cannot ask.

Blast is unfired

Law chosen, path written, coefficient uncalibrated, never run in a build.

Fragments are invisible

Correct sizes at 11–33 cm on a 44 m hull. Physics right, presentation unfinished. Partly superseded: detached pieces are no longer deleted — they fall as debris with their own physics — and the fracture path now produces chunks rather than powder. Neither is in a played build yet, so this limitation is annotated rather than removed.

Hard crashes overflow

Past a cell threshold the incremental path gives up and the full rebuild returns. A big enough impact is still a stutter. The mechanism is now in the logs verbatim: the collision folds its moved corners into the topology patch, the patch exceeds a fixed cell budget, and the fast path is refused — so the full walk runs over the entire hull. The cheap path exists and is being abandoned, which is a different problem from a slow path being slow, and a different fix. Open work.

Provenance

Structural strength of a cellular solid

Excavation and the price of ground

Material properties

Where a figure on this page is a measurement it names the capture, the binary and the conditions it was taken under. Where it is a design target rather than a reading, it says so instead. Conditions are not decoration: the same build measured at ground level and at altitude can differ by a factor of two, and on a page where you can see neither the build nor the scene they are the only thing that makes a number mean anything.