VilQ – za kulisami

KaiN

„A może by tak zrobić nową grę?”

Rok 2016, jakoś przed wakacjami. Zaczyna mi się pojawiać koncepcja na grę, którą bym mógł napisać na RetroKomp GameDev Compo. W wakacje idę na praktyki do lokalnego oddziału pewnej korporacji, przez co plany schodzą na dalszy plan. Axi0maT chwali się planami napisania czegoś pokroju Alien Breeda na MegaDrive.

Koniec sierpnia. Praktyki mają się ku końcowi, więc programistycznie zaczynam odżywać. Deadline na wstępną wersję gry na RKGC jest jednak niemiłosiernie blisko, bo zaledwie w odległości dwóch tygodni. Pytam Axi jak mu idzie pisanie i czy nie potrzebuje jakiejś pomocy przy drobnych bugach. Ten odpowiada, że jednak pisze platformówkę i ma postać biegającą po ekranie. Od słowa do słowa stwierdzamy, że wspólnie napiszemy coś małego – coś, co będzie bardziej zapchajdziurą na compo niż pełnoprawną produkcją: grę na jeden przycisk, „endless runnera”.

Rygor pracy

Dzielimy się obowiązkami – Axi bierze na siebie rzeczy wymagające bezpośredniej rozmowy z konsolą, a zatem wyświetlanie sprite’ów i przewijanie tła. Do tego jeszcze dochodzi grafika, gdyż jest on w tej kwestii mniej nieuzdolniony niż ja. Ja biorę na siebie logikę gry, a ta składać się miała głównie z generatora losowych poziomów.

Przyzwyczajony do porannego wstawania przez niedawno skończone praktyki, pracę nad kodem zaczynałem codziennie o 6:00. Swoją działalność kończyłem zwykle wraz z obiadem w okolicach godziny 14:00 lub 15:00. Łączyło się to akurat z powrotem Axi0maTa z pracy, który zaraz brał się za swoją część kodu i siedział nad nią do późnego wieczora. Na styku naszych „zmian” ucinaliśmy sobie pogawędki na Skype, na których zdawaliśmy sobie raport z poczynionego postępu prac – co zostało zrobione, co jeszcze nie, co będzie skończone w następnej kolejności oraz jaka część kodu sprawia problemy. Nasz kod źródłowy synchronizowaliśmy z użyciem systemu Git.

Zanim jednak przyszedł Git, przez pierwsze dni wysyłaliśmy sobie kod mailowo. Po screenach z gry wydawało mi się, że w naszej produkcji główną rolę odgrywa postać wilka, więc roboczo nazwałem katalog z kodem „vilq”, choć później po nazwach plików zreflektowałem się, że faktycznie główną postacią jest niejaki Koyot. Axi0maTowi moja nazwa się spodobała i została w projekcie na stałe.

Generacja poziomów

Uwaga – może być czasem zbyt technicznie, choć postaram się pisać językiem prostym.

Jako, że plansza ma być potencjalnie nieskończonej długości, a pamięć konsoli jest jak najbardziej skończona, Axi0maT zadbał o to, by pole gry było nieznacznie szersze niż ekran oraz by jego koniec przechodził ponownie w początek. Na takiej bazie można budować nieskończone plansze dorysowując nowy teren na kawałku, który właśnie przestał być wyświetlany na ekranie.

Początkowo obszar niewidzialny na ekranie miał 256 pikseli szerokości. Pierwsze, co robił generator, to losowo zmieniał wysokość terenu. Jak łatwo się domyślić, skokowe zmiany szerokie na pół ekranu nie były zbyt atrakcyjne. Punktem zwrotnym w podejściu do generacji poziomów był filmik z gry Bit Trip Runner, który pokazał mi Axi. Zaczerpnąłem stamtąd pomysł na półki szerokie na dwa sprajty oraz półki i ściany z góry.

Ostatecznie funkcja generująca dalszy teren miała tworzyć kawałek szeroki na 32 piksele i dostawała współrzędne pola gry, na jakich kawałek ten ma zostać narysowany. Podczas swojego działania wyliczała wysokość następnego terenu, mając przy tym w pamięci wysokości poprzedniego i obecnego kawałka, po czym brała się za rysowanie obecnego segmentu. Takie podejście, z pozoru udziwnione, pozwalało na lepsze rozsiewanie bonusów i „przeszkadzajek” tak, by poziomy miały ręce i nogi.

