Pár dní dozadu začala vznikať nová gameska Nemezyro, ktorá samozrejme (ako obyčajne) ovplýva nejakými neštandardnými fičúrkami, tým myslím použitie technológie, ktorú som ešte nikdy predtým nepoužil.
Ok, o čo teda v Nemezyro ide?
Je to logická/postrehová oddychovka; hra, kde skrollujú z prava do ľava náhodne generované sekvencie trojfarebných dlaždíc a úlohou hráča je tieto dlaždice eliminovať čo najdlhší čas bez toho aby sa niektorá dlaždica dotkla ľavého okraja herného poľa. Dlaždice sa eliminujú kliknutím kurzora na dlaždicu s tým, že zároveň s ňou sa eliminujú všetky susedné dlaždice rovnakej farby. Čo je tu špecifické je, že susednosť platí aj medzi najvrchnejším klikateľným riadkom a najspodnejším klikateľným riadkom… takže pri prvom pohľade máte pocit, že to tam občas nejako mizne samo :).
Poďme ale k tomu, ako je to urobené a kde to drhlo…
Na hre som začal makať 20.augusta, netradične som potreboval vymyslieť názov projektu ako prvú vec. Napadlo ma všeličo, ale nakoniec som našiel na nete šikovný generátor názvov a po prejdení zopár stoviek vygenerovaných nezmyslov môj pohľad zastal na Nemezyro. Následne som sa pustil do kódenia, nabúšil scrollovací engine, chytil graph2font, kde som si rozvrhol farbičky DLI, vyexportoval a napojil generovanú DLI rutinu do hry. Vtedy hra obsahovala ešte 4 farebné dlaždice, neskôr som oranžovú vyhodil pri riešení jedného glitchu a potom som sa rozhodol, že už ju nevrátim.
Po trojdňovej pauze som sa rozpamätal, že už je čas trošku pohnúť projektom a zbesilo som začal pridávať interakcie hráča.
Celkom som sa obával ako to bude stíhať, keď mám normálny playfield so 4 zmenami v jednom scanline a ešte sa to scrolluje, ale na moje počudovanie išlo všetko pekne hladko bez jediného glitchu.
Ďalší deň pauza a na rad prišla logika hry a nejaká tá vychytávka. Začal som pracovať na rutine delete_adjacent, trošku som pobrowsoval net, či nenájdem nejaký šikovný floodfill algoritmus, ale nakoniec som pochopil, že mi neostáva nič iné ako sa spoľahnúť sám na seba, tak som si napísal vlastný jednoduchý floodfill s bufferom (bez rekurzie), ešte tam boli chybičky v prechode medzi horným a dolným okrajom, ale v princípe to šlapalo:
Medzitým som už kontaktoval Poison-a, ako fanúšik jeho muziky, či by som niečo s jeho tvorby nemohol použiť do nastávajúceho projektu. Nečakane mi odpísal celkom svižne, že má jednu novú muziku hotovú, ktorú pripravoval do Fandal-ovej multijoy4 úpravy gamesky, ale ten ju nechcel pretože je stereo. Samozrejme bola hudba excelentná a rozhodol som sa, že ju teda prevezmem. Poison robí v SDCMC, čo je Stereo Double Chaos Music Composer od Datri-ho. Je to upravená verzia CMCčka s použitím 8-kanálového sterea a záhadného double módu. K tejto “dobrote” sa ešte vrátim neskôr.
Za poslednú dobu sa robia hry takmer výlučne s hudbou v RMTčku (Raster Music Tracker), ktorý má celkom príjemne poriešenú podporu zvukových efektov, teda SFX. V CMCčku o takejto podpore neviem, marí sa mi, že to možno aj také niečo má, ale dokumentácia sa moc zohnať nedá, tak ma napadlo, že vyskúšam niečo inovatívne.
Čo už môže byť na Atari inovatívne? – Je to nečakané, ale z času na čas sa zjaví niečo špeciálne a v tomto prípade som sa pohrával s myšlienkou, že použijem na SFX pípák klávesnice o ktorý sa nestará Pokey (audio) čip, ale GTIA čip, ktorý je mimo iného zodpovedný za PMGčka, “tučnopixelové” mnohofarebné grafické módy a funkčné tlačidlá Start,Select,…
Je to relatívne nedávno čo XXL spravil GTIA sample player a prehráva hudobné moduly formou akoby to boli sample. To, čo to potrebuje je frekvenčne modulovaný signál (amplitúda sa meniť nedá). Celý trik prehrávania zvukov cez GTIA je len striedavý zápis dvoch hodnôt do CONSOL ($D01F), tá mágia je vo frekvencii s akou sa zápisy vykonávajú.
Spravil som zopár pokusov a okamžite som pochopil, že cez VBI teda veľa vody nenamútim, tak som aspoň spravil cez to VBIčko taký bzučiak. Na to aby zvuky za dačo stáli je potrebné vykonávať zápis v mnohonásobne vyššej frekvencii ako je 1/50 sekundy. Kontaktoval som aj XXL-a, že či to robím dobre, ale sám som pochopil, že tam nie je moc s čím vymýšľať. Bzučiak som nechal teda tak…
Zlom nastal 30. augusta ako sa nebezpečne blížil deadline. Doplnil som do hry kopec contentu, ale za celý deň som commitol len jedinú verziu kódu do SVNka. Pridaním hudby do hry som okamžite pochopil, že GTIA bzučiak ide von. Cez tu Poisonovu muziku ho vôbec nebolo počuť, takže SFX som kompletne zavrhol. Deň predtým som sa ale hral s inou vychytávkou. Išlo o RastaConverter, geniálny to výtvor, ktorý dokáže zobraziť nevídané množstvo farieb v statickom obrázku. Trik je v tom, že pomocou hill climbing algoritmu systém iteruje zmeny farieb PMG a bitmap grafiky a snaží sa výsledný obrázok na Atari čo najviac priblížiť jeho plnofarebnej predlohe. Autorom je Ilmenit (kámo, si borec!), pred časom (už sú to snáď 2 roky) bola celkom živá diskusia o RastaConverter-i na AtariAge, ale veru nespomínam si, že by niekto takto vygenerovaný obrázok použil v nejakej hre. Len nedávno som videl nejaké simple demo (obrázok+scroll), ktoré využívalo túto technológiu. “Challenge accepted, chcem rastaimage ako title screen!” Strávil som nejaký čas vymýšľaním ako by to malo vyzerať, nakoniec som zvolil farebnú šachovnicu s názvom v strede:
Mal som niekoľko verzií a tunoval som dosť ten nápis (veľkosť, typ fontu), kým sa mi podarilo zvoliť kombináciu, ktorá bola dobre vygenerovateľná. Zabil som tým skoro celý deň, ladil som aj farby, ditheringové algoritmy, bolo toho dosť… toto finálne logo bolo generované po viac ako 160 miliónoch iterácií a jeho vygenerovanie na mojom 4-jadrovom Elitebook-u trvalo cca 4 hoďky, ale myslím, že výsledok je famózny.
Šialene veľký vygenerovaný kód obrázka (cez 20kB) som pripojil k hre spolu s muzikou a nemilo ma prekvapilo, že SDCMC v double móde sa nestíha prehrať počas VBI a interferovalo to s vykreslovaním loga. Výsledkom boli nechutné glitche (hlavne keď hrali bubny) a miestami bola hudba spomalená.
Medzičasom mi Poison dodal aj pomalú verziu hudby pre SLOW mód hry. Musel som ho zase povolať do služby s požiadavkou, aby z hudby vyhodil bubny a vyladil ju pre normal (non double) mód. Dúfal som, že takáto hudba už časovanie nenarúšať nebude a logo aj hudba budú krásne stabilné.
Teraz to tu vyzerá, že všetko išlo ako po masle, ale realita bola niekde úplne inde. Ono totiž tomuto všetkému predchádzalo veľmi silné krvácanie, ktoré spôsoboval SDCMC player. Riešil som ho s Fandal-om, za čo má moje veľké dík, pretože by som to asi bez neho nerozchodil. Na svojom blogu už 2krát písal o SDCMC veľmi nemilé veci a ja som si to veru vyskúšal na vlastnej koži. Player ako taký hrá stereo v štandardnom normal móde. Táto verzia CMC playera však má jeden flag, ktorý treba nastaviť pre zapnutie double módu. Double mód je modifikovaná replay routina, ktorá trvá výrazne dlhšie ako štandard, odmenou sú však ďaleko kvalitnejšie bubny. Je to niečo podobné ako keď sa RMT alebo TMC player púšťa 2x za snímok, ale tento sa púšťa len raz. Sranda ale je, že v double móde hrá jeden kanál úplné bludy a v určitej časti player číta z adries, ktoré sú úplne mimo dát súvisiacich s hudbou ($FF00). Na tieto fakty ma Fandal upozornil, čo sa dalo som patchol jeho návodom, ale to divné čítanie z poslednej stránky pamäte som proste debugovaním metódou pokus omyl upravil tak, že som zmenil 1 byte v hudbe na inú hodnotu. Táto chybka mi predtým spôsobovala to, že mi ingame hudba odmietala loopovať a po dosiahnutí posledného riadku proste stíchla. Druhou “zábavnou” vecou pri SDCMC je jeho Disk Manager, kde load funguje v zásade až na druhý raz a save len v Atari800winPlus a tuším aj SIO patch musel byť vypnutý. V emulátore Altirra je to márna snaha, žiadny zápis na disk sa nepodarí – sranda. Tento fakt ma celkom “pobavil”, keďže Altirru používam primárne a po 25. opakovaní uloženia modulu som zúfalo s Fandalom diskutoval, že to proste nefičí.
Prišiel 31.august, deň dead-line. Stav: title screen šlape, ale hudba spôsobuje glitche (nižšie je screenshot s frameblendingom, kde ten glitch vidno), herná logika je iba v plienkach, klikať sa dá, ale ešte nič nemizne ani sa neainmuje.[\lang_sk]
Poison mi dodal novú verziu SLOW hudby bez bubnov v non-double móde, ktorá už blikanie titulného obrázku nespôsobovala, takže paráda. Stále som ale zápasil s chybou, ktorú som ešte nespomenul. Proste celé to nejako občas stratilo synchrón, obraz sa rozblikal až som sa prekúsal do čiernej obrazovky. To by nebolo nič zvláštne, keby sa hra nejavila, že je všetko v poriadku. Človek by čakal nejake zatuhnutie prerušenia, štart ilegálnej inštrukcie a crash… ale tu nič, všetko šlapalo ale obraz nikde.
Takýto stav som ešte nezažil. V zúfalstve posielam Fandalovi binárku, že ako to u neho vyzerá a on mi povie, že u neho to šlape v pohode. Síce to nie je moc zosynchronizované s obrazovkou ale ináč ok. To si snáď zo mňa robí srandu alebo čo. Fandal ako ťažký oldschool kóder (nepoužíva makrá ako MVA,MWA,SUB,ADD,PLR,PHR ani žiadne .PROC či .LOCAL) primárne na ladenie stále používa už dlho neupdatovaný emulátor Atari800WinPlus 4.1. Ja frčím na Altirre už ale 3 roky no a na moje prekvapenie tá binárka v Atari800WinPlus šlapala úplne stabilne (s obrazom), čo ma celkom rozčarovalo. Celú dobu som teda hľadal chybu podľa falošných symptómov… “no na parádu, taký chleba donesem, že sa budete za ušami zalizovat“:
Nakoniec sa mi tento problém podarilo vyriešiť, za všetko mohol HSCROL. Ja som sa totiž snažil napísať celý program tak, aby sa nikdy nečakalo v nejakej hlúpej obrazovkovo-synchronizačnej slučke typu LDA:CMP:REQ 20, zjavne sa mi potom stávalo, že pri skrolovaní som HSCROL menil v nejakom “zvláštnom/zakázanom” čase, z čoho išla Altirra úplne “do čávesu”.
Ok super, takže obraz sa mi už nerozbíjal na úplnú kašu, ale nejeden epileptik by padol na zem s penou okolo úst. Nechutný flicker vznikal počas jedného frejmu z 8mich, keď sa jemný scroll switchol na hrubý (coarse) scrolling a celá videoram sa potrebovala posunúť. To by sa asi ešte stihnúť dalo, ale ja som neposúval videoram, ale prakticky prekresľoval celú scénu dlaždicu po dlaždici nanovo, čo sa fakt nedalo stihnúť za 1 frame. Začal som teda pracovať na doublebufferingu a kupodivu mi trvalo len necelú hodinu aby to pekne stabilne šlapalo, striedavo sa scéna vykresľovala do jednej z dvojice videoramiek a medzitým sa synchrónne upravoval DisplayList. Bol som nabudený, že konečne nejaký seriózny progres, že sa konečne môžem sústrediť na vývoj samotnej hry a nie stále riešiť nejaké prašivé glitche, blikania a inak rozbité zobrazenia.
Jediný problém bol, že už bolo 20:00 a do deadlajnu mi ostávali už len 4 hodiny.
Naklikal som fonty, doplnil jednoduché (ale podľa mňa efektné) ingame logo, nejaké tie čiaročky, aby tá ingame obrazovka mala nejakú fazónu. Nevedel som do čoho sa potom pustiť skôr a celkom značne ma začala opúšťať nádej, že hru stihnem aspoň v nejakej normálnej verzii dokončiť do pol noci.
Vtom mi pípne telefón a PG mi píše, že odoslal hru do Abbucu jednu minútu pred deadlajnom… pozerám, že asi to má chalan nejaké pomýlené, veď deadline je už tradične o pol noci… pozriem pravidlá na webe a neverím vlastným očiam, deadline je o 22:00!
Chvíľku som premýšľal, že čo teraz, no rozhodol som sa konať. Chytil som to, čo som mal hotové, pripojil som to do mailu na Saschu Kriegela (skr), ktorý software compo zastrešuje a napísal som mu stručný popis hry spolu s textom, že som netušil, že je deadline oproti minulým rokom posunutý na skorší termín.
Nejaký čas mi trvalo kým som strávil čo sa stalo a povedal som si, že nevadí veď nejako to dokončím a aspoň to releasnem v predstihu. Niečo pred 23:00 som sa pustil do relokácií. Ono vyvíjať niečo len pre emulátor je fasa, ale reál má dosť zásadné obmedzenie a tým je load dát pod ROMku. V emulátore sa to dá prakticky okamžite a bez problémov, no v reáli je nutné dáta naloadovať niekam do RAMky, potom vypnúť ROMku a preniesť dáta do ROMkového adresného priestoru. Totiž ona tá ROMka má v sebe mimo iného aj obslužné rutiny pre load z diskety, takže keď sa to vypne, rutiny sú fuč a pri pokuse ich použiť s vypnutou ROMkou nasleduje s istotou zrútenie systému. Akože nič nové pod slnkom, riešim to už pri každom projekte snáď od dema Summertime. Problém je ale v tom, že ten šialený titulný obrázok žerie niečo cez 22kB pamäte a nie je vôbec triviálne ho nejako šikovne zastrčiť pod OS ROM alebo Basic ROM. Pôvodne som myslel, že hodinka mi na relokácie bude stačiť… “óó, ako hrozne som sa mýlil”.
Štandardný postup som časom vzdal, nechodilo to ani trošku a je to celkom frustrujúce, keď slušne dobre chodivú hru rozbijete tak, že sa nedá naštartovať ani po hodine ladenia presunov v pamäti. Skúsil som teda postup 2, t.j. použiť runtime packer na realokovanie. Na packovanie používam TeBe-ho SuperPacker, no ani po 10-tom pokuse nie som schopný zapakovať hru tak, aby ju bolo možné rozpakovať a spustiť. “Ok, už je veľa hodín, na toto už nemám nervy.” – revertol som zdroják o hodinu späť z môjho SVNkového repozitára a relokácie som nechal tak.
Pokračoval som teda vo vývoji a niečo po 1:00 v noci mi už šlapalo jednoduché skóre a rozrábal som obtiažnosti a herné módy. Okolo pol druhej som to zabalil po fixnutí chybičky, ktorá spôsobovala občasné “cúvanie” dlaždíc.
Na druhý deň ráno 1.septembra som sa zobudil a našiel v inboxe email, ktorého odosielateľom bol Sascha Kriegel. Čítam a neverím, Nemezyro zaregistroval do súťaže, do deadlajnu potreboval popis a hrateľnú verziu, ktorú som dodal, takže všetko je ok a skutočný deadline sa posúva ešte dopredu. Z emailu nebolo úplne jasné ako to myslel, mal som aj s MaPa-om polemiku aký je teda termín konca súťaže, no nakoniec z toho vysvitlo, že sa posunul o 3 dni… s tým, že ešte do nedele (7.9.) je možné posielať bugfixy.
Posilnený novým vetrom v plachtách som sa pustil do dokončovania hry pre Abbuc SW contest. Od rána som krvácal na relokáciách a niekedy okolo tretej poobede som konečne naštartoval hru tak aby to zvládlo aj reálne Atari. Generovaný kód RastaConverter-a som sa pôvodne snažil realokovať (ja hlupák), no potom mi to doklaplo. Preto som kód nechal kódom a presunul som pod ROMku videodata. Nuž, človek sa učí neustále, škoda, že aj viackrát to isté… keď to odminula zabudne.
Potom som začal vymýšľať dizajn Options-screenu tak, aby sa tam dali zvoliť tri herné módy. Dal som tomu trošku fazónu a celé som to potom zaklincoval nekonečným cyklom zápisu náhodných hodnôt do farby pozadia. Pripomína to vizualizáciu procesu depackovania. Trochu som váhal, či to tam nechať, ale nakoniec som si povedal, že veď čo, nech to tam je…
Popracoval som na hernom cykle a stavoch, ktoré definujú kedy sa má prejsť z title screenu do options, odtiaľ do hry a naspať cez game over do title. Večer som konečne fixol prepočítavanie kurzora na dlaždice, prepočet bol dovtedy značne mimo, čo mi nechápavo vyčítali moji remote testeri :). Tesne pred polnocou bol options screen hotový aj s počítaním highscore a zobrazením last score. Nastavil som rôzne parametre hry pre každý herný mód a doplnil reload time, t.j. nemožnosť okamžite opakovane vykonať zmiznutie dlaždice, proste kurzor zmenil farbu a až po prekreslení späť na bielu bolo možné znovu eliminovať nové dlaždice. To si samozrejme vyžadovalo ladiť parametre obtiažnosti a tesne pred polnocou som si doprial spánok.
Na ďalší deň som stále riešil obtiažnosť a jej navyšovanie s ubiehajúcim časom. Vyžadovalo si to celkom dosť hrania, ale bez toho to jednoducho nejde. Už deň predtým som si všimol posledný zásadný grafický glitch, ktorý vznikal pri game over animácii, keď sa dlaždica dotkla ľavej hrany hernej plochy. Prejavovalo sa to tak, že sa všetky dlaždice posunuli doľava o 1 celú dlaždicu. Podobný problém nastával aj pri štarte novej hry, kedy počas prvých pár posunov sa nejako kúzelne dlaždice o pár pixlov zrazu “vrátili” naspäť. Za všetko mohli nesprávne hodnoty HSCROL.. oba prípady bolo potrebné riešiť správnou inicializáciou a nakoniec som túto “dobrotu” spasil zo sveta tiež.
Na ďalší deň (to už bol 3. september) som ešte večer zase poladil obtiažnosti a doplnil do hry časomieru, pretože som bez nej tú obtiažnosť poriadne ani ladiť nevedel. o 22:40 som vybuildoval finálnu binárku Nemezyro a poslal do Abbuc-u.
Zase raz išlo o challenge, vždy prekvapí niečo nové, je to cesta tŕnistá, ale tak ma to baví…
Awesome game as usual from you 🙂
Thanks for sharing your story.
Quite confusing this shifting of the “dead” line. Sascha, what’s going on with you? 😉
A very vivid, enjoyable chronicle… and as a result of your effort, an even better game.
A nice read – glad to see someone else under that deadline pressure!