Might and Magic VIII na Androidu: třetí díl, stejný engine

Po sedmičce a šestce přišla osmička. Engine už uměl dvě hry, takže přibyla třetí větev a spousta čísel, která vypadají stejně jako v sedmičce, ale znamenají něco jiného. Výsledek je zase jedna aplikace, česky, s dotykovým ovládáním a synchronizací uložených pozic.
Osmička je zatím poslední díl, který jsem na telefon dostal. Engine OpenEnroth uměl původně jen sedmičku, u šestky se musel naučit druhou hru a u osmičky třetí. Kopie enginu teď pozná podle dat, kterou hru má před sebou, a podle toho se chová; sedmička ani šestka se přitom nesmí rozbít.

Co musíte mít připravené
- Legálně koupenou hru Might and Magic VIII: Day of the Destroyer z GOG.com, nainstalovanou na počítači.
- Naklonovaný veřejný repozitář MaM-android, ve kterém je upravený engine i skript na sestavení. Herní data v něm nejsou, ta musí mít každý vlastní.
- Windows 10 nebo 11, zhruba 20 GB volného místa a nainstalovaný Docker Desktop.
- Git a Python 3.
- Telefon nebo tablet s Androidem 7 a novějším, 64bitovým procesorem ARM a podporou OpenGL ES 3.2. Volného místa je potřeba asi 1,5 GB.
- Půl hodiny až hodinu při prvním sestavení, další pak zaberou pár minut.
Čeština funguje stejně jako u předchozích dílů: fanouškovský překlad se nainstaluje do hry na počítači a do aplikace se data zabalí už počeštěná. Dabing zůstává anglický. A jako vždy, hotová aplikace obsahuje vaše herní data z GOGu, takže je jen pro vás.

