Guida al Rom Hacking
2002/2003 by Brisma - Versione 0.9
Per uso offline cliccare quà.
Domenica 6 Luglio 2003: Nuova versione pubblicata. Riscritta la sezione "Giochi su CD"
Così vorreste entrare nel mondo del Rom Hacking ? Ma non avete la più pallida idea di come si editi una Rom eh ? Niente paura, molta gente pensa che sia una cosa complicatissima ma con questa guida vi voglio far vedere come sia relativamente semplice il Rom Hacking. L'unica cosa che chiedo per cominciare è: PAZIENZA. Senza di essa non riuscirete a fare niente. Poi logicamente se volete tradurre una Rom Inglese dovrete sapere l'Inglese ;). Detto questo possiamo anche cominciare fin da subito.
In
questa guida tratterò tutti gli argomenti di base:
-ll sitema esadecimale
-Trovare una table
-Editare una rom
-DTE/MTE
-Modificare la grafica
-Modifica delle DTE/MTE
-Espandere lo spazio
-Cambiare i puntatori
-Script e banchi di testo
-Giochi su CD
Il sistema esadecimale
Allora per prima cosa dobbiamo capire come funziona il sistema esadecimale. Noi, normalmente, per contare usiamo il sistema decimale ovvero i numeri che vanno da 0 a 9, invece il sitema esadecimale funziona con 16 numeri ovvero da 0 a 9 e da A a F. So che all'inizio è un po' difficile da capire e per questo vi mostrerò un po di esempi.
DEC | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 |
HEX | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | A | B | C | D | E | F |
Praticamente
nel sistema esadecimale si conta da 0 a 9 e da A a F mentre nel sistema
decimale si conta da 0 a 9 e poi 10 11 12 ecc.
Quindi il valore HEX 10(decimale) corrisponde a A(esadecimale) 11 sarà
B e via dicendo...
Facciamo subito un po' di calcoli per capire come funziona :
A + 1 = B
Perchè ciò ?
Perchè A=10 + 1 = 11
11 in esadecimale corrisponde a B.
A
+ 2 = C
(A = 10) + 2 = 12
12 = C
A + 5 = F
(A = 10) + 5 = 15
15 = F
A
+ 6 =10
Ora vediamo perchè A + 6 è uguale a 10.
A = 10
10 + 6 = 16
se dovessimo continuare quella piccola tabella di prima ecco che avremmo la
nostra
risposta:
15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 |
F | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 1A | 1B | 1C | 1D | 1E | 1F | 20 | 21 |
Spero che abbiate capito comu funzioni il sistema esadecimale. In caso contrario provate a fare qualche esperimento con la calcolatrice di Windows.
Editare una Rom
Prima
di tutto dobbiamo sapere cos'è una table (d'ora in poi TBL). Ogni lettera
che vedete su schermo corrisponde a un byte esadecimale. Lo standar adottato
da DOS e Windows è il ASCII dove la lettere "A" corrisponde
a "41" e "a" corrisponde a "61", quindi "B"
corrisponderà ad "42" e via dicendo. Voi vi chiederete a
che cosa serva sapere questo ma ora lo capirete meglio. Le vecchie Software
House che sviluppavano i giochi per le console, non adottarono lo standar
ASCII ma creavano delle nuove tabelle di caratteri dove "A" poteva
essere ad esempio "15". Quindi una Rom (che al 95% dei casi non
è in ASCII) per essere tradotta ha bisogno della sua tabella dei caratteri.
Questa TBL conterrà tutte le lettere e i punti che si vedono comparire
durante il gioco. Quasi sempre sono :
A, B, C, D, E, F, G, H, I, J, K, L, M, N, O, P, Q, R, S, T, U, V, W, X, Y,
Z
a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p, q, r, s, t, u, v, w, x, y,
z
1, 2, 3, 4, 5, 6, 7, 8, 9, 0
, ; . : ! ? % ' - * +
Quindi bisognerà trovare il byte che corrisponde a questi segni. Per
trovare la TBL (ovvero l'insieme dei caratteri con i numeri esadecimali) dobbiamo
usare un programma di ricerca relativa. Io consiglio caldamente il SearchR
X dei SadNES cITy. Allora supponiamo
di voler tradurre Dragon Warrior (Dragon Quest) per il Nintendo. Per prima
cosa scarichiamo la Rom. Testiamo la Rom con un buon emulatore, e facciamo
uno snap della prima schermata di testo del gioco che è questa quà
:
Ora apriamo il programma SearchR X e dovrebbe presentarsi una schermata tipo questa :
Bene la prima cosa da fare è aprire la Rom quindi File -> Apri -> File Rom (in questo caso Dragon Warrior.nes). Ora dovremo cercare una parola che compare nel gioco, riguardando lo screen shot quì sopra prendiamo in esempio la parola "Descendant" Avrete 1 risultato che è all'indirizzo(offset) 45391. Ed ecco che di fianco vediamo " A=24 a=OA 1=?? " :
Finalmente possiamo creare la nostra tabella dei caratteri perchè sappiamo che tutte le lettere "A" del gioco corrispondono al numero esadecimale 2A e quindi successivamente la B a 0B, C a 0C e via dicendo, e che tutte le lettere "a" del gioco corrispondono a 0A e quindi "b" a 0B ecc ecc. Ora possiamo già fare una bozza della TBL che useremo per tradurre il gioco. La faremo con Dark Tabler. Apriamolo e apparirà una schermata così :
Ora inseriamo, tramite i risultati ottenuti con il SearchR X le lettere nelle caselle a nostra disposizione in questo modo:
Ora salviamo la tbl col nome di "DW1.TBL". Ok ora abbiamo imparato ad trovare una TBL (ricordiamoci che quella appena creata NON è completa dato che mancano altri segni tipo i punti ". , :", le virgolette, i numeri e altri ancora). Per finire la TBL dovremo leggere il prossimo capitolo.
Editare una Rom
Ora vedremo come trovare i caratteri rimanenti e come modificare il testo. Per prima cosa procuriamoci un buon editor esadecimale. Io suggerirei il ThingyV 1.5 che è, secondo me, il più adatto per i newbie. Facciamoci un bel doppio click sopra è apparirà una skermata dove inserire dei dati.
'Nome
File da modificare?'
Quì dovrete inserire il nome della Rom/File. Rinominate Dragon Warrior.nes
in DW1.nes e scrivete dw1.nes.
'Tabella
Principale?'
Quì dovrete inserire il nome della TBL. Nel nostro caso DW1.tbl
'Tabella
Secondaria (opzionale)?'
Può succedere che un gioco possa usare 2 tbl: una per il testo e una
per i menu.
Ma per adesso questo non ci riguarda, quindi lasciate vuoto e battete invio.
La schermata che vi apparirà sarà questa:
Ora la prima cosa che dovremo fare è cercare la parola "Descendant". Quindi premete "S" e nella nuova schermata scrivete "Descendant" e premete "ESC" per confermare. Quindi vedrete questa schermata:
Sfortunatamente non potremo ancora editare la rom a causa della mancanza di altri caratteri. Ora guardando questo screenshot potremo trovare dei nuovi caratteri da mettere nella Rom:
Ora potremo facilmente trovare il byte che corrisponde allo spazio. Infatti come potete notare nello screenshot ho segnato con un cerchietto rosso lo spazio tra "Descendant" e "of". Se guardate bene il ThingyV (come un qualsiasi altro editor esadecimale) segna con # qualsiasi segno non sia contenuto nella TBL. Nel nostro caso per scoprire il numero(byte) che corrisponde allo " " e sufficiente posizionare il cursore tra il # che separa Descendant da of ottenendo il byte "5F". Quindi apriamo di nuovo la TBL con Dark Tabler e inseriamo lo " " nell'apposita cella e salviamo. Ora riapriamo il Thingy con la nuova TBL salvata, premiamo nuovamente "S" e ricerchiamo "Descendant" e guardate il risultato:
Come potete notare moltissimi # si sono trasformati in " ". Lo stesso procedimento vale per tutti i segni. Ora provate a scoprire voi i relativi bytes dei degli altri segni.
N.B.: A volte, può succedere che in un gioco esista un byte per indicare le "Aperte Virgolette" e un altro per indicare le "Chiuse Virgolette" se ci fate caso questo in windows non esiste e quindi non sarebbe possibile inserire due caratteri diversi per indicare le virgolette aperte e chiuse. Il consiglio che vi dò è quello di usare altri due caratteri ad es. le "Aperte Virgolette" le potrete sostituire con "/" mentre le chiuse con "\" o con qualunque segno voi vogliate tanto il risultato nella Rom nn cambierà, saranno sempre le stesse virgolette a comparire.
Una volta che avrete trovato i relativi byte di: "/" - "." - "," - "\" il ThingyV dovrebbe apparire così:
Ora come notate nel nuovo screenshot c'è ancora 1 byte ad non esser ancora svelato. Ed è inutile cercare nella rom il carattere corrispondente dato che nn è un carattere, è il byte che indica la fine di una frase. Quando l'emulatore va a leggere questo byte capisce che deve smettere di mostrare testo. Il nuovo byte FD non sarà inserito nella TBL come carattere tipo FD=? ma si metterà come /FD (come può essere /0B /5F...) all'inizio della TBL. Quindi se la TBL la aprite con notepad dovreste vedere:
/FD
24=A
25=B
26=C
...
N.B.:
In quasi tutte le Rom esiste oltre il byte che indica la fine della frase
il byte che indica di tornare a capo
ad es.
Ciao, come ti_
chiami ?
Al
posto di "_" c'è un carattere invisibile che dirà
di mettere a capo il testo.
Come per il byte di fine frase anche questo va messo all'inizio della TBL
come ad es. *4B o *DE...
Nel caso di Dragon Warrior questo byte non serve perchè il testo andrà
a capo in automatico quando arriverà al fondo
dello spazio disponibile.
N.B.2:I byte che indicano fine frase e torna a capo nel Thingy li vedrete BIANCHI e non rossi come gli altri.
Ora
che abbiamo una TBL più o meno pronta (mancano ancora i byte tipo !
e ? ma questi li troveremo più avanti)
possiamo passare all'hacking massiccio.
Ora riapriamo il ThingyV selezioniamo rom e table e tentiamo di modificare il primo testo. Come sempre premiamo S e cerchiamo "Descendant" e posizioniamoci come nella scheramta:
In realtà il testo inizierebbe con "/" ma dato che indica aperte virgolette e non dobbiamo modificarlo nn lo toccheremo e ci posizioneremo subito su D. Ora mentre siamo su D premiamo SPAZIO, ora spostiamo il puntatore sopra il "." finale e ripremiamo spazio. Verrà fuori una schermata tipo quella di quando si preme S ma invece quì dovremo inserire il testo tradotto da noi. Quindi inseriamo "Discendente di Erdrick, ascolta le mie parole." al posto di "Descendant of Erdrick, listen now to my words." Come notate dalla traduzione ho dovuto togliere quel "ora" perchè non ci entrava per mancanza di spazio. La mancanza di spazio è un problema che c'è sempre infatti non possiamo aumentare dal nulla lo spazio e perciò dovremo adattarci a quello che c'è. In realtà delle tecniche per espandere esistono ma le spiegherò più avanti nella guida. Una volta inserito il testo premiamo ESC e chiudiamo il ThingyV apriamo l'emulatore et voilà il nostro risultato:
Ora basterà fare lo stesso procedimento per tutto il testo, inserendo quando opportuno nuovi segni nella TBL e armarsi di tanta pazienza...
DTE/MTE
DTE: In questa parte della guida spiegherò solo cosa effettivamente sono senza far nessun esempio (spiace ragazzi ^^). Ritengo che sia abbastanza facile da capire per tanto mi sembra inutile fare di nuovo 30 mila immagini come prima. Ma cmq , bando alle ciance iniziamo subito con la spiegazione delle DTE. Le DTE sono un'invenzione dei programmatore per risparmiare spazio nella rom e per mettere in crisi i Rom Hacker XD . Fino a ora abbiamo sempre visto che un byte corrisponde a una lettera quindi ogni # ha il valore di una lettera. Bene, anzi male :D , le DTE infraggono questa regola infatti con esse un # può valere anche più di una lettere per tanto dovremo fare una table con tutti questi valori aggiuntivi oltre i classici byte=lettera. Secondo me il problema più grosso sta nel ritrovamento di tutte le DTE a volte può rilevarsi un'impresa anche per i più professionisti ;) . Facciamo un esempio, un gioco che vorremmo tradurre ha queste famose DTE noi siamo riusciti a ricavarne una TBL di base con solo il valore di tutti i byte che valgono una sola lettere come facciamo a trovare le DTE ? Semplice analizzando il testo.
H#lo#or#.
Facciamo finta di saper per certo che lì dietro si nasconde la frase "Hello world." Sono presenti già 3 DTE, spostiamoci sul primo # che ha come valore ad es. 51 e nella TBL inseriamo "51=el" ora spostiamoci sul secondo che ha come valore ad es. 52 e inseriamo "52= w" ora andiamo sul terzo che ha come valore 53 e mettiamo "53=ld". Il risultato sarà il seguente :
Hello world.
I colori usati sono gli stessi che vedrete nel ThingyV infatti le DTE hanno un colore diverso dai caratteri normali.
MTE: Ora che abbiamo imparato le DTE possiamo passare alle MTE. In pratica esse sono delle semplici DTE che valgono più lettere ad es. il byte 44 può valere la parola "that" 45 può valere "this" etc etc praticamente un # vale una parola. Di norma viene utilizzato un Dizionario cioè esiste nella rom un elenco di tutte le parole che possono essere usate. Questo è un grosso problema per i traduttori infatti una semplice frase può apparire così:
# # is #.
Se nn sapete il valore di ogni # non potrete mai capire cosa si cela dietro, facciamo finta di aver trovato tutti i valori e il testo diventa:
My name is Yoshi.
Logicamente non potrete mai tradurre con così poco spazio perciò avrete la necessità di modificarvi tutto il dizionario affinchè la traduzione sia plausibile.
Modificare la grafica
Eccoci arrivati nel paese delle meraviglie ^_^. Non starò a farvi un discorso lungo per spiegarvi come funziona i colori etc etc perchè penso che quello che vi interessa è solo modificarla :P Allora prima di cominciare dovete sapere solo alcune cosette. La grafica nelle rom e divisisa a mattoncini cioè a tile, praticamente tutta la grafica che vedere sono dei semplici quadratini di 8x8 pixel messi uno vicino all'altro. In oltre è presente una palette dei colori. Tutto quà quello che vi occorre sapere. Il miglior programma che c'è in giro è il Tile Layer Pro 1.1 con esso potrete fare quasi tutto. Apriamo il suddetto programma e scegliamo come sempre la nostra cavia, ovvero Dragon Warrior. Appena aperta la rom si presenterà questa schermata:
Ora basterà scendere un po' per trovare la grafica. Quella che a noi interessa per ora è quella dei font delle lettere. Se notate bene il primo font di caratteri si intreccia con della grafica azzurra dietro, cosa che non deve accadere, mentre il font sotto e pulito. Per il primo font, quello intrecciato con la grafica, basterà cambiare il tipo di formato di visualizzazione, nulla di più semplice: vai su View -> Format -> 1BPP et voilà che le nostre lettere diventano pulite. Per modificare la grafica è molto semplice, basta cliccare su una casellina ed apparirà nel Tile Editor, quì avrete il vostro tile ben ingrandito che potrete modificare con il mouse. Non vi preoccupate dei colori ci pensarà l'emulatore a sistemare tutto quanto. Alcune volte può capitare che la grafica sia un po' spezzettata perciò è stato studiato il Tile Allanger ovvero quella grossa casella gringia sopra il Tile Editor. Basterà trascinarci sopra tutti i tile nel giusto modo e ricreare l'immagine corretta per modificarla senza problemi. Volendo, si può estrarre la grafica sotto forma di bitmap e modificarla con qualsiasi programma di disegno. Basterà selezionare i tile che volete modificare (di solito se ne selezionano un bel po') e cliccare su Edit -> Export Bitmap, stessa cosa per importare si seleziona (con il tasto destro del mouse) e si fa Import bitmap. Tutto quà, ah se della grafica non la trovate ci sono due probabilità: la prima è che sia in un altro formato (tipo GB SNES NES) mentre l'altra che sia compressa, in quest'ultimo caso dovrete studiarvi l'ASM del gioco e crearvi un programma di De-Compressione su misura.
Modifica delle DTE/MTE
Questo argomento è molto breve, ho avuto poche occasioni di utilizzare questa tecnica però noto che molta gente la usa perciò vi spiegherò quello che so. Capita spesso che per via delle DTE originali è difficile far entrare una frase in uno spazio, ciò è dovuto che le DTE utilizzate sono organizzate per il testo inglese e non per quello italiano perciò bisogna modificarle per ottimizzarle a quello italiano. Se avete un pezzo di script del testo (praticamente un file con dentro un bel po' di testo del gioco) potete utilizzare un ottimo programmino chiamato Martial che analizzerà tutto quanto e vi dirà le DTE migliori da utilizzare. Una volta che avete la nuova lista di DTE "comode" dovrete aprire la rom con il vostro editor esadecimale preferito (io fino ad adesso ho illustrao il ThingyV xkè lo ritengo il più comodo per i novellini, ma esiste anche il Translhextion che è veramente ottimo) e dovete iniziare a cercare le DTE in modo standar cioè senza averle attive usando la tabella normale dove un byte equivale a una lettere. Provate a cercare un po, prima o poi finirete nella tabella delle DTE. Praticamente ci sono tutte le DTE messe una attaccata all'altra scritte in modo standar (byte=lettera) basterà semplicemente modificarle con i risultati del martial e otterete una nuova tavola delle DTE. Se ora provata ad aprire il gioco con un emulatore molto probabilmente il testo sarà illeggibile dato che avete sfalsato tutto quanto.
Per le MTE il discorso è lo stesso, cercate le parole con una TBL senza DTE/MTE e di solito le troverete subito. Se avete fortuna potebberò avere una spaziatura fissa tra una parola e l'altra ad es. così:
Ciao.../tesoro./canna../
In pratica quei puntini indicano spazio libero mentre i "/" indicano la fine dello spazio utilizzabile perciò avrete sempre 7 byte disponibili per riscrivere la vostra parola. In caso contrario saranno tutte attaccate da "/" perciò dovrete scambiare di posto molte parole.
Espandere lo spazio
Mmm bene bene, in questa sezione vorrei mettere la parola fine allo spazio limitato nelle roms (sempre che sia possibile :P ). Come prima cosa dobbiamo sapere che tutte le roms hanno una loro dimensione in mbit che può variare da piccoli file fino ad enormi. Praticamente per espansione si intende aggiungere una quantità di spazio libero pari al successivo supporto mbit. Da come ho detto sembra che sia un'impresa eccezionale farlo in realtà è una vera cavolata.
SNES - Praticamente mettiamo di avere una rom da 2MB completamente piena e che ci serva un po' di spazio. Nulla di più semplice, basterà farla diventare 2.5Mb esatti. Esistono vari programmi per farli ma io preferisco fare le cose manualmente perciò vi spiego come faccio io. Apro WinHEX e clicco sull'ultimo byte della rom poi aggiungo il tot di byte necessari (c'è un'apposita opzione nei menu per appendera al fondo del file spazio vuoto). Come abbiamo detto vogliamo aggiungere 0.5MB di spazio libero perciò facciamo prima questo piccolo calcolo per sapere quanti byte sono esattamente 0.5MB = 0.5MB -> 512KB -> (512 x 1024) 524288 byte. Et voilà una volta aggiuntp questo tot di bytes la rom sarà diventata 2.5MB e avremo molto spazio libero da utilizzare. Piccola nota: Questo procedimento funziona solo con le LoRom e non con le HiRom, non chiedetemi il perchè ^^'
GB/GBC - Quì è più o meno la stessa cosa dello SNES ma dopo aver aggiunto lo spazio necessario sarà da fare una piccola modifica all'header del gioco. Perciò andiamo all'offset 0x148 e modifichiamo il byte che c'è in base alle nuove dimensioni della rom:
00-
32kb
01- 64kb
02- 128kb
03- 256kb
04- 512kb
05- 1MB
06- 2MB
07- 4MB
Ora basta salvare e il gioco è fatto.
Se sapete come espandere altri tipi di rom fatemi sapere che appena posso lo inserisco nella guida, per contattarmi guardate al fondo della guida.
Cambiare i puntatori
OK, ora si inizia con qualcosa di più complicato, EVVAI ! I puntatori mmmm gran brutte bestie. Prima di tutto dobbiamo capire che cosa sono.
In pratica i puntatori sono dei byte nelle rom che indicano di spostarsi in un punto della rom. Cioè li potremmo immaginare come dei segnali stradali sull'autostrada dove dicono Di quà per Torino, Di là per Savona, Di lì per Milano etc etc. In pratica quando il processore della console cerca il testo va a chiedere a questi puntatori dove andare a pescare il testo e loro glielo dicono. Perchè a noi interessa ciò ? Ora lo scoprirete. Immaginiamo di avere il seguente testo preso dalla Rom:
This's a tomb./Hello boys, my name is Mary./
Mettiamo di voler effettura delle modifiche a queste due frasi. Come noterete la prima dice "Questa è una tomba." come vedete non ci sta; guardano la seconda frase decidiamo di tradurla in "Mi chiamo Mary" e di risparmiarci quei byte di "Hello boys, " per aggiungerli alla frase di prima. Perciò metteremo:
Questa è una tomba./Mi chiamo Mary.********/ { I * corrispondono a spazio vuoto}
Se notate abbiamo spostato il "/". Ora proviamo ad giocare con l'emulatore e vedremo per la prima schermata:
Questa è una tomba.
Mentre per la seconda vedremo:
mba.
Perchè vediamo "mba." e non "Mi chiamo Mary." ? Semplice xkè ci sono i puntatori ! Analizziamo la prima frase:
This's a tomb./Hello boys, my name is Mary./
Quelli segnati in rosso sono i due byte a cui i puntatori fanno riferimento, chiamiamoli per comodità Torino e Savona. Ora riprendiamo la frase modificata ed analizziamola:
Questa è una tomba./Mi chiamo Mary.********/ (Notare che la lunghezza totale è identica alla lunghezza della frase originale, sono sempre 40 bytes)
Torino e Savona sono sempre allo stesso punto di prima, per Torino è ok perchè è invariato mentre Savona va spostato alla M perchè rimanendo dov'è appena l'emulatore vede il "/" smette di mostrare testo. Il risultato che dobbiamo ottenere alla fine è questo:
Questa è una tomba./Mi chiamo Mary.********/
In questo modo vedremo il testo in modo perfetto. Sfortunatamente ogni console ha il suo tipo di sistema dei puntatori, perciò sotto spiegherò i puntatori delle console che conosco:
NES: Allora i puntatori standar del NES funzionano così: si prende l'offset ad es. 12345 si sottrae l'header (10 byte) e si invertono le ultime 4 cifre. Quindi:
12345 - 10 = 12335 = 2335 = 3523
Et voilà 3523 è il nostro puntatore basterà cercarlo nella rom e sostituirlo con il nuovo puntatore. Notate che di solito i puntatori sono tutti in sequenza quindi probabilmente vedrete cose del genere: 3523 4723 9123 A323
SNES: I puntatori SNES si dividono in due gruppi: per LoRom e per HiRom.
LoRom: Si prendere l'offset 12345 si sottrae l'header (200 byte) e si invertono le ultime 4 cifre:
12345 - 200 = 12145 = 2145 = 4521
Anche quà vale sempre la regola dei puntatori progressivi.
HiRom: Si prende l'offset, si sottrae l'header (200 byte) e se il numero non è compreso tra 8000 e FFFF si aggiunge C00000 e si inverte tutto quanto. Quindi:
12345 - 200 = 12145 + C00000 = C12145 = 4521C1
4521C1 è il nostro puntatore.
GB/GBC: I puntatori del GB/GBC si differenziano dagli altri sistemi perchè si basano in base a dove il testo è posizionato nella rom. Per trovarli bisogna prendere l'offset e ricavarne solo le ultime 4 cifre e applicare le seguenti regole:
Se il numero ottenuto è compreso tra 0000 e 3FFF bisogna aggiungere 4000 e invertire -> 1234 + 4000 = 5234 = 3452
Se il numero è compreso tra 4000 e 7FFF bisogna solo invertire i due byte -> 6123 = 2361
Se il numero è compreso tra 8000 e BFFF bisogna sottrarre 4000 e invertire -> 9145 - 4000 = 5145 = 4551
Se il numero è compreso tra C000 e FFFF bisogna sottrarre 8000 e invertire -> CA12 - 8000 = 4A12 = 124A
GBA: I puntatori del GBA sono formati da 4 byte. Bisogna prendere l'offset e aggiungere 08 all'inizio e invertire il tutto. Quindi
450213 = 08 + 450213 = 08450213 = 13024508
È da ricordare che i puntatori del GBA puntano sempre a un byte prima.
Altre: Per tutti le altre console si avvale la formula del "Chi cerca trova" ad es. la PSX e il PC. Ogni gioco ha il suo modo di calcolare i pointers. Se sapete come calcolare pointers di altre console fatemi sapere che li aggiungerò.
Comunque, facciamo finta che la rom con quel testo è una SNES LoRom e che il puntatore chiamato Savona sia 4521. Prima di cercarlo nella rom calcoliamoci il nuovo puntatore che sarà basato sull'offset di M che è 1234A quindi il puntatore sarà 1234A - 200 = 1214A = 214A -> 4A21. Ora cerchiamo i due byte nella rom "45 21" e quando ci accorgeremo che che siamo finiti nel punto giusto (basta vedere se ci sono altri puntatori simili prima e dopo il nostro) ci basterà cambiare i due byte in 4A 21 e il gioco e fatto. Ora il testo apparirà perfettamente.
Script e banchi di testo
Prima di spiegare gli script vi spiego molto velocemente cos'è un banco di testo. Altro non è che il testo della rom messo tutto vicino separato solo da "/". In pratica il testo delle rom è sempre ammucchiato in 1 o più malloppi di testo messo in ordine sparso. Giusti per darvi l'idea:
Ciao, come ti chiami ?/C'era una volta.../Ehi tu, cosa credevi di fare?/Wow, che forza./Come stai?/
Questo è un frammento di un banco di testo. Ora che avete capito cos'è un banco di testo possiamo passare agli script. Gli script sono praticmanete questi banchi di testo sotto forma di TXT in ASCII. In pratica viene estratto il testo e reso modificabile senza l'utilizzo di editor esadecimali, quindi potrete tradurre il testo con blocco note. Volendo esiste un ottimo programma per modificare gli script chiamato U.S.U scaricabile dal sito degli It.Unknown (in cui ero un ex-membro). Una volta estratto lo script e tradotto molto probabilmente verranno spostati quasi tutti gli "/" dal loro posto orginale perciò quando reinserirete il testo nella rom dovrete riscrivere tutta la tabella dei puntatori. Potete farlo manualmente oppure tramite programmi che lo fanno in automatico, basterà dargli come input l'offset di inizio del testo e l'offset di fine del testo, l'inizio della tavola dei puntatori e la fine e l'header da sottrarre. Il programma genererà da solo la nuova tabella dei puntatori e tutto tornerà a funzionare come prima.
Giochi su CD
Questa sezione è consigliata per chi ha già imparato a maneggiare per bene i file e modificarli nel giusto modo.
Detto questo iniziamo subito. Il problema principale dei giochi per CD è che all'interno contengono vari file e molte volte è necessario reinserirne anche più di uno. Prima di comnciare procuratevi questi 3 programmi: CDRWin - CDMage Beta 5 - BIN Patcher.
Mettiamo ad esempio che voi abbiate già preso un file dal CD (nel mio caso userò un gioco PSX) e che lo avete già tradotto ma volete reinserirlo nel cd. La prima cosa da fare è creare un'ISO del cd con CDRWin, dovete cliccare sul terzo tasto nella schermata principale e settare il tutto in questo modo:
In questo caso la nostra iso avrà il nome di "MiaISO.bin", il file "MiaISO.cue" per ora non ha nessuna importanza perciò lo ignoreremo. Io per comodità ho fatto un'iso di FF7 PSX e come file da reinserire userò WARNING.TIM che ho già modificato. Ora apriamo CDMage e segnamoci l'LBA del file. Nel mio caso è 127031. Ora assicuriamoci per l'ultima volta che il file modificato abbia le stesse identichi dimensioni di quello originale e prepariamo la calcolatrice di winzozz. Ora dobbiamo fare un piccolo calcolo ovvero: (LBA x 2352) + 24 e poi convertire in Esadecimale. Nel nostro caso è: (127031 x 2352) + 24 = 298776936 -> 11CEF968. Ora apriamo BIN Patcher di Walxer e selezioniamo l'iso e il file modificato. Nel mio caso sono MiaISO.bin e WARNING.TIM, ora dobbiamo inserire il l'offset che abbiamo calcolato prima e cliccare sul magico tasto "Patcha". Et voilà il nostro bel risultato:
Lo stesso procedimento funziona per tutti i files tranne per gli XA/STR che hanno bisogno di un trattamento "con i guanti". Chissà magari nella prossima versione lo spiegherò ;) Ah dimenticavo, io ho fatto una prova su un gioco PSX ma va bene un CD qualsiasi a patto che contenga dei file e che non sia compresso come Chrono Cross :P
Conclusione
Quelli che vi ho illustrato sono tutti gli argomenti di base, ora potete iniziare il vostro cammino nell'approfondimento sei singoli settori dato che avete la basi per quasi tutto. Se notate negli argomenti più complessi non sono stato a spiegarvi per filo e per segno tutti i procedimenti perchè esistono risorse molto superiori alle mie dove potrete documentarvi meglio. Però una buona base l'avete già e potrete già fare le vostre prove.
Se volete mettervi in contatto con me per qualsiasi motivo mandate una e-mail a: brisma88@tin.it . Oppure potete cercarmi su IRC nei server Quakenet AzzurraNet ed IRCNet nel canale #traduzioni .
E ora per concludere questa lunga lista di ringraziamenti :P Ah se mi dimentico di qualcuno perdonatemi ma ho scritto quasi tutto in 2 giorni e sono fuso ^^.
SadNES cITy
_Ombra_: Un ringraziamento spieciale va al mio grande amico _Ombra_ che mi ha spiegato moltissime cose sul rom hacking alcune delle quali sono riportate in questa guida.
Mickey: Un grazie va anche a lui per aver realizzato un'ottima guida insieme a tutto il gruppo.
Duke^: Che dire...mmmmm....GRAZIE per tutte le cose che mi hai insegnato ^_^
Clomax
Clomax: Un grazie va anche a lui che mi ha aiutato varie volte nel corso del mio cammino. (Non ti preoccupare pubblicala pure sul tuo sito la guida non c'è bisogno che me lo chiedi ;) )
Sertara: È stato il primo a darmi una mano quando sono entrato nel mondo delle traduzioni.
It.Unknown
Zydio: Siamo stati a lungo compagni di gruppo e in questo periodo mi ha insegnato cosa vuol dire essere un "gruppo" e mi ha spiegato molte cose che non sapevo.
Sephirot: Un grazie va anche a lui, non so perchè ma glielo devo ^_^
Vari
RedXIII: Mio grande friend, un grazie va anche a lui che è stato compagno d'avventura per molto tempo.
_Scorpio_ Tidus e Neutrinus: Che dire...in chat mi fanno sganasciare dalle risate...mahauhauhauahu
Karma: Il mio saggio maestro, sempre disponibile e molto professionale, SEI UN MITO !
Graph: Semmai leggessi queste righe (dato che ora sei sparito) ti dedico un grazie per tutto quello che mi hai insegnato, per le compressioni LZSS, per le info sulla PSX, per le serate passate assieme, per tutto quello che hai fatto, GRAZIE.
Gemini e Sephiroth1311: Che dire... vi sto conosciendo solo in quest'ultimo periodo, mi avete dato una grossa lezione di umanità, perciò un grazie va anche a voi. Bastardoni XD
Mentz e Mattia: Non so perchè ma penso che semmai si mettessero a lavorare assieme farebbero scintille.
Sir_Auron: Un ringraziamento va anche a lui, mi ha stressato obbligandomi a finire questa guida :P
Dewos: Un grazie va anche a lui, grazie per....ehmmmmm... magari poi mi viene in mente qualcosa :P (altrimenti la prossima volta che mi vede in chat mi sbrana ^_^)
Amici di chat: Un grazie va anche a voi che mi avete supportato e che mi fate divertire con le vostre battute.
Tutti gli altri: Perdonatemi se mi sono dimenticato di qualcuno di voi, ma un grazie alla fine va a tutti quelli che mi sono stati sempre vicini !