Tyhle staré české hry Čtyřlístek si pamatuju z dětství, kdy se objevovaly jako součást promocí cereálií Nesquik. Hráli jsme je s bráchou a po letech mě napadlo, jestli by si je nemohl zahrát i můj syn. To se ale rychle změnilo v praktický problém: moje osobní počítače běží na Linuxu nebo macOS a ani Windows 11 notebook z práce hry nespustil spolehlivě.
Čtyřlístek je dlouholetá česká komiksová série pro děti. Postupem času kolem ní vznikla i řada PC her na CD-ROMu. V celé téhle herní řadě je přibližně dvacet titulů, ale já jsem se soustředil na tři CD, která jsem měl pořád doma:
- Čtyřlístek: Zítra se bude tapetovat (
tapetovat, 2001) - Čtyřlístek: Sami doma (
sami, 2003) - Čtyřlístek: Silák Bobík (
silak, 2005)
Nejsou to DOS hry. Jsou to 2D point-and-click adventury z Win32 éry postavené na CPAL2 enginu od Centauri Production, s DirectDraw, DirectSound, DirectInput, DirectShow/AMStream, starými kodeky a spoustou předpokladů z období Windows 98/XP. Cíl byl jednoduchý: spolehlivě spustit všechny tři hry, nezáviset na starém Windows stroji a udělat výsledek použitelný z prohlížeče, aby se dal rychle sdílet a testovat.
Krátké názvy výše jsou labely, které používám ve skriptech, logách a runtime toolingu. Při buildu image, patchování souborů a přepínání mezi testovacími běhy jsou výrazně praktičtější než celé české názvy her.
Co nefungovalo
První pokus byl nejzjevnější: pustit původní média přímo na Windows 11. Instalace sice prošla, ale hry při spuštění padaly i po zkoušení různých režimů kompatibility. To nebyl setup, který bych chtěl dál ladit nebo na něm záviset.
Další pokus byl Windows XP v UTM. Na papíře to znělo správně: dobově odpovídající operační systém pro dobový software. Po zhruba hodině a půl nastavování UTM a instalace XP byl ale blocker jednoduchý a dost zklamávající: tahle cesta hrám nedala DirectX podporu, kterou potřebovaly.
Pak jsem zkusil ambicióznější browser-first směr s v86: nabootovat Linux i386 guest přímo v prohlížeči, uvnitř emulovaného x86 spustit Wine a nad tím vystavit webové UI pro spouštění her. Ten experiment byl pořád užitečný, protože potvrdil tvar výsledného zážitku. Browserové launch controls dávaly smysl, diagnostika šla zobrazovat přímo na stránce a celý flow šlo vzdáleně sdílet.
Jenže jako runtime to byla špatná cesta. Build-test smyčka byla bolestivě pomalá a finální blocker nebyl jen výkon. Wine startup uvnitř v86 guestu byl nestabilní, s chybami jako WINE_EXITED_EARLY a nízkoúrovňovými problémy kolem virtual_map_user_shared_data. V tu chvíli dávalo větší smysl změnit architekturu než dál ladit emulovaný guest.
Runtime, který fungoval
Praktické řešení bylo zachovat browser UX a zahodit vrstvu plné CPU emulace. Finální runtime používá linux/386 Docker image s Wine, TigerVNC Xvnc, noVNC, websockify, PulseAudio a malým Python control serverem.
Zjednodušeně stack vypadá takto:
Prohlížeč -> noVNC/websockify -> Xvnc -> Wine -> cdromek.exe
Prohlížeč -> Audio WebSocket -> control server -> PulseAudio TCP stream
Prohlížeč -> control API -> launch / stop / status / logs
Xvnc je X server a VNC server zároveň, takže odpadá další framebuffer-polling vrstva. Desktop se do prohlížeče posílá přes noVNC, zatímco audio jde zvlášť: PulseAudio zapisuje do null sinku, TCP stream vystavuje monitor výstup a prohlížeč přehrává PCM přes AudioWorklet s malým low-latency bufferem.
Control server se ukázal důležitější, než jsem čekal. Stará se o výběr hry, cleanup zbylých Wine procesů, launch módy, tail logů, status metriky a malé rozdíly mezi jednotlivými tituly. tapetovat může používat native-first ddraw wrapper cestu, zatímco sami a silak se v aktuálním setupu chovají lépe s vestavěným ddraw ve Wine.
Legacy detaily
Nejužitečnější zjištění bylo, že nejtěžší problémy nebyly vždycky "emulační" problémy. Často šlo prostě o staré runtime předpoklady.
tapetovat už měl extrahované runtime soubory, ale sami a silak se chtěly vydat instalační cestou. Jejich média obsahují Centauri CPack archivy: cdromek.pak pro resources a cdromek2.pak pro executable. Extrahovat je do cdromek.res a cdromek.exe a spouštět hru z extrahovaného runtime adresáře udělalo z novějších titulů mnohem podobnější případ jako tapetovat.
Pak tu byly path předpoklady. Hry očekávaly různé varianty C:\runtime-* a C:\Program Files\Ctyrlistek\..., takže launcher připravuje zapisovatelné runtime kopie a podle potřeby vytváří compatibility aliasy. Staré Windows programy také čekají TEMP a TMP jako Windows cesty, ne jen unixové proměnné prostředí.
Fonty a registrace médií potřebovaly vlastní hardening. Container instaluje core fonts, přidává legacy font substitutes jako Arial CE, registruje DirectShow-related COM třídy, nastavuje DirectX-era registry hodnoty a mapuje staré názvy kodeků. Bez toho některé chyby vypadaly jako bugy hry, i když skutečný problém byl v tom, že Wine prostředí nevypadalo dost jako stará instalace Windows.
Nejhorší problém bylo přehrávání AVI videí v menu u sami a silak. Padající cesta šla přes CPSE a AMStream, s chybami jako CPSE: Stream open file failed, Can't create multimedia stream instance a RenderEx -> 0x80040218. sami má AVI soubory z éry Intel Indeo, zatímco silak obsahuje WMV3 video. Zkoušel jsem klipy normalizovat a zjednodušovat media path, ale DirectShow graph pořád na některých místech selhával.
Pragmatická oprava byla patchnout známé runtime buildy executable a vynulovat reference na menu_*.avi. Tím se obešla padající cesta menu videí, ale samotné hry zůstaly hratelné. Z pohledu čisté preservation to není perfektní, ale jako opakovatelný "funguje to teď" kompromis to dává smysl.
Aktuální stav
Všechny tři hry se dnes spustí z prohlížeče. Instalační cesta je obejitá, zbylé Wine procesy se mezi launchi uklízí, audio latence je znatelně lepší než v dřívějších verzích a menu AVI crash blocker je vyřešený workaroundem.
Slabým místem pořád zůstává video delivery. Setup je funkční a použitelný, ale stream může být pod zátěží stále trhaný, v horších případech někde kolem nízkých 20 FPS. Pravděpodobně se dá ještě něco získat laděním ddraw módů pro jednotlivé hry, snižováním render/encode režie nebo časem nahrazením VNC transportu něčím efektivnějším.
To už ale není hlavní milník. Tyhle staré české hry jsou znovu hratelné v moderním browser workflow a už to není jen preservation experiment na mém počítači. Se synem je teď opravdu hrajeme.
Nejtěžší překážkou v tuhle chvíli není Wine, DirectShow, Docker ani streaming latence. Je to naučit ho ovládat hru myší, protože doteď hrál hlavně na mobilu. A to je výrazně lepší typ problému.