IK Plus
Ez az írás többek kérésére született, arra a kérdésre válaszolva, hogyan hoztuk létre az Interkarate+ játék
A teljesség igényére törekedve próbáljuk felidézni a program kezdeteitől a kiadásáig történt főbb eseményeket, hogy tanulságul szolgáljon nem csak másoknak, hanem magunknak is. Lássuk hát, hogyan jutottunk el a játék megalapozásától a
A TVC verzió címképe
Előzmények
IK+ TVC verzió, átirat ZX
Persze az ember mindig többet akar. Alig készült el az átirat, máris arról ábrándoztunk, mekkora dolog lenne a Commodore
2
A projekt
Az álmok viszont makacs dolgok. Valamelyest eltávolodnak ugyan tőlünk, de
A 2018 végén úgy döntöttem, szeretnék egy bizonyos játékot megírni
Tamás elkezdte írni a DevTool nevű
Míg készült Tool, közben (pihenésképpen) más platformokról hoztam át képeket
De az “áthozott” képek között volt egy, amit rajtam kívül még senki nem látott.
Az
Persze a színek és a felbontás miatt alaposan át kellett dolgoznom. Szétbontottam rétegekre és az eredetileg 160 pixel széles képet 128 pixelbe sűrítettem, úgy átrajzolva, hogy lehetőleg senkinek ne tűnjön fel, hogy a kép jóval keskenyebb, mint az eredeti.
Mindezek után áttoltam Tamásnak is a képet, hogy mit szól hozzá.
Nem volt nehéz kitalálni az eredményt: De jó lenne átírni ezt is! Innen még futottunk pár udvariassági kört, hogy
Az Interkarate Plus,
3
Kezdetek
Az alapállású karatékát már áthoztam
A
Tehát három sprite mozgott a képernyőn,
Ez a tesztelés több napon át tartott, a finomítások után javarészt gyorsabb és gyorsabb lett a rutin.
Őket mozgattuk a sebességtesztek alatt
4
Render (Tamás)
A játékban a megjelenítésért egy komplett programmodul a felelős, amit általában “rendernek” hívnak “tudományos körökben”. Ez a programrész felelős a háttér letörléséért, az új kép kiszerkesztéséért illetve a képernyőre rajzolásáért. (Tehát nem csak a sprite rajzolás a feladata.)
Nagyon fontos kritérium volt, hogy a nagy
Az nyilvánvaló volt, hogy a játéktér újrarajzolása nem fog beleférni két megszakítás közben eltelt időbe. A megoldás: előbb rajzoljuk ki a képet a legfelső memória lapon és amikor a teljes kép ki van szerkesztve, egyetlen szubrutinnal másoljuk a képernyőre. Viszont a karatékák (és később a
Ennél gyorsabb megoldásra van szükség.
Minden sprite kirakása után tegyük be egy memória tömbbe a sprite köré írható téglalapot. (bal felső X, bal felső Y, szélesség, magasság). Tegyük bele utána az előző kép köré írható téglalapokat, majd ciklusban vizsgáljuk le, hogy
Amikor az összevonás megtörtént, utána már nincs más dolgunk, mint végig menni az összevont téglalapokon és csak ezeket a téglalapokat alkotó memória területeket másoljuk a képre. Az előző fázis téglalapjait is bele kell vonni ebbe a folyamatba, hogy ha azokhoz képest az új képen elmozdulás történt, akkor íródjon felül az előző fázis területe is. Így elkerülhető, hogy a video
A sprite kirakás sebesség optimalizációja, illetve a képernyőre részlegesen kimásolt háttérbuffer tartalom jelentős sebesség növekedést eredményez, ami igencsak kihat a játékélményre.
A fenti folyamat algoritmusának lekódolása sok időt emésztett fel, többször is újra lettek írva részei, de az eredmény - úgy gondoljuk - magáért beszél.
5
Animációk
(Misi)
Miközben a render tesztelési folyamatot végeztük, folyamatosan emeltem ki a
Ez persze nem úgy ment ám, hogy rá lett eresztve valamilyen sprite kereső a C64 memóriájára, ami szépen kimentette nekünk a kockákat (de szép is lett volna), már csak azért sem, mert a fázisok a
Ilyen képekből lettek kivágva az animációs fázisok
Persze csak olyan képeket tudtunk használni, amiken a karakterek nem takarták egymást (el lehet képzelni hány mentett képből kellet ehhez válogatni miközben arra is kellett ügyelni, hogy meglévő fázisokat lehetőleg ne mentsünk ki még egyszer).
Ezekből a mentett képekből vágtam ki a mozgásfázisokat, amiket átszíneztem az alsó 8 színre, majd (hogy át lehessen látni a munkát),
6
Ezután következett a fázisok egyesével való kimentése, majd beemelésük a
Mindet, egyesével.
Nem csak lépés, támadás animációk vannak, hanem védekezések, sérülések, elesések is, így ezeket ki tudtuk bővíteni olyanokkal, amelyek az eredeti játékban nincsenek is. Például módunkban áll a hátraflikkelő ellenfeleket
Bal oldalon az animációk, jobb oldalon a kiválasztott animáció fázisai
Az editorban a mai napig minden animáció az alapállás fázissal kezdődik, de mivel ez nagy pazarlást jelentene a memóriát tekintve, a Z80 forrásba exportált adatokból ezek a fázisok ki lettek véve (természetesen utólag, kézzel).
Minden
7
Találat ellenőrzés
A találat ellenőrzést először táblázatból akartuk megoldani, de nem volt teljesen világos a módszer, ezért Tamás úgy gondolta, kicsit komolyabbra vesszük a figurát,
A vízszintesen a támadó technikák, a függőlegesen a támadott fázisok, a számok az eltolási értékek)
A támadó és sérülési pontok - szerencsére kivitelezni nem kellett :)
8
AI (mesterséges intelligencia)
(Tamás)
A játék alatt az az igazi, amikor két játékos egymás ellen küzd, de még ebben az esetben is ott a harmadik karatéka, akinek azért illik tevékenyen beszállni a küzdelembe (hacsak nem akar egy “come on” intést a Mestertől). Tehát minimum egy játékost a számítógépnek kell irányítani.
Mivel a program nem átirat, ezért az AI is teljesen saját elgondolás és ötletek alapján készült.
Amikor a számítógép egy karatékát mozgatni kezd, megvizsgálja, hogy a másik két karatéka
Először úgy volt megcsinálva a játékosok gépi mozgása, hogy a végrehajtandó karate technikában - mintegy előre gondolkodva - vegye számításba azt is, hogy amikor a technika “berobban” akkor az ellenfél melyik mozgás fázisban lesz.
Meglepetésünkre az intelligencia hatékonysága nem volt sokkal jobb, mint amikor csak az ellenfelek pillanatnyi helyzetét veszi figyelembe, ezért ezt az “előre gondolkodós” verziót elvetettük és csak a “pillanatnyi helyzetet figyelembe vevő” változatot hagytuk meg, ami harmad akkora kód méretet eredményezett.
Lehetett volna még
A végső döntés eredményeképp (egy véletlen faktor figyelembevételével) vagy a megtalált támadó technikát, vagy az odaillő védekezést választja a program.
Hátránya ennek a verziónak, hogy a véletlengenerátor olyan amilyen, illetve a találati táblázatban szekvenciálisan keres az algoritmus és ha talál szerinte optimális technikát, akkor nem keres tovább, hanem azt indítja el. Ennek okán történik az, hogy ha a játékos csak egy technikát használ, akkor az AI sok esetben nem tud optimálisan dönteni.
De hát melyik karatebajnok tökéletes?
9
Labdák
(Misi)
A projekt elején még nem volt biztos hogy bele
Az eredeti játékban két
Az egyik ilyen a labdák vágása volt (amihez Tamásnak módosítania kellett a sprite kirakót), jobbról és balról is tudni kellett vágni a képernyő szélén. A másik, hogy a lehető legfinomabb mozgást akartuk elérni, minél kevesebb, de persze minél gyorsabb kóddal. Pixelenként kellett tudni mozgatni a labdákat, de nem akartunk menet közben biteltolást használni (a sebesség miatt). Ezért minden labda fázis kétszer van meg a memóriában, egyszer a helyén, egyszer egy pixellel eltolva. Mozgás közben hol a páros, hol a páratlan pixelre eső fázist rakjuk ki.
A labdák, ahogy a memóriában vannak (az eltolt fázisokkal együtt)
A következő dolog a szinuszos, gravitációt és pattogást modellező mozgás volt. Ehhez egy negyed ciklusnyi táblázatot használtunk, amit Tamás
Az árnyékolt labda
A kódolás és tesztelés közben közben felmerült, hogy egyszerűsítünk
10
Természetesen nem maradhatott ki az árnyékuk a képernyő alján (amihez egy “vágással” is kellett kiegészíteni a sprite kirakó rutint), ami fontos látványelem, emellett a visszapattanás pontját is segíti megállapítani a játékosnak.
Mikor a hangok is elkészültek, rájöttünk, hogy még egy “apróság” hiányzik a labdázás teljességéhez (amit gyorsan meg is csináltunk és alig pár perc alatt be is lőttünk): a pajzs és a labdák pattogásának folyamatosan emelkedő hangja.
A kivédendő labdák darabszámát
Mikor mindezzel megvoltunk, találtunk egy furcsa hibát: elméletileg minden harmadik pályán kellett volna hogy labdázzunk, ami első körben stimmelt is. Két pálya, egy labdázás. De innentől már minden küzdelem után jött egy labdás rész és ez ismétlődött, egyesével váltogatva egymást.
Látszólag egyszerű hiba volt, mégis hosszú órákba telt, mire ki tudtuk javítani.
A labdák sebességét is jól be kellett állítani
11
Pontozás, övfokozatok színei
A memóriát teletöltő adatmennyiség és a gép sebessége miatt gyorsan eldőlt, hogy nem tesszük ki a technikákért kapott pontokat a játékosok fele fölé (ahogyan egyébként a többi gépen történik).
Ehelyett inkább megcsináltuk azt, hogy az övek színe a pontszámok függvényében változzon a karaktereken (tudomásunk szerint ilyen kizárólag Amigán van), ezért a ruhák egyik “színét” (amit a program a karatékák kirakása közben átszínez), az övre használtunk el.
A memóriában tárolt és a menet közben színezett karakter
Az övek színezésén túl, a jobb felső sarokban is mindig a legmagasabb övfokozat neve van, természetesen szintén az övnek megfelelő színnel kiírva.
Eredetileg volt még plusz két övfokozat (és szín), de végül maradtunk annyinál, amennyi a többi verzióban is van.
A pontozáson viszont már változtattunk, úgy, hogy kicsit magasabb ponthatárokat állítottunk be az övfokozatok eléréséhez. Az eredetiekhez képest talán egy kicsit arányosabban is osztottuk el őket.
12
Buborékok
A Mesterrel és a mondanivalóival pont annyit dolgoztunk (és szenvedtünk), amennyit előre is gondoltunk. Ehhez először is a Mestert a karatékáktól minél messzebbre kellett kitenni, emellett a feje fölött megjelenített buborék nem lóghatott ki a képernyőről (ami a
Tamás több algoritmust is írt, ami a mester pozícióját igyekezett kiszámítani. Ezek között volt egyszerűbb és bonyolultabb, végül a harmadik vagy negyedik vált be annyira, hogy száz mester megjelenésből kilencven biztosan helyesen van elrendezve. Ez egyébként olyan pontos, hogy néha egyetlen pixelnyi(!) különbség dönti el, hová kerül a Mester a képen.
A szövegek mondatai indexelt szavakból (félmondatokból) tevődnek össze, ezeket táblázatokban definiáltuk. Fontos volt, hogy a mondatokban bizonyos szavak lecserélhetőek legyenek (pl. red/white/blue wins/out), a cserék pedig természetesen eseményvezérelten történnek meg.
Nem csak a játék, hanem a demózás alatt is jelennek meg szövegek (többféle, mint a játék alatt), ezeket
A játékos észre sem veszi, de a buborékok mérete dinamikusan változik. Figyelembe véve a sorok hosszát, Tamás kóddal rajzolja ki őket a Mester feje fölé, kiegészítve a Mester felé mutató nyilacskával). Erre a méretre igazított buborékra jönnek a tényleges szövegek.
Demó alatti szövegbuborék
13
Ponttáblázat
(Tamás)
Mivel a játék kifejezetten pontra megy (az övfokozatokat is eszerint osztja a program), a ponttáblázatot mindenképp meg akartunk csinálni. Több verzió elvetése után a legegyszerűbb nyert (a “kevesebb: több” elve szerint) és úgy láttuk, hogy az eredeti harminc soros listához képest elég lesz nekünk a tízes is. Négy oszlop: helyezés, név, öv, pontszám. Egyszerű, mint a faék, nem igaz? Mi is azt hittük...
Először a lista megjelenítése készült el (majdnem), de már a legelső tesztnél valami egészen furcsa dolog történt: a “helyezés” oszlop
Kiderült, hogy a megszakítás a “bűnös”, ezért a táblázat kirakása elé betettünk egy “halt” utasítást, hogy megvárjuk a következő megszakítást. Az “összefirkálások” ugyan ritkultak, de nem szűntek meg. A
Szép lassan összeállt a kép: amikor a számokat megjelenítendő karakterekké alakítjuk, akkor egy 6
Csapatunk tagjai is szerepelnek
A név beírása már nem okozott problémát: a joy
Apropó, a demózás közbenlista előtt álló, táblát tartó karatékáról még lesz szó!
14
Átszínezés
(Misi)
Már a tervezés korai szakaszában (tehát több, mint harminc évvel ezelőtt) úgy akartuk elkészíteni a programot, hogy a játékosok tetszőlegesen állíthassák be a karaktereik színeit (persze egy adott szín csak egy karatékán lehet), így nem csak
Madarak
Tamás szívügye volt a madarak megléte és mozgása. Nem volt egyszerű összehozni, mert több dolognak is stimmelnie kellett. A magam részéről szerettem volna elkerülni a maszkolást (a kapu mögött takarni kell őket, ami gépidő), ezért olyan mozgáspályákat javasoltam, ami azt a helyet elkerüli. Aztán felmerült, hogy csak fekete madarak legyenek, így (mivel a kapu nagy része fekete) többfelé is tudnak mozogni anélkül, hogy maszkolni kelljen.
De aztán nem volt kerülőút: teljesen korrektre kell megírni, mert hol egy, hol két madárnak kell tudnia repülni, fehér és fekete színben is, lehetőleg random
Demo
Teljesen nyilvánvaló, hogy a demózást nem lehetett kihagyni, ami Tamás előrelátó kódolásának hála nem volt olyan bonyolult, mint amilyennek látszik. A kék karatéka egyébként is a gép által van irányítva, ami voltaképp
Fejlesztés közben felmerült, hogy esetleg mindhárom karatékát ember irányítsa, de az nagyon belekavart volna a szabályrendszerbe, így ejtettük a megvalósítását.
Szerencsére, mert utólag visszatekintve nem fértünk volna be a memóriába.
15
Pause
Ez is olyan pont volt, amiben nem voltunk biztosak, hogy lesz. A memória végén jártunk (nagyon), a legkisebb lépést is meg kellett gondolnunk. Az gyorsan kikristályosodott, hogy a képernyő mérete és a TVC sebessége miatt három karatéka lesz öt helyett. Amíg Tamás írta a pause kódját, addig a
Apró részlet, de a “paused” feliratot is meg kellett csinálni, majd visszacserélni a
Az eredmény olyannyira sikerült, hogy mikor az összehasonlító, promóciós videót készítettem, tökéletesen egymásra illeszkedett a mozgás (és a karakterek pozíciója) az eredeti,
Idő kijelző
Az memória végének pár
16
Kivételek
Bizonyos
A C64 és TVC verzió
Van egy karakter, aki a küzdelemben semmilyen módon nem vesz részt, csak.. áll. Őt egyszerűen csak Mumusnak hívtam, mert a háttérkép után a legtöbb helyet foglalja a memóriában (leírni is szörnyű: tömörítve 420 byte!). Ő az, aki a highscores top ten tábláját tartja...
Mumus
17
Optimalizálás
Ahhoz képest, hogy a legelején több háttérképet is terveztünk betenni a játékba, nagyon gyorsan a memória végére értünk. Kénytelenek voltunk elővenni az ecetes ollót és vágni ahol csak tudtunk, hogy beleférjünk a .cas formátum és a memória keretei közé.
Első körben elvetettünk bizonyos, még le sem kódolt részeket (az esetleg már bekerült grafikával együtt). Rögtön mellőztük például a “több háttér” ötletét, maradt az eredeti. Kivettük a nadrág lecsúszás
A kézfújás volt az első animáció, ahol elkezdtünk kivételeket tenni a sprite kirakásban. Sok memóriát pancsoltunk volna el, ha ezt az animot egész alakosan tároljuk le, ehelyett csak részleteiben írtuk felül a karaktert, kisebb méretű
Mindezek mellé társult a simább lejátszás előnye is, mert csak akkor fújja a kezét a karakter, ha mindkét ellenfél fekszik a földön és a processzornak nem kell foglalkoznia sem az
A kézfújás sprite
18
Háttér
Amire viszont nagyon ki kellett találni valamit, a háttérkép. Mivel ez foglalta a legnagyobb helyet a memóriában, kipróbáltunk valami merész, új dolgot: a színenkénti tömörítést. Az egész képet színeire bontottam és Tamás különálló képekként tömörítette le őket. Pár óra múlva beláttuk, hogy ennek hatékonysága elmaradt a byte tömörítéstől, körülbelül 300
Színre bontott rétegek (részlet)
19
A vége persze az lett, amit a legkevésbé akartam: alaposan átrajzolni a képet (hogy a byte tömörítésnek minél inkább tetsszen). Kezdtem a felhőkkel, “byte határ” felbontásra tettem át őket (ez játék alatt annyira nem zavaró, de tömörítve sokat számít), majd következett a fa lombjának teljes újrarajzolása, a part és hegyek vonalának finomítása, a kapu oszlopainak levágása. Ezeket Tamás inkább programból húzta meg.
A egész kép úgy lett összeállítva, hogy az ismétlődések kevésbé legyenek láthatók és minél jobban kihasználjuk a kompresszor lehetőségeit. Kibontva mindkét kép 6144 byte, de tömörítve sokat nyertünk a második verzión az elsőhöz képest: (4283 vs 3506 byte).
Az oszlop rajzoló kóddal és a hozzá szükséges táblázattal (ez együtt 129 byte) összesen a 648 byte volt a teljes nyereség a két tömörített verzió között!
Optimalizálatlan háttér (4283 byte)
Optimalizált háttér (3506 byte)
20
További csökkentést értünk el azzal, hogy bizonyos animációs fázisokat töröltünk és hasonlókkal helyettesítettük őket. Így a kétfelé rúgásból, ugró rúgásból, hasba rúgásból ki tudtunk venni
Legalábbis azt hittük.
Aztán egy napon… Kéne még
Ezért bizonyos animációs fázisokat elkezdtem a kompresszorhoz igazítani.
Hogy hogyan? Ahogy a háttérképet is: innen elvettem egy pixelt, amoda pedig betettem. A nadrág szárába plusz egy pixel, a karjából le egy pixel. Alig néhány
Számítva rá, hogy további
Nem kellett sokáig várni. Hamarosan ismét szükség volt “néhány
256/253 és 293/283 byte (a különbséget piros pixelek mutatják)
Mondanom sem kell, hogy minél több ilyen
21
Közjáték
Az utóbbi években többször is nyüstöltem Tamást, ássa elő a régi kazettáit, mentsük meg ami menthető és ki tudja, talán elfeledett kincsekre is lelhetünk közben… Aztán végre hozott nekem egy csomó anyagot (közben öcsém megajándékozott egy működőképes rádiómagnóval) és bedigitalizáltuk az összes megtalált kazettát. Többször is.
A kazettákon voltak HomeLab és TVC programok, és ezekhez mindenféle egyéb fájlok (például screen mentések, adatok, stb). Meglett többek között Tamásék egyik (még BASIC) játéka, a “Katakombák Mélyén”. Örömömben nekiálltam egy kicsit pimpelgetni (címképernyő, pályaszínesítések, HUD, stb), aztán Tamás is belenyúlt
Pihenésképpen ezt is kiadtuk (versenyen kívül)
22
Aranyhíd
A háttérkép aranyhídját nyilvánvalóan nem hagyhattuk ki (az egyik fő, állandóan szem előtt lévő látványelem). Tamás felvetette hogy egyben lévő animációként játsszuk le, de számomra egyértelmű volt, hogy ez teljesen esélytelen (annyi fázis kéne hozzá, hogy ha semmi más nem lenne a memóriában csak ez, akkor sem férne be).
Ehelyett egy algoritmust javasoltam, amit aztán gyorsan meg is írt (őszintén szólva majdnem gyorsabban, mint amennyi idő alatt el tudtam neki magyarázni, mit is akarok). Aztán persze kellett még finomhangolni, de az már apróság.
Az aranyíd alap mintája
Az algoritmus egyszerű, látványos eredményű és igen takarékos. A “híd” képe egyben van a memóriában, de hogy a háttér adott sorára a híd melyik sorát másoljuk be, azt már egy táblázatból vesszük ki.
Az aranyhíd vízen lévő helyének minden sorára meg volt adva, hogy a híd képének melyik sorától melyik soráig vegyen mintát (ciklusonként haladva a táblázaton). A kirajzolás eredménye azért tűnik random hullámzásnak, mert a híd képéből való, soronkénti mintavétel darabszámban eltérő (hol három, hol négy, hol öt) és a program ezeket
Emiatt alakul ki a rendezetlennek tűnő látvány (ami ennek ellenére mindig ugyanazt a lejátszási mintát követi).
Az algoritmussal kevert kép
Végül Tamás megfelezte az aranyhíd
23
Particle
Két hely is van a játékban, ahová particle készült: az egyik a víz felszíne, a másik az éppen megjelenő Mester körüli terület. Ráadásul minden particle
A Mester körüli csillogás három,
Mester és particle
A víz csillogása egy táblázatban meghatározott területen belül, random helyre kerül kirakásra, ugyanúgy, ahogy a Mester körül is.
A víz esetében először minden animáció azonos fázisban volt indítva, ami előre várható módon nem volt túl szép (akkor sem, ha az animációk különböztek egymástól), ezért indítási offset értéket is kellett, hogy tudjon a rutin.
A fázisok grafikailag maszkolatlanok (nem lyukasak) és az összes szín használható bennük. A csillogás grafikai tömbjében négy darab, nyolc fázisból álló animáció található, amelyek mindkét irányban lejátszhatók.
A csillogási fázisok négy elnyújtott pixelnyi szélesek.
24
Zene
Kezdettől fogva kérdéses volt,
Aztán ott volt a szükséges memória kérdése… ennyi grafika és kód mellé hová férhetne be a song data (nem beszélve magáról a lejátszóról)? Na és melyik zenét írjuk meg: az Amigás, a
Így mentünk bele a novemberbe. Hat hét volt a határidő végéig.
Ekkortájt kezdtünk kísérletezni egy egyszerű lejátszóval, ami (mivel még nem volt része a játéknak) nem megszakításból, hanem, saját főciklusban futott. Világos volt, hogy két (ál)csatornánál nem lehet több (basszus+szóló), így első körben a mixelést teszteltük. Milyen gyorsan váltogassuk a csatornák között? Milyen tempóban játsszuk le a zenét? Hogy fog az egész szólni? Lesz egyáltalán értelme az egésznek?
Megelőzendő a felesleges kódolást, elővettem a SID lejátszót és kiexportáltam az IK+ zenéjének csatornáit külön
Ezekből hallás útján beírtam (tesztnek) a finálé basszus+szólóját, úgy, hogy a patternek dupla sebességgel futottak, a leütések pedig felváltva szóltak a két csatornán (mintha már
A felváltva szóló
25
Már az elejétől nem hagyott nyugodni, hogy az emulátorban kiadott hang valamiért másképp szól mint a fent említett, generált négyszög jel, ezért emulátorból is mentettem ki
Nem éppen sima négyszög jel :)
A minél valósághűbb szimuláció kedvéért kiexportáltam
És hogy fog mindez beférni a gépbe? Kit érdekel? Megoldjuk és kész!
Zeneszerkesztő tekintetében (több évtizedes tapasztalatunk alapján - számunkra nyilvánvalóan) az Amigás és
További (nem éppen elhanyagolható) különbség, hogy a patternjeink hosszát tetszőlegesen lehetett beállítani, amivel a két sáv teljesen függetlenedni tudott egymástól, persze nagyon ügyelni kellett arra, hogy ne csússzon szét a szinkron közöttük sem zeneileg, sem technikailag.
De amíg Tamás írta a zeneszerkesztőt, nekem foglalkoznom kellett valami mással is.
Mégpedig azzal, hogy a Protrackerben kiadott hangmagasság függ a hangszer eredeti mintavételi frekvenciájától - tehát hiába írom én meg a zenét
26
A
Szóltam Tamásnak, hogy a fő leütések közül ki kellene szedni
Már az eredeti vason is hallható, hogy néha elcsúsznak a hangok időben egymáshoz képest (ez például a Sanxion boot zenéjében “kiválóan” hallatszik) ebből következően az exportált
Így megkaptuk a valós, nettó
Közben valamennyire elkészült a DevTool zeneszerkesztője is (persze nyilván fapados módra, házi használatra).
De még mielőtt elkezdődhetett volna a tényleges,
Talán túldolgozásnak tűnhet mindez, de itt nem lehetett viccelni, a csaknem nyolc perces zenének minden egyes hangját kézben kellett tartani.
27
Részlet a
Csak mindezek után következett a
A legfontosabb az volt, hogy a zene teljes hossza minél előbb legyen meg. Ezért készült egy 64 és egy 32 soros “üres” pattern is
A patternek egyébként szintén (mondhatni) “tömörítve” vannak, például a leütések közötti szünetek úgy vannak tárolva hogy “szünet, x darab”.
Minden
Nem tudom megmondani, hány százszor csináltam meg ezeket a lépéseket, csak azt, hogy a végére teljesen kikészültem a
Közben a lejátszó kapott egy új
28
Nosza, lehetett az összes
A kezdő taktusok
A következő nagy lépés az volt, mikor a lejátszó bekerült a játék alá és megszakításból kezdett működni. Kicsit tartottunk attól, mennyi időt fog megenni a processzortól, de nem tapasztaltunk érezhető sebesség csökkenést a játékmenetben. Így következhettek a...
Hangeffektek
Az effektek szintén patternek, csak rövidebbek. Olyan hangokat próbáltam csinálni, amelyek önmagukban is több csatornásnak hatnak, mély és magas hangok vegyesen, ütések, elesések, stb., a labdák például kifejezetten gumilabdás hangzást kaptak.
Az egész lejátszót úgy írta meg Tamás, hogy mikor egy effektet ki kell adni, a zene szóló sávján játssza le őket, majd folytatja a zenét tovább, mindemellett bármikor kikapcsolható akár a zene, akár az effektek (amely növeli a játék komfort érzetét).
Hang és zene ügyben az első kapavágást
29
Zene utántöltés
Tamásnak a következő tennivalója az volt, hogy a zenét és hangeffekeket kitegye egy külön
Legalábbis neki, floppy
A kazettás dolgokkal én foglalkoztam. A főprogramból és a
Egy darabig ment is, épp csak a zenetöltő nem működött.. De miért is? Mert a kazettáról töltéshez a
Mivel Tamásnak egyéb elfoglaltsága akadt, az (esélytelenek nyugalmával) magam kezdtem megkeresni a töltési hívást a másik
A két ROM cím közötti eltérés a betöltés meghívásához
30
Címképernyő
És most következhetett valami egészen más (egyik vesszőparipám): a title képernyős loader. Ilyen méretű és kaliberű játéknál semmiképp sem akartam hogy kimaradjon (az eredetileg Jon Egg által készített képet már hónapokkal előbb átalakítottam
Tamás összedobta a képkirakót a loaderrel és áttolta nekem, hogy szórakozzak vele én, ha már annyira akarom… Így komoly programozói teljesítményt nyújtva (beleírtam kettő sort az assembly forrásba, hihi) kiegészítettem azzal, hogy letiltottam minden BASIC visszajelzést (hogy ne legyenek töltési üzenetek és a teljes képernyőt ki tudjuk használni).
Remekül működött is minden. Lemezről...
Mert kazettán valami borzalmas pokoljárás kezdődött. A képet kirakta ugyan, épp csak semmiképp nem akarta betölteni a főprogramot. Súlyos, órákon át tartó
31
Lezárás
Tulajdonképpen végeztünk, már csak apróságok voltak hátra. Például beilleszteni a készítők
nevét is a játékba...
A
A szövegek bekerültek a forrásba, csak volt egy kis probléma. Csak egy egészen “apró”. A lefordított cas hossza 42.256 byte lett. Eggyel több, mint a memóriába tölthető adatok hossza… Ha írunk egy programot, ami hosszabb mint memória hossza, a program értéke egyenlő a nullával, hiszen ez bármilyen hibát okozhat.
Próbálkoztam mindenféle variációval, de a .cas makacsul tartotta ezt a hosszt (vagy épp egy
Észrevettem, hogy a szövegtáblánkban az 1 és a 2 stringek így vannak definiálva:”1 “, “2 “. Vagyis mindkettő után van
Ezzel lett a cas végleges hossza a maximális 42.255 byte. A program értéke
Legalábbis addig, amíg ki nem vettük a többek által (jogosan) kifogásolt stop gombot, így végre nem lehetett véletlenül rányomva kilépni a játékból (ezzel is nyertünk pár
.cas hossza 42.241 byte).
32
DevTool
(Tamás)
A fejlesztés kezdetén lepróbáltam a
Adta magát a lehetőség, hogy akkor ezt tegyük bele a
Ehhez tudnom kellett a struktúra minden változójának offset címét. Ezt eleinte “equ” val adtam meg, de kényelmetlen volt, ezért bevezettem az “enum” ill. a “struct” direktívát. Később ennek hatalmas előnyét láttuk.
Történt, hogy egyszer csak - ki tudja hanyadjára - elfogyott a memória. Mivel a legfelső (harmadik) lapot is
33
Promóció
(Misi)
A projekt vége felé elkezdtük a reklámozást, figyelemfelkeltést. Óvatos voltam, nem akartam, hogy túl hamar kiderüljön mit is csinálunk (bombaként akartuk robbantani), ezért formabontó módon tettem közzé részleteket. Például a címképből, a játék hátteréből csak néhány csíkot mutattam meg és olyan dolgokat, amiből nem derülhetett ki, miről van szó. Például a dokumentációból, szövegbuborékból, pontlistából is kerültek fel részletek.
Címképernyő részlet :)
Elsöprő sikerre persze nem számítottunk, de elértük hogy fejekben ott voltunk. Bár az igazsághoz az is hozzátartozik, hogy a számításunkba így is hiba csúszott: mikor a játék háttérképének egyetlen pixeloszlopát széthúztam teljes szélességűre, hát Buza Laci nem kitalálta? :)
Ki is feküdtem rögtön :)
34
Kiadás
A fentiek után a kiadást sem akartuk elaprózni. Sőt, ebből kifejezetten stratégiai előnyt akartunk kovácsolni. Ne feledjük el, hogy versenyeztünk (kőkeményen) és ez olyan pontja a játéknak, ahol szintén próbáltunk többet nyújtani a többieknél (akik talán nem is gondoltak erre a lehetőségre). Ezért olyan komplettre akartuk csinálni, amilyenre csak lehet, minél több “szolgáltatást” nyújtva a “vevőknek”. Amíg Tamás a kód egyéb részeivel foglalkozott, a “kiadást” magamra vállaltam.
A nyomtatható borító is tesztelve lett(!)
Ennek természetesen tartalmaznia kellett a .dsk és .wav fájlokat (utóbbi kazettára vehető (vagy magnó emulátorba, telefonra tölthető), ahonnan vasba betölthető). Emellé kapott egy .pdf fájlt, teljes, minden részletre kiterjedő “gyári” leírással. Készült hozzá színes, méretarányos
Nyomtatható 3d karakterek
Ahogy a gép memóriáját dugig töltöttük intelligens információval, ugyanezt műveltük
35
Első helyezés
A facebookos TVC csoportban történt szavazásban elsők lettünk. Kemény munka, sok lemondás, feszültség, stressz, bizakodás, öröm. Hogy mindez
A szavazás végeredménye
Olyan dolgot tettünk le az asztalra, ami világviszonylatban is komoly teljesítmény. A gépet a végletekig kihasználtuk, minden erőforrásával éltünk. Mi - a Doberdo Brothers - úgy véljük ilyen hozzáállással érdemes bármit csinálni, amit szeretünk.
36
Utóélet
Nagy örömünkre szolgált látni, hogy egy teljes egészében emulátoron fejlesztett játék igazi hardveren is tökéletesen fut. Köszönetünket fejezzük ki azon fejlesztőknek, akik ezeken dolgoztak (akár éveken át),
Az egyik legérdekesebb élményünk az volt, mikor egy görög srác gépén láttuk futni a játékunkat (amit természetesen görögül kommentált és ahogy kiejtette a nevünket, már önmagában
Videó, egy messzi, messzi gépről felvéve :)
Szerénytelenségnek tűnhet, de mikor 2019 novemben (Csoki klubnapon) arra a kérdésre, hogy mit csinálunk most, azt találtam mondani
37