Komplementarnie do funkcji generującej działała funkcja sterująca, która obserwując aktualną liczbę punktów gracza włączała lub wyłączała pewne elementy generatora. Przykładowo, dopóki score gracza jest mniejszy niż 5, na mapie pojawiają się tylko półki i „znajdźki”. Następnie do czasu uzyskania 10 punktów pojawiają się do tego tylko przepaście, zaś do liczby 30 punktów do mapy dochodzą żaby. Potem do liczby 50 punktów na planszy nie ma niczego innego prócz mięs, półek i pszczół, tak by gracz mógł się nauczyć ich omijać.

Samo generowanie odbywało się na zasadzie rzutu monetą lub kością. W pierwszej kolejności przypominało to decyzje w stylu: jeśli orzeł to zrób przepaść, w przeciwnym wypadku teren ciągnie się dalej, lecz wykonaj kolejny rzut na obecność półki. Jeśli powstaje nowa półka, to rzuć kostką na jej długość. Mając generator liczb losowych zwracający wartości od 0 do 65535, orłem było uzyskanie wartości parzystej a reszką – nieparzystej. W przypadku rzutów „wielościennych” otrzymaną losową liczbę skracałem poprzez bitową operację AND.

Później do warunków zależnych czysto od losowości doszły dodatkowe, które kontrolowały liczbę przeciwników umieszczanych na mapie pod rząd, długości przepaści, itd. Testowaliśmy każdą kombinację terenu i przeciwników wielokrotnie – w grze zostały tylko te, które chociaż raz udało nam się poprawnie ominąć.

Oprawa audiowizualna

Cała szata graficzna była opracowana samodzielnie już od samego początku. Klatki animacji Sonica posłużyły jako odniesienie przy tworzeniu klatek Vilqa – obie postacie biegną w ten sam sposób, cechując się tymi samymi pozami w kolejnych klatkach animacji.

Gdy stworzyliśmy już grywalną wersję, natychmiast podesłaliśmy ją AceManowi. Gra bardzo mu się spodobała i napisał do niej (podobnie jak w przypadku The Wizard) wpadającą w ucho muzykę.

Werdykt

Prezentacja odbyła się podczas imprezy RetroKomp 2016, gdzie na mojej Sedze można było do woli ograć Vilqa. Tym razem również kultywowaliśmy tradycję kończenia gry na party rozpoczętą przez Axi0maTa rok temu, usuwając ostatnie bugi i dodając drobnostki do kodu gry.

Osób chętnych do testów nie brakowało. Produkcja spodziewanie przyniosła graczom wiele frustracji, lecz bicie coraz większych rekordów wywoływało sporo emocji, zwłaszcza że publicznie zobowiązaliśmy się umieścić najlepsze wyniki zgromadzone na imprezie w ostatecznej wersji.

Na grę złożyło się 90 paczek zmian w kodzie stworzonych na przestrzeni miesiąca. Przyjeżdżając na imprezę liczyliśmy na jedno z ostatnich miejsc, a mimo to udało nam się wygrać GameDev Compo. Ośmieleni sukcesem zamierzamy wydać na cartridge’ach wersję Deluxe z dopracowaną grafiką, zmienną scenerią i bez bugów, zachowując przy tym niezmienną mechanikę rozgrywki.

Posłowie

Przy tworzeniu gry nie korzystałem z żadnej literatury dotyczącej losowej generacji. Za bardzo też jej nie szukałem – na potrzeby Vilqa wystarczyło po prostu odrobinę pokombinować.

Do napisania Vilqa wykorzystaliśmy bibliotekę C o nazwie SGDK. Jest to bardzo łatwa baza do pisania czegokolwiek na MegaDrive. Jeśli miałbym komuś rekomendować coś na start przygody z gamedevem na stare platformy, to poleciłbym najprawdopodobniej właśnie to rozwiązanie. Jest proste, intuicyjne i jest to dobry punkt startowy by zrozumieć prawa rządzące grafiką na starych sprzętach.

KaiN