W poprzednich artykułach wyjaśniłem czym są i jak odczytać pliki ATTRIBUTEZ.TXT oraz CHEATZ.TXT. Są to zaszyfrowane pliki konfiguracyjne zawarte w archiwum GRUNTZ.REZ. Program Gruntz Decryptor umożliwia właśnie ich modyfikację. Dzięki niemu można taki plik odszyfrować, ręcznie zmienić parametry pliku konfiguracyjnego, a następnie z powrotem zaszyfrować, by gra Gruntz go poprawnie odczytała. Program umożliwia również automatyczne dekodowanie kodów do gry, dzięki czemu można je modyfikować, jak i dodawać nowe.
W związku z tym, że jedynie plik ATTRIBUTEZ.TXT jest faktycznie wykorzystywany przez grę, a plik CHEATZ.TXT jest jedynie pozostałością z czasów jej tworzenia, funkcja powrotnego szyfrowania pliku CHEATZ.TXT jest w zasadzie niczemu niepotrzebna; zostawiłem jednak taką możliwość dla kompletności programu.
Gruntz Decryptor 1.1.0.zip (1.23 MB)
Dekodowanie kodów do gry
Domyślnie kody do gry są zakodowane – każdy znak kodu jest modyfikowany poprzez dodanie do jego wartości ASCII liczby 61 (0x3D) (po szczegóły odsyłam do artykułu o pliku ATTRIBUTEZ.TXT). Program domyślnie automatycznie wyszukuje wszystkie kody do gry i je od razu dekoduje, przez co są w czytelnej i przystępnej postaci.
Żeby umożliwić automatyczne manipulowanie kodami do gry, napisałem prosty i w miarę kompletny parser LL pliku konfiguracyjnego. Jeżeli podczas parsowania zostanie napotkany jakiś błąd składni, parser odnotowuje błąd i próbuje wznowić swoje działanie od najbliższego możliwego miejsca, zawierającego kolejny kod do gry – w ten sposób w przypadku błędu zostanie utraconych jak najmniej informacji o kodach do gry. Tak stworzone drzewo AST jest następnie analizowane:
- Wyszukiwana jest sekcja “Cheatz”,
- Odczytywana jest z niej wartość parametru “NumCheatz”,
- Kodowane (lub dekodowane) są wszystkie kody do gry, znajdujące się w sekcjach “Cheat<N>”, gdzie “N” jest liczbą od 1 do wartości parametru “NumCheatz” włącznie.
Na końcu tego procesu są pokazywane wszystkie błędy składniowe i leksykalne, jakie parser wykrył w pliku konfiguracyjnym, wraz z numerem linii w jakiej błąd został znaleziony. Należy zwrócić uwagę na to, by podczas szyfrowania pliku konfiguracyjnego nie było żadnych błędów składniowych – każdy taki błąd to potencjalnie jeden kod do gry, który nie został poprawnie zakodowany, przez co gra Gruntz może nie odczytać ich poprawnie.
Parser wykorzystuje następującą uproszczoną gramatykę (pseudokod poniżej jest wzorowany na formacie gramatyki stosowanej przez narzędzie ANTLR, dlatego że format ten jest dla mnie czytelniejszy, estetyczniejszy i bardziej zwięzły niż klasyczna notacja BNF; narzędzie ANTLR nie jest jednak przeze mnie wykorzystywane, a sama gramatyka poniżej jest jedynie czysto poglądowa):
ini : section* EOF section : '[' ID ']' parameter* parameter : ID '=' (STRING | NUMBER) | ID '=' '(' ID ')' (STRING | NUMBER) STRING : '"' BYTE*? '"' NUMBER : '0'..'9'+ ID : ('a'..'z' | 'A'..'Z' | '_') ('a'..'z' | 'A'..'Z' | '_' | '0'..'9')*
Gramatyka ta nie jest idealnym odzwierciedleniem plików konfiguracyjnych INI, ale spokojnie zdaje egzamin w przypadku gry Gruntz.
Changelog:
Legend:
“+” = Addition
“*” = Bug Fix