Add AI-upscaled critter/object art as a new MDL mod type
build / build (push) Successful in 3m36s

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/.
This commit is contained in:
ml
2026-09-27 20:52:35 +02:00
parent 389abd7de7
commit ab2b778f44
25 changed files with 2009 additions and 35 deletions
+43 -1
View File
@@ -13,8 +13,24 @@
# mods - builds every mod under mods/ via that image, offline.
# Set MODS="name1 name2" to build only those. Output
# lands in dist/mods/.
# animgallery_base - browses res/assets/ss_ee/data alone: every animated
# resource as a looping GIF in build/gallery-base/.
# animgallery_mods - same, but with every built mod under dist/mods/
# layered on top (later wins), in build/gallery-mods/ -
# shows what a mod actually changes without launching
# the game. Run `make mods` first.
# animgallery_dist - every built mod under dist/mods/ layered on top of
# the base game, like animgallery_mods, but restricted
# to only the resources a mod actually overrides, in
# build/gallery-dist/ - a focused "what did my mods
# change" view, in the base game's own colors (unlike
# a mod's own output alone, which has no palette
# resource and would render in grayscale).
# Run `make mods` first.
# (animgallery_base/_mods/_dist all write into this
# subproject's own build/, not the repo root's.)
# clean - removes dist/.
.PHONY: all build-image hacked mdlp-image mods clean
.PHONY: all build-image hacked mdlp-image mods animgallery_base animgallery_mods animgallery_dist clean
export MODS
@@ -45,5 +61,31 @@ mods:
./mdlp-run-image.sh; \
fi
animgallery_base:
./gen_animgallery.sh -data res/assets/ss_ee/data -out modding/build/gallery-base
# Layers every built mod's mod/ folder on top of the base assets, later
# wins - same discovery pattern as res/run-mods.sh.
animgallery_mods:
@ARGS="-data res/assets/ss_ee/data"; \
for d in dist/mods/*/mod; do \
[ -d "$$d" ] && ARGS="$$ARGS -data modding/$$d"; \
done; \
./gen_animgallery.sh $$ARGS -out modding/build/gallery-mods
# Same layering as animgallery_mods, but -only-changed restricts the output
# to resources a mod layer actually overrides.
animgallery_dist:
@ARGS="-data res/assets/ss_ee/data"; \
FOUND=""; \
for d in dist/mods/*/mod; do \
[ -d "$$d" ] && ARGS="$$ARGS -data modding/$$d" && FOUND=1; \
done; \
if [ -z "$$FOUND" ]; then \
echo "PREFLIGHT FAIL: no built mods found under dist/mods/ - run 'make mods' first" >&2; \
exit 1; \
fi; \
./gen_animgallery.sh $$ARGS -only-changed -out modding/build/gallery-dist
clean:
rm -rf dist