Prompt
Postup je stejný jako u ostatních dílů. Naklonujete repozitář, otevřete Claude Code ve složce s portem, přepíšete si odstavec MOJE ÚDAJE a necháte ho pracovat. Prompt sestaví aplikaci v Dockeru, zkontroluje ji a na emulátoru otestuje.
Prompt pro Claude Code
Chci si pro vlastní potřebu postavit Android port hry Might and Magic VIII: Day of the Destroyer
jako JEDNO samostatné APK, které po instalaci rovnou funguje. Hru vlastním legálně z GOG.com
a mám ji NAINSTALOVANOU. APK bude obsahovat moje herní data, takže je jen pro mě a nesmí se šířit.
Na to mě na konci upozorni.
MOJE ÚDAJE (doplň / uprav):
- Cesta k nainstalované hře: C:\GOG Games\Might and Magic 8
- Klon repozitáře MaM-android: C:\Projekty\MaM-android (git clone https://github.com/filippecha/MaM-android)
(MM8 port je ve složce "MaM 8", Docker image pro Android ve "MaM 7\docker")
- Název aplikace v telefonu: MaM 8, ID balíčku: cz.mm8.game (tak je to už v enginu nastavené)
- Jazyk hry: čeština (texty v EnglishT.lod, obrázky v EnglishD.lod) / nebo: angličtina
- Mám Docker Desktop: ano. Mám Android Studio (SDK + emulátor): ano/ne.
ZÁSADNÍ PRAVIDLA:
1. Do složky s originální hrou NIKDY nezapisuj, jen z ní čti.
2. Pracuj jen uvnitř složky "MaM 8" (a čti z "MaM 7\docker"). Jiné porty v repozitáři neměň.
3. Než začneš něco velkého stahovat nebo stavět, napiš mi krátce plán a počkej na moje „ano".
Potom pracuj samostatně.
4. Nic netvrď bez ověření. U každé věci řekni, jestli je ověřená (a jak), nebo jen předpokládaná.
5. Emulátor mi NEMAŽ (wipe-data), mám v něm vlastní aplikace. Docker nikdy neresetuj do továrního nastavení.
6. Komunikuj česky.
KROK 0: OVĚŘ PŘEDPOKLADY (nic přitom neměň):
- Ve hře existují Anims\Magicdod.vid, Anims\mightdod.vid, Data\EnglishD.lod, Data\EnglishT.lod,
Data\bitmaps.lod, Data\games.lod, Data\icons.lod, Data\sprites.lod, Data\d3dbitmap.hwl,
Data\d3dsprite.hwl, Music\2.mp3 … 15.mp3 a MM8-Rel.exe.
- Vytvoř složku "MaM 8\gamedata\MM8" a zkopíruj do ní data ze hry (jen čtení ze hry, zápis
do repozitáře), jen soubory vyjmenované výše. Ověř, že velikosti sedí s originálem. Tahle složka
se nesmí dostat do gitu (je v .gitignore), obsahuje moje koupená data.
- Jazyk: MM8 má texty v EnglishT.lod (global.txt). LOD má jména položek dlouhá 64 znaků a obsah
zabalený zlib. Přečti je malým parserem (nebo MaM 8\tools\lod.py) a řekni mi, jestli je hra česky.
- Docker běží (docker info), je git a Python 3 a aspoň 20 GB místa. Zjisti, jestli mám Android SDK
a emulátor (%LOCALAPPDATA%\Android\Sdk, emulator -list-avds).
KROK 1: DOCKER IMAGE
- Image "openenroth-android" se staví z "MaM 7\docker\Dockerfile" (Ubuntu 24.04, JDK 17, Android SDK
s NDK, CMake 3.31 z Kitware, protože Ubuntu má jen 3.28). Když už existuje (docker images), nestav ho znovu.
- Licence Android SDK zkopíruj do "MaM 7\docker\licenses" z mého Android Studia
(%LOCALAPPDATA%\Android\Sdk\licenses). Když Android Studio nemám, zeptej se mě.
Neodklikávej je za mě přes „yes |".
- Když Docker Desktop nejde spustit s chybou „…sock.stale: The file cannot be accessed by the system",
přejmenuj (ne mazat) složky %LOCALAPPDATA%\Docker\run a %LOCALAPPDATA%\docker-secrets-engine,
když Docker neběží. Když je Docker ručně pozastavený, neobcházej to a řekni mi to.
KROK 2: BUILD APK PRO TELEFON (PowerShell ve složce "MaM 8"):
docker run --rm -v "${PWD}\OpenEnroth:/src:ro" -v "${PWD}\gamedata:/gamedata:ro" -v "${PWD}\out-android:/out" -v "${PWD}\docker-android:/dd:ro" -v oe8_work:/work -v oe_gradle:/root/.gradle openenroth-android bash -c "sed 's/\r$//' /dd/build.sh > /tmp/b.sh && bash /tmp/b.sh"
- Pozor: "gamedata" se mountuje jako /gamedata a MUSÍ v ní být podsložka MM8. Se špatným mountem
build projde, ale APK nebude mít žádná data.
- Skript docker-android/build.sh zkopíruje zdrojáky do volume (build na bind-mountu z Windows je
pomalý), přibalí data bez *.partNNN, *.dll a *.ini, podepíše APK klíčem out-android\keystore.jks
(když chybí, vytvoří ho) a výsledek uloží jako out-android\MaM8.apk.
- Keystore je potřeba schovat, jinak další verze nepůjde nainstalovat přes starou.
KROK 3: KONTROLA APK (povinná)
- apksigner verify, aapt dump badging (název MaM 8, balíček cz.mm8.game), native-code JEN arm64-v8a,
v assets/mm8 jsou všechny datové soubory, LOD, hwl, vid a mp3 nekomprimované (MM8-Rel.exe
komprimovaný být smí, je malý) a žádné *.partNNN.
KROK 3b: SYNCHRONIZACE ULOŽENÝCH HER (zkontroluj, že je v kopii enginu)
- V OpenEnroth\android\openenroth\src\main\java\org\openenroth\game musí být SaveSync.java
a DataInstallerActivity.java a OpenEnroth.java ji musí volat (popis níže v sekci „Synchronizace uložených her“).
Když tam není, dopiš ji podle té sekce, jen do Android části, engine v C++ se nemění.
- V APK zkontroluj, že classes*.dex obsahuje SaveSync.
KROK 4: TEST NA EMULÁTORU (když mám Android Studio)
- Emulátor umí jen OpenGL ES 3.1, engine chce 3.2. Postav ZVLÁŠTNÍ testovací APK:
-e GITHUBARCH=x86_64, výstup do "out-android-emu" (s prebuild.sh zkopírovaným z "MaM 7\out-emu",
ten jen v pracovní kopii sníží ES 3.2 na 3.1) a jiný volume (oe8emu_work). Tahle úprava se nesmí
dostat do APK pro telefon, zkontroluj, že out-android\MaM8.apk má jen arm64-v8a.
- Emulátor potřebuje asi 3 GB volné paměti. Když se nespustí, protože Docker/WSL zabírá skoro všechno,
uvolni mezipaměť Dockeru (docker run --rm --privileged alpine sh -c "sync; echo 3 > /proc/sys/vm/drop_caches")
a zastav nepotřebné kontejnery. Docker neresetuj.
- Přes adb (input tap/swipe, screencap) mi ukaž: instalaci dat při prvním spuštění, intro a hlavní menu,
tvorbu postavy s diakritikou (i okénko po podržení pravého tlačítka na dovednosti), Dagger Wound
Island s rozhovorem se S'tonem po startu hry, chůzi tlačítkem dopředu. Když mám tabletový AVD, to samé na tabletu, a rozměr telefonu přes
adb shell wm size 2400x1080 + wm density 420 (potom wm size reset a wm density reset).
Po změně rozměru se aplikace zavře, spusť ji znovu.
- Synchronizace savů: do /sdcard/Documents/MaM8 dej přes adb push zkušební soubor (třeba pokus.txt),
při prvním spuštění vyber v dialogu „Synchronizace uložených her" tu složku a povol přístup.
Po startu hry soubor ze složky smaž, zmáčkni Domů a ukaž mi, že ho tam hra vrátila ze své kopie
(tím jsou ověřené oba směry). Když máš save z téhle hry, ukaž ho i v nabídce Nahrát hru.
Pak ověř zástupce: adb shell dumpsys shortcut musí u cz.mm8.game ukázat „Složka pro uložené hry".
- U release buildu nefunguje run-as, stav zjišťuj z logcatu a screenshotů.
- Po testu testovací aplikaci odinstaluj a emulátor vypni. Schránku na mém PC nepřepisuj.
VÝSTUP:
- out-android\MaM8.apk a keystore tamtéž.
- Na konci mi napiš: cestu k APK, jak ho dostat do telefonu a nainstalovat (neznámé zdroje,
~1,5 GB místa, první spuštění rozbaluje data), co je ověřené a co ne (skutečný telefon s ES 3.2
jsi netestoval), co jsi změnil na disku (složky, Docker image a volumes) a že APK nesmím šířit.
Ovládání a uložené hry
Tlačítka jsou stejná jako v sedmičce a šestce: vlevo pohled, let, křik, útok a otáčení, vpravo inventář, mapa, skok, chůze a přepínač pravého tlačítka myši. Na tabletu jsou tlačítka menší a hra zabere víc místa. Jedna zvláštnost osmičky: lektvary, jablko nebo podkovu použijete tak, že je vezmete v batohu a kliknete jimi na panáčka postavy.

Uložené pozice se dají držet stejné na telefonu i na tabletu. Aplikace savy porovnává se složkou, kterou jí jednou ukážete, a tu složku si necháte synchronizovat na cloud běžnou aplikací. Přímo s žádnou cloudovou službou se hra nespojuje.
Na co jsem narazil
- Osmička používá stejná čísla předmětů, zvuků, domů a příšer jako sedmička, ale často pro úplně jiné věci. Každá taková konstanta se musela dohledat, co v osmičce doopravdy znamená.
- Hodnoty, které nejsou v datech, tedy třídy, dovednosti, kouzla, ceny a obchody, se čtou přímo ze spustitelného souboru hry. Ten se do aplikace přibalí, ale nespouští se.
- Emulátor potřebuje kolem tří gigabajtů volné paměti. Když ji sežere Docker, prostě se nespustí.
- Synchronizace savů je v osmičce ověřená v emulátoru, na skutečném telefonu zatím ne. V sedmičce ověřená je.
Kdo nemá upravený engine a chce si ho dopsat sám, najde na konci návodu v repozitáři kapitolu o tom, jak se osmička do enginu dostávala. Není to práce na jeden prompt, ale na dlouhé vedení po částech.
Další díly
Tohle je koníček, ale metoda je stejná jako v práci: dopsat do cizího systému část, která v něm chybí, a nerozbít přitom to, co už funguje. Potřebujete něco podobného?
Napište mi