Bring back my bones 4k wydanaDrukuj stronę
2020-07-06
Około 8. czerwca tego roku, natknąłem się na informację o konkursie na grę do 4kb organizowaną przez magazyn Reset 64, 'Craptastic' 4k game compo. Konkurs ten ogłoszony został już na początku roku, jednak tę informację jakoś przegapiłem...
Format i pomysł na sam konkurs wzbudził we mnie wielką chęć do wzięcia w nim udziału! Gdy zorientowałem się, że mam niecałe 3 tygodnie do końca konkursu, postanowiłem bezzwłocznie przystąpić do prac, odkładając na bok pracę nad grą cRPG Meonlawel. Także, będąc wciąż ofiarą prokrastynacji, nie miałem wyboru podążając za sukcesem wydania w zeszłym roku gry RTS pod nazwą Swarm 16k, która zgłoszona została do konkursu RGCD 16k cartridge compo (wyników wciąż nie ogłoszono). Nie informowałem jeszcze o tym publicznie, lecz w tym roku, za cel przyjąłem sobie skończenie pierwszego dema Meonlawel. Postaram się poświęcić temu osobny wpis, teraz jednak chciałbym napisać o grze, wydanej zaledwie tydzień temu w ramach konkursu 'Craptastic': Bring back my bones 4k.
Jako, że do konkursu można było zgłosić projekt nie przekraczający 4 kilobajtów, pomyślałem o wskrzeszeniu jakiegoś projektu z przed lat, który używa standardowy zestaw znaków PETSCII, dostępny po włączeniu komputera Commodore 64. Tym sposobem, jak za dawnych lat, mógłbym budować grafikę z gotowego zestawu podstawowych znaków graficznych i alfanumerycznych, tym samym oszczędzając pamięci na definiowanie grafiki.
Pierwszym pomysłem, który przyszedł mi do głowy był niedokończony projekt, który napisałem w BASICu w roku 2002 (18 lat temu!). Była to gra pseudo 3D, gdzie Twoim celem było wydostanie się z miejsca będącego skrzyżowaniem średniowiecznych podziemi (pochodnie, używanie noża i topora) z kosmiczną bazą (odsuwane drzwi, karty dostępu). Miejsce to, opanowane zostało przez rasę pochodzącą prawdopodobnie z obcej planety, mutanty przypominające pijawki. Gra ta nazywała się Xertian Breed. Jako, że wtedy asemblera nie umiałem, gra napisana została jak już wspomniałem po prostu w BASICu przez co działała bardzo wolno. Zawierała jednak loader poziomów z dwoma gotowymi poziomami, bronie do wyboru i rysowaną na bieżąco mapę.
Teraz, po 18 latach, z kilkuletnim doświadczeniem w asemblerze, postanowiłem odkurzyć ten pomysł. W procesie powstawania, oryginalny pomysł aż prosił się jednak o szereg usprawnień. Głównym niedomaganiem oryginału było same poczucie trójwymiarowości. Reprezentacja otaczających ścian nie była zbyt jasna, czy w danym kierunku jest przejście czy nie. Na pierwszy rzut poszła więc próba z renderowaniem samych ścian. Po tygodniu eksperymentowania z różnymi wersjami projekcji, udało mi się w końcu uzyskać w miarę zadowalający efekt, który nadal mieścić się będzie w 4 kb pamięci. Tym sposobem dodałem boczne ściany, pomagające odnaleźć się w przestrzeni 3D.
Następnym krokiem było przeanalizowanie rozgrywki. I tak, koncept noża i topora z Xertian Breed, zastąpione zostały magicznymi pociskami, tak, by możliwa była także walka z dystansu. Także sami przeciwnicy przeszli całkowitą metamorfozę. Wywijające łapami pijawki zastąpione zostały diabłami, które narysowałem na dzień przed wysłaniem na konkurs ukończonej wersji gry. Początkowo chciałem, by ich rogi składały się ze znaku "@" (at), ale zastąpiłem je znakiem funta z jednego prostego względu - gdyż znak "@" zarezerwowałem w edytorze dla specjalnych funkcji takich jak transparencja czy "renderowanie cienia". No tak, nie wspomniałem o tym, że wszystkie obiekty rysowane były za pomocą edytora (nazwanego Breed-Edit) z opcją odczytu i zapisu, który sobie na szybko musiałem napisać, tym razem w BASICu. Z czystej nostalgii. I tak, znak funta reprezentujący rogi spodobał mi się nawet bardziej.
Idźmy dalej. Oryginalny pomysł z Xertian Breed, gdzie zbierało się po prostu apteczki przywracające porcję energii w niczym nie przypomina Bring back my bones, gdzie zbierasz kości porozrzucane po całej mapie i tylko poprzez wrzucenie ich do kotła, możesz przywrócić część energii. Początkowo miał to być eliksir życia, utrzymany poprzez wymieszanie ziół w kotle, jednak gra nie miała wyraźnego celu. Początkowo, celem jej przejścia miało być odnalezienie wyjścia, jednak pomysł ten nie miał punktu zaczepienia. Stąd też, zioła zastąpione zostały kośćmi - zebranie ich określiło główny motyw gry.
W bardzo krótkim czasie, objętość projektu doszła do górnej granicy, tj. 4 kilobajtów pojemności. Kilka rzeczy nie mogło więc pojawić się w wersji wysłanej na konkurs. Usunąć musiałem planszę tytułową, grafikę paneli, a nawet wersję ścian z większą ilością detali. Nie zmieścił się też player muzyczny. Dźwięków nie chciałem jednak się z tej wersji pozbywać, napisałem więc własny odtwarzacz efektów dźwiękowych. Niestety nie udało mi się też dodać więcej poziomów, nawet mimo próby dodania generatora poziomów, który po prostu się nie zmieścił. Dodatkowo, usunąłem pewne elementy kodu ignorujące renderowanie świata, gdy znajdujemy się na krawędzi mapy. Ta ostatnia zmiana niestety spowodowała wystąpienie błędu, którego nie zdążyłem wyłapać przed końcem konkursu. Powodował on, że gra stawała na jakiś czas a w pewnych okolicznościach, była w stanie się wtedy zawiesić. Ten błąd został naprawiony w obecnej wersji, wciąż w ramach 4kb.
Przez połowę czasu pisania tego projektu zastanawiałem się czy w ogóle uda się to wszystko zamknąć w 4 kilobajtach pamięci. W ostatnim dniu, okazało się, że na animację podłogi też nie miałem już w ogóle miejsca. Aby oddać lepsze wrażenie ruchu, zależało mi jednak na napisaniu takiej procedury do płynnego przesuwania się podłogi. Dysponując kilkoma bajtami, postanowiłem w ślepo dodać offset do tabeli, z której czytana była kolejna wartość tła. Wymieszałem ją następnie z wartością kierunku, w którym gracz jest zwrócony tak, by oddać też wrażenie obrotu. Postanowiłem zobaczyć co się stanie. Po uruchomieniu programu, statyczna a do tego nudna, fioletowo-niebieska podłoga, wzbogacona została o kolory, których nigdy bym nie wmieszał w paletę: przypominające piasek brązy i szarości. Co się okazało, offset wskazywał na kolejną tablicę w kodzie używaną do innych operacji, której wartości reprezentowały wspomniane brązy i szarości, kolory, o których zastosowaniu bym nawet nie pomyślał.
Co z procedurami? Nie wchodząc w szczegóły, pętle używające tzw. speed code musiałem zamienić na wolniejsze ale krótsze w rozmiarze - coś brzydkiego i kompletnie nieintuicyjnego w świecie asemblera gdzie każdy cykl jest cenny. Także inicjalne generowanie tablic ze wskaźnikami poskutkowało lepszym rezultatem. Projekt uratowało także użycie packera Pucrunch, który spisał się o wiele lepiej w porównaniu z testowanym Exomizerem w wersji 2 i 3. Gra, po rozpakowaniu zajmuje 6 117 bajtów.
Praca nad tym projektem sprawiła mi niesamowitą frajdę (poza tym, że spędzałem średnio 4-6h snu dziennie). To prawda, że dopuszczalna pojemność gry i dostępne znaki PETSCII były sporymi ograniczeniami. I oba te ograniczenia znacznie wpłynęły na efekt końcowy całego projektu. Jednak nie czułem tego ograniczenia bezpośrednio, a wręcz przeciwnie. Było to tylko motorem napędowym - wyzwaniem - by gra była przyjemna wizualnie jak i pod względem grywalności.
Mam nadzieję, że udało mi się osiągnąć ten efekt. Tworzenie całego świata ze znaków PETSCII jest procesem niezwykle twórczym, który gorąco każdemu polecam. Sam na pewno będę chciał do tego jeszcze powrócić. Może przy okazji pełnej wersji Bring back my bones?
Do konkursu 'Craptastic' zgłoszonych zostało w tym roku 38 gier! I muszę przyznać, że mam kilku mocnych faworytów, gdzie grywalność i pomysłowość przyciągnęła mnie do komputera na wiele godzin dobrej rozgrywki. Gorąco zachęcam Was do zagrania w te gry, znajdziecie je na tej stronie.
Z tego miejsca chciałbym też podziękować organizatorom konkursu za prosty, a jakże wspaniały pomysł! Jest to świetna okazja, by spróbować swych sił i... by dostarczyć wspaniałej rozgrywki dla komodorowców! W 2020 roku! Prawie 40 lat od premiery ukazania się pierwszego Commodore 64 na rynku!
Tutaj możesz zobaczyć gameplay poprzedniej wersji z bugami ze streamu hayesmaker64 na Twitch: https://www.twitch.tv/videos/721517829?t=01h26m13s. Dzięki dla hayesmaker64 za zagranie, gość świetnie podchodzi do recenzji gier i równie dobrze prowadzi ten stream!
Ciekaw jestem Waszej opinii na temat tej gry a w międzyczasie, pozwólcie, że rozprostuję swoje kości!