Roxblox – Pokec

Áno priatelia, je to tu zas. ABBUC vyhlásil nové kolo software contestu a samozrejme, že som neváhal a všetkými 11-timi som sa pustil do smaženia kódu novej gamesky.

No, nebolo to úplne takto ale nevadí.

Moja nová gamesa má super originálny názov Roxblox, ide o logiku, kde je potrebné posúvaním kociek v stĺpcoch a riadkoch získať rozloženie podľa predlohy. Znie to celkom easy ale je to fuška, hlavne keď to hráte poprvý krát. Hra je rozdelená na stages po 8 levelov a podľa toho ako dobre uhráte stage získate rank. Najepší rank je “A”, t.j. hviezda, keď ich získate v každom stage-i tak vyhráte hru ;).

Pravidlá sú popísané v texťáku, ktorý potom ako bude hra vydaná ABBUCom prihodím k jej blogpostu tutok u mňa na fancy atari blogu.

Teraz trošku k technickej stránke veci.
Ide o hru, ktorú som pôvodne plánoval naprogramovať za víkend, možno 2… avšak na moje nemilé prekvapenie sa to pretiahlo skoro na rok.

Nejde o žiadnu mega-pecku, aj keď som sa teda snažil zo seba vylúdiť nejakú okulahoiacu grafiku. Čo teda bolo dôvodom tak dlhého vývoja???

No, sčasti určite aj moja nie príliš veľká odhodlanosť tomuto projektu. Predsalen v práci čumím do kompu celý deň, mozog namáham, nedá sa to “len tak” praktizovať, sústredenie mi uchádza niekam inam. Ideálne sa potom vyventilujem pri Quake3 Arena online s expertmi tu z okolitých prilahlých krajín európy.
Tak či onak, ako sa blížil deadline ABBUC compa, nejako som sa dokázal namotivovať a hru dokončiť.

Táto hra je ale špecifiká tým, že je písaná v C a kompilovaná CC65-kou, úžasným Cčkovým kompilátorom, ktorý vás donúti si trhať vlasy, skákať po hlave a vydesene behať s krikom po miestnosti.

Úprimne, je to čisté peklo.

Táto hra mala byť proof, že sa dá CC65 reálne použiť na nakódenie jednoduchej gamesy. Problém mi ale nastal hneď po chvíli, keď som potreboval plynule hýbať kockami, vtedy bolo vykreslovanie tak pekelne pomalé, že som proste musel začať písať rutiny v ASM. Nehovorím ešte o tom, že niekedy sa skompilovaný kód správal takpovediac divotvorne, musel som predsa kombinovať Cčko a asmáč. Nakoniec, čo sa týka dĺžky kódu je to asi 1:1 ASM:C.

Najhoršie na tom celom je ladenie, keďže prakticky niet šance ladiť asmáč, ktorý vylezie z CC65, lebo takto píše kód iba diabol z vnútorných kruhov pekelných. Jedinou možnosťou bolo pokus/omyl a verte mi, počet tých pokusov sa limitne blíži k nekonečnu.

Suma sumárum: nikdy CC65 nepoužívať! Písať čisto v ASM je omnoho jedoduchšie a prehľadnejšie.

Týmto chcem vzdať hold autorovi hry His Dark Majesty, ktorá je fenomenálna a zároveň písaná v CC65: Človeče, fakt nechápem.

Ono keď už som sa tej CC65 venoval, chcel som v tom spraviť aj niečo viac ako nejaký trápny testík, no v niektorých fázach som mal chuť začať písať hru v ASM a ušetriť kopec problémov.

Posledné 2 dni som už v podstate iba doklepával nejaké detailíky, dopĺňal posledné levely a dnes som takmer prišiel o svoje mentálne zdravie.
Uspokojil som sa s tým, že hra mi veselo šlape na Atari800Win Plus a tak som sa rozhodol v rámci voľného času vytiahnuť pekelný stroj zo skrine a otestovať hru na reálnom Atari.

Dotiahol som do izby starú telku, pripojil komp, nainštaloval APE for windows (trial) a pripojil SIO2PC kábel. Na moje počudovanie mi trvalo asi 5 minúť a Atárko veselo bootilo z APE. Samozrejme som sa potešil, že aj po rokoch (asi 2 roky som to nevytiahol zo skrine) ešte viem ako to má fičať.

Hru kódim na svojom netbooku a velký komp (ktorý má RS232) používam ako Subversion (SVN) server, FTP server a teraz aj ako virtuálnu Atari disketovku.

Upol som teda na FTPko roxblox.xex a naloadoval do Atari. Loaduje mi to akosi dlho, ale tak za 10 sekúnd vidím na obrazovke moje ctené meno za búšenia bombastickej 4-kanálovej RMTčkovej muziky. Následne sa vyfejduje jednoduché logo a ja netrpezlovo s očami na stopkách čakám ako bude vyzerať herná obrazovka.

Prásk!

