Blog (1)
Komentarze (819)
Recenzje (0)
@pionnerGra niemożliwa do przejścia — ja nie dam rady?

Gra niemożliwa do przejścia — ja nie dam rady?

13.05.2017 21:27

Na początku chcę uprzedzić, że jeśli bawiłeś się kiedyś hex edytorem, modyfikowałeś zapisy gier itp. to raczej nie dowiesz się tutaj niczego nowego. Ale i tak możesz przeczytać :) Mam nadzieję, ze mój pierwszy wpis przypadnie wam do gustu.

W podstawówce, czyli już parę ładnych lat temu, odkupiłem od znajomego mojego pierwszego handhelda. Był to śliczny, fioletowo-przezroczysty Game Boy Color. Wraz z nim dostałem dwie gry- “Nigel Mansell’s World Championship”, oraz bohatera dzisiejszego wpisu, grę “Tony Hawk’s Pro Skater 3”.

Bohater dzisiejszego opowiadania
Bohater dzisiejszego opowiadania

Zagrywałem się w nią godzinami, jednak nigdy nie udało mi się dojść dalej, niż do czwartego poziomu, przy czym pierwsze trzy były odblokowane od ręki.

Gra na GBC, tak samo jak jej “doroślejsze” odpowiedniczki z PS2, czy PC polegała na wykonywaniu określonych zadań na czas- dostajesz listę zadań do wykonania: zdobycie danej liczby punktów, wykonanie konkretnego triku, czy zebranie literek SKATE rozrzuconych po planszy. Za każde wykonane zadanie gracz był nagradzany punktem statystyk, a zebranie ich odpowiedniej ilości odblokowywało następną mapę. Ponadto, niektóre plansze były turniejami, na których jedynym celem było zebranie jak największej liczby punktów.

Lista zadań do wykonania na pierwszym poziomie
Lista zadań do wykonania na pierwszym poziomie

Ostatnio ponownie odkopałem grę i odpalając ją, miałem nadzieję, że tym razem mi lepiej pójdzie i chociaż obejrzę jak wyglądają dalsze poziomy. Niestety się zawiodłem, bo o ile z wersją na PC nigdy nie miałem większych problemów i potrafiłem ją dawniej przejść w jeden wieczór, to wydanie na GBC jest diabelnie trudne. Po zdobyciu 13 punktów na 16 wymaganych do odblokowania piątego poziomu (przy czym odblokowany czwarty poziom praktycznie nie pomaga) utknąłem na amen. Postanowiłem sobie jednak, że nie odpuszczę, dopóki nie obejrzę pozostałych poziomów (i nie znajdę taśmy VHS na 1 poziomie- coś czego te kilkanaście lat temu nigdy nie udało mi się zrobić).

Jako, że grę mam na gameboyowym kartridżu, z którym nic poza wsadzeniem w konsolę nie jestem w stanie zrobić, a już na pewno nie edytować zapisy, zacząłem więc od pozyskania ROMu gry w formacie .gbc, oraz instalacji emulatora.

Emulator przy pierwszym uruchomieniu gry tworzy plik .sav, w którym przechowywany jest postęp gracza i to nim będziemy się dzisiaj bawić. Do tego celu zainstalowałem GHex.

Zapis gry otwarty w edytorze heksadecymalnym
Zapis gry otwarty w edytorze heksadecymalnym

Jak widać na powyższym zrzucie, plik nie jest duży. Widoczne na dole wartości FF ciągną się przez jakiś czas i są przez grę ignorowane. Nie jestem pewien dlaczego tam są i dlaczego jest ich akurat tyle, ile jest, nie chcę teoretyzować.

Zaczynając jednak od początku, widzimy 54 48 33, które w ASCII tworzą TH3, następnie 20, czyli spacja i A018, które zapewne jest identyfikatorem gry. Dalszy ciąg jest dla nas (jeszcze) niezrozumiały, ale spostrzegawcza osoba może zobaczyć, że dane tworzą “schodki” pooddzielane zerami. Ponadto poniżej widać powtarzający się ciąg “TH3”.

Zaznaczyłem “schodki”
Zaznaczyłem “schodki”

Warto się zastanowić, co w ogóle gra może w tym pliku przechowywać. Na pewno będą to statystyki poszczególnych skejterów, zaliczone zadania oraz rekordy punktów. Patrząc na listę rekordów, chyba zaczynamy się domyślać, w której części zapisu gra je przechowuje :)

Rekordy
Rekordy

Ta część nas nie interesuje, ponieważ rekordy nam nic nie odblokowują. Szukamy dalej.

Przejdźmy sobie do podglądu statystyk skejterów. Pierwszym jest oczywiście Tony Hawk.

Statystyki Tonego
Statystyki Tonego

