This round of work turned the first hour of the game into something you can actually play through and watch. The menus now match the original screens, the temple finally has atmosphere, and the prologue dragon shows up with a full scripted scene. Here is what changed and what we learned building it in Unreal Engine 5 C++.

The Equipment and Inventory screens were rebuilt from scratch. Instead of approximating the layout, every plate, rule line, icon and text box now sits at the exact position the original screen uses, on a fixed 1280 by 720 board that scales to fit any resolution. The title bar gets its own left anchored board so the dragon emblem stays flush with the screen edge on ultrawide monitors.

  • A 4 by 3 item grid with the original cell frames, markers and a slowly pulsing cursor.
  • A scrolling slot column where the chosen slot sits in a dark band, with one icon clipped above and three below.
  • Stat comparison rows in blue and red, and resistances that only appear when they are not zero.
  • The inventory party row with health and stamina gauges that fill by cutting the atlas instead of squashing it, and a weight gauge coloured by encumbrance class.
  • No key hints anywhere. The screens read cleaner without them.

The trick that made it painless: build on a fixed canvas and scale it with a render transform every tick. Hit testing follows render transforms, so buttons still line up. The one gotcha is that every decorative image and text block must be hit test invisible, or it quietly swallows clicks meant for the buttons underneath.

C++
const float Scale = FMath::Min(ScreenSize.X / 1280.0f, ScreenSize.Y / 720.0f);
BoardSlot->SetPosition(FVector2D((ScreenSize.X - 1280.0f * Scale) * 0.5f, (ScreenSize.Y - 720.0f * Scale) * 0.5f));
Board->SetRenderScale(FVector2D(Scale));

A lantern that does not blind you

The hip lantern was casting a huge dark wedge in front of the player. The light sits a few centimetres from the body, so the body itself blocked it and threw a shadow across the whole scene. Turning off shadow casting on the lantern light fixed it, and moving the lantern model onto its own lighting channel stopped its flame from blowing the model out to pure white. You can finally see the lantern itself.

The temple gets atmosphere

The prologue temple was far too dark. Two findings did most of the work:

  • Lumen was running out of room. The surface cache atlas was oversubscribed by more than 20 percent because the stage meshes are huge, so parts of the level simply received no bounce light. Raising r.LumenScene.SurfaceCache.AtlasSize gave it room.
  • Fake walls. The original game only draws each chunk of the level while you stand in the zone that owns it, and seals openings between zones with one sided cards. Drawn all at once, those cards turned into walls that blocked passages and light. We now detect them and can strip them per chunk.

On top of that: volumetric fog with warm and cool fill lights along the path, local fog volumes, and fog banks under the dragon's perch. We also found that hundreds of placed props were never brought into the level, and prototyped splitting the props baked into the level chunks into separate objects, so each one can later be replaced with a high detail asset.

The dragon scene

The biggest piece this round. When the party walks into a trigger, the score swells, the dragon rises beside the rock, breathes a fireball at the party, turns his head to speak to the Arisen under lightning, then climbs, beats his wings high above the mountain and glides away.

The scene is data driven: an ordered list of steps, each with a clip, a duration, a movement (hold, straight up, or level forward) and events such as flames, the fireball, speech, head look, lightning and camera shake. The clip order was matched by hand against gameplay footage. Dragons in the original fly square, straight up first and only then forward, so the movement system does exactly that.

  • Root motion carry over. One shot clips move the root bone. When a clip ends, the root's travel is added to the actor, so the next clip starts where the last one finished instead of snapping back.
  • Head look without an animation blueprint. The animated mesh is hidden and a poseable copy draws the dragon. Every frame it copies the pose, then rotates the neck and head toward the nearest player, clamped and eased in.
  • Wing beats in sync. The wing tip bone is found automatically from the bind pose. A wing sound plays at the bottom of each downstroke, the moment the tip stops falling and starts rising.
  • A fireball in the style of Bolide. A new lightweight sprite effect system draws flipbook fire, smoke and embers as camera facing instanced quads. The fireball leaves a flame trail and a smoke tail, lands with a blast of sparks and leaves a fire burning.
  • Glowing eyes on their own emissive material, and a camera shake with distance falloff for the breath, the roar and the impact.

Lightning that looks like lightning

The old bolt was 18 straight segments. It is now built by midpoint displacement, so it is jagged at every scale, tapers toward the ground and splits into forks that split again, with a violet white flash. The scene can also call strikes at chosen positions, which is how lightning lands behind the dragon while he speaks.

C++
// Each halving adds a smaller random kink, so the bolt is jagged at every scale
Finer.Add((Points[Index] + Points[Index + 1]) * 0.5f + Side * Random.FRandRange(-1.0f, 1.0f) * Jitter);
Jitter *= 0.55f;

Smaller fixes

  • The handwritten opening line no longer shows a black band sweeping across the first line while the second one is written.
  • The prologue character now wears his outfit as real equipment, so every piece can be taken off and swapped.
  • A dev tool picker can page through every dragon clip while standing next to him.

Next

Three things are in progress: equipping and unequipping clothing on the character, the Fighter vocation with sword and shield, and the first AI monster, a goblin with idle, crouch, walk, run, alert and attack states plus its own sounds. After that, a spinning volumetric storm ring around the summit.

As always, everything shown uses placeholder assets that will be replaced before anything ships.