DLIčka sú pošahané. To snáď nie, veď v emulátore to bolo OK. Medzičasom som sa po pokeci s PG a MaPa-om (haha, neviem ako to mám skloňovať) rozhodol na otestovaní cez emulátor Altirra. Ináč títo dvaja chalani pripravili veľmi sľubný príspevok a dnes som si u nich viackrát ventiloval svoje emócie pri odlaďovaní na real HW.

Ok, takže späť k mojej hre. Štartol som ju v Altirre a vidím, že je tam podobný bug DLI niekde medzi ingame logom a herným poľom. Nuž je to zverina, lebo práve tam sa switchuje z normálneho hracieho poľa na wide, takže v rámci jedného scanline tam stihnem akurát tak prd. Ja som si veselo menil farbičky akoby sa nechumelilo, ale celé sa to nestíhalo vykonať a grafika sa tam lámala. Samozrejme, že všetko sa dá spraviť a postupne som to vyladil tak, že som si pripravil hodnoty do registra X a aj do akumulátora a v tom osudom poslednom scanline textového riadku som zavolal STA,STX a zrazu to sadlo.

Neuveriteľné, rýchlo uploadujem binár na FTP, reštartujem atari, bootujem, loadujem a drb! Furt je to blbé a pritom Altirra aj A800win nemali problém. Tak som teda ešte predpripravil hodnotu aj do Y registra a v tom scanline som zavolal len 3 zápisy STA,STX,STY. Emulátory sa zatvárili že pohoda, loadnem to do Atari a čuduj sa svete, fičí.

Zároveň som mal ešte chybu aj v dolnej časti obrazovky kde je stage selector, sa tam zase blblo DLIčko. Najprv som sa s tým hral, že som robil 1 zmenu po druhej, ale asi po poloďke som sa nasral a celé som to tam reorganizoval a porozdeľoval tak, aby som nemal viac ako 2 zmeny na scanline (2xLDA #$XX, 2xSTA $XXXX) a na prvý pokus to v emulátore frčalo. Ono je to vždy celkom lotéria, keď nejaký kód komplet poprehadzujem a reorganizujem, no tentokrát to vyzeralo akob bez zmeny. Upnem teda na FTP, reštartujem Atari, bootujem, loadujem, zobrazí sa herný screen, krása, bez chyby.

Srdce mi poskočilo od radosti, tak som do kódu vložil jeden JMP nech sa mi zobrazí congratulations screen. Na emulátoroch samozrejme všetko beží veselo plynule, no na real HW mi to crashuje.
Zdesenie, hrôza, beznádej.

Čo teraz?

Ako to mám debugnúť, keď to neviem ani v emulátore nasimulovať?

Skúšal som snáď všetko, vypnúť hudbu, zrušiť prerušenia, presúvať kód v pamäti. Stále to padalo. Potom som pristúpil k totálnemu brute-force riešeniu, že som vkladal do kódu JMP * a hľadal ten “pekelný” riadok kódu, ktorý spôsoboval pád systému. Urobil som asi 50 pokusov, 50 uploadov na FTP, 50 reštartov Atari a 50 nekonečne dlhých loadingov aby som znovu a znovu videl ako to celé crashuje.

Strašná zapeklitosť, ktorá vznikala niekde v rutine, ktorá má za úlohu generovať DL pre finálny picture. V kóde nič hrozné nebolo, nikde som nevedel nájsť nič, čo by mi mohlo beh ovplyvniť, či už nejaké prerušenie alebo čo… proste nič. Zdochýnalo mi to na makroinštrukcii INW $XX, ktorá mi mala zvýšiť pointer pre ukladanie cez nepriame indexované adresovanie. (snáď som to napísal dobre). Skúsil som to teda spraviť tak, že som nahradil túto maktoinštrukciou malým snippetom, ktorý adresu zvyšoval iným spôsobom a aj tak to stále padalo.

Nasral som sa a po asi 4 hodinách strávených nad touto chybou som vyNOPoval inštrukciu kde to padalo a hádajte čo sa stalo?
Padlo to aj na NOPe.

OMG! WTF?

Tak toto už je nejaká karma alebo čo… začal som premýšlať, či som nedávno nepustil nejakého dôchodcu v mestkej hormadnej doprave sadnúť a že teraz prežívam odplatu nejakej vyššej moci alebo čo.

Konec, som v koncoch, netuším, čo sa tam deje neviem ako na to prísť.

V agónii zúfalstva som spotil mail pre Fandal-a, ultimátneho kódera/crackera/hackera/[doplň čo ta napadne] s prosbou o pomoc pri riešení tohto mimoriadneho problému. Potom som ešte urobil zopár suchých pokusov a vzdal som to s tým, že hádam Fandal na to kukne jedným očkom a do pol minúty mi napíše riešenie (ako je to jeho zvykom, za čo mu naozaj ďakujem). Dal som si teda pauzu ale na hoďku, stále žiadna odpoveď, neva ešte to skúsim.

Odpálil som teda takmer celú hru a nechal už len ten DL generátor a stále som nevedel čo s tým sakra je. Potom som sa rozhodol, že ten DL vygenerujem úplne nazačiatku po naloadovaní všetkých častí hry dakam pod DOS, keďže ho už nebude treba. Spravil som to teda tak, že hneď po naloadovaní posledného dátového bloku sa mi naštartoval DL generátor a následne sa odštartovala hra.

Upol som to teda na FTPko, resetol Atari, bootol APE, loadol binárku a zrazu bác! Hrá hudba, vidím moju menovku, logo, herný screen. Super, takže DL je vygenerovaný a hra ide, teraz už len skúsiť to DL aj použiť. Naštartoval som teda zobrazenie congratulations obrazovky a ….

FIČÍÍÍÍ !!! 😀

Neni možné. Trochu som to teda ešte uhladil, opravil nejake drobné problémiky, čo sa vyskytli bokom a doplnil loading screen.

Hru som otestoval a vlastnoručne prešiel asi za 7 minút (nech nežerem, 10), každopádne, toľkokrát som to debugoval a hral, že už poznám všetky levely naspamäť a prechádzam ich bez toho aby som sa nad tým zamýšľal :).

