Decode IMG and ANN graphics, and follow the engine's file lookup rules
10 459 images and animations were listed but unviewable. They are now decoded to PNG without OpenGL, so a script reference like IMGOVERLAY:FILENAME=NAKLADKA.IMG shows the actual picture. Decompression comes from :core (CLZW2Compression, CRLECompression) — that is the hard part and there is no reason to have two copies of it. The header parsing had to be written here, and not by choice: ImageLoader keeps its parser private, and AnimoLoader, despite a signature that looks headless-friendly, builds Image objects whose constructor creates a Texture straight away. Field layout mirrors those loaders one for one, so catalogue and emulator read the same bytes the same way. Pixels are RGB565/RGB555 plus a separate alpha byte, composed with ImageIO. One quirk needed care: ImageLoader maps compression 4 to "none" for IMG files, but in animation frames the same 4 means real CRLE and AnimoLoader passes it through. Applying the IMG quirk to ANN turned whole animations into noise. 3531 images and 6928 animations decode (81 515 frames, 29 019 named events); 30 files fail and are recorded with the reason. Previews are thumbnails only — 340 MB of cache instead of decoding everything to disk — and full frames are rendered from the disc on demand. Animations carry their author: 6513 of them are signed Piotr Maciejewski. File lookup now follows the engine instead of guessing. A bare FILENAME means next to the script; $ is the game root, so $COMMON\X and $WAVS\X resolve there; WAV files live in wavs/. This matters because a name alone does not identify a file — Wojna Trojańska ships seventeen different bkg.img, one per scene, and matching on the name showed the wrong picture for all of them. Resolution is now 98% overall and 97% for WAV with nothing uncertain; the 900 matches that still fall back to name-only are flagged in the UI rather than passed off as fact. What stays unresolved is mostly save-state written at runtime. Two extraction bugs fixed along the way: fields ending in ^N (VARIWST:ONCHANGED^2) were skipped entirely, hiding 176 real references; and blocking a match at an underscore made the regex restart one character later, cutting HIST0.ARR out of +"_HIST0.ARR". Matches must now begin at a token boundary. Resolution used to run as correlated subqueries over a CTE, re-evaluated per row: 36 s for a script with 745 references. Parameters are now bound directly and file.basename is a generated, indexed column — 0.19 s. Docker gains whisper.cpp and ffmpeg (tens of MB); the model is mounted under /models instead, since it is the part that weighs gigabytes and everyone keeps a different one. Not verified: the Docker daemon is not running on this machine, so the image was not built. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
co-authored by
Claude Opus 5
parent
6feb2254b2
commit
f1b36f0e29
+25
-4
@@ -15,15 +15,36 @@ COPY src ./src
|
||||
RUN ./gradlew --no-daemon installDist \
|
||||
&& grep '^coreVersion=' gradle.properties | cut -d= -f2 > /src/core-version
|
||||
|
||||
# whisper.cpp budowany ze źródeł: w repozytoriach Debiana go nie ma, a binarka
|
||||
# z hosta jest nie do użycia — tam macOS, tu Linux
|
||||
FROM debian:bookworm-slim AS whisper
|
||||
RUN apt-get update \
|
||||
&& apt-get install -y --no-install-recommends git cmake build-essential ca-certificates \
|
||||
&& git clone --depth 1 --branch v1.7.4 https://github.com/ggerganov/whisper.cpp /src \
|
||||
&& cmake -S /src -B /src/build -DCMAKE_BUILD_TYPE=Release -DBUILD_SHARED_LIBS=ON \
|
||||
&& cmake --build /src/build --target whisper-cli -j "$(nproc)" \
|
||||
&& cmake --install /src/build \
|
||||
&& rm -rf /var/lib/apt/lists/* /src
|
||||
|
||||
FROM eclipse-temurin:21-jre
|
||||
WORKDIR /app
|
||||
|
||||
# obrazy płyt montowane z zewnątrz, tylko do odczytu; katalog danych to wolumen
|
||||
VOLUME ["/data"]
|
||||
# Transkrypcji mowy w obrazie nie ma i nie będzie: whisper.cpp plus model to
|
||||
# kilka gigabajtów, a katalog jest w pełni użyteczny bez nich — mówcę i kontekst
|
||||
# kwestii bierzemy z dialogi.dta. Front powie wprost, że narzędzia brakuje.
|
||||
# Kto chce transkrybować, robi to na hoście: rex-catalog transcribe.
|
||||
|
||||
# whisper.cpp i ffmpeg wchodzą do obrazu, bo to kilkadziesiąt megabajtów.
|
||||
# Model NIE wchodzi: waży kilkaset megabajtów do kilku gigabajtów, każdy trzyma
|
||||
# inny i wybór należy do użytkownika — montuje się go pod /models i wskazuje
|
||||
# przez WHISPER_MODEL. Bez modelu katalog działa normalnie, a front mówi wprost,
|
||||
# czego brakuje: mówcę i kontekst kwestii bierzemy z dialogi.dta, nie z modelu.
|
||||
RUN apt-get update \
|
||||
&& apt-get install -y --no-install-recommends ffmpeg \
|
||||
&& rm -rf /var/lib/apt/lists/*
|
||||
COPY --from=whisper /usr/local/bin/whisper-cli /usr/local/bin/whisper-cli
|
||||
COPY --from=whisper /usr/local/lib/libwhisper.so* /usr/local/lib/
|
||||
COPY --from=whisper /usr/local/lib/libggml*.so /usr/local/lib/
|
||||
RUN ldconfig
|
||||
ENV WHISPER_BIN=/usr/local/bin/whisper-cli
|
||||
# file.encoding ustawia entrypoint przez JAVA_OPTS; JAVA_TOOL_OPTIONS robiłoby
|
||||
# to samo, ale JVM wypisuje wtedy "Picked up..." przy każdym uruchomieniu
|
||||
ENV CATALOG_DATA=/data
|
||||
|
||||
Reference in New Issue
Block a user