The Unity port of Deep Roots now has its finished hero. Morrow is drawn in a detailed painted style at four times the old pixel density, and a Windows build with her in it exists: Unity 6000.0.45f1, IL2CPP, 361 MB, built with 0 errors and 0 warnings.
What is in the sheet
| frames | 806 |
| animations | 52 |
| game aliases | 50 |
| hand and muzzle anchors | 30 |
| pixel density | 4 |
The first 358 frame slots and all 45 original animation definitions kept their order and timing. Only the artwork under them changed. The other 448 frames are seven 64-frame cycles for idle, walk and the run paces, which is what let the run stop being a handful of stills.
Output is 1664x960 over an unchanged 416x240 logical world. Gameplay, collision size and weapon hit timing did not move.
No black outline
The earlier build had an artificial near-black perimeter around every sprite. It is gone, from the bake, from the rotated roll frames and from the cape animation, along with its palette entry. The painted shadows inside the figure stay.
It is a rule rather than a one-time cleanup, so any new concept art is held to it as well. Figures are extracted whole, across the boundaries of the cells they were drawn in, so a raised hand or a long pistol is never sliced off by a grid line.
A model was tried and rejected
Before settling on the painted sheet we tried to rebuild her as a 3D model baked down to sprites, and then a hybrid with a modelled cape over the painted body. Both were put in front of us in motion and both lost. The painted version simply looked better, so everything went back to it. That pushed the problem somewhere harder: the motion had to be fixed without changing her look.
Why the run jittered
The reference drawings for the run each paint their own cape: one a wide flap, one a streamer, one a blob. Swap between them and the cape changes shape on every frame, which reads as jitter rather than wind.
The fix keeps one set of painted parts and moves them procedurally.
- Legs. Two-bone leg targets, with each foot planted in stance and both boots lifted in recovery. Step length is tied to distance travelled, not time: walk 20, run 28, sprint 44 world pixels per step, with 32, 36 and 40 in between. Measured over 14 contacts, the planted foot varies by at most 0.830 world pixels, against a limit of 0.9. That is close, not mathematically locked, and we do not claim it is.
- Cape. Only the trailing cape is deformed, as a travelling wave that is pinned at the collar. The first version of the wave produced about one fine pixel of visible travel, which is why it still looked stiff. Amplitude went from 24 to 34 up to 44 to 60 source pixels across run and sprint, and the sampling area is padded so the moving leaf tips are not clipped.
- Flight. An older version of the stride lifted the whole body between steps, and the detailed rig had lost it. The lift is back: 6 fine pixels at run, 12 at sprint, shaped as a squared-sine arc and exactly zero while a foot is down. Feet and hips get the same offset, so leg length stays constant.
Tiptoeing, and arms like a T-rex
Two notes came back after the art was approved, and both were about feel rather than looks. The first run looked like tiptoeing; the second pass fixed that and then the arms looked small and tucked.
For the tiptoe, the torso now pitches forward 0.24 radians at run and 0.36 at sprint, the ground covered per step went from 16 to 19.6 world pixels, and the sole stays flat for 82% of stance before rolling off. Recovery uses continuous curves instead of stopping at each keyframe.
For the arms, the running upper and lower arm went from 24 and 27 fine pixels to 31 and 31, the elbow opens more at the back, and both hands now travel behind the hip as well as forward past the torso. Before, they stayed in front of the chest for the whole cycle. A regression check now fails any run in which a hand does not swing behind the hip and reach forward, so that error cannot quietly come back.
The roll is a single intact, tucked figure rotated through the original 16 frames. It is seated by its real opaque silhouette instead of by a rotated empty rectangle, which removed a small hover in the first bake.
Bugs that were not in the animation
- Black background at density 4. The upscale had a hardcoded factor of 2. Fine at the old density, and a black frame at the new one.
- Red specks on sprite edges. Not the sprite palette: saturated room light was overflowing additively into a pixel's red channel, and transparent pixels were inheriting the red of a saturated coarse mask. Fixed in the compositor and covered by a regression test.
- A dark fringe on cave leaves. The cave overlay tint is piecewise, and a bright coarse leaf sits across its midpoint from the dark cave visible between its fine pixels. Evaluating only the coarse slope picked the wrong branch and drew a dark rectangle. It is now evaluated per fine pixel.
- A black Game view. The frame buffer was valid; the screen quad was being submitted with back-facing winding. Reversing the vertex order fixed it.
A bad ruler
The tool that plays captured clips back for review was cutting the run mid-stride, which made a good loop look broken. The run's capture loop is now 30 frames, and sprint plays its real cycle at a fractional 60 Hz frame duration. That was a fault in the playback, separate from the game, and it cost time because we were judging the animation by the wrong instrument.
Where it stands
The packaged build ran 400 frames of autopilot gameplay with Morrow selected and wrote a valid framebuffer, with no runtime exceptions. That was a headless run with no GPU backend, so it checks packaging and CPU rendering, not what a player sees. Performance is the open question: draw time in that run had a median of 36.6 ms, so we are not claiming 60 fps.
