Estrattore grafica

Aperto da White Dragon, Maggio 03, 2007, 17:48:27

Discussione precedente - Discussione successiva

White Dragon

Ragzzi ho un dubbio e nn saprei come risolverlo...
sto lavorando su una rom con grafica compressa...
il punto è che per estrarre la grafica pezzo per pezzo tutto manualmente
mi fa perdere molto tempo...
se io volessi scrivere un programma che riconosce la grafica... non dico neanche che me la estrae, ma almeno mi dicesse l'offset dal quale comincia.. un po' tipo lo sniff.exe di lunar compress
come dovrei procedere? cioè come faccio ad esaminare la rom e dire "ecco da qui cominciano tiles grafici compressi"
perkè estrarre tutto manualmente fa gonfiare i maròns =((

|GeO|

Se non c'è qualche identificativo tipo header o altro non so se si possa fare molto. L'altra opportunità sarebbe trovare i puntatori alla grafica.

White Dragon

mmm... capisco. si in effetti l'unika sarebbe i puntatori ma sono così talmente sparsi a volte ke mi sa ke un programma potrà automatizzare poko...
vabbè dai, pazienza ^___^

darkdream

salve white (chissà se ti ricordi... non ti sei mai fatto vedere vergogna! :D)

io ho fatto un lavoro del genere per trovare i puntatori al testo in un gioco che li implementava direttamente nel codice...

allora prima di tutto devi trovare come vengono caricati i puntatori alla grafica, o c'è una tabella oppure se sono sparsi ci sarà un determinato spezzone di codice che li carica, se c'è una tabella di puntatori è facilissimo, in caso i puntatori sono sparsi come detto da te e sono nel codice puoi seguire questo approccio, su gameboy avevo trovato un codice come questo:

ld hl, puntatore
call decompressione

adesso la grafica è compressa sempre nello stesso modo di solito quindi ti basta andare a cercare nella rom gli opcode per ld hl, XXXX e call 1234
dove le XXXX possono essere variabili.
facciamo un esempio,
l'opcode di hl e 43 (non lo ricordo esattamente è solo un esempio)
e che l'opcode con l'argomento di call decompressione sia
35 3412 (ricorda in caso sia necessaria la conversione little/big endian)
e salvi tutti i risultati in un file di testo.
(se ci sono più metodi di decompressione trova anche le altre call)

per l'estrazione invece bisogna vedere che metodo di decompressione usa, per esempio ci può essere un lz che finisce con 0000 allora te fai andare il programma man mano avanti nella grafica finchè non trova quei byte di controllo  ovviamente in una lz di 0000 possono essercene tanti che non sono il byte di controllo quindi devi andare a controllare man mano i byte di controllo e saltare le parti compresse/decompresse andando a controllare appunto solo i byte di controllo finchè non ne trova uno uguale a 0000.
arrivato alla fine salvi in una variabile la lunghezza della grafica e poi estrai.
è difficile che venga passata anche la lunghezza del buffer compresso però se è così è ancora più semplice perchè la pigli direttamente dal codice.
e finiamo col mio smile preferito :brucelee:

spero sia comprensibile e utile quello che ho scritto
ciao! :D

White Dragon

Citazionesalve white (chissà se ti ricordi... non ti sei mai fatto vedere vergogna! )

mmm... indendi su questo forum? non capisco ke intendi... magari mi mandi un PM (scusa ma nn ricordo proprio =(( )

cmq sia ti ringrazio x la dritta, il sistema del gioko in questione usa una compressione di tipo lz (lzss) e il puntatore alla grafica è strutturato in questo modo: puntatore_offset+size_data in ogni caso ho lasciato perdere e ho estratto tutto manualmente tanto nn erano poi così tanti dati da modificare tanto da rikiedere un tool.

grazie ankora^__^ byeee