The first official version
This game got to eight robots, a closed arena, local and online play and 150 commits before it had a version number. Until now, the way to tell people what changed was me posting patch notes in the WhatsApp group after every deploy. That works for whoever is in the group, it works for nobody else, and nothing is left to read later.
From here on, every change that alters how the game plays goes into a numbered version, and every version gets a page like this one, with the measured number next to each claim. When I write that a weapon got 62% narrower, it's because I measured both.
The three numbers mean different things. Basically, the first goes up when the game changes shape, the second when something new comes in, and the third when it's just a fix. It's more or less the semver everyone uses, without the promise of following the rule to the letter.
This one is 1.0.0 because it's the first, and because it's the first one I call stable. It touches the base of everything, which is what the physics thinks each robot is. With that base in place, new robots and new features can come in without breaking what's already standing.
T.P.U.'s weapon was bigger than T.P.U.
T.P.U. was the game's first robot. She came in back when there was no proper way to check whether the hitbox matched the CAD, and all the physics knew about her was three boxes drawn by eye.
Every robot that came after was a bit more polished, and the first one fell behind on her own. Nobody decided that, we just never stopped to touch what was already running.
The worst of the three was the front box, which was the weapon's hitbox.
It was 162% wider than the real weapon, and reached 18% past it. Written like that it sounds like a detail. Spinning, the two extras multiply. That box swept 3.6 times the volume the part sweeps. Three and a half times of air counting as metal.
That's what made T.P.U. look like she hit without touching. She really did hit. Her weapon existed in a place where there's nothing.
The two extras decide fights, each in its own way.
The extra reach made T.P.U. bite first in exchanges that, looking at the screen, were clearly out of range. Whoever played against her learned to respect a distance she doesn't have.
The extra width gave room to hit. Angled hits, glancing blows, the kind that should slide past, found weapon anyway, because there were 27 cm of extra weapon waiting on each side.
The body box was one block from bumper to rear, and that's why the fork pushed like a wall. In real life it's a thin blade lying on the floor, made to slide under the opponent. Nobody got under anybody.
Now each robot has one hitbox per part, taken from the CAD its builder sent. The roster went from 74 boxes to 158.
The weapon has two bodies and swaps mid-fight
A hitbox true to the part runs into a speed problem.
The game's physics checks things 60 times a second. Between one check and the next, it knows nothing. It only compares where everything was with where everything is now.
That works for a robot driving around. A beetleweight flat out covers a few centimeters in that interval, so it can never pass entirely through someone without being noticed.
The tip of the drum can't say the same. Flat out, it makes more than one full turn between one check and the next. Picture a ceiling fan filmed by a camera that only takes one photo every turn and a half of the blade: in every photo the blade is somewhere plausible, and in none of them can you tell where it went. That's why a fan blade looks still, or spinning slowly the wrong way, on video.
For the physics it's the same problem, with a worse consequence than looks. If in the previous photo the drum was on one side of the opponent and in the next it's on the other, and all the physics does is compare the two, the hit in between simply never happened.
That's half the reason. The other half shows up with the weapon stopped.
A cylinder is a perfect round prop. If the weapon's hitbox is always a cylinder, a robot that lands on its nose rests the weapon on the floor and stays there, balanced, with no reason to leave.
That's exactly what HAI did. Dropping him on his nose in the inspector, weapon off, he settled in under half a second and then never moved again: same height, same angle, until the end of the test. Stuck, propped on his own weapon.
With sectors instead of the cylinder, what touches the floor is the real bar. A free bar can't hold torque. The weight resting on it turns it toward the lever arm, the prop gives way and the robot tips over. Which is what would happen in real life.
That's why the weapon has two stages, and swaps on its own during the fight.
Bar sectors
Six pieces collide, shaped like the real drum and spinning with it. At this speed you can trust the frame. It's the stage in play while the weapon spins up, when it died in a hit, and when the robot is still and the unbalanced bar turns until the heavy tooth points at the floor.
Swept disc
The sectors switch off and a cylinder at the disc's real radius takes over. The gap between the teeth disappears, because at this speed there is no gap. Anything that gets in there gets hit, which is what happens with a drum at full spin.
Before the question comes up again: the six pieces are not the weapon breaking. Nothing in the game cracks, comes loose or falls apart yet. The pieces are a single object the whole time, and they spin together as one part.
They exist because a physics collider can only be convex. Convex is a shape with no dents: any straight line between two of its points stays inside. T.P.U.'s drum isn't like that, it has a waist: two fat discs at the ends and a thin middle. A cylinder around it fills the waist with solid. A cylinder the size of the waist loses the discs.
The way to get the right shape is to add convex pieces until they give the concave outline. Six, in the drum's case. It's the same reason Dark Matter has two separate rings instead of one cylinder: the gap in the middle is a dent, and no single collider can do a dent.
That swap is what makes a stopped drum and a drum flat out behave like two different things, which is what they are.
A good side effect came along. With the sectors on at low speed, the bar started colliding where the blade actually is. Before, the collider spun separately from the model, and you hit a drum drawn somewhere else.
Robot by robot
All eight, from the front, the side and the top. The three views of each robot move together, so you can follow the same change from all three angles at once.
T.P.U. V3

