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

Hlavní menu Might and Magic VIII na telefonu s Androidem, po stranách jsou dotyková tlačítka

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.

Hlavní menu Might and Magic VIII na telefonu, po stranách jsou dotyková tlačítka
Hlavní menu Might and Magic VIII na telefonu, po stranách jsou dotyková tlačítka

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.

Rozhovor s postavou v Might and Magic VIII na tabletu, text je česky včetně diakritiky
Rozhovor s postavou v Might and Magic VIII na tabletu, text je česky včetně diakritiky

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.

Might and Magic VIII na telefonu, uprostřed herní obraz a po stranách dotyková tlačítka
Might and Magic VIII na telefonu, uprostřed herní obraz a po stranách dotyková tlačítka

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

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 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