Czego możemy się tutaj dowiedzieć? Ano, Tony ma 6 statystyk, czyli dokładnie tyle, ile elementów ma nasz “schodek” w GHeksie. Wypiszmy sobie te statystyki po kolei: 4-3‑4-6-3-2. Nie wygląda znajomo? Oczywiście jest to nasz pierwszy (czerwony) schodek. Drugą przechowywaną daną mamy już z głowy, teraz pozostało tylko odnaleźć zaliczone zadania. Każdy skejter ma oddzielnie zliczane zadania, więc tutaj obstawiałbym pustą przestrzeń pomiędzy statystykami. Po policzeniu poziomów wychodzi 9, czyli tyle, ile jest bajtów pomiędzy poszczególnymi skejterami. Myślę, że trafiliśmy :)

Pozostało tylko potwierdzić naszą teorię zaliczając jakieś zadanie. Zacząłem od zebrania słowa SKATE, a oto i wynik:

Zdobyty punkt
Zdobyty punkt

Popróbowałem z kilkoma zadaniami na wszystkich trzech dostępnych planszach i uzyskałem całkiem ciekawe wyniki. Czego można się było domyślić, to format zapisywanych danych. Jako, że każda plansza dysponuje tylko jednym bajtem na zapisanie stanu 7 zadań, jest to robione przez sumowanie kolejnych potęg dwójki. Pierwsze zadanie ma wartość 1, drugie 2, trzecie 4 i tak dalej. Przykładowo przy zaliczeniu zadań 1, 2, 7, zostanie to zapisane w sposób 1+2+32=35 (23 w zapisie szesnastkowym).

Logika nakazywałaby, żeby numeracja szła od pierwszego zadania do ostatniego, jednak widać, ze jedno z zadań było doimplementowywane na szybko :)

Reprezentacja zadań w zapisie
Reprezentacja zadań w zapisie

Szybki rzut okiem na listę zadań i od razu widzimy, że zbieranie VHSek zostało napisane po całej reszcie i raczej nie było planowane od początku.

Mamy wszystko, czego potrzebowaliśmy, pora sprawdzić naszą wiedzę. Szybka edycja pliku, odpalenie emulatora i... Gra skasowała zapis.

Emulator informuje, że gra właśnie radośnie dokonała zapisu... Usuwając nasze zmiany
Emulator informuje, że gra właśnie radośnie dokonała zapisu... Usuwając nasze zmiany

Szybka weryfikacja, czy wszystko było zmienione jak należy, kolejna próba, efekt ten sam. Co mogło pójść źle? Ano zapewne mamy gdzieś jakąś sumę kontrolną, która nam wchodzi w paradę. Teraz pytanie jak ją znaleźć. Najłatwiej będzie wykonać kopię pustego zapisu, wykonać jedną misję i porównać pliki. Oczekujemy, że podniesie się jeden punkt statystyk i zmieniony zostanie bajt odpowiadający za przechowywanie zaliczonych misji. Wszelkie inne zmiany będą oznaczać naszą sumę kontrolną. Odpalam, przechodzę, porównuję i nasz winowajca aż się świeci na biało :)

Winowajca na tacy
Winowajca na tacy

Dla przypomnienia: podświetlone 05 to nasza szybkość (statystyka), 10 (w szesnastkowym), czyli 16 (w dziesiętnym) to zaliczenie zadanie (z tabelki i screena z listą zadań powinieneś sam móc odczytać, które zadanie wykonałem).

Teraz pozostaje jeszcze problem obliczenia prawidłowej sumy. Tutaj z pomocą przychodzi nam jednak Online Checksum Calculator, który pozwala na obliczenie sum mniej więcej siedmioma trylionami sposobów. Najpierw wrzucamy niezmodyfikowany zapis (wszystkie bajty do sumy kontrolnej, oczywiście bez niej samej).

http://www.scadacore.com/field-tools/programming-calculators/online-checksum-calculator/
http://www.scadacore.com/field-tools/programming-calculators/online-checksum-calculator/

No i od razu widzimy, że “CheckSum8 Modulo 256” pokrywa się z naszą sumą. Bingo!

Szybkie podkręcenie naszych wyników:

0E(16) = 14(10), czyli maksymalna ilość punktów w danej statystyce
0E(16) = 14(10), czyli maksymalna ilość punktów w danej statystyce

I mamy wynik:

Sam nabiłem, nie oszukiwałem!
Sam nabiłem, nie oszukiwałem!

Z 64 punktami dostęp do wszystkich map jest odblokowany, a z podniesionymi statystykami mogę w końcu wskoczyć na samą górę 1 planszy i się przekonać, czy kaseta tam faktycznie jest. Ehh... Oczywiście, że jej tam nie ma, bo w zapisie gry jest już oznaczona jako zebrana. No, ale jako że wiemy jak to poprawić, jedna szybka edycja i...

Czyli jednak tam była!
Czyli jednak tam była!
Wybrane dla Ciebie
Komentarze (8)