Might and Magic VI na Androidu: šestka, kterou engine neuměl

Sedmičku jsem na telefon dostal za víkend. U šestky to bylo o dost delší: engine ji vůbec neznal a musela se do něj celá dopsat. Výsledek je stejný, jedna aplikace, která po instalaci rovnou funguje, česky a s dotykovým ovládáním. Tady je postup i prompt.
U sedmičky stačilo vzít hotový engine OpenEnroth, přibalit k němu herní data a postavit aplikaci. U šestky to takhle nešlo: OpenEnroth umí jenom sedmičku. Šestka má jiná čísla předmětů, jiná kouzla, jiné domy, jiné rozhovory a část hodnot vůbec nemá v datech, ale přímo ve svém spustitelném souboru. Musela se proto do enginu dopsat, a to nebyla práce na jeden večer.
Výsledek je ale stejný jako u sedmičky. Jedna aplikace, která má herní data v sobě, po instalaci si je rozbalí a spustí hru. Česky, s dotykovým ovládáním a bez hledání složek v telefonu.

Co musíte mít připravené
- Legálně koupenou hru Might and Magic VI: The Mandate of Heaven z GOG.com, nainstalovanou na počítači. Stažený instalátor nestačí.
- Upravenou kopii enginu, ve které podpora šestky už je. Leží ve veřejném repozitáři MaM-android, odkaz je níž. Bez ní se nedá začít u promptu, ale u dopisování enginu; poslední kapitola popisuje, jak se to dělalo.
- 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,2 GB.
- Půl hodiny až hodinu při prvním sestavení, další pak zaberou pár minut.
Čeština je tu jednodušší než u sedmičky: překlad šestky se instaluje do hry na počítači a texty, které šestka vůbec nemá, protože patří k novějším oknům enginu, se vzaly z české sedmičky. 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 a nikam se nenahrává.
Prompt
Nejdřív si naklonujte repozitář, pak otevřete Claude Code ve složce s portem a vložte do něj text níž. Nahoře v něm je odstavec MOJE ÚDAJE, kde si přepíšete cestu k nainstalované hře, cestu k naklonovanému repozitáři a jazyk. Prompt pak sestaví aplikaci v Dockeru, zkontroluje ji a případně otestuje na emulátoru.
Prompt pro Claude Code
Chci si pro vlastní potřebu postavit Android port hry Might and Magic VI: The Mandate of Heaven
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 6
- Klon repozitáře MaM-android: C:\Projekty\MaM-android (git clone https://github.com/filippecha/MaM-android)
(MM6 port je ve složce "MaM 6", Docker image pro Android ve "MaM 7\docker")
- Název aplikace v telefonu: MaM 6, ID balíčku: cz.mm6.game (tak je to už v enginu nastavené)
- Jazyk hry: čeština (překlad je v icons.lod a games.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 6" (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\Anims1.vid, Anims\Anims2.vid, data\BITMAPS.LOD, data\SPRITES.LOD,
data\games.lod, data\icons.lod, Sounds\Audio.snd, Sounds\2.mp3 … 16.mp3 a MM6.exe.
- Vytvoř složku "MaM 6\gamedata\MM6" 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: MM6 má texty v icons.lod (global.txt). Přečti je malým parserem LOD (hlavička "LOD\0",
adresář položek, obsah zlib) 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 6"):
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 oe6_work:/work -v oe_gradle:/root/.gradle openenroth-android bash -c "sed 's/\r$//' /dd/build.sh > /tmp/b.sh && bash /tmp/b.sh"
- 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\MaM6.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 6, balíček cz.mm6.game), native-code JEN arm64-v8a,
v assets/mm6 jsou všechny datové soubory nekomprimované (LOD, vid, snd, mp3, MM6.exe) 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 (oe6emu_work). Tahle úprava se nesmí
dostat do APK pro telefon, zkontroluj, že out-android\MaM6.apk má jen arm64-v8a.
- Přes adb (input tap/swipe, screencap) mi ukaž: instalaci dat při prvním spuštění, hlavní menu,
tvorbu družiny s diakritikou, Nové Sorpigal po startu hry, chůzi tlačítkem dopředu, psaní jména
postavy s klávesnicí Androidu. 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).
- Synchronizace savů: do /sdcard/Documents/MaM6 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.mm6.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\MaM6.apk a keystore tamtéž.
- Na konci mi napiš: cestu k APK, jak ho dostat do telefonu a nainstalovat (neznámé zdroje,
~1,2 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 tablet
Ovládání je stejné jako u sedmičky. Vlevo nahoře dvě trojice kláves na rozhlížení a na let, pod nimi Esc, křik, interakce, tahový režim, útok a rychlé kouzlo, dole otáčení. Vpravo inventář, mapa, skok, přeskočení tahu, chůze dopředu a dozadu a přepínač pravého tlačítka myši. Na tabletu jsou pruhy s tlačítky širší a hra se zúží mezi ně.

Jak se šestka do enginu dopisovala
Tohle je nejzajímavější část a v návodu má vlastní kapitolu. Nedá se to udělat jedním promptem, je to dlouhé vedení po částech, kde se po každé části kontroluje, že sedmička pořád funguje.
- Engine se nejdřív naučí poznat, kterou hru má před sebou, a každá odlišnost šestky je pak samostatná větev. Chování sedmičky se nesmí změnit.
- Čísla předmětů, dovedností, povolání a map se při načítání převádějí do rozsahů sedmičky, takže zbytek enginu funguje beze změny.
- Hodnoty, které šestka nemá v datech, tedy ceny, statistiky povolání a kouzla, se čtou přímo z jejího spustitelného souboru.
- Vývoj běžel na počítači, ne na telefonu: hra se spouštěla v Dockeru bez obrazovky, ovládala se skriptem a každá obrazovka se porovnávala se snímkem z originálu běžícího vedle.
- Postupovalo se po částech: načtení dat, menu, tvorba družiny, mapa a pohyb, postava a kouzla, domy a obchody, rozhovory a úkoly, konec hry.
Prompt i tenhle popis odkazují na stav z září 2026. Aplikaci jsem zkoušel na emulátoru a na svém zařízení, ne na desítkách telefonů; když se u vás něco rozbije, je to na vás.
Další díly
Ušetřil vám tenhle návod odpoledne hledání? Můžete mi koupit kafe. Nic za to nedostanete, port je zadarmo a prompt taky, ale potěší to.
Tohle byla zábava po večerech, ale stejným způsobem řeším i práci: rozchodit něco, co oficiálně nejde, nebo dopsat do cizího systému část, která v něm chybí. Potřebujete něco podobného?
Napište mi