The game's first robot, and so the most outdated. Three boxes for a robot that has much cooler geometry.
The drum became the two stages described above, with the radius measured piece by piece instead of guessed. That alone cut the weapon's width by 62%.
The blue shoulder guard, also called the foot, became three parts with different jobs. The skirt runs next to the wheel and doesn't touch the floor. The shoulder guard is the front wall. The fork is just the low blade, without the support triangle out to the tip.
Upside down, she stopped levitating. The contact point of the flipped wheel came from the height of the antennas, well above any geometry that existed there, so the four springs engaged on nothing and held the chassis in the air.
Dark Matter

The weapon is two discs, one at each end of the axle, with an empty middle. The old profile put one cylinder straight across, end to end, so the gap in the middle, which is exactly where a low robot gets through, hit just like the ring.
Fixing that meant changing how the game measures the weapon's reach. It became one band per ring, instead of a single one in the middle of the axle. Measured in the middle, the whole reach fell inside the gap, which is exactly where there's no weapon.
Biribeetle

The weapon got both stages, and its real reach turned out 22% bigger than the physics thought.
It also became only as wide as the arms holding it. Before, it spilled out past them.
Outside the physics, his 3D model shrank 78% without losing detail. The heaviest robot in the roster became the lightest to download.
Wigow

Hybrid weapon, and the fork became two parts: the bearing that holds and the blade that cuts. They have different heights and different jobs, and treating both as one block left the blade too high to get under anyone.
The weapon's real reach went up 28%.
Lucifer

Lucifer's fork is just the low blade. The old profile took the whole triangle, from the support to the tip, which gave the robot a solid ramp where the part has a gap.
The beater got both stages, with 27% more reach. It also got the push the disc gives when it scrapes the floor, which the rest of the roster already had.
Corsário

The only one with a horizontal bar, and so the one that pushed the tooling hardest. His weapon spins on a standing axle, not lying down like everyone else's, and the tool that slices the weapon into convex pieces only knew how to work lying down.
The bar got both stages like the rest of the roster.
He's the only one who comes out of this version weaker on purpose, and that's because he was impossible to beat.
Corsário is an undercutter. His bar goes under the opponent and lifts. Except the hitbox left that bar scraping the floor, meaning always at the perfect height to get under anything, and the rest of the roster had no way to hit first. He was the first ideal undercutter in history.
What held the robot up, by the way, was the weapon. At Corsário's nose there's an axle that goes lower than the disc, and in real life it's what scrapes the floor and keeps the bar clear. For the physics that axle didn't exist. The nose sank until the bar touched the floor, and the axle, which should be the first thing to touch, went right through it.
Now it exists, and it's what holds up the front of the robot. Upright, the bar spins without touching the floor, at the height it has on the real robot. Upside down, what touches is the tip of the pin, not the nose fairing.
That changed how he self-rights. The pop was a push on the nose, and the nose is exactly where the pin now rests. Pushing against your own support lifts nothing. Now he lifts the rear and rolls over the front.
The weapon also lost acceleration. Corsário's bar is the heaviest in the roster and got back to full speed half a second after any bite, so hitting cost nothing. Now it spins up in 2.9 s instead of 2.1, and a bite on the bumper costs 1.6 s to come back.
HAI

