← Back to devlog

Art

The first boss: seventeen versions of an ice dragon

The Frost Wyrm is the first boss in Ascension with its full repertoire: six attacks, each with its own wind-up and recovery. There are seventeen versions between the first test and the video, and most of them fell over details nobody should ever notice.

The Frost Wyrm hovering over the test arena while its frost breath freezes the ground in a fan ahead of it
The Frost Wyrm hovering over the test arena while its frost breath freezes the ground in a fan ahead of it

This is the first boss in Ascension with its whole repertoire animated. Six attacks, each with its wind-up, its hit and its recovery:

There are seventeen versions between the first test and that video. Almost none of them fell over something you’d notice at a glance.

A dragon with no membrane

The Frost Wyrm had been in the codex for months as an entry: boss, level forty-five, ice dragon. Turning an entry into a creature that moves starts with looking at it closely, and the first thing I saw when I looked closely was that the wings had no inside.

They were single-sided panels, the same scales on both faces. A dragon’s wing isn’t that: the outside is hide and the inside is membrane, and that difference is half the silhouette the moment the wing opens.

The fix was to add an interior layer of its own: one thousand three hundred and twenty-four inverted faces, eighteen hundred-thousandths away from the outer face. Close enough that the gap never shows, far enough that they never fight over the same pixel.

The first version of that membrane was just blue, and it looked it. The second got radial folds, branching veins and tonal variation. A flat membrane doesn’t read as a membrane; it reads as a sticker.

The skeleton that wasn’t one

Of the model’s fifty-seven thousand four hundred and eighty-three vertices, fifty-seven thousand one hundred and eighty-nine hung off a single bone.

That isn’t a skeleton. That’s a model with a stick in it.

So I built one from scratch inside Blender: twenty-nine bones at first, six of them for the wings and five for the tail. Then thirty-one, once the shoulder blades had to follow the walk. Thirty-two, when it needed a jaw to bite. And forty in the version that flies, with fourteen controls in the wings alone: three fan rays and a thumb on each.

I placed the fangs one by one, checking that each root sat inside the gum.

The things that fall over

The walk came out right first time. Nothing else did, and I’d rather write it down because that’s the honest part of the job.

South looked like south-east. All eight cameras were calibrated against the front I thought the model had, and its real front was twenty degrees round. Every direction came out skewed at once, which is exactly the kind of error you can see and can’t name.

The hind legs dragged the tail. One thousand one hundred and twelve tail vertices carried weight from the back legs, one of them at ninety-eight per cent. The tail moved because the dragon walked, not because anything moved it.

A blue that wouldn’t go away. The outside of the wing kept coming out blueish even with the membrane switched off. I spent a good while chasing the new layer before realising the blue was in the model’s original texture. It wasn’t a mistake I’d just made: it was an old assumption I’d never checked.

The flight climbed like a staircase. I rejected it. A dragon doesn’t ascend in steps: it pushes, and what I wanted to see was it holding itself up there the way you’d stand up on your hind legs. The good version tilts the torso forty-four degrees, climbs on three chained impulses, and keeps the neck compensating so it looks forward while the body goes up.

The ice only falls in front

This is the detail I’m happiest with, and it’s invisible when it works.

The dragon's frost breath, animated: charge, sweep, and the ice spreading only in front of it

The frost breath freezes the ground. The first time it worked, it also froze what was behind and underneath, because the effect grew from the centre of the scene instead of from the mouth.

If the boss freezes the ground you’re standing on with no warning, the attack stops being an attack and becomes a trap. A boss has to be hard the way a mountain is hard: always the same, always legible.

So the ice now only exists in the hundred-and-thirty-two-degree fan that comes out of the muzzle. And the mask lives in the geometry, not in the camera: that means you can look at it from any of the eight directions and the ground behind stays clean. A camera-space mask would break the moment you turned.

No two shards alike

The second ground attack lifts both front paws, slams them into the flagstones and sends a row of crystals running straight forward:

The row of ice crystals advancing in a straight line from the dragon's paws

The first version used the same prism repeated. It looked tidy and fake: real ice doesn’t grow in copies.

There are eighty-nine distinct meshes: twelve main spikes with three- to six-sided sections, side splinters, base fragments and sixty small shards. Different heights, different leans, irregular shoulders. Not one repeated, and I checked by hash.

And the falling shards — the other cast — isn’t a fixed animation. The nine positions are drawn at random every time the attack runs, with a minimum separation between them, inside the arena limit and respecting the front edge. I tested it across ten thousand different draws, checking that none of them broke those three rules.

A boss that repeats the same falling pattern gets memorised. One that draws inside known rules gets read, which is not the same thing.

The argument about size

When the dragon went into Godot with its pixel-art pass — sixty-four atlases, two thousand eight hundred and twenty-four frames, all eight directions — something I wasn’t expecting happened: it looked small.

That started a four-version dance. I put it at its native size, forty-three per cent bigger. Then it lost detail, because the same drawing spread over more pixels doesn’t gain information: it had to be re-rendered larger at source, with the interior untouched and a softer edge. Then fifty per cent more. Then another thirty.

The final size is nearly double what felt right at the start. A boss feeling big doesn’t come from its stat block or its health bar: it comes from how much screen it takes up when it’s in front of you.

Why this video isn’t the game

The dragon already fights inside Godot. It has three difficulty profiles, it picks among its six attacks depending on where you are, and Leo’s guard, parry and dodge all work against it.

And even so, the video above is not a capture of the game. It’s the original scenes cut together, complete and at their real speed.

I made the captured-from-the-game version first and threw it away. The effects inside Godot are simplified compared to the approved ones, and the timings came back trimmed to fit. Showing that and saying “here’s the boss” would have meant showing a worse version of work that was already right.

What’s missing is still missing: moving those effects and those timings into Godot without watering them down. But I’d rather the outstanding work show up on the list than in the video.

← Back to devlog