Vedzte, že vôbec netuším, čo spôsobovalo tú pekelnú chybu generátora DL, no nejako sa mi to podarilo obísť a už je to minulosťou.

Hra je teda poslaná a som zvedavý ako dopadne na tohtoročnej súťaži ABBUC Software contest 2011.

Tu na AtariAge si môžete pozrieť video z hry, hral som to velmi zle, nebudem predsa ukazovať ako to prejsť ;).

Citoplazma

Citoplazma je najnovšie demo grupy Demodogs (alias Demopsi). Mojou úlohou na tejto produkcii bolo zmastiť kód, zrežírovať to nejako a […]

Roxblox

Taak, ďalší Abbuc software contest je za nami. Moja gameska Roxblox sa umiestnila na tretej priečke. Keďže sú už výsledky […]

12 thoughts on “Roxblox – Pokec

  1. Tak to byla dobra story, jsem rad, ze s happy endem 🙂 Hodne stesti v soutezi!

  2. hm, nic v zlom, ale atarista, ktory vytiahne atari raz za 2 roky nie je atarista.. a uz vobec nie, ked robi hru len kvoli nejakej sutazi..
    a ten anglicko slovensky text..:D ty si cisty IT-ckar.. cely zivot za pocitacom.. 😀

  3. viktor: místo abys ocenil, že pro tvůj milovaný systém ještě stále někdo něco píše (navíc tvůj krajan!), tak ho kritizuješ, že není atarista. Ani já atari nevytáhnu častěji než 2-3x ročně, ale tím, že se každoročně podílím na několika softwarových projektech, IMHO atari scéně prospívám víc, než kdybych na Atari denně pařil River Raid.

  4. hm, ataristi ostali len ty, fandal, pepax a dalsi z CZ, na ktorych si nespominam, poliaci, ataristi z UK, USA, atd.. hlavne v UK to teraz zije, desiatky HW/SW projektov rocne:) a zdarma.. a nie kvoli sutaziam 🙂 a uz vobec nie na 10 rocnom atari800win 😀

  5. PG: nechaj tak, nema to cenu.
    viktor: ano, uz konecne viem ze som nula a ty si najlepsi na svete, ospravedlnujem sa.

  6. hmm..trepes dve na tri. nie si nula a ja niesom najlepsi na svete.nepis to co som nenapisal..

  7. Vela potenacialnych problemov je popisanych v docs. Aky mal si konkretne problem s CC65? Pouzival som ho na rozne projekty a jediny problem sa objavil len v pripade, ked som zaplnil celu dostupnu pamat.
    Okrem toho pise sa v CC65 vyborne a time-critical code mozes napisat v asm 🙂

  8. Ilmenit: nie je možné debugovať kód a stávalo sa mi, že sa mi to správalo úplne divne. Je pravda, že nie som moc zvyknutý na klasické C-čko, ale dosť som sa pri niektorých crashoch vytrápil. Navyše kód je niekoľkokrát dlhší ako ten, ktorý by som napísal v ASM. Naozaj mi CC65 bola skôr na príťaž ako by mi mala pomôcť urýchliť vývoj.

  9. To Matosimi:

    – príma že si niečo urobil, je to chvályhodné
    – ja som nevydal o Atari nič vyše 17 rokov, boli aj iné starosti, ani teraz na programovanie nezostáva čas, zato sa po celý čas považujem za ataristu a len posledných 1 a 1/2 roka dávam trošku o sebe vedieť
    – držím palce pri ďalších veciach
    ________________________________________________________
    – Viktor, nemám pocit že by to bolo robené kvôli peniazom
    – tie súťaže sú práve preto aby sa nezaspalo, takže tá motivácia je práve o tom
    – to by znamenalo čo píšeš že všetci čo idú na súťaž tam idú len pre peniaze? hmmm …
    – nezaškodí byť trochu nad vecou a voliť miernejší slovník
    ________________________________________________________

    Pekný článok, ako sa postupne niečo postupne začne zašmodrchávať – nespisovný výraz, ale myslím že je popisný, až sa to napokon podarí dotiahnuť do konca, blahoželám.

Leave a Reply

Your email address will not be published. Required fields are marked *