The newcomer was born in the new pipeline, so his count doesn't change. What changed is where the 26 boxes are.
Tower and antenna are now split at the part's notch instead of at a height picked by eye, and they're no longer generated twice, once on each plate. Lying on his side with the weapon on, he bounces again, after the disc's lowest point started taking the axle's tilt into account.
The setup Balta found became the bot's default: straight line flat out, turns at half, steering doubled.
The bumper bites back
The arena always reacted to robots. Driving nose-first into the bumper lifts the robot and tips it over its nose, which is how some real robots use the wall to get back on their wheels.
What it didn't do was react to weapons.
Taking a weapon at full speed into the bumper cost no rotation at all. Zero. HAI hit the plate at 21,000 rpm and left it at 21,000 rpm, as if he'd gone right through it. He'd hop about 10 cm and carry on.
In real life, biting the bumper is one of the fastest ways to lose your weapon. The plate doesn't give, and whatever the tooth digs into it comes out of the rotation.
Now it comes out here too.
Half the weapon
A charge with a full weapon costs about half the rotation. Corsário goes in at 12,000 rpm, comes out with 5,400 and takes 1.6 s to have a weapon again. A slow weapon barely catches: at 30% the tooth scrapes instead of biting.
The push
The bumper doesn't move, so whatever the tooth digs into it comes back through the robot, and it comes off the wall and rises 9 to 18 cm. A faster tip digs deeper and pushes harder, and Corsário's bar, the longest in the roster, is the one that goes furthest.
Whoever stays against the plate bites again before recovering, and insisting parks the weapon between a third and half of full speed. It only comes back if you get away.
Not every robot reaches the plate with its weapon. Lucifer has the fork well ahead of the beater. The fork hits, the beater never gets there. Wigow puts fork and drum at the same point and can't make up his mind.
There's one thing I expected that didn't happen. Self-righting on the wall didn't get easier. Whoever can get back on their wheels is still whoever already could, and the shape of the flipped robot decides that far more than the strength of the push.
Small things nobody asked for
Nothing here changes how the game plays. It's just that, once the export already knew how to separate the parts, it got cheap to make each one spin in the right place. So I wanted to see it look nice.
HAI has four wheels in two sizes, at different spots on the chassis, and each one spins with its own tire, hub and bolts.
His weapon isn't centered either. It sits off to the side, held between two towers that aren't mirror images of each other, and the motor pulley spins together with the disc.
You could play your whole life without noticing any of this. But I'd know it was wrong.
Corsário had three mistakes at once, and one of them in the opposite direction.
The nose pin spun with the bar, when it's fixed. The weapon motor's stator spun with the housing, when it's a stator, which is literally the name of the part that doesn't spin. And the eight bolts holding the disc sat perfectly still in the middle of it spinning, because the export routine grouped parts by name and catalog bolts don't have names worth anything.
Bearings are what trips this up the most. When the axle is fixed, the outer race spins; when it spins, it's the inner one. Both cases exist in the same robot, and swapping them is far too easy.
Quick ones
A stopped weapon now stops on the floor instead of going through it. In a resting pose, flipped Lucifer's weapon sank 2 cm into the floor, and HAI's on his nose 2.6 cm. The bar sectors were born with no floor collision so a stopped bar wouldn't prop the robot up, but what breaks that prop is the free bar giving way under load, and to give way it has to feel the contact.
Upside down, T.P.U.'s and HAI's weapons stopped biting a floor they can't reach. In that pose T.P.U.'s ear touches 0.4 mm before the drum does, and HAI's antenna keeps the bar 5 mm off the floor. Even so, both did the bite hop, hitting nothing.
A bar resting on the floor stopped shaking. It turned into a seesaw: gravity pushed the heavy tooth into the floor, the contact pushed back on the next frame, and the two took turns. Now gravity only kicks in after half a second with the bar touching nothing, so it stays where it stopped.
Biribeetle's model went from 2.99 MB to 660 KB. It was the heaviest in the roster to load.
Removed Dark Matter V2