[PORADNIK] Pointery w grach na SNES-a - Rusty Can

Awatar użytkownika
ikskoks
Nadzieja polskiego romhackingu
Posty: 797
Rejestracja: 19 wrz 2011, o 11:10
Grupa: LocMakers
Kontakt:

[PORADNIK] Pointery w grach na SNES-a - Rusty Can

Postautor: ikskoks » 11 sty 2013, o 23:57

Artykuł: Pointery w grach na SNES'a (by Rusty Can)
Autor: Rusty Can
Korekta: bemberg

Nagłówek dla ROM'ów SNES'a ma długość 200 hex bajtów.
Załóżmy, że szukamy wskaźnika do słowa znajdującego się pod adresem 02A840:

Obliczanie:
- odejmujemy wielkość nagłówka. Heksalnie będzie to 02A840 - 200 = 02A640. Łatwizna - zmienia się tylko trzecia cyfra od końca.
- bierzemy tylko ostatnie 4 bajty, co daje A640.
- (patrz UWAGA!)
- dzielimy to na połowę i zamieniamy stronami 40A6
- 40A6 to właśnie szukany wskaźnik.


UWAGA!
Jeśli ROM jest Lo, (sprawdzić to można w emulatorze), to wszystkie wskaźniki przed zamianą powinny mieć wartości od 8000 do FFFF. Jeśli wskaźnik jest mniejszy, to należy dodać 8000. przykładowo:
- 016438 - 2000 = 016238, co daje:
- 6238. Jest mniejszy niż 8000.
- 6238 + 8000 = E238
- dalej standardowo, zamiana kolejności połówek:
- ostatecznie wynik to 38E2


Szukanie:
Przyjmijmy, że zmieniamy nie tylko jeden wskaźnik, ale kilka kolejnych. Czyli obliczmy wskaźniki dla znalezionych tekstów, np. dla kolejnych pozycji w menu. Załóżmy, że w jakiejś grze mamy opcje Item, Magic i Save, których wskaźniki policzone to:

Item - 40A6
Magic- 4AA6
Save - 51A6


Poszukajmy więc gdzie w ROM'ie jest ciąg bitów 40A64AA651A6. Jest? No to już wiemy gdzie zapisana jest tablica wskaźników.
Może dla ułatwienia/utrudnienia poszukamy tylko jednego wskaźnika: Item - 40A6. Jego sąsiedztwo, bajty przed i po nim, powinny wyglądać podobnie, czyli xxA6. Jeśli bowiem wskaźnik wskazuje na tekst, który umieszczony jest w ROM'ie niedaleko naszego Item, to adres musi być zbliżony do 02A8xx, co po operacjach da nam xxA6.


Zmienianie wskaźników:
Jeśli chcemy przedłużyć jakieś słowo kosztem innego, to to drugie należy przesunąć. Zacznie się ono wtedy w innym miejscu, więc trzeba zmienić wskaźnik do niego. Jeśli już znaleźliśmy wartość wskaĽnika i miejsce gdzie jest on zapisany, to obliczamy nowy wskaźnik do nowego początku tego przesuniętego słowa i podmieniamy stary na nowy.


Problem z miejscem na słowa?
Często słowa są bardzo "stłoczone", i przedłużanie jednego wiąże się z koniecznością przesuwania wszystkich które są po nim. Można to rozwiązać inaczej, jeśli tylko znajdzie się wolne miejsce, wypełnione samymi FF. Adres tego nowego miejsca jednak musi być w obrębie tych samych dwu pierwszych bajtów, które odrzuca się przy obliczeniach. Jeśli np. słowo jest pod adresem: 02A840, to wolnego miejsca należy szukać od 020000 do 02FFFF.


Słowa? Zdania?
To o czym piszę oparte jest na zmienianiu słów będących elementami menu, czyli np. Item, zakończone znakiem końca tekstu (najczęściej kodem 00). Jeśli chcemy przesuwać całe wypowiedzi dialogów, postępujemy tak samo, pamiętając o zakończeniu nowej wypowiedzi (wpisanej w wolne miejsce) kodem 00.


Na co jeszcze uważać?
Wolne miejsce wypełnione FF powinno być dostatecznie długie, byśmy byli pewni że nie ma ono żadnego znaczenia. Kto wie, może FF to kolor biały a wiele FF opisuje jakąś jednolitą grafikę? ;) No i jeszcze raz przypomnę o zakończeniu nowej wypowiedzi (wpisanej w wolne miejsce) kodem 00.

Wróć do „Poradniki”



Kto jest online

Użytkownicy przeglądający to forum: Obecnie na forum nie ma żadnego zarejestrowanego użytkownika i 3 gości