Jak na textovku na osmibitu, ale bez BASICu.
Občas se stane, hlavně když je člověk šťoura, že se z nevinného dotazu stane projekt. Někde ve Facebookové diskusi o originálních osmibitových hrách jsem zmínil, že dokonalé textovky od Infocomu existovaly na i osmbitová atárka (tady jsme je neznali, protože potřebovaly disketovku a ty měly jen děti zelinářů a vnuci vojáků Wehrmachtu 😉) A tam přišel právě ten dotaz:
To jsem nevěděl, ale dotaz zaujal. Tak jsem zapojil strýce Googla a ten říkal, že tadyhle https://github.com/akosela/inform615 se nachází jak překladač, tak interpret pro osmibitové atárko, spolu s ukázkovou hrou a skriptem na výrobu ATR obrazu diskety. Tak jsem se vydal na průzkum toho, jak to funguje, a co by obnášelo počeštění – protože na angličtinu je toho už dost.
Historická vsuvka
Firmu Infocom založili v roce 1979 studenti z MIT. Napsali řadu vynikajících textových adventur, v době, kdy ještě existoval krabicový software – jejich krabice navíc obsahovaly různé artefakty – třeba stopy pro detektivní hry, nebo miniaturní ručníček a neviditelnou vesmírnou flotilu ve Stopařově průvodci. Tyto artefakty občas sloužily i jako ochrana proti kopírování, ale právě protože přirozeně patřily ke hře, nebyly vnímány tak otravně, jako jiné způsoby ochrany – např. Lenslok nebo známé opisování slov z manuálu.
Nejsem si jist, jak to bylo odlišné od jiných společností, ale Infocom nepsal hry přímo pro architekturu. Místo toho navrhli vlastní jazyk ZIL, který trochu připomíná LISP a měli mainframe počítač, na kterém tento jazyk překládali do bytecode, kterému říkali ZCODE. Tento bytecode spolu s kompresovanými řetězci tvořil tzv. story. A potom pro každou majoritní platformu (i pro řadu minoritních) napsali interpret tohoto bytecode – takže jedna textovka mohla běžet najednou a vlastně „zdarma“ na dvaceti různých architekturách.
Interprety existovaly v omezeném množství variant – verze 1 a 2 nejsou příliš známé. Verze 3 byla velmi rozšířená na osmibitech, včetně Atari, pak následovaly verze až po v8, které pak už měly vyšší limity, podporu pro grafiku a zvuk atd. A pak je koupil Activision a pak je zavřel a Infocomu byl konec.
O historii Infocomu a jejich hrách si nejlépe počtete na Wikipedii https://en.wikipedia.org/wiki/Infocom
Historická vsuvka #2
V devadesátých letech napadlo Grahama Nelsona napsat jazyk, kterým by mohl vytvářet vlastní textovky – a rozhodl se, že použije už existující interprety. Stvořil tak jazyk Inform, který generoval přímo z-code pro výše zmiňované interprety.
Vyvinul několik verzí, ze kterých je pro nás nejdůležitější verze 6 – je poslední, která připomíná programovací jazyk a umí vytvářet story ve verzi 3, pro kterou existuje na Atari interpret.
Další verze už pak neumí nižší verze story, mají jako hlavní virtuální stroj Glulx a píší se v přirozeném jazyce – což je pravděpodobně dost dobrý nápad pro angličtinu, ale neumím si představit, jak by to mohlo fungovat pro jakýkoli jiný jazyk.
Každý projekt v Informu6 se skládá ze dvou věcí – vlastní hry a knihovny. Samotný prázdný Inform, totiž neumí téměř nic – umí přečíst něco z klávesnice, něco vypsat, vyhledat něco ve slovníku, ale to je tak všechno. Teprve knihovna oživuje prostředí a komunikuje s uživatelem.
O Informu je čtení zde https://en.wikipedia.org/wiki/Inform a pak asi na bambiliónu dalších stránek zabývajících se IF (interactive fiction)
Současnost
Takže, abychom se podívali na ten githubovský adresář:
Atárkovský interpret umí jen a pouze v3, umožňuje použít až 128kB story, které může být buď na jedné 90kB disketě nebo na dvou s tím, že člověk by snad měl otáčet disketu v průběhu hry jen jednou. Je to zařízeno tak, že story se dělí na dvě části – rezidentní, která je pořád natažená v paměti a obsahuje části kódu, tabulky objektů, slovníky apod, a pak swappable, která se dotahuje z diskety a cachuje. Cachování funguje tak, že si interpret přehazuje tabulku načtených dat tak, aby nejnovější zůstávaly v paměti nejdéle, takže počet přístupů na disketu je relativně nízký. Dvoudiskové atárkovské hry pak fungují tak, že na první disketě je interpret a rezidentní část hry, na druhé disketě/straně je pak ta část, která se dotahuje. Pořád to dává člověku habakuk místa na vlastní hru. Ale je to celé anglicky a bez podpory nabodeníček.
Dále je tam překladač – Linuxovská verze Informu 6.15, která jde v pohodě přeložit i v MingW pro Windows.
A knihovna – standardní knihovna pro Inform6 je luxusní, ale obrovská. A strašně hodně moc anglická. Proto autor repozitáře přiložil minifikovanou verzi knihovny, která vychází z Inform knihovny 6.2 a osekává ji o nepodstatnosti, při zachování nutné flexibility. Tuto miniknihovnu vytvořil Dave Bernazzani pro soutěž ve psaní textovek na nějaké malé Commodory.
A jedna mini-ukázková hra.
Dohromady má ukázka s knihovnou a interpretem asi 30kB, což se může zdát hodně, ale vzhledem k limitu 128kB na story, je to luxusní prostor.
Současnost #2
Otázku tedy máme zodpovězenou. Samostatný interpret existuje, překladač existuje, knihovna existuje, zkompilovat a odstartovat na atárku to lze. Ale jen anglicky, takže jsme si nepomohli. Ale čas v lockdownu plyne jinak, takže proč si nepohrát…
Interpret
Dal jsem dohromady všechny atárkovské textovky od Infocomu, podíval jsem se jim lehce na střeva a dospěl jsem k názoru, že existoval prakticky jen jeden interpret a je podobný tomu, který byl přibalen na GitHubu. Tak jsem ho prohnal disassemblerem a pokusil se ho pochopit. Naštěstí je napsán velmi jednoduše a slušně, je krátký (okolo 7kB) a existuje originální zdroják interpretu pro počítače CoCo. Sice napsané pro 6809, ale i tak pochopitelné.
Mám tedy k dispozici originální anglický interpret ve zdrojové formě, s popisem důležitých funkcí, který se dá přeložit assemblerem XA do binární formy. Zdroják má asi 100kB assemblerského kódu, ale naštěstí není potřeba mu rozumět od začátku do konce.
Nabodeníčka
ZIL používá dost zvláštní metodu ukládání stringů – každý znak má 5 bitů, dohromady jsou tři ve dvou bajtech, zbylý bit slouží k pokračování/ukončení výpisu. Už z toho plyne, že je k dispozici jen 32 znaků, ale existují i přepínací znaky na další tabulky. Zde jsem na pochopení strávil asi nejvíc času, nakonec jsem zjistil, že existuje možnost psát text přímo v kódování ISO-8859-2 a použít přepínač -C2 pro překladač. Toto umožní používat celou Latin II sadu, jen jsem musel napsat převodní tabulku, která vezme ISO-8859-2 znak, převede ho na Unicode, ten pak převede přes Inform Unicode tabulku na vnitřní znak a ten pak převede na znak v kódování Čapek, který jsem si vybral. Font a tabulku jsem uzmul u Rastera http://raster.infos.cz/atari/chars.htm
Pak už stačilo do interpretu vložit font, nasměrovat CHBAS a do funkce „vypiš jeden Z-code znak“ přidat prohledávání převodní tabulky
Pak ještě přeložit hlášky vlastního interpretu a bylo to.
Inform knihovna
Práce, která je dost komplikovaná a není zatím dokončená, je počeštění mInform knihovny. Obsahuje velké množství textu a je velmi anglofonní – skloňování nic, rody nic, pomnožná čísla nic. Spoustu věcí se skládá z jednotlivých kousků za sebou na základě různých parametrů, takže překlad je pomalý a značně opruzný.
Musel jsem přistoupit k různým kompromisům:
- Příkazy se píší vesměs celé (Z-code má horní limit 6 znaků) ve druhé osobě, rozkazovací způsob – dej, prozkoumej, prohledej apod.
- Podstatná slova a oslovení se píší v prvním pádu. Takže „dej hopík anton“ nebo „robot, vlez do trouba“.
- Co není kompromis, ale funkce, je nutnost používat předložky a v případě komunikace nebo přikazování, oslovovat osoby. Žádné jednoduché dvouslovné kombinace.
- Musel jsem změnit slovosled, aby věty i bez skloňování dávaly smysl, tj. původní hláška „There is nothing on XXX“, která by v češtině byla „Na XXX nic není“ jsem změnil na „XXX: nic na ní není“.
- V současné době lze u předmětu nastavit osobu mužskou a ženskou, ještě popřemýšlím, zda přidat i další možnosti (pomnožná).
Demo
Na otestování funkcionality jsem stvořil krátké demo s názvem Dort. Užijte si ho a napište nějaké názory, zda mám dokončit překlad knihovny a zveřejnit celý toolset. Uvítám i nalezené chyby, pozůstatky angličtiny apod. Hra je kompletní, betatester Holyna byl schopen ji dohrát. Vlastní hru jsem vyvíjel čistě v textovém editoru a výsledné story jsem testoval v Inform engine WinFrotz. Kvůli této multiplatformnosti je vývoj a ladění velmi rychlé.
Ve hře jde o opuštění domu, ve kterém vám brání mikromanažer fiktivní České Republiky, který se usídlil v obyváku a nechce vám dovolit dům opustit. Ale je nám jasné, že se dá rád uplatit. Ale čím, že by tvou luxusní sbírkou atárek?
PS: Než se někdo zeptá – screenshot je pořízen v Altiře, kde mám nastaven zhnusovač obrazu tak, aby připomínal skutečné CRT, tak jak si ho pamatuju.
Dort (28,1 KiB, 114 hits)
Vyzkoušel jsem, nedokončil jsem; alespoň doposud ne. Že to dohrál Holyna, nepřekvapuje; ten dohraje i hry, ve kterých jsou bugy, kvůli kterým hra nejde dohrát. Lustr jde vzít, aniž bych si kvůli tomu musel vylézt na stůl, ale abych ho prozkoumal, musím s ním na ten stůl vylézt. Zadal jsem robotovi příkaz uvedený v textu, ale přestože je pak zavřený v troubě, tak dál vesele putuje po kuchyni a zabil mě, když jsem opomněl zavřít lednici po akci se slonem… Je správný můj předpoklad, že šroubek je ve vysavači? Já jen abych zbytečně nepřemýšlel nad tím, jak se do toho vysavače dostat, pokud tam ten šroubek není. 🙂 Ale jinak to vypadá dost dobře. Až na tu zarážku u dveří. To je zločin.
Že se dá vzít lustr, je naprostá chyba, zapoměl jsem mu nastavit flag „scenery“. To jsem opravil, texty s vysavačem jsem opravil. Šroubek je v první místnosti. Fixlá verze tu bude večer, nebo mi písni mail na jindroush sabáčka seznam atd. Zarážka je náhodou užitečná, když je průvan. 😉
Hotovo. 51 bodů z 55. (Ty chybějící 4 body asi nějak souvisí s tím hopíkem, že? Nějak jsem nevěděl, co s ním.) Kvůli předčasně upečenému dortu jsem to hrál znova, takže jsem lustr už nebral, a tak vše proběhlo tak, jak mělo. Když dám slonovi jiný příkaz, tak to píše „Slon has better things to do.“
@KaiN: Okay, tak já nikdy žádnou adventuru nepsal, takže jsem jistě spáchal všechny adventurní hříchy – hlavní z nich je ten, že tě to nemá zabít za něco, cos nemoh vědět. Na tu hlášku se podívám, na některý z nich mám příliš málo fantazie, abych je z tý knihovny vymlátil.
Skóre jsem prověřil, maximum je 51, dva objekty měly nahozené skóre, ale to se přičte jen při sebrání, ale ne při prozkoumání, což jsem chtěl odměnit. Obecně se musím podívat, jak se v Informu dělají věci jednou, teď to dělám takovou ojebávečkou a nevím, zda to je tak správně.
@Jindroush: je tam aktuální verze
„zda mám dokončit překlad knihovny a zveřejnit celý toolset.“
Určite áno, má to zmysel dokončiť aj zverejniť 🙂