Reverse Engineering gry - Nietypowa propozycja: Sonic Chronicles (1/3)

in #polska7 years ago (edited)

Ten tekst jest tłumaczeniem wpisu z bloga dla silnika Xoreos. Poprosiłem przyjaciela o przetłumaczenie, gdyż moim zdaniem tekst jest ciekawy. Xoreos to próba napisania silnika BioWare Aurora Engine na wolnej licencji - na silniku BioWare powstały gry takie jak Wiedźmin czy Neverwinter Nights.

Oryginalny wpis: The Odd One Out: Sonic Chronicles (1/3) (napisany przez DrMcCoy).

Opiszę na przykładzie kolejnej gry co mam na myśli. Wcześniej pisałem o moich postępach z Wiedźminem, Jade Empire i Neverwinter Nights 2. W przeciągu kolejnych dwóch miesięcy przyjrzałem się niecodziennej propozycji: Grze na platformę Nintendo DS "Sonic Chronicles: The Dark Brotherhood".

Tak, grze na Nintendo DS. Sam nie byłem i nadal nie jestem w 100% pewien co do tego czy jest to właściwy wybór do przekonwertowania na silnik xoreos. Wiem jednak że gra stosuje co najmniej kilka plików formatu BioWare a także formatu Nintendo DS. Widziałem też, że niektóre z tych formatów BioWare są wykorzystywane w Dragon Age: Początek, tak więc Sonic Chronicles faktycznie stanowi naturalny przystanek na mojej drodze.
Będę dzielić mój raport na trzy części. W tym poście, pójdę się nieco w szczegóły tych popularnych formatów plików BioWare. W następnym poście, opiszę grafikę (stosowaną w większości formatów Nintendo). I po trzecie, pokaże jak to wszystko jest ze sobą powiązane w xoreos.
Tak więc dalej, do formatów BioWare.

GFF4


GFF (Ogólny format pliku) jest używany jako podstawa do wielu rzeczy w grach BioWare. Zasadniczo, jest to porównywalne do XML [1]: Dane hierarchiczne, zorganizowane w sposób podobny do drzewa, zdolne opisać w zasadzie wszystko. Jako taki, jest używany do opisania obszarów, postaci, przedmiotów, dialogów itp. W przeciwieństwie do XML, GFF jest w formacie binarnym, a nie bezpośrednio do odczytania przez człowieka.
Z racji, że GFF jest tak ważnym formatem, xoreos ma zaimplementowany czytnik (dzięki wypuszczeniu przez BioWare specyfikacji zestawu narzędzi dla Neverwinter Nights). My oferujemy narzędzie do konwertowania ich do XML dla łatwiejszego odczytu. Było tak tylko do wersji 3.2 (używanej przez Neverwinter Nights, Neverwinter Nights 2, Knights of the Old Republic, Knights of The Old Republic 2 oraz Jade Empire) i 3.3 (wykorzystywanej przez Wiedźmina), ale dla Sonic Chronicles, Dragon Age: Początek i Dragon Age 2 potrzebny jest czytnik dla wersji 4.0 i 4.1 - tu nastąpiła zmiana formatu.
Po konwersji GFF3 do XML, całość jest naprawdę bardzo czytelna i zrozumiała. Każdy tag ma pełny ciąg jako nazwę, co sprawia że jego zastosowanie jest dla nas jasne. Ale z punktu widzenia gry, to ma ogromną wadę: jest powolne. Ciągi są nieporęczne, wolno odczytywane i porównywane, długość i zmienne elementy są przeszkodą, gdy chcemy szybko przejść do konkretnego pola. Aby ograniczyć to, GFF4 usuwa te uporczywe ciągi: Pola stosują 32-bitową liczbę całkowitą jako "nazwę" i całe dokonywanie porównań i obliczeń staje się banalnie łatwe.

xoreos01.png

GFF3 jako XML vs GFF4 jako XML

