Narzędzie do edycji NDS.

Wszelkie kwestie techniczne.
Regulamin forum
1. W miarę możliwości prosimy o załączanie plików przez nasze forum, nie na zewnętrznych serwerach. Pliki nie znikną wtedy po upływie pewnego czasu. 2. Jeśli chcecie uzyskać pomoc przy rozpracowaniu plików (np. z tekstem, czcionką) załączajcie je do postów - nie każdy przecież posiada tłumaczoną przez Was grę.
Chares
Posty: 21
Rejestracja: 23 gru 2008, o 19:05

Re: Narzędzie do edycji NDS.

Postautor: Chares » 31 gru 2008, o 20:44

Pobrałem, załadowałem i zadziałało, ale nie do końca. Podczas normalnego wyszukiwanie nie może nic znaleźć: Obrazek. Kiedy wyszukuje w trybie relativ znajduje niektóre słowa. Tutaj pracowałem nad całym obrazem .iso.

Teraz spróbuje nad .nds i poprzez "rozbicie" .nds na poszczególne pliki.

Może wspólnie do czegoś dojdziemy :D

EDIT1:
W pliku .nds nie ma czego szukać.

EDIT2:
Próbowałem z kilkoma plikami z folderu "text", włożyłem tablice do SnesEdit i nadal ma problemy z rozpoznaniem tekstu, np. nie rozpoznaje takich wartości: 1C, 19, 18, 02, 01, 1E, 09, 12, 06.

