ab2b778f44
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/.
75 lines
3.9 KiB
Docker
75 lines
3.9 KiB
Docker
# Runtime environment for modding/src/mdlp/ (the first-party Mod Definition
|
|
# Language Processor - see ../README.md): builds mdlp from source and runs it
|
|
# against modding/mods/ to produce modding/dist/mods/. Kept as its own image,
|
|
# separate from hacked-build-image/, because mod processing is expected to
|
|
# grow its own external tool dependencies (image/audio conversion, etc.)
|
|
# independent of hacked's own GTK/GLFW/mingw toolchain.
|
|
FROM ubuntu:22.04
|
|
|
|
# go.mod's own "go" directive is a minimum toolchain version, not a version to
|
|
# fetch - pin a stable release that already satisfies it so `go build` never
|
|
# needs to fetch a newer toolchain over the network at build time.
|
|
ARG GO_VERSION=1.27.1
|
|
|
|
# patch: applies src/hacked-patches/ to the scratch copy of hacked/ that
|
|
# process-mods.sh (and ../gen_animgallery.sh) stage before building against
|
|
# it - see stage-hacked.sh. python3/pip: runs the AI upscaler below via
|
|
# plain CPU inference (ONNX Runtime). Not a Vulkan-based tool: this image
|
|
# has no real GPU, and Vulkan software emulation (Mesa lavapipe) gives
|
|
# wrong colors for ML inference workloads.
|
|
RUN apt-get update \
|
|
&& DEBIAN_FRONTEND=noninteractive apt-get install -y --no-install-recommends \
|
|
ca-certificates curl gosu patch python3 python3-pip \
|
|
&& rm -rf /var/lib/apt/lists/*
|
|
RUN pip3 install --no-cache-dir onnxruntime pillow numpy
|
|
|
|
# The AI upscaler model for mdlp's upscale mod type (see ../README.md
|
|
# section 4): RealESRGAN_x4plus_anime_6B, a 6-block RRDBNet ONNX-exported
|
|
# from xinntao/Real-ESRGAN's anime-illustration checkpoint (BSD-3-Clause).
|
|
# It's trained on flat-color line art, so it keeps hard sprite edges rather
|
|
# than smoothing them the way a photo- or video-denoising model would. A
|
|
# mod's own "model" field (upscaleDef in ../src/mdlp/upscale.go) is not
|
|
# consulted; every resource goes through this one model. upscale_batch.py
|
|
# resizes its fixed native 4x output down to whatever scale a mod actually
|
|
# asks for.
|
|
ARG UPSCALE_MODEL_URL=https://huggingface.co/skillsafe-ai/realesrgan-x4plus-anime-6b/resolve/main/model.onnx
|
|
RUN mkdir -p /opt/upscale-model \
|
|
&& curl -sSL -o /opt/upscale-model/model.onnx "$UPSCALE_MODEL_URL"
|
|
COPY mdlp-image/upscale_batch.py /usr/local/bin/upscale_batch.py
|
|
RUN chmod 755 /usr/local/bin/upscale_batch.py
|
|
ENV UPSCALE_MODEL_PATH=/opt/upscale-model/model.onnx
|
|
|
|
RUN curl -sSLO "https://go.dev/dl/go${GO_VERSION}.linux-amd64.tar.gz" \
|
|
&& tar -C /usr/local -xzf "go${GO_VERSION}.linux-amd64.tar.gz" \
|
|
&& rm "go${GO_VERSION}.linux-amd64.tar.gz"
|
|
ENV PATH=/usr/local/go/bin:${PATH}
|
|
ENV GOTOOLCHAIN=local
|
|
ENV GOPATH=/opt/go
|
|
|
|
# Populates /opt/go/pkg/mod with every dependency mdlp/go.mod pins, so the
|
|
# container never needs network access to build it. mdlp/go.mod replaces
|
|
# github.com/inkyblackness/hacked with the local ../hacked (see ../README.md),
|
|
# so that module's own go.mod/go.sum have to be present too for dependency
|
|
# resolution - only these two go.mod/go.sum pairs are copied in for this, not
|
|
# the rest of either source tree, so editing .go files doesn't invalidate
|
|
# this layer's cache.
|
|
COPY src/hacked/go.mod src/hacked/go.sum /tmp/mdlp-deps/hacked/
|
|
COPY src/mdlp/go.mod src/mdlp/go.sum /tmp/mdlp-deps/mdlp/
|
|
RUN cd /tmp/mdlp-deps/mdlp && go mod download && rm -rf /tmp/mdlp-deps
|
|
|
|
COPY mdlp-image/docker-entrypoint.sh /usr/local/bin/docker-entrypoint.sh
|
|
COPY mdlp-image/process-mods.sh /usr/local/bin/process-mods.sh
|
|
# 755, not +x: see hacked-build-image/Dockerfile's identical comment - the
|
|
# entrypoint drops to a `builder` user matching the host's UID/GID, which is
|
|
# never in these root-owned files' group.
|
|
RUN chmod 755 /usr/local/bin/docker-entrypoint.sh /usr/local/bin/process-mods.sh
|
|
|
|
WORKDIR /workspace/modding
|
|
ENTRYPOINT ["/usr/local/bin/docker-entrypoint.sh"]
|
|
CMD ["/usr/local/bin/process-mods.sh"]
|
|
|
|
# Marks a shell as already running inside this image, same convention as
|
|
# hacked-build-image/Dockerfile - lets ../Makefile compile directly instead
|
|
# of trying to docker-run this image again from inside itself.
|
|
ENV MDLP_IMAGE=1
|