Na szczęście dla mnie, nowy format GFF4 jest już udokumentowany w Dragon Age Toolset Wiki. Ogromna ilość przykładowych plików oferowana przez dwie gry z serii Dragon Age oraz Sonic Chronicles dała mi wiele możliwości, aby przetestować też szczególne przypadki. Narzędzie gff2xml wspomniane powyżej obsługuje również GFF4.

[1] W rzeczywistości, BioWare tworzy swoje pliki GFF4 w oparciu o format XML, jak widać w Dragon Age: Początek Toolset Wiki.

TLK


Następnie widziałem nowy format: TLK używany w grze Sonic. TLK (talktable) jest listą ciągów zaindeksowanych przez numeryczne ID. Chodzi o to, że cały tekst używany w grze znajduje się w jednym miejscu, jest łatwy w użyciu i równie łatwy do przetłumaczenia. Już używany w Neverwinter Nights, dzięki czemu xoreos ma dla niego gotowy czytnik, jest stosunkowo prosty.
Jednak nowy format jest w zasadzie zupełnie inny. W rzeczywistości, to GFF4! Wspomniałem, że można po prostu zapisać wszystko w GFF, prawda? To właśnie zrobili dla Sonic Chronicles (i dwóch gier Dragon Age). Wraz z nowym czytnikiem GFF4 dodano wsparcie dla GFF4'd TLK.

GDA

Podobnie jak GFF4'd TLK, GDA jest dobrze znanym nam programem w przebraniu GFF4. Tym razem jest to 2DA: 2 wymiarowa tablica, lub prościej tabela. Jeśli nadal nie widzisz o co chodzi, wyobraź sobie arkusz kalkulacyjny Excel, proste gromadzenie danych zorganizowanych na siatce.
2DA są stosowane, na przykład, do określenia modeli różnych obiektów. Plik GIT od opisywania obiektów w obszarze powie: "Oto przedmiot, nazywamy go krzesło, ma wygląd nr 179". Gra sprawdza pole "wygląd" (appearances.2da, w wierszu 179) i kolumnie "MODELNAME", wybiera plik i załadowuje go jako model obiektu.

GDA jest, w zasadzie, takie samo jak GFF4. Lista kolumn podających nazwę i typ oraz lista wierszy z danymi dla każdej kolumny. Pomimo, że prawdziwe 2DA posiadają rzeczywistą nazwę kolumny ("MODELNAME", na przykład),przez co odgadnięcie znaczenia jest łatwe, GDA nie potrafi właściwie przechować nazw. Przechowuje za to hash nazwy (w szczególności, CRC32 kodowanego ciągu znaków UTF-16LE dla wszystkich małych liter), liczba nie mająca znaczenia sama w sobie.

Istnieje 845 unikalnych hash'y w plikach znajdujących się w Sonic GDA. Nie ma dobrego sposobu, aby włączyć je z powrotem do czytelnych ciągów, ale istnieje pewna sztuczka: "atak słownikowy". Zebrałem ogromną listę słów znalezionych w słowniku, zhashowałem, i zestawiłem. Potem wyekstraktowałem wszystkie ciągi jakie udało mi się znaleźć w grze (głównie GFF), i zrobiłem to samo. Potem połączyłem słowa tych list. Następnie połączyłem zgadzające się wyniki. Za każdym razem, ręcznie przeglądałem listy pozbywając się z wielu, wielu fałszywych tropów: ciągi zakodowane do dobrego numeru, ale nie mające sensu w kontekście gry ("necklessnoflyzone", "rareuniquemummifications", " properlyunsmoked ").
Uff, to było wiele żmudnej pracy. Mimo to, udało mi się znaleźć w ciągach źródłowych 534 z tych 845 hash'y, czyli 63%. Oczywiście, wciąż jeszcze 311 brakuje, ale to będzie musiało zaczekać na później.

Do zobaczenia w kolejnym wpisie! :)

Coin Marketplace

STEEM 0.29
TRX 0.11
JST 0.033
BTC 63901.15
ETH 3133.40
USDT 1.00
SBD 4.05