Dostałem taką poradę:
http://img374.imageshack.us/my.php?imag ... 563ba2.jpg - 2 screen
Judging from your second screenshot, the game isn't using compressed text but standard Japanese Shift-JIS encoding, despite being in English - for example, the bytes from 0x01F0 to 0x0204 there mean "Arena     ". Guess that was the easiest way for the developers to translate the game without rewriting the text routines. You're going to need a Shift-JIS table file to dump the text, unless you code a custom dumper for the game like I did with Dairansen (and no, I'm not sure if it, HeadSplitter, would work with Path of the Ninja).
Nie potrafię użyć HeadSplitter, o ile w ogóle działa.

Awatar użytkownika
mziab
Posty: 460
Rejestracja: 20 maja 2008, o 23:11
Grupa: mteam
Kontakt:

Re: Narzędzie do edycji NDS.

Postautor: mziab » 31 gru 2008, o 21:30

Całkiem niewykluczone, że tekst jest owszem Shift-JIS, ale dodatkowo kompresowany.
"Człowieka można przedstawić w postaci ułamka, w którym licznikiem są jego właściwości, a mianownikiem - mniemanie o sobie. Im większy mianownik, tym mniejszy cały ułamek." - Lew Tołstoj

Chares
Posty: 21
Rejestracja: 23 gru 2008, o 19:05

Re: Narzędzie do edycji NDS.

Postautor: Chares » 31 gru 2008, o 22:02

W takim razie jak odczytał autor tej odpowiedzi wyraz bez specjalnych narzędzi i dekompresatora ? W jaki sposób mam wydobyć sam tekst do tłumaczenia ? Czy ktoś może napisać instrukcję obsługi programu HeadSplitter (http://www.romhacking.net/utils/530/) ?

Awatar użytkownika
mziab
Posty: 460
Rejestracja: 20 maja 2008, o 23:11
Grupa: mteam
Kontakt:

Re: Narzędzie do edycji NDS.

Postautor: mziab » 31 gru 2008, o 22:22

W przypadku niektórych typów kompresji (np. kompresji słownikowej lub LZSS) w skompresowanym strumieniu widać czasem całe wyrazy, szczególnie na początku strumienia. Nie mówię, że akurat użyto tej kompresji, choć jest to dość prawdopodobne.

Widzę zresztą, że Headsplitter jest do zupełnie innej gry Naruto. Niby rozszerzenie o niczym nie świadczy, ale pliki tekstowe w tamtej grze miały rozszerzenie .msg, tutaj mają .dat. Nie robiłbym sobie zbyt wielkich nadziei, że to narzędzie rozwiąże wszystkie problemy. Nie używałem go nigdy. Widzę, że trzeba mu podać jako argument nazwę pliku z dialogami. Aplikacja nie ma gui, jest napisana pod wiersz poleceń. Jeśli nie wiesz zupełnie o czym mówię, spróbuj przeciągnąć plik dialogowy na ikonę Headsplittera :)
"Człowieka można przedstawić w postaci ułamka, w którym licznikiem są jego właściwości, a mianownikiem - mniemanie o sobie. Im większy mianownik, tym mniejszy cały ułamek." - Lew Tołstoj

Chares
Posty: 21
Rejestracja: 23 gru 2008, o 19:05

Re: Narzędzie do edycji NDS.

Postautor: Chares » 1 sty 2009, o 00:41

Zmieniłem format .nds na .mgs. Włączyłem program, uruchomiłem dumpowanie, zaczął pracować i po 20 min. crash: Obrazek

Mam jakiś kod do dekompresji LZSS, tylko nie wiem jak go skomplikować:

Kod: Zaznacz cały

// Decodes a data stream to B.O.B.'s specifications unsigned int lzDec(unsigned int DecLen, unsigned char *Src, unsigned char *Dst) { unsigned int sOff = 0, dOff = 0, Temp, Dist; unsigned char cHdr, Bit, BitVal, Leng; // Keep going 'til it's all decoded while (dOff < DecLen) { // Chunk header cHdr = Src[sOff]; sOff++; // Cycle through bits for (Bit = 0; Bit < 8; Bit++) { BitVal = (cHdr >> (7 - Bit)) & 1; // Literal if (BitVal == 0) { Dst[dOff] = Src[sOff]; sOff++; dOff++; // Distance/length pair } else { Temp = Src[sOff] | (Src[sOff + 1] << 8); Dist = Temp & 0x7FF; Leng = (Temp >> 11) + 3; sOff += 2; // Prevent out of bounds for bad data if (Dist > dOff || Dist == 0) return 0; // Copy Length bytes from output buffer for (Temp = 0; Temp < Leng; Temp++) { Dst[dOff] = Dst[dOff - Dist]; dOff++; if (dOff == DecLen) break; } // for } // if if (dOff == DecLen) break; } // for } // while // Return size of packed data return sOff; } // Encodes a data stream to B.O.B.'s specifications unsigned int lzEnc(unsigned int DecLen, unsigned char *Src, unsigned char *Dst) { unsigned int sOff = 1, dOff = 2, HdrOff = 0, Temp; unsigned char cHdr = 0, Bit = 1, tLen; unsigned int mDist, MaxLeng, mOff, LongLeng, LongDist; // Write the first byte as literal Dst[1] = Src[0]; // Encode until done while (sOff < DecLen) { // Calculate starting distance if (sOff < 0x7FF) mDist = sOff; else mDist = 0x7FF; // Find the longest match LongLeng = 0; for (mOff = sOff - mDist; mOff < sOff; mOff++) { // Match was found; find its length if (Src[mOff] == Src[sOff]) { // Calculate maximum possible length MaxLeng = DecLen - mOff; if (MaxLeng > 0x22) MaxLeng = 0x22; // Scan bytes and check reported length for (tLen = 1; tLen <= MaxLeng; tLen++) if (Src[mOff + tLen] != Src[sOff + tLen]) break; if (tLen > MaxLeng) tLen = MaxLeng; // For loop quirk // If this is the longest match so-far, record it if (tLen >= LongLeng) { LongLeng = tLen; LongDist = sOff - mOff; } // if } // if } // for // Literal byte if (LongLeng < 3) { Dst[dOff] = Src[sOff]; dOff++; sOff++; // Distance/length pair } else { Temp = LongDist | ((LongLeng - 3) << 11); Dst[dOff] = Temp & 0xFF; Dst[dOff + 1] = (Temp >> 8); cHdr |= (0x80 >> Bit); dOff += 2; sOff += LongLeng; } // Write out a chunk header if needed Bit++; if (Bit == 8) { Dst[HdrOff] = cHdr; cHdr = 0; Bit = 0; HdrOff = dOff; dOff++; } } // while // Write the last chunk header if needed and return output size if (Bit > 0) Dst[HdrOff] = cHdr; return dOff; }
I tablice do tego /\ na: http://en.wikipedia.org/wiki/Shift-JIS

Jakieś propozycje czy raczej przetłumaczenie tej gry jest niemożliwe ?

Awatar użytkownika
mziab
Posty: 460
Rejestracja: 20 maja 2008, o 23:11
Grupa: mteam
Kontakt:

Re: Narzędzie do edycji NDS.

Postautor: mziab » 1 sty 2009, o 15:28

Przede wszystkim, tego programu używa się na pliczkach z dialogami, nie na całym romie.

Druga sprawa, LZSS ma wiele różnych wariantów, które różnią się szczegółami implementacji. Kod, który znalazłeś, będzie raczej bezużyteczny. Należałoby pobawić się debuggerem i zobaczyć jak gra wczytuje tekst. Niestety, dostępne debuggery do NDSa są raczej kiepskie. Btw, skompilować, nie skomplikować :)
"Człowieka można przedstawić w postaci ułamka, w którym licznikiem są jego właściwości, a mianownikiem - mniemanie o sobie. Im większy mianownik, tym mniejszy cały ułamek." - Lew Tołstoj


Wróć do „Technikalia”



Kto jest online

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