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 mi nakonec nepomohl.
Čtyřlístek je dlouholetá česká komiksová série pro děti. Postupem času kolem ní vznikla i řada PC her na CD-ROMu a právě tuhle část jsem chtěl znovu oživit.
V celé téhle herní řadě je přibližně 20 titulů, ale já jsem se záměrně soustředil jen na tři, které jsem našel doma v šuplíku na CD:
- Čtyřlístek: Zítra se bude tapetovat (
tapetovat) - Čtyřlístek: Sami doma (
sami) - Čtyřlístek: Silák Bobík (
silak)
Krátké názvy 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é názvy her.
Tenhle článek je technický příběh o tom, co nefungovalo, co nakonec zabralo a co je ještě potřeba zlepšit.
TL;DR
- Kompatibilní režim na Windows 11 nebyl dost spolehlivý.
- Windows XP v UTM se ukázal jako slepá ulička, protože tam chybí použitelná podpora DirectX.
- Plná browser emulace přes
v86potvrdila správný UX směr, ale výkon byl na skutečné hraní příliš slabý. - Použitelná architektura nakonec byla Docker + Wine + Xvnc + noVNC s malou řídicí vrstvou okolo.
- Všechny tři hry se dnes spustí v prohlížeči, ale hlavním omezením zůstává výkon streamu.
Placeholder pro screenshot: přehled projektu / launcher screen. Doporučený záběr: browser UI se seznamem
tapetovat,samiasilak, včetně launch tlačítek a aktuálního stavu.
Cíl
- Spolehlivě spustit všechny tři hry.
- Nezáviset na samostatném starém Windows stroji.
- Zpřístupnit hry přes prohlížeč pro snadné sdílení a testování.
- Udržet setup dostatečně opakovatelný, aby šel později použít i pro další tituly Čtyřlístku.
V praxi každá hra odhalila jiné legacy předpoklady kolem instalace, struktury souborů, kodeků a chování z éry starého DirectX.
Pokus 1: Spustit je na Windows 11
První pokus byl ten nejzjevnější: pustit původní média přímo na Windows 11 na notebooku, který jsem měl po ruce.
Hry jsem sice dokázal bez problému nainstalovat, ale při spuštění padaly, a to i po zkoušení různých režimů kompatibility. Tuhle cestu jsem proto opustil.
Pokus 2: UTM + Windows XP
Další krok byl virtualizovaný Windows XP v UTM. Na papíře to znělo jako správná odpověď: dobově odpovídající operační systém i očekávání starého softwaru.
Jenže po zhruba hodině a půl nastavování UTM a instalace Windows XP jsem narazil na tvrdou realitu: UTM nepodporuje DirectX tak, jak tyhle hry potřebují.
Pokus 3: Plná browser emulace přes v86
Potom jsem šel browser-first směrem s projektem v86. Postavil jsem Linux i386 root filesystem, spustil Wine uvnitř emulovaného x86 a nad tím vystavil webové UI pro boot a spouštění her.
Tahle fáze byla důležitá, protože potvrdila podobu finálního zážitku:
- browser UX dával smysl,
- výběr her i diagnostika šly dělat přes prohlížeč,
- celý flow bylo možné vzdáleně sdílet i opakovat.
Zároveň ale ukázala hlavní limit: debug i optimalizace byly bolestivé, protože buildy i testy trvaly dlouho a plná x86 emulace měla příliš vysokou režii. Jako prototyp to bylo cenné, ale jako finální způsob hraní ne.
Pokus 4: Docker + Wine + Xvnc + noVNC
Použitelné řešení nakonec vypadá takto:
- Wine běží nativně v Dockeru na
linux/386image, - render jde přes Xvnc,
- desktop se streamuje do prohlížeče přes noVNC,
- nad tím je malá API/řídicí vrstva pro launch, stop, status a audio.
Důležitý architektonický posun byl jednoduchý: odstranit těžkou vrstvu plné CPU emulace, ale zachovat přístup přes browser. V téhle fázi se mi také podařilo vyřešit problémy s chybějícími fonty, přehráváním starých AVI videí ve hrách, zvukem a dalšími runtime detaily.
Placeholder pro screenshot: architektura nebo runtime view. Doporučený záběr: buď jednoduché schéma Docker -> Wine -> Xvnc -> noVNC, nebo živá browser session s již spuštěnou hrou.
Runtime a path problémy vyřešené po cestě
Některé z nejtěžších problémů vůbec nesouvisely s emulací. Šlo prostě o nesoulad prostředí:
- očekávání cest jako
C:\runtime-*aC:\Program Files\..., kvůli kterým jsem přidal aliasy a symlinky, - zůstávající procesy při přepínání mezi hrami, takže bylo potřeba zpřísnit stop a cleanup chování,
- fonty a edge casy kolem
ddraw, takže Wine setup i launch defaults potřebovaly další hardening.
Díky tomu se chování při startu stalo mnohem předvídatelnější napříč všemi třemi tituly.
CPSE + AVI rabbit hole
Nejhorší problém bylo přehrávání AVI videí v menu u sami a silak, s chybami jako:
CPSE: Stream open file failedCan't create multimedia stream instance- DirectShow graph failure
RenderEx -> 0x80040218
Tahleta legacy AMStream cesta zůstávala v současném prostředí nespolehlivá i s normalizovanými nebo zjednodušenými testovacími klipy. Praktická oprava nakonec spočívala v patchnutí runtime executable tak, aby se pro známé buildy vypnuly reference na menu_*.avi. Tím se obešla padající cesta menu videí a hry se staly znovu hratelnými.
Z pohledu čisté preservation to není ideální, ale z pohledu "funguje to teď a opakovatelně" je to správný kompromis.
Placeholder pro screenshot: failure analysis nebo debug evidence. Doporučený záběr: side-by-side rozbitého menu videa, nebo terminál / log view s chybou
CPSE/ DirectShow během investigace.
Výkon a aktuální stav
Jakmile se hry podařilo funkčně rozběhat, hlavní problém přestal být kompatibilita a stal se jím výkon. V tu chvíli se práce přesunula z otázky "spustí se to vůbec?" na otázku "dá se to rozumně hrát přes browser?"
Většina úsilí šla do snižování zpoždění a uhlazení streamu. Přesunul jsem audio cestu na AudioWorklet-first přístup, přidal bounded low-latency jitter buffer, snížil burst velikost audio chunků na relay cestě a doladil VNC defaulty pro localhost použití. Zároveň jsem vylepšil metrikový HUD, abych konečně viděl, co se při běhu skutečně děje, místo odhadování podle pocitu.
To celý projekt posunulo výrazně dál než předchozí verze. Všechny tři hry se dnes spustí z prohlížeče, instalační cesta je obejitá, audio latence je znatelně lepší a menu AVI crash blocker je vyřešený workaroundem. Slabým místem ale zůstává video: pod zátěží je stream stále viditelně trhaný, aktuálně někde v nízkých 20 FPS. Upřímný závěr tedy je, že projekt je dnes funkční a použitelný, ale pořád jasně výkonově omezený.
Placeholder pro screenshot: aktuální hratelný výsledek. Doporučený záběr: jedna ze her spuštěná v prohlížeči s viditelným performance / metrics overlayem, aby byl vidět jak výsledek, tak i zbývající omezení.
Závěr
Po technické stránce je pořád co zlepšovat. Pravděpodobně se dá ještě něco získat dalším laděním ddraw módů pro jednotlivé hry, snižováním render a encode režie nebo časem i nahrazením noVNC za efektivnější transport. Ale to už dnes není to hlavní.
Hlavní milník je splněný: tyhle staré české hry jsou znovu hratelné v moderním browser workflow. A co je důležitější, 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 už není Wine, DirectShow, Docker ani streaming latence. Je to naučit ho ovládat hru myší, protože doteď hrál prakticky jen hry na mobilu. A to je výrazně lepší typ problému.