Ondra mezi balvany je nová hra pro počítač Tesla Ondra. V tomto článku vás chci seznámit s pozadím vývoje této hry, důvodem jejího vzniku, motivací a také s technickým řešením, především specifickými záležitostmi na platformě Ondra. Mým cílem není psát hluboce odborné statě, ale spíše podat poutavý pohled do světa programování tak specifického kusu hardware, jakým Ondra bezesporu je a také do jednotlivých fází osobního vývoje, kterými jsem si jako neustále začínající amatérský programátor samouk prošel.
Jak to začalo
S programováním v assembleru obecně jsem začal v roce 2021 a to od nuly se hrou Falling Blocks. Ve stejném roce jsem se poprvé účastnil Bytefestu, kde jsem hru ukázal veřejnosti. O této hře jsem již článek psal. Nikdo však doposud nevěděl, že už tehdy na této akci jsem měl Ondru mezi balvany v první alfa verzi hotového (dokonce jsem jej tam nahrál a někdo si to vyfotil).
Poháněn především touhou překonat své i hardwarové meze Ondry jsem si dal za cíl udělat hru na úplném maximu co s Ondrou zvládneme. Věděl jsem, že chci hru komplexní a jít tzv. na jistotu s žánrem a kdyžtak ji mírně obohatit. Hra Rock and Ghosts pro Jupiter Ace mě jako předloha naprosto uchvátila a věděl jsem, že to je to pravé. Takový styl „boulder dash“ co se nescrolluje by snad mohl jít.
Rychlý začátek i konec
V první fázi vývoje jsem dokončil dá se říci jen převod původní verze tak, aby vůbec běžela na Ondrovi. Dalo se chodit po levelech asi třetinovou rychlostí než je příjemné a to s úplně vypnutými nepřáteli (duchy). O zvucích, obrazových efektech ani nemluvě. Tady jsem poprvé velmi tvrdě narazil.
A teď trochu čísel. Jupiter Ace je počítač založený na CPU Z80 o frekvenci 3,5Mhz a nemá grafiku, ale programovatelný znakový generátor. Má 32×24 znaků a tedy překreslení celé obrazovky znamená překreslit 768 znaků – v jeho případě tedy bajtů. Těchto 768 bajtů překresluje s efektivním taktem téměř 3,5MHz. Hra byla založena na překreslování stínové RAM (tím si pro sebe nazývám tu část paměti, kde se hra „odehrává“ skryta před zraky hráče) do znakové RAM s každým herním cyklem (jeden pohyb panáčka, fyzika a pohyb nepřátel). Pokud se nyní dopustím velkého zjednodušení, Ondra má grafický výstup, kde překreslení obrazovky znamená překreslit cca 10 000 bajtů s jeho efektivním taktem cca 0,4MHz (brzděné 2MHz CPU díky použití patentu Ing. Smutného pro vykreslování grafiky v režimu DMA). Pokud si vezmeme tyto hodnoty do poměru, zjistíme, že Ondra je cca 100x pomalejší co se vykreslení znaků týče a cca 9x pomalejší při vykonávání kódu. Tento nepoměr sil se nakonec stal nikoli hřebíčkem do rakve, ale tou největší motivační silou. Z tohoto důvodu je pro mne Ondra tak programátorsky zajímavý, protože jde na absolutní dřeň, nedovolí nic odfláknout, nedovolí nad ničím mávnout rukou. Cestou k úspěchu je jen totální a naprostá optimalizace kódu. V časově náročné smyčce hry se nesmí provádět nic navíc, než co je nezbytně nutné. Takže se vrátím k tomu, že prvotní verze tak, jak ji Jupiter Ace zvládal „levou zadní s prstem v nose“ a ještě musel být brzděn byl pro Ondru nesplnitelný úkol. V tu chvíli jsem z toho byl otráven a vnitřní motivace si to dokázat ještě nenabyla na síle. Projekt Ondra mezi balvany šel tedy k (prvnímu) ledu…
Období po vývoji Ondra MELODIK
Do druhé fáze vývoje jsem došel po dokončení Ondra MELODIKu. Měl jsem v ruce něco, co hrálo a umělo dělat zvuky. Pokukoval jsem po novém cíli na poli software – opět hře. Ale Ondra mezi balvany byl prostě nejlepší, nejvíc mi dával smysl. Ale jak to proboha dokončit, když bych k tomu měl to nebohé CPU zatížit navíc ještě ovládáním zvukového čipu? Přesto jsem se do toho pustil, nedokázal jsem si připustit, že to vzdám dokud nevyzkouším všechny možnosti. Prvním krokem bylo udělat hru tak, aby využívala méně zobrazovaných linek a docílit vyššího efektivního taktu CPU – toto je velmi specifická vlastnost Ondry. Hra tedy běží v režimu 192 linek. Plný počet linek je 255. Tímto se zvýší efektivní rychlost o 30%. Je to znát na první pohled, ale je to stále velmi málo, potřebuji stovky procent. Druhým krokem bylo se zbavit překreslování všech políček v každém herním cyklu. Zkoušel jsem několik způsobů a přístupů, ale jako nejefektivnější se ukázalo tzv. inkrementální překreslování. To si vyžádalo druhou stínovou RAM. V první stínové ram o velikosti hrací plochy 768 bajtů (znaků), se odehrává veškerý nový pohyb. Po jeho dokončení se porovnává bajt po bajtu s druhou stínovou RAM, kde je zaznamenán předchozí hrací cyklus. Pokud se políčko neshoduje, je nově překresleno jak do druhé stínové RAM a zároveň nově vykresleno do videoRAM (na obrazovku).
Po dokončení tohoto systému jsem se najednou ocitl v situaci, kdy jsem si říkal, že to možná půjde. Hra měla již přijatelnou rychlost, ale stále zatím bez nepřátel a beze zvuků. Po přidání nepřátel jsem se opět dostal do úzkých, kdy byla hra opět nehratelná co se rychlosti týče. Nepřátelé se musí generovat až po vykonání veškeré fyziky na hrací ploše, nelze to kombinovat. Fyzika padání kamenů se musí počítat plošně a to pro každé pole, tudíž 768x vyšetřit, co se na každém poli děje, čím je ovlivněno, kde je hráč atp. Jakékoli pokusy se selektivním fyzikálním modelem selhaly ne z důvodu funkce, ale byly ve výsledku dokonce pomalejší než plošný model. Pohyb nepřátel byl přejat také jako plošný, tzn. po ukončení cyklu fyziky, se uskutečňuje jeden cyklus pohybu nepřátel. Ondra mezi balvany šel tedy opět k (druhému) ledu….
Nápad
Tehdy jsem dokončil Falling Blocks v2 – tudíž docela dost vnitřně pozměněná verze, především s hudbou a nově nabytými znalostmi v programování. Pamatuji se ten večer, chtěl jsem jít normálně spát a v tu chvíli mě to trklo. Vždyť mohu ponechat plošný fyzikální model pro padání balvanů a selektivní model pro generování nepřátel, protože nepřátel je v souhrnném počtu jen zlomek oproti balvanům a tudíž zde selektivní model převažuje ve svých výhodách. Lidsky řečeno, pokud plošný model má náročnost výpočtu na jednom poli 1 a musím to vykonat 768x, je celková náročnost 768. Selektivní model má náročnost výpočtu na jednom poli podstatně vyšší, např. 5, ale pokud to musím vykonat jen 5x (počet nepřátel), je celková náročnost pouze 25! Tudíž celková náročnost klesla ze 768+768 na 768+25 a to je přijatelná přítěž. Ten večer jsem nešel ani spát a do půlnoci jsem tuto hypotézu prakticky ověřil a Ondra si opět vybral svou spánkovou daň. Od té chvíle už to šlo pěkně od ruky, protože jsem věděl, že hru lze dokončit!
1bit pixelart
Měl jsem pohyblivou hru, velmi dobrou hru. Ale graficky mi přišla ne úplně dokonalá. Rozhodl jsem se tomu seriózně pověnovat. Přeci jen jsem strávil moře času vnitřním kódem a ten čas si zasloužil i hezký kabátek. Začal jsem se zajímat o pixelart, hlavně 1bit. Studoval jsem tu techniku, jak to dělají ostatní, dal si do sledování různé borce na sockách a prostě denně nasával. Zároveň jsem si dal cíl, že to musí vypadat dobře na tom jediném správném zobrazovadle a to je televizor Tesla MERKUR. Takže jsem si Merkura dal na stůl na trvalo a všechny verze grafiky jsem si na něm prohlížel, přizval jsem si i děti na poradu a výsledek vidíte. Bojoval jsem s přehledností, ale která nesměla převyšovat estetičnost. Zjistil jsem, jak každý pixel ovlivní výsledný dojem.
Něco navíc
Ondra je počítač pro děti a mládež. Tak jej Ing. Smutný a jeho spoluautoři zamýšleli. Ve všem svém konání kolem Ondry jsem se již ustálil v tom, že chci pokračovat v tomto duchu. Tudíž vše musí být české a zaměřené tak, aby to vypadalo jako cílené na děti, i když dnes tomu tak již rozhodně není. Proto je hra v češtině a název takový, jaký je. A hra musí mít alespoň nějaký příběh a proto mě napadla ta věta „Ondra se ztratil a jeho tatínek Eda je Smutný!“ Jsem rád, že tato věta rezonuje i mezi vámi, což dokazuje, že vás příběh počítače Ondra také zaujal.
Dále jsem se zaměřil na detaily, které by mohly hru zpestřit a zároveň neukously z výkonu. Takže jsem si říkal, že by panáček mohl náhodně mrkat. No a když spadne tak těžký balvan, země se přece musí otřásat. A spadnutí balvanu na hlavu s námi musí otřást ještě více. Tyto „drobnosti“, které hardware Ondry umožňuje alespoň přidají určitou dynamiku do hraní, která jinak na tak pomalém počítači není možná.
Zvuky
Zvuky a hudba jsou velmi důležitou součástí herního zážitku. Samozřejmě jsem cílil na použití Ondra MELODIK. Ale od začátku mi bylo jasné, že nebudu dělat in-game hudbu. Opakující se stejná hudba po delší době irituje a všechny boulder dash hry mám spojené se zvuky. Kdy když se nic neděje, musí být ticho a pak se rád zaposlouchám do uspokojujícího kopání hlíny nebo sbírání diamantů. Takže hudbu najdete jen v úvodní obrazovce, kde jsem si nemohl odpustit použít dokonalou znělku Boulder Dash od Petera Liepy. Zaměřil jsem se i více na zvuky s vestavěným pípákem, aby dávaly smysl. A především mi dalo nejvíc práce si to interně připravit tak, abych měl usnadněný vývoj v budoucnu. Takže mám nyní dvě „knihovny“, kde volání zvuku je shodné jak pro melodik tak vnitřní pípák, kde se na začátku hry detekuje přítomnost melodiku. A ve hře jsou dvě databáze zvuků pro každý zvukový výstup zvlášť, protože data zvuků jsou zcela odlišná.
Dokončení
Dokončení šlo docela rychle. Testování se ochotně ujal Solaris104. Vzhledem k tomu, že cílová skupina lidí hry pro Ondru se dá spočítat zřejmě na prstech jedné ruky, už si nelámu moc hlavu, zda se neobjeví bug. Vlastně když mi ho někdo reportuje, já mám radost, že to někdo hraje. Proto byl na začátku mírně zmatek, když první vydaná verze vehementně cvakala s relátkem Ondry. Můj dobový klon Ondry nikdy neměl relé zapájené a tak mě to prostě nedocvaklo (doslova). Takže jsem si relé zapájel, ověřil si chybu a okamžitě jí napravil. Každopádně jsem se snažil hru vydat už co nejdříve, protože jsem se cítil vývojem této hry už přesaturovaný a kdybych neustále hledal mouchy nebo prostor k vylepšení, asi bych nebyl schopný nikdy nic dokončit. Například jsem chtěl zabudovat možnost ukládání herního postupu na magnetofon nebo načítání levelů z OndraSD nebo magnetofonu atp. Ale už jsem to nechal být. Je možné, že se k tomu někdy vrátím a toto vylepšení dodělám.
Závěr
Mým cílem bylo především opět rozšířit nabídku her na Ondru, která je velmi nízká. A to o hru, u které se dá strávit pár příjemných chvil. A to se mi myslím podařilo. Na konci hry je „překvapení“, které otevírá možná další budoucnost hry…
Stažení pro ViLi ROM: Ondra_mezi_balvany_v1.1.zip
Oficiální web: https://github.com/72ka/Tesla_Ondra/tree/main/Ondra%20mezi%20balvany
Jan Heřman (aka 72ka)