Manapság a játékipar csúcsát az AAA-kategóriás alkotások jelentik. Bár sokan a hatalmas költségvetéssel azonosítják őket, a valódi jelentésük a kompromisszumok nélküli, minden részletre kiterjedő kidolgozottság. De vajon át lehet ültetni ezt a minőségi szemléletet egy 40 éves mikroszámítógép korlátai közé?
Peti visszaemlékezése:
Minden egy egyszerű gondolattal kezdődött, még tavaly ősszel, a Chernobyl játék fejlesztése közben. Már akkor felmerült bennem, hogy a játék alapján egy remek hajós játékot is lehetne készíteni, de az ötlet egy időre a fiók mélyére került.
A szikra idén májusban pattant ki újra, amikor az Érdi Gergő-féle Chip-80 projekten megláttam a régi ZX80/81-re írt Submarine játékot. Azonnal beugrott, hogy ezt a HL3 karakterkészletével sokkal szebben is meg lehetne valósítani, hiszen az eredetin még a tengerszint sem volt rendesen jelölve. Aztán bevillantak a gyerekkori emlékek a NES-es verzióról, amivel rengeteget játszottam. Eszembe jutott, hogy bár az is nagyszerű volt, mennyi minden hiányzott belőle: nem scrollozott a pálya, nem volt tengerfenék, de még a hajó fordulását sem animálták.
Ekkor, Laciak felvetettem az ötletet, aki erre csak annyit mondott:
„Jó, de akkor ezt csináljuk már meg rendesen! Legyen menüje, választható hajók, minden, ami kell…”
És innentől a projekt egy teljesen új dimenzióba lépett.
Laci visszaemlékezése:
Amikor Peti megemlítette a játék ötletét, hogy készítsünk egy szebb, igényesebben kidolgozott verziót a Submarine-ből HL3-ra, nekem azonnal egy nagyobb vízióm támadt. Mi lenne, ha – a hardveres lehetőségekhez mérten – megpróbálnánk egy olyan kategóriájú játékot alkotni, mint a mai modern AAA-s címek? Persze, mindezt monokróm karakteres grafikával, egy egyszerű csipogóval, esetleg PSG hanggal, de a szemlélet legyen modern.
A lista gyorsan bővült. Így jött az ötlet, hogy legyen a menü alatt zene, támogassa a játék a magyar és az angol nyelvet, legyenek benne küldetések, és persze kapjon egy mentési módot is, hogy egy hiba után ne kelljen mindent elölről kezdeni. Közben Peti felvetette, hogy ha már ennyi minden lesz benne, bővítsük ki egy kétjátékos, 1v1 móddal is. A célunk egyértelmű lett: maxoljuk ki a gépet, és hozzunk létre egy olyan élményt, ami méltó a modern kor elvárásaihoz, de a régi idők hardverén fut.
Végül, hogy a kihívást a maximumra tekerjük, kitűztünk egy nagy programozási célt is: az egésznek, minden funkciójával együtt, bele kell férnie 16 kB-ba.
A retro számítógépes szcéna reneszánszát éli. Commodore 64-re, ZX Spectrumra, TVC-re, Enterprise-ra és más 8 bites csodákra ma is aktívan fejlesztenek játékokat. A nagy kérdés azonban az, hogy egy ilyen, mai szemmel nézve végtelenül korlátozott platformra írt program hogyan léphet túl a "cuki, de egyszerű" nosztalgia faktorból, és hogyan válhat a maga kategóriájában egy AAA-szintű alkotássá?
A választ itt nem a fejlesztésbe beletolt dollár milliókban, nem is a bájtok számában, hanem a kreativitásban, a mesterségbeli tudásban és a kőkemény odafigyelésben rejlik.
Nézzük meg, mik azok az elemek, amelyek egy modern retro játékot kiemelnek a tömegből.
Egy modern AAA-játék legfontosabb ismérve a csiszolt, mély és magával ragadó játékmenet. Nincs ez másként a 8 bites világban sem.
Túl a klónokon: Az első lépés a "gagyi" elkerülésére, ha a játék nem egy agyonhasznált klasszikus (pl. Pac-Man, Space Invaders) ötlettelen másolata. Egy igazi "8-bites AAA" játék mer újítani. Lehet, hogy egy ismert műfaj (platformer, kalandjáték, shoot 'em up, bomber) keretein belül mozog, de valamilyen egyedi mechanikával, csavarral teszi azt frissé. Például egy platformer, amelyben nemcsak ugrani, hanem a környezet elemeit manipulálni is lehet, vagy egy kalandjáték, amely mély, nem lineáris történetet mesél el.
Feszes irányítás: Ez a legkritikusabb pont. Ha a karakter irányítása késik, pontatlan vagy "úszkál", a játék élvezhetetlen lesz. Egy csúcskategóriás retro játéknál az irányítás azonnali, pixelpontos és intuitív. A játékosnak éreznie kell, hogy teljes mértékben uralja a karakterét, és ha hibázik, az az ő hibája, nem a programé.
Tökéletesített nehézségi görbe: A régi játékok híresek voltak a kíméletlen nehézségükről. Egy modern retro remekmű azonban nem frusztráló, hanem kihívást jelentő. Fokozatosan vezeti be az új elemeket, tanítja a játékost a szabályokra anélkül, hogy kézen fogná, és a nehézséget úgy adagolja, hogy a sikerélmény folyamatosan fenntartsa az érdeklődést. Nincsenek igazságtalanul nehéz, "trial and error" részek.
A 8 bites korlátok nem béklyók, hanem egy kreatív keretrendszer. Az igazi mesterek csodákat művelnek ezeken a gépeken.
Művészeti irány, nem csak pixelek: Egy kiváló retro játék grafikája nem attól lesz jó, hogy hány színt használ, hanem attól, hogy van egy egységes, átgondolt művészeti stílusa. A karakterek jól megkülönböztethetők, az animációk folyamatosak (a hardver képességeihez mérten), a hátterek pedig hangulatot teremtenek. A C64 multicolor grafikai módjának vagy a Spectrum szín ütközésének (colour clash) ismerete és kijátszása, a Homelab-3 karakter-grafikájának kreatív használata a profizmus jele.
A zene, ami a füledbe mászik: A 8 bites gépek hangchipjei (mint a legendás SID a C64-ben, vagy az AY-3 a legtöbb mikrogépben) ikonikus hangzást produkálnak. Egy "gagyi" játékban a zene akár idegesítő is lehet. Egy AAA-szintű alkotásban a zene dinamikus, hangulatot fest, és olyan fülbemászó dallamokat tartalmaz, amelyeket a játékos napokig dúdolni fog. A zeneszerző a chip minden képességét kihasználja, hogy komplex, többszólamú mesterművet hozzon létre.
Technikai varázslat: Az igazi "wow-faktor" az, amikor a játék olyat tesz a képernyőre, amiről a játékosok 40 évvel ezelőtt azt hitték, lehetetlen. Lenyűgözően sima és gyors scrollozás, rengeteg mozgó objektum (sprite) egyszerre a képernyőn lassulás nélkül, parallaxis hatást keltő hátterek, vagy éppen a hardver korlátait meghazudtoló speciális effektek. Ezek a technikai bravúrok jelzik, hogy a fejlesztők nemcsak ismerik, hanem mesterei a cél hardvernek.
Ami egy jó játékot naggyá tesz, az a rengeteg apró, láthatatlan részletre való odafigyelés.
Történet és atmoszféra: Még egy egyszerű arcade játék is lehet hangulatos. Egy jól megírt bevezető, a pályák közötti rövid jelenetek, a világot és a karaktereket bemutató apró részletek mind hozzájárulnak ahhoz, hogy a játékos ne csak pixeleket lásson, hanem egy világba csöppenjen bele.
Tartalom és újrajátszhatóság: Egy AAA-játék nem ér véget 10 perc alatt. Elegendő tartalommal kell rendelkeznie, hogy lekösse a játékost. Ez lehet sok pálya, felfedezhető titkok, gyűjthető extrák vagy akár több végigjátszást ösztönző elemek. A cél, hogy a játékos úgy érezze, a pénzéért... izé… akarom mondani, a játékkal eltöltött idejéért egy teljes, gazdag élményt kapott.
Hibamentesség: Talán magától értetődőnek tűnik, de egy csúcskategóriás játék nem fagy le, nincsenek benne a játékmenetet tönkretevő hibák. A készítők rengeteg időt töltenek a teszteléssel és a finomhangolással, hogy a végeredmény egy stabil, megbízhatóan működő szoftver legyen.
Egy 40 éves mikroszámítógépre írt játék tehát nem a hardver korlátai miatt lesz "gagyi" vagy unalmas. Akkor válik azzá, ha a készítője nem fektet bele elég energiát, kreativitást és szakértelmet.
Az igazi "8-bites AAA" játék egyfajta művészeti alkotás: egy tisztelgés a múlt technológiája előtt, miközben a modern játékkészítési elveket alkalmazza. A játékmenet mély, az irányítás tökéletes, a megvalósítás pedig a hardver határait feszegeti. Ezek a játékok bizonyítják, hogy a nagyszerű élmény nem a processzor sebességétől vagy a memória méretétől, vagy a sok színtől függ, hanem az emberi találékonyságtól. Ez az, amiért 40 év után is relevánsak tudnak maradni.
Ezen ismerek után, most nézzük meg, hogy a fent említett szempontok alapján, hogyan sikerült a szűk korlátok között megvalósítani ezt a kihívást.
A projekt célja egy olyan játék megalkotása volt, amely a 8-bites korszak korlátai között is modern és gazdag játékélményt nyújt. Ennek érdekében a következő funkciók kerültek beépítésre:
Látványos grafika: A Homelab-3 karakter-grafikus képességének a kreatív kihasználása.
Dinamikus játéktér: Tengerfenék-scrollozás ad mélységet a játéktérnek.
Fejlett animáció: Az objektumok nem csak jobbra-balra mozognak, hanem animált fordulási fázisokkal is rendelkeznek.
Komplex kihívás: Egyszerre több, a számítógép által vezérelt ellenfél teszi próbára a játékost.
Választási lehetőségek: Többféle hajó közül lehet választani (játékmódtól függően). Többféle játékmód (kihívás) van, valamint a játék nyelve és nehézségi szintje is állítható (játékmódtól függően).
Látványos effektek: Egyedi robbanás-animációk teszik akciódússá az ütközeteket.
Felhasználóbarát funkciók: A játék bármikor szüneteltethető, "check point" rendszer, választható irányítási mód (billentyűzet vagy joystick).
A projekt alapvető koncepciója, hogy a modern, magasszintű programozási nyelvekre (mint pl. C, Python, Pascal) jellemző strukturált, objektumorientált logikát a lehető legalacsonyabb szinten, közvetlenül gépi kódban - assembly - valósítsa meg. Ez a szemlélet teszi lehetővé a hardver maximális kihasználását és a rendkívüli teljesítmény elérését.
A játék vizuális megjelenítéséért egy teljesen egyedi grafikus motor felel, amely több, célirányosan fejlesztett komponensből áll.
Parametrikus kirajzolás és animáció
Az objektumok – hajók, tengeralattjárók, robbanások, lövedékek – megjelenítéséért nem egy egyszerű sprite-kirajzoló rutin felel. Ehelyett egyedi, parametrikus algoritmusok lettek kifejlesztve, ahol változók határozzák meg az objektum típusát, tájolását és animációs fázisát. Ezekre épülnek az animációs algoritmusok, amelyek életre keltik a fizikai mozgást, és dinamikusan állítják be a kirajzoló rutinok számára szükséges paramétereket.
Képtömörítés és optimalizálás
A statikus grafikai elemek (menü, szövegdobozok, címkép) megjelenítéséhez egy ZX81 demóhoz fejlesztett MPEG animáció lejátszó kép-kitömörítő/kirajzoló rutinja lett alkalmazva. Ez a rutin - kifejezetten ehhez a játékhoz - optimalizálva lett:
Az eredeti 33 gépi kódú utasításból álló kódot 18 utasításra sikerült csökkenteni.
Az eredmény nem csak kétszer gyorsabb lett, de a funkcionalitása is bővült.
Bár a tömörített adat mérete némileg nőtt, de egy 20x16 karakteres infobox a 320 bájt helyett így is csupán 129 bájtot foglal.
A tömörítési eljárás hatékonyságát 3 speciális vezérlő karakter is segíti:
BR (Break): A kép végét jelzi, az utána következő adat nem kerül kirajzolásra.
CC (Compressed Control): A tömörítő belső használatú vezérlő karaktere.
TP (Transparent): Az ezzel jelölt karakterek átlátszóak, nem írják felül a képernyőn már meglévő tartalmat.
A hangok előállítása a game engine feladata, ami a kezdetleges "csipogó" (buzzer) hardver miatt komoly kihívást jelent. Minden egyes képkocka (frame) alatt csupán egy rövid idő áll rendelkezésre egy hang darabka előállítására.
Technika: Az effektek apró hangimpulzusok sorozatából állnak össze, ettől kapnak egyedi, "darabos", retro "Quartz game" hangulatot.
Változatosság: Minden darabka hangmagassága és hossza külön szabályozható, így jönnek létre a különböző hangeffektek (robbanás, lövés stb.).
Memória-hatékonyság: A menü alatt szóló zenei aláfestés adatai és a lejátszója rendkívül kis helyet foglal:
Zenei adatok (kotta): 174 byte
Lejátszó program (player): 290 byte
Frekvencia-tábla és ADSR adatok: 556 byte
Összesen: 1020 byte
A kód- és memória hatékonyság jegyében a mentési rendszer radikálisan újragondolva. A megszokott több mentési hely (slot) helyett egyetlen, (közismert) automatikus checkpoint rendszer került beépítésre.
Előnyök:
Memória-felszabadítás: A mentéshez szükséges adatterület mérete a töredékére csökkent, ezzel értékes memóriaterület szabadult fel.
Egyszerűbb kód: Nem kellett külön mentési és betöltési menüt, valamint slot kezelő rutinokat írni.
Ez a megoldás tökéletes példa arra, hogy egy funkció leegyszerűsítése hogyan vezethet jelentős erőforrás-megtakarításhoz, miközben a "checkpoint" funkció továbbra is újrakezdési lehetőséget kínál a játékosnak.
A game engine egy eseményvezérelt, többszálú (multithreaded) architektúrára épül, amely objektumorientált elveket alkalmaz assembly nyelven.
A Főprogram (Main Loop): Ciklikusan, minden VSYNC jelre meghívja az összes alprogram szálat, figyeli a beviteli eszközöket (billentyűzet, joystick) és kezeli a játék állapotát (menü, szintlépés, győzelem/vereség).
Önálló szálak: Minden játékbeli objektumhoz vagy eseményhez (pl. játékos hajója, ellenfél, bomba, torpedó, robbanás, háttér) egy-egy külön szál tartozik.
Minden szálnak saját, dedikált memóriaterülete van a regiszterei, számlálói és feltételei számára. Ez szükségtelenné teszi a lassú PUSH/POP verem használatot.
A szálak futása feltételekhez köthető (pl. időzítő, állapot regiszter).
Objektumok közötti kommunikáció: A szálak képesek egymás regisztereit és változóit írni/olvasni, ezzel aktiválva vagy deaktiválva egymást.
Példa a gyakorlatban (egy bomba útja):
A játékos bombát dob. Ez aktiválja a bomba animációs szálát.
A bomba animációs szála ütközést észlel.
Az ütközés hatására a bomba szál deaktiválja saját magát, és egyidejűleg aktiválja a robbanás animációs és a robbanás hangeffekt szálát.
Miután a robbanás animációja és a hangeffekt lefutott, ezek a szálak automatikusan deaktiválják magukat.
A rendszer törli az ütközésjelző regisztert, és a játékos újra dobhat bombát.
Ez a moduláris, eseményvezérelt felépítés teszi lehetővé, hogy a hajók, tengeralattjárók, torpedók és a tengerfenék animációja egymástól függetlenül, párhuzamosan fusson, komplex és életszerű játék világot teremtve.
Felmerülhet a kérdés: miért nem születtek ehhez hasonló, komplexebb játékok akkoriban? A válasz az akkori játékkészítés úttörő jellegében rejlik. A fejlesztők maguk fedezték fel, hogy mi fán terem egy falbontó vagy egy mászkálós kalandjáték, és mitől lesz egy irányítás igazán kézreálló. Nem léteztek még kiforrott receptek.
Egy ilyen projekt ma már több évtizedes, felhalmozott programozói tudás és rutin alapjain nyugszik. Szükség volt arra a tapasztalatra, ami segít átlátni egy játék belső szerkezetét, és arra a mélyreható rutinra, amivel az ember belelát a hardver működésének legapróbb részleteibe is.
Fontos látni, hogy egy program minősége sosem a fejlesztői környezeten múlik. A modern eszközök csupán megkönnyítik és felgyorsítják az alkotói folyamatot, de a lényeget – a tudást, a logikát és a kreativitást – nem pótolják.
A technika tehát fejlődött, de a legfontosabb, hogy mi magunk, alkotók is fejlődtünk vele. Ez a projekt éppen ennek a kettősségnek az eredménye: a 40 év alatt felhalmozott tudás és tapasztalat alkalmazása a korabeli technológián. Azért válhattak mára a programok ennyire kiforrottá – mert az alkotók egy egész iparág kollektív tudására és tapasztalatára támaszkodhatnak.
A jövőben sem adjuk alább. Elkötelezettek vagyunk amellett, hogy a jövőben minden alkotásunk ezt a kompromisszumok nélküli, AAA-szemléletű minőséget képviselje. Minden új játékunk egy ígéret lesz a játékosok felé: egy ígéret a maximális kidolgozottságra és a feledhetetlen élményre. Célunk, hogy a jövőben minden címünk bizonyítéka legyen annak, hogy az igényesség és a modern játéktervezés a klasszikus hardveren is megvalósítható.
Please support us so that we can reach as many of our goals as possible.
Kérjük, támogasson minket, hogy minél több célunkat elérhessük.