Delucidazioni sui puntatori e altre amenità su Pokèmon Trading Card Game 2

Aperto da RyuH88, Ottobre 04, 2014, 14:32:21

Discussione precedente - Discussione successiva

RyuH88

Ciao ragazzi. Apro questo thread per esporre alcuni miei dubbi. Sono letteralmente anni che saltuariamente mi rimetto a tradurre qualche rom per poi scontrarmi sempre con lo stesso problema:i puntatori. Ora, premesso che di guide ne ho lette tantissime su come calcolare l'offset ecc..non ne ho trovato manco mezza che spiegasse COME cambiare i puntatori. A quanto ho capito in genere si tratta di una coppia di byte da modificare. Ma dove si trovano?O.o vi posto uno screen per capirci:



le lettere "àù" che ho evidenziato rappresentano i byte che servono a "chiudere" determinate frasi(il gioco in questione è pokemon trading card game 2), e in particolare a far "terminare" le battute di un determinato personaggio o il testo d'una determinata carta. Ora mi chiedo: in questo marasma son presenti i puntatori?sono dei byte qui visibili?non dovrebbero trovarsi subito dopo(o prima)il punto evidenziato?ho bisogno essenzialmente che qualcuno mi aiuti a cambiare un puntatore cosi da poterlo(finalmente) capire. Ho capito il "concetto" di base ma nient'altro, insomma..

Phoenix

No, solitamente i puntatori non sono inglobati nei testi (anche se esistono alcuni casi in cui questo accade). Solitamente, i testi di un gioco sono memorizzati in due parti:
- I testi, e
- La tabella dei puntatori

Quello che tu stai mostrando è la sezionedei testi.
La tabella dei puntatori si trova solitamente subito prima (o subito dopo) i testi, e solitamente puoi riconoscerla dal fatto che essa è non è altro che una sequenza di valori di lunghezza fissa che tende a crescere.

Ad esempio, su PSX, sono molto comuni le tabelle di puntatori lunghi 2 o 4 byte ciascuno.
Un esempio potrebbe essere
0500 1000 2300 4400 4600 5B00 2001 2401 ...
Questi puntatori sono lunghi due byte ciascuno, e sono invertiti. Il motivo per cui i puntatori sono invertiti è perché la console (PSX ad esempio) ha un processore little endian, che ti basti sapere trova più comodo leggere i dati in questa forma, ma all'atto pratico, questi puntatori, non sono altro che i seguenti numeri.

0005 0010 0023 0044 0046 005B 0120 0124 ...

(altre console, con un processore big endian invece, memorizzano i puntatori in forma non-invertita).

questi numeri rappresentano l' "indirizzo" in cui inizia ogni frase. Ad esempio, 0005 è l'indirizzo della prima frase, ecc.

I puntatori però, sono solitamente di due tipi (più un altro):
- Assoluti
- Relativi
- ....

quando un puntatore è assoluto, vuol dire che il suo valore rappresenta direttamente l'indirizzo della frase. Solitamente, in questi casi (per le console non troppo datate), tali puntatori sono lunghi 3-4 byte, visto che sono necessari indirizzi abbastanza lunghi per puntare ad una frase dentro un grande file.

Quelli relativi invece, sono puntatori il cui valore non rappresenta un indirizzo dentro il file/ROM, ma lo scarto tra una posizione prefissata, e l'inizio della frase. Solitamnte, questa posizione prefissata è l'indirizzo in cui inizia la tabella dei puntatori.

Quindi, assumendo che la tabella che ti ho mostrato sopra, si trovi all'indirizzo 0x443C, e che questi puntatori siano relativi,
allora 0x0005 + 0x443C = 0x4441 rappresenta l'indirizzo esatto in cui si trova la prima frase.

Per ora mi fermo, spero di essere riuscito a darti l'idea.
Phoenix
****************
membro di SadNES cITy
I gruppo italiano di traduzione ROM
http://www.sadnescity.it
*****************************

RyuH88

Innanzitutto grazie =) in secondo luogo..finalmente ho capito qualcosa in piu!Quindi il primo passo ora è cercare la tabella dei puntatori..ora ci do un'occhiata e vedo se riesco ad smanettarci un pochino con successo!=)

EDIT:per ora ho trovato una MAREA di byte 00...spazio vuoto che posso utilizzare, se non sbaglio.

RyuH88

Ok mi scuso per il doppio reply ma..non riesco proprio a riconoscere la tabella dei puntatori..O.o di sicuro non è DOPO il testo perchè da li parte solo un'infinita sfilza di 00 fino alla fine della rom..quindi sarà prima. Ma come la individuo?(sto rileggendo la tua spiegazione per cercare di capirla al 100%) ho provato a prendere come esempio una parola scritta all inizio della mole di spazio vuoto e a relazionarla con una frase ben precisa del gioco. In questo caso ho preso le ultime 4 cifre dell'offset segnato all inizio(nel mio caso 0001)e ho capito da li che il puntatore dovrebbe essere 0005..tuttavia sono una marea!O.o quindi non ho capito come trovare quello che voglio effettivamente cambiare..(e nn ho capito nemmeno se ho fatto bene il processo ma, apparentemente, la rom non sembra risentirne..forse perchè devo ancora trovare il punto effettivamente "cambiato"). Spero di essermi spiegato bene, sto nuotando nella confusione xd

Phoenix

Se il tuo gioco è per gameboy, è possibil che i tuoi puntatori siano del terzo tipo: Indirizzi virtuali.

Un puntatore è un indirizzo virtuale se il suo valore rappresenta un indirizzo in RAM/ROM secondo il formato del processore. Ad esempio, le vecchie sonsole, come NES, SNES, GB ecc. accedono ai dati in ROM attraverso un sistema di Bank Switch. Gli indirizzi virtuali della PSX invece sono indirizzi in RAM con un 0x80 a precedere quell'indirizzo.

Nel tuo caso, ti consiglio di leggere la guida su come calcolare gli indirizzi virtuali per il gameboy: http://romhacking.it/upload/docs/%5B14%5Dguida_puntatori_gameboy.htm.

In buona sostanza, la guida spiega come calcolare, a partire dall'indirizzo nella ROM di una frase, l'indirizzo nel formato Game Boy, cioè Bank/Indirizzo. Una volta convertito in quel formato, si tratta di cercare questo puntatore nel file della ROM, e verificare che questo si trovi dentro una plausibile tabella dei puntatori.
Phoenix
****************
membro di SadNES cITy
I gruppo italiano di traduzione ROM
http://www.sadnescity.it
*****************************

RyuH88

è una guida diversa da quella che ho usato ma il succo è lo stesso. Prendo il valore evidenziato nell'immagine(0010), aggiungo 4000 e inverto(4010->1040..poi uso la "hex search" e cerco quel valore..ma me ne trova centinaia O.o dubito di dover cambiarli tutti finchè non trovo il puntatore giusto(ammesso sia questo il "processo" giusto).

Phoenix

Infatti, un modo per capire se ti trovi sulal vera tabella, è calcolare il puntatore per la prima e la seconda frase ad esempio, e cercare tutti e due i puntatori insieme.

Assumi che il puntatore della prima frase viene 4322, e quello delal frase successiva è 4329. Allora cerca la sequence 22432943. Questo in virtù del fatto che solitamente i puntatori sono tutti in fila, in ordine crescente. Dovresti ridurre lo spazio di ricerca di un po' così.
Phoenix
****************
membro di SadNES cITy
I gruppo italiano di traduzione ROM
http://www.sadnescity.it
*****************************

RyuH88

mi sono dimenticato di uploadare l'immagine a cui mi riferivo..-.- che idiota..cmq...Ho provato...in questo caso il puntatore della primissima frase riportata nel testo dovrebbe essere "0072"e per la seconda "2072"..ma cosi non trova nulla =/ ti metto qui l'immagine..ti secca calcolare tu questi puntatori?cosi capiamo dove ho sbagliato.


Phoenix

Ma stai lavorando su una rom già hackata? Perché da quel che vedo, la tua rom supera il megabyte.
Ammetto che non sono un esperto di hack GB, però ho il presentimento che il tuo 0006 non sia il terminatore di stringa, ma solo 00 lo è. Quindi il tuo puntatore non è F200, ma F1FF.
Phoenix
****************
membro di SadNES cITy
I gruppo italiano di traduzione ROM
http://www.sadnescity.it
*****************************

Phoenix

Altra cosa, assicurati che la ROM sia senza Header, altrimenti gli indirizzi vengono tutti sballati.
Phoenix
****************
membro di SadNES cITy
I gruppo italiano di traduzione ROM
http://www.sadnescity.it
*****************************

RyuH88

In effetti si, è "nata" dalla patch inglese d'un altro traduttore. Non ho pensato di menzionare la cosa =/ sorry. Comunque..emh..come vedo se è priva di header?

RyuH88

ps:fra l'altro non ho capito perchè dovrebbe diventare "F1FF"...o.o nn si vede neanche nell'immagine(o almeno non lo trovo). Che calcolo hai fatto?=) comunque a me pare che sia 0006 perchè usa solo quelli per terminare la "frase"...se ne metto uno solo succede un casino xd

Phoenix

Il calcolo è semplicissimo. Semplicemente, l'inizio della frase è spostato indietro di un byte. quindi se l'indirizzo di prima era f200, il numero subito prima questo, in esadecimale è 1fff. Basta usare la calcolatrice di Windows. A me sembra invece che 00 sia l'unico terminatore, il fatto che tu ti ritrovi casini, non vuol dire che sia quello il terminatore. Dovrei provare di persona sulla ROM.

Mi mandi un PM?
Phoenix
****************
membro di SadNES cITy
I gruppo italiano di traduzione ROM
http://www.sadnescity.it
*****************************

RyuH88


RyuH88

Credo d'aver capito cosa non va. è presente l'header e ottengo valori sballati, per questo cercando una sequence non trovo nulla =/ come devo agire? ho fatto dei test su un altra rom, evidentemente senza header, e son riuscito a cambiare i puntatori. Quindi l'unica spiegazione è che i valori dei puntatori siano sballati dall header =/

ho comunque provato quel che mi hai detto..c'è qualcosa di strano. Se elimino i byte 06 certe volte non succede nulla. Altre volte sparisce il testo in game. Boh.