traduzione gioco ps2

Aperto da Tatore87, Luglio 13, 2011, 19:22:58

Discussione precedente - Discussione successiva

Tatore87


Tatore8725

Ciao a tutti, sono  Tatore87
dopo diversi anni sono finalmente riuscito a completare la traduzione del gioco.
Chiunque abbia provato a modificarne i testi probabilmente si sarà bloccato quasi subito: all'interno dell'ISO i dialoghi sembrano essere presenti in chiaro nei file .pam contenuti in data/field/aa_pam, ma modificandoli nel gioco non cambia nulla.
Il motivo è che quei file sono soltanto copie inutilizzate rimaste sul disco. Il gioco carica invece le rispettive versioni compresse in formato .lzs, ed è proprio lì che bisogna intervenire.
La compressione utilizzata è una variante dell'algoritmo LZSS di Okumura. Il problema principale è che, durante la decompressione, il gioco modifica il proprio buffer mentre sta copiando i dati. Di conseguenza, un riferimento può rileggere anche i byte appena prodotti: un comportamento che può facilmente causare errori nei compressori realizzati manualmente.
Anche il file FS.DIR, che contiene l'indice dei file, ha richiesto parecchio lavoro. Non è compresso, ma cifrato: ogni valore a 32 bit viene sottoposto a XOR con una sequenza generata da un generatore lineare congruenziale, la cui costante iniziale si trova all'interno dell'eseguibile.
I testi del gioco, inoltre, non si trovano tutti nello stesso punto, ma sono distribuiti in tre aree differenti:
nei file .lzs delle mappe, all'interno di tabelle indicizzate chiamate MSG;
nell'eseguibile SLES_508.91, che contiene menu, oggetti e abilità. In questo caso gli indirizzi delle stringhe sono scritti direttamente nelle istruzioni del processore, quindi i testi non possono essere spostati e ogni traduzione deve rientrare nello spazio originale;
nei file .dat presenti in data/battle, utilizzati per tutorial e battaglie legate alla trama. Il formato è simile a quello delle mappe, ma l'intestazione deve essere individuata manualmente e i puntatori vengono calcolati partendo da zero, anziché da 0x80.
Un'altra difficoltà riguarda la finestra dei dialoghi: può mostrare un massimo di 45 caratteri per riga e non effettua automaticamente il ritorno a capo. Tutto ciò che supera il limite semplicemente scompare. Per questo motivo ogni singola riga tradotta è stata controllata e adattata manualmente.
Al termine del lavoro ho anche confrontato l'eseguibile modificato byte per byte con quello originale, per verificare che ogni cambiamento fosse contenuto esclusivamente nelle aree dedicate alle stringhe e non avesse sovrascritto parti del codice.
Il risultato finale è:
3.409 stringhe tradotte;
90.843 byte modificati;
zero byte modificati al di fuori delle stringhe.
È stato un lavoro lungo, ma finalmente la traduzione è completa.