Gruntz … praktycznie gra mojego dzieciństwa (ustępująca jedynie grze The Neverhood) i gra, którą darzę szczególną sympatią. Zresztą nie tylko ja – od samego początku, w momencie, kiedy gra wyszła w 1999, powstało co najmniej parę różnych Gruntzowych społeczności oraz fanpage’ów. Czas nie oszczędzał nikogo i wszystkie powoli się wykruszały aż zostało w gruncie rzeczy (pardon the pun 😉 ) jedynie forum GooRoo’s Gruntz. Forum funkcjonuje już od ponad 14 lat (sam jestem na niej zarejestrowany już od lat dziesięciu) i naturalnie miał okresy większej i mniejszej aktywności. Ale dzięki założycielowi forum – Ed’a Kivi – wszystko prężnie się rozwija. Większość aktywności forum opiera się w dużej mierze na grupie tzw. Designerów, którzy od czasu do czasu tworzą nowe poziomy, w które grają pozostali fani. W momencie pisania tego posta, poziomów jest już 619 i ta liczba ciągle się powiększa (12 z nich jest nawet mojego autorstwa), najnowszy poziom wyszedł nawet niespełna miesiąc temu. Więc samo forum ma się jeszcze dobrze 😉
Pokusiłbym się nawet o stwierdzenie, że gra Gruntz skupiła wokół siebie pewnego rodzaju fandom. Są tworzone ilustrowane opisy przejścia (tzw. walkthroughs) standardowych poziomów i tych niestandardowych (również w formie filmów video), są toczone niezliczone dyskusje odnośnie ewentualnych sequelów gry (są nawet próby stworzenia takowego), nawet był okres czasu, kiedy tworzone były krótkie komiksy o tematyce Gruntzów. Czego to ludzie nie wymyślali. Oprócz tego na forum panuje maniera specyficznego zapisywania końcówek angielskich wyrazów, które kończą się na literę “s”. Zamiast niej mianowicie piszę się literę … “z”. Tak więc przeglądając forum bardzo często spotka się takie słowa, jak “Switchez”, “Cheatz”, czy “Toolz” zamiast zwykłych “Switches”, “Cheats” i “Tools”. Taki zapis nie ogranicza się jedynie do rzeczowników liczby mnogiej – dajmy chociażby wyrażenie “Indiana Jonez” jako przykład (a sto punktów dla tych, którzy wiedzą, gdzie to wyrażenie jest wykorzystywane w grze!). Ta specyficzna maniera zapoczątkowana została przez samych twórców gry (wystarczy spojrzeć chociażby na nazwę gry – “Gruntz”).
Społeczność jednak nie ograniczyła się jedynie to tych aktywności i zaczęła również gmerać przy samej grze. I tak zostały skatalogowane wszystkie przedmioty, które można zdobyć w grze i ich statystyki, wszystkie rodzaje wrogów (również te niespotykane w standardowej grze), główne elementy gry … tak naprawdę, trudno by znaleźć coś, co nie zostało już wcześniej na forum opisane. Odkrywane są coraz to nowe kody do gry (wkrótce ukrócę ten proceder, ale o tym cicho sza), odkryto wszystkie sekretne poziomy (a dokładnie … jeden, ale ludzie nieźle się napracowali, żeby go odnaleźć!). Odkryto mnóstwo nowych obiektów, jakie można dodać do poziomów, a które nawet przez twórców nie były wykorzystywane. Znaleziono sposoby na niewłaściwe wykorzystywanie przedmiotów w grze (ale to trzeba by już znać samą grę – na przykład sprężyna przeskakująca o jedno pole więcej niż powinna itp.). O tego typu dokonaniach można by się rozpisywać przez długi czas.
Na samym początku programiści musieli zdecydować się na to, czym powinni się zająć w pierwszej kolejności. Wybór był dosyć oczywisty i swoją uwagę skupili na najważniejszym pliku w katalogu z grą – GRUNTZ.REZ (oraz w konsekwencji również GRUNTZ.VRZ), czyli archiwa z właściwymi plikami gry. Próby ich otwierania są równie stare, jak sama gra. Kiedyś, dawno, dawno temu był program WinRezLT, który służył właśnie do przeglądania i modyfikacji archiwów w formacie REZ, ale zyskał złą sławę po tym, jak tuziny programów antywirusowych zaczęło wykrywać w nim wirusy. Były potem poszukiwania nowych narzędzi, ale raczej ciężko było cokolwiek znaleźć. Napisanie własnego narzędzia do odczytywania archiwum REZ i jego modyfikacji było bardzo kuszące, ale brakowało informacji odnośnie specyfikacji formatu. Aż pewnego pięknego poranka dowiaduję się, że taka specyfikacja została odnaleziona na stronie Xentax (jej autorem jest sam Watto, twórca sławnego Game Extractor). A ze specyfikacją temat można było już pociągnąć dalej.
Chronologicznie następne rozczytane przez programistów formaty plików to *.WWD (czyli pliki z poziomami do gry – Wap World Document) oraz *.PID (czyli pliki graficzne). W przypadku tych dwóch formatów użytkownik o nicku kijanek6 odwalił kawał dobrej roboty. Nie był on jednak częścią społeczności Gruntzów, ale członkiem Claw Forum – polskiego forum poświęconego grze starszej od Gruntzów o dwa lata, ale korzystającej z praktycznie tego samego silnika gry. Była to naturalnie gra Claw (lub w polskiej wersji językowej – Kapitan Pazur), która skupiła swoją własną społeczność, o której również można by napisać osobny artykuł o sporych rozmiarach 🙂 kijanek6 uważał (zresztą zgodnie z prawdą), że aktualny edytor do poziomów był raczej toporny i mało przyjazny użytkownikowi. Dlatego postanowił stworzyć własny edytor poziomów do gry Claw, który nazwał WapMap (dostępny do ściągnięcia z serwisu The Claw Recluse). Przyszły edytor musiałby jednak korzystać z wielu plików różnych formatów, a przede wszystkim plików REZ, WWD oraz PID – trzeba było więc znać ich specyfikacje. O ile struktura plików REZ była już raczej znana, o tyle pliki WWD i PID trzeba było niestety własnoręcznie rozczytać. Reszta formatów (jak same palety, czy animacje – czyli pliki *.PAL oraz *.ANI) były już o wiele mniej kłopotliwe do rozczytania.
Jeżeli chodzi o pliki *.PID, to społeczność Claw miała dużo szczęścia – okazało się mianowicie, że w archiwum CLAW.REZ znajdował się program PCX2PID, który umożliwiał konwersję plików graficznych w formacie PCX właśnie do formatu używanego przez grę. Najwidoczniej deweloperzy spakowali go przez przypadek, albo zapomnieli wykasować. W każdym razie dzięki programowi kijanek6 mógł naocznie przekonać się, jak były generowane pliki PID, co znacznie ułatwiło spisanie dokumentacji formatu. Najtrudniej mogło być z określeniem algorytmów kompresji, jakie były tam wykorzystywane (program pozwalał na użycie jednego z dwóch sposobów kompresji obrazu).
Drugie w kolejce były pliki *.WWD. Tutaj jest podobna sytuacja – mając do dyspozycji edytor poziomów również mogło się tworzyć własne poziomy i patrzeć jak są zapisywane. Zmieniało się jeden parametr w edytorze, zapisywało się poziom i patrzyło się, który bajt w pliku się zmieniał. I tak do skutku, aż nie wyklaruje się struktura całego dokumentu. Były przy tym dwa problemy: po pierwsze, plik WWD mógł zostać skompresowany, trzeba było więc dojść do tego, jaki algorytm kompresji był użyty. Okazało się, że był to algorytm deflate; pomogło przeglądanie pliku wykonywalnego samego edytora do poziomów np. w HEX edytorze (można w nim znaleźć między innymi notkę o prawach autorskich, gdzie jest nazwa algorytmu). Drugi problem był o wiele cięższy – zostały mianowicie do rozczytania cztery bajty, które zmieniały się po każdej zmianie jakiegokolwiek parametru w edytorze. Jeżeli pole to było wyliczone niepoprawnie, zarówno edytor, jak i gra, odrzucały poziom i nie chciały go ładować. Ewidentnie była to jakaś suma kontrolna, której poprawne wyliczenie było kluczem do zrealizowania całego projektu. I o ile autorem całej dotychczasowej pracy był kijanek6, to rozczytaniem sumy kontrolnej zająłem się ja. Po dłuższym czasie wlepiania się w bajty w HEX edytorze i robieniu notatek na kolanie, odgadłem algorytm generowania sumy kontrolnej i można było wydać pierwszą wersję edytora.
Sam edytor był jednak od samego początku nastawiony na tworzenie poziomów do gry Claw. Poziomy z innych gier niby da się w nim otworzyć, ale często edytor sobie z nimi po prostu nie radzi. Społeczność Gruntz została więc przy starym edytorze i raczej tak już pozostanie. Sam projekt WapMap zaowocował jednak również i innymi narzędziami. Po rozczytaniu formatu PID kijanek6 stworzył programy automatyzujące eksport i import plików PID (nazywają się bodajże PID Converter oraz GIF2PID, ale nie wykluczone, że są jeszcze jakieś o których zapomniałem). Natomiast z pojawienia się specyfikacji WWD skorzystał inny użytkownik Claw Forum – Kubus_PL. Postanowił napisać bibliotekę, która pozwalałaby na obsługę wszystkich formatów plików obsługiwanych przez silnik WAP32. Projekt nazwał libwap32, a kod źródłowy biblioteki udostępnił na githubie. Póki co zawiera ona jedynie obsługę plików WWD. Jest to oczywiście gratka jedynie dla programistów, którzy pisaliby ewentualne aplikacje z niej korzystające. Ja już z niej korzystałem. A ty? 🙂
Jestem przekonany, że te wszystkie spektakularne osiągnięcia, które przed chwilą opisałem, to kamienie milowe w modowaniu nie tylko Gruntzów, ale i wszystkich gier opartych na silniku WAP32 (czyli również Claw oraz Get Medieval). Od tego właściwie wszystko się zaczęło. Powstało przy tej okazji jeszcze mnóstwo innych narzędzi i mnóstwo innych osób maczało jeszcze w tym wszystkim palce. Ale gdyby chcieć o wszystkim napisać, to post wydłużył by się trzykrotnie. Na pewno jednak do większości z nich nawiążę jeszcze w przyszłych postach. Ale najważniejsze jest to, że historia modowania WAP32 oraz Gruntzów dzieje się na naszych oczach i cały czas jest coś robione w tej kwestii. I nawet ty możesz być jeszcze jej częścią!
Ten post będzie służył jako mały wstęp do moich kolejnych artykułów o Gruntzach i silniku WAP32. Poza tym fajnie by było trzymać wszystkie rewelacje w jednym miejscu. Może powstanie z tego jakaś wybitna kronika, która będzie wspominana z rozrzewnieniem za kilkadziesiąt lat, kto wie 😛 Być może wrzucę tutaj również specyfikacje wszystkich poznanych formatów plików wykorzystywanych przez grę, żeby nie musieć używać Google do znalezienia wszystkiego. Generalnie plany są ambitne, ciekawe czy wytrwam.
PS. Jeżeli któryś z faktów przekręciłem lub jeżeli są jakiekolwiek inne zastrzeżenia – pisać!
Pozdrawiam,
Tomalla