Pages

Friday, December 8, 2017

Gruntz - krótka historia modowania
Gruntz - the brief history of modding

(Sorry, it's a work in progress. The translation is NOT complete. To view the complete article, go and see its Polish version. Hopefully you'll get something out of it, perhaps with a little of Google Translate. Cheers)

Gruntz ... the game of my entire childhood (right after The Neverhood) and the game I have really fond memories of. And definitely I'm not the only one out there - since the game was produced in 1999, numerous Gruntz communities and fan pages have been created. Unfortunately the time spares no man and these activities were not an exception. Most of them have been forgotten or closed down due to lack of activitity. The one that did survive and is noteworthy is the GooRoo's Gruntz Forum. The forum has been already running for 14 years (and I've been its proud member for 10 years). Naturally it had its ups and downs but thanks to Ed Kivi - the founder of the forum - everything is running smoothly and the forum is prospering. The most of the forum's activity is based on the work of the Designers, who design custom levels for others to play. At the time of writing there are 619 custom levels and counting! 12 of which are made by yours truly ;) The most recent level was released less than month ago so the site is doing perfectly well.
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 ;)

I'd even say there's quite a fandom concentrated around the game. There are illustrated walkthroughs to guide the player through a level, be it standard or custom one (some of them in a video form), there are countless discussions on possible sequels of the game (some are even in the making), there was also a time when comic strips were put together. Oh, and there's an interesting habit of changing the spelling of words ending with an "s" where it's replaced with a "z" instead, so we can spot "Switchez", "Cheatz" and "Toolz" all over the place instead of regular "Switches", "Cheats" and "Tools". It's not only restricted to plurals - just take "Indiana Jonez" as an example (and bonus point to those who know where this phrase is used in the game!). This distinctive notation was introduced by the creators of the game themselves (the name of the game being a subtle hint - "Gruntz").
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").

Naturally many of the activites of the Gruntz community were related more closely to the game itself. And so all the collectibles and their statistics have been cataloged and indexed, as well as the enemy types (those not encountered during a standard play as well), the game mechanics ... it'd be a challenge to find something not yet documented by the community, really. There are new cheat codes being discovered every now and then (I'm planning to put an end to this endeavor soon, but shush ...), all the secret levels have been revealed (well, only one, but what a crafty beast she was!). So many new logics for objects have been dug up that have never been used by the original designers. Plenty of glitches and exploits have been found in the game (but that would require the basic knowledge of the game's mechanics - one exploit would allow the SpringzGrunt to jump over gaps two tiles wide for instance). I could talk about these for hours.
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.

There are however next degrees of initiation that some might not be aware of. That's because some members of the community are programmers and those fellas are known for their high success rate at breaking everything at will ;) And as you can easily tell - I'm one of them. So let's get to it!
Ale kolejne poziomy wtajemniczenia dopiero przed nami. Część użytkowników forum była bowiem programistami. A programiści jak to programiści - jak coś chcą zepsuć i rozłożyć na czynniki pierwsze, to nic nie stanie im na przeszkodzie ;) A jako, że jestem jednym z nich, to na tym się teraz właśnie skupię.



In the beginning the programmers had to decide what to work on first. And so they started with one of the most crucial files in the main directory of the game - GRUNTZ.REZ (and the GRUNTZ.VRZ as a natural consequence), which are archives containing the game files. The attempts at opening these archives are as old as the game itself. Back then there was a very popular application called WinRezLT which allowed for modifiation of REZ files. Unfortunately it was given quite a bad name after dozens of antiviruses started spotting malware in it. Many people didn't want to risk it and started searching for an alternative which as far as I know, did not prove successful. It was the perfect occasion for programmers to really shine as they could provide such tools. There was one problem though - the lack of REZ format specification. And without the knowledge on how to actually read REZ archives no tools could be devised. The situation didn't change until the discovery of the REZ specification on the Xentax wiki (the author of the specification being Watto himself, the author of the famous Game Extractor). Now let's take a closer look at the archives.
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.

Chronologically speaking, the next two formats that have been deciphered are: *.WWD (Wap World Document - files containing playlable levels) and *.PID (in-game sprites and images). If it wasn't for the user kijanek6, there might not be any documentation on these formats to this day. He's not a part of the Gruntz community however, but the member of the Claw Forum - the Polish forum about the game Claw (the game released two years before Gruntz, but based on the same game engine). I'm not really
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, który nazwał WapMap. 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.

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 :P 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

No comments:

Post a Comment