- writeGIF now pads every frame to one shared canvas instead of
writing each at its own (possibly storage-cropped) size - GIF
disposal rules were showing a previous frame's stale pixels through
the uncovered border of a smaller frame, bleeding content between
frames in the gallery.
- decodeFrames/decodeViewFrames/decodeAnimationFrames now always hand
bitmap.DecodeReferenced a zero buffer instead of the previous
frame/block's real pixels. The game's actual RSD8 decoder treats a
"skip" run as literal zero, with no mechanism to carry a reference
frame's pixels forward (confirmed against Night Dive's published
source), and hacked's own multi-block Bitmap preview decodes the
same way. The previous behavior ghosted a previous frame's stale
content into the current frame's skip-run regions, in both the
gallery and the AI upscaler's source input.
- index.html now shows a labeled per-frame filmstrip next to each
animated GIF, and a base-vs-this-build side-by-side comparison for
every resource a mod overrides.
- Gallery GIFs play back at a third of real speed by default, for
easier frame-by-frame review.
- modding/mods/*/bitmaps/*.json gains considerPreviousFrames: a
per-resource list that runs a temporal-consistency pass (median
across the animation's own frames) on independently-upscaled frames
to reduce per-frame AI flicker. Applied to 0x7B1 in upscale_medbot.
- Drop the rebecca-test example mod.
- engine-debug-tools/: a debug dump hotkey + dump2png to inspect
decoded critter frames independent of the renderer (see root
README.md's "Debugging" section).
- engine-patches/04,05: fix critter sprite scale and an OpenGL
texture cache collision, found using that tooling.
- mdlp: fix encodeFrames RLE-diffing upscaled frames against a
previous-frame reference the real RSD8 decoder never implements
(verified against Night Dive's original Mac source down to the
68K assembly) - was rendering as scattered static in-game.
- Upscale pipeline: better color quantization (dithering, pure-ramp
exclusion) and per-resource model selection.
Extends the MDL system beyond text overrides: bitmaps/<label>.json
names a model/scale and resource list, and mdlp extracts each
resource's frames, runs them through an ONNX Runtime CPU upscaler
baked into mdlp-image, re-quantizes to the game's palette, and writes
the result back - same build-time pipeline as message overrides.
Adds animgallery, a standalone viewer that renders any data
directory's animated resources as an HTML/GIF gallery with a
checkbox-driven MDL JSON generator, and -only-changed to preview just
what a mod overrides against the base game.
Fixes a real data race in hacked's ChangeNotifier.hashAll() (found via
go build -race causing non-deterministic resource counts), via a new
numbered patch rather than editing the vendored source.
Adds engine-patches/, a general-fixes counterpart to
android/engine-patches/ now staged and applied to the desktop builds
too (previously unpatched): a real GL_UNPACK_ROW_LENGTH stride bug, an
audio error-logging improvement, and two critter-rendering fixes -
mod art was losing to the base game's own re-opened resource files,
and critters rendered at the wrong size/position once that was fixed,
both from how the billboard renderer derives on-screen size and
placement straight from bitmap pixel dimensions.
Updates README.md and AGENTS.md to document engine-patches/.