The archetype with no body
written 2026-09-06Every faction has always had a siege engine. Until now it rendered on the board as a heavily-armoured soldier, because nothing had ever been built for it to actually look like. Giving it a real body meant answering a question nothing on this board had asked before: what happens to a character that has no skeleton at all?
Every one of 8 factions fields its own siege engine, with its own name and its own flavour — a trebuchet is not a storm cannon is not a war wagon. On the board, though, every one of them has always rendered as the same heavily-armoured foot soldier, because the code that turns a unit into a 3D model had a stand-in for this case and nothing else. The comment next to that line said so outright: no siege prop yet.
Fixing that could have been a one-line swap — point the lookup at a new file instead of the old one. It wasn't, because every other thing that lookup feeds assumes the model it names is a walking, breathing character with a skeleton inside it. A siege engine has none.
Anything set like 0.0665 was measured by a machine and generated into this page from the committed results. Everything else was written by a person.
Everything downstream assumed a skeleton
The board's characters are not simple models. Each one carries a real skeleton, and a shared system builds an idle sway, a walk cycle and three combat beats — attack, hurt, death — by bending named bones at runtime, because none of the underlying files ship those clips themselves. That system is written to fail loudly the moment a bone it expects is missing, which is exactly correct for a rigged character with a wrong or outdated bone map.
It is exactly wrong for a character that was never going to have bones in the first place. Asking that system to animate a siege engine wouldn't have quietly done nothing — it would have crashed, the same crash a genuinely broken rig produces, the first time anyone tried.
"This one has no rig" became a fact the type system checks, not a rule to remember
The fix was not a check inside the animation code that says "skip this one." A check like that is exactly the kind of rule a future edit forgets. Instead, the archetype was split at the type level into two families — the ones with a body to bend, and the one without — and every function that authors an animation clip was rewritten to only accept the first kind.
The result is that asking to animate the siege engine is no longer a bug that shows up when someone runs the game. It doesn't compile. The one place that genuinely needs to render it at all reaches for a second, much simpler path that never touches a skeleton, a mixer or a clip — it poses the model once and leaves it there, at zero ongoing cost, precisely because there is nothing to animate.
The swap broke a generator nobody was thinking about
Renaming the stand-in also meant every faction's siege unit now asked a different part of the codebase for guidance on how to describe itself — a completely separate tool that turns each of the board's roster units into its own generation prompt, for a future wave that will eventually give every faction's siege engine its own distinct look. That tool had guidance for a soldier. It had none for a machine.
It did not fail quietly. It threw immediately, by design, the moment it tried to build a prompt for the first of the eight — the same fail-loud discipline the animation code follows, just in a completely different file that had no reason to be touched by this change at all. The fix was small: teach it that a siege engine has no pose to describe, because it is a machine and not a body, and give it real guidance for what one should look like instead of silently reusing the soldier's.
Correct, and invisible on this particular board — on purpose, not by accident
The board only ever shows one model per stack: whichever unit in it is strongest. A siege engine's own strength sits in a narrow 4-to-5 band — respectable, but rarely the highest number in a mixed army. Re-measuring the board's draw-call and triangle counts after the swap turned up a number that had not moved at all.
That was not a sign the new model had failed to wire in. It was the honest consequence of how this particular deterministic test board happens to be composed: no stack on it is ever led by its own siege engine, so the new model, while completely real and correctly wired, never becomes the visible marker there. The unit layer's draw calls and triangles came back exactly 402 and 95538 at full reveal — unchanged, because the board that number describes never happens to ask for it.
The record
Every quantity on this page was read out of the committed files by a script and written into the page's data, so it cannot drift from the file it came from — a test regenerates it and fails on any difference. The prose around them is written by hand, which is exactly why it can be wrong in ways a test cannot catch.
The engine itself — a wooden throwing arm on a braced, wheeled frame, built to a 3500-triangle budget — arrived correctly shaped on the first attempt, with nothing to reroll.