Benvenuto Visitatore!  / Create an account







This forum uses cookies
This forum makes use of cookies to store your login information if you are registered, and your last visit if you are not. Cookies are small text documents stored on your computer; the cookies set by this forum can only be used on this website and pose no security risk. Cookies on this forum also track the specific topics you have read and when you last read them. Please confirm whether you accept or reject these cookies being set.

A cookie will be stored in your browser regardless of choice to prevent you being asked this question again. You will be able to change your cookie settings at any time using the link in the footer.
Valutazione discussione:
  • 0 voto(i) - 0 media
  • 1
  • 2
  • 3
  • 4
  • 5
[Gba] "Error on compressed data", "Access violation at address 00000000" - How to fix
#1
0| INTRODUZIONE
Non so quanto sia comune, ma può capitare che un tileset venga danneggiato o corrotto, e che AMap non riesca più a lavorare correttamente con le mappe a cui quel tileset è associato.
Gli errori possono essere più disparati. In una mappa, AdvanceMap riportava l'errore indicato nel titolo:
Codice:
Error on compressed data (size of data is $FFFFFF)
In un'altra mappa, AMap riportava all'infinito un messaggio di errore.
Codice:
Access violation at address 00000000. Read of address 00000000.
Codice:
Access violation at address 00403ED4 in module 'AdvanceMap.exe'. Read of address FFFFFFDC.
(suppongo che gli offset citati possano variare a seconda della rom di riferimento)
Altre volte ancora, AMap andava in crash senza neanche riportare un messaggio di errore.

Quando questo accade, l'errore NON è della mappa, ma del tileset associato a quella mappa. Advance Map sta tentando di leggere i dati del tileset ma non riesce, perché questi sono danneggiati, corrotti o inesistenti.
Non esiste un programma che corregga in automatico questo bug: dovremo procedere manualmente con un Hex Editor (io uso HxD, voi usate quello che più preferite) e un pizzico di pazienza.

1| TROVARE GLI OFFSET DEI TILESET
A meno che non abbiate fatto enormi modifiche alla vostra rom, l'offset dei tileset dovrebbe essere lo stesso della rom di partenza (Ruby, Fire Red, o Emerald). Ogni tileset è lungo 24 byte (0x18), poi si passa al successivo. Riporto qui di seguito gli offset dei primi tre tileset di tutte e tre le rom di lavoro più comuni:
Citazione:RUBY
Tileset 1: $286CF4
Tileset 2: $286D0C
Tileset 3: $286D24
...

FIRE RED
Tileset 1: $2D4A94
Tileset 2: $2D4AAC
Tileset 3: $2D4AC4
...

EMERALD
Tileset 1: $3DF704
Tileset 2: $2DF71C
Tileset 3: $2DF734
...
Per trovare l'offset del tileset che vi interessa, comunque, vi basta aprire Advance Map -> Vista header -> Ctrl+H (Vista header professionale) -> Offset of tileset part 1 e Offset of tileset part 2 (sono, rispettivamente, gli offset del primo e del secondo tileset di quella mappa).
Se Advance Map va in crash quando tentate di aprire la mappa col tileset che vi interessa, non demordete! Vi basta prendere un backup della vostra rom di lavoro a quando quel tileset non era danneggiato, oppure prendere una rom vergine (quasi certamente l'offset è rimasto invariato) e leggere l'offset da lì.

2| CORREGGERE L'ERRORE
Ora, è possibile che ci siano due tipi di errori che portano AMap ad andare in crash. Vediamoli di seguito:
  • 1: L'offset della grafica del tileset è sbagliato
    Abbiamo visto che ogni tileset ha associati 24 byte. Di questi 24, i byte dal quinto all'ottavo sono un pointer alla grafica del tileset. Lo riconoscerete facilmente perché, come tutti i pointer, è scritto in questo formato:
    Codice:
    XX XX XX 08
    Dove "XX XX XX" è l'offset di riferimento, scritto in little endian. Ad esempio, se il pointer rimanda alla posizione 08123456, il pointer sarà scritto:
    56 34 12 08
    È possibile che il pointer rimandi ad un posto in cui la grafica non c'è più, o che il pointer stesso sia stato manomesso per qualche motivo e rimandi quindi al posto sbagliato. Dovremo quindi correggerlo, scrivendo al suo posto il pointer all'offset corretto. Se non sapete quale sia l'offset corretto, vi basta prendere una rom vergine (se non avete mai modificato quel tileset, la grafica si trova allo stesso posto) oppure un backup della vostra rom ad un punto del tempo in cui il tileset non era danneggiato.
  • 2: La grafica del tileset è danneggiata/corrotta
    È possibile che il pointer rimandi alla posizione corretta, ma la grafica del tileset sia danneggiata per qualche motivo (magari è stata sovrascritta da altro, o avete operato alcune modifiche incautamente). Dovremo quindi correggerla. Per farlo, consiglio di copiare i byte della grafica dall'ultimo backup funzionante o da una rom vergine (quest'ultimo caso solo se non avete mai modificato quel tileset). A seconda dell'estensione della corruzione dovrete prendere un quantitativo maggiore di byte, ma in linea di massima direi che copiare qualche riga dovrebbe bastare. Fate attenzione a non sovrascrivere nessun dato che si trovi dopo la grafica del tileset che state tentando di correggere!



Questi sono errori che mi sono capitati personalmente mentre lavoravo alla mia rom hack, e le soluzioni sono quelle che ho personalmente messo in atto per sistemarli. Se a voi sono capitati errori diversi che hanno richiesto soluzioni alternative, sarei felice di sentirle e aggiungerle alla guida.

P.S. NON inserite le mappe con la funzione di Advance Map (File -> Map -> Insert map). Quella funzione è sempre stata buggata, non controlla correttamente dove inserirle e porta quasi sempre a sovrascrivere altri dati. NON INSERITE LE MAPPE CON ADVANCE MAP. MAI. PER NESSUNA RAGIONE. Se avete creato una mappa su una rom di prova e volete copia-incollarla su un'altra rom, il procedimento è:
- Salvare la mappa (File -> Map -> Save map as).
- Aprire la rom in cui volete inserirla, e la mappa al posto della quale volete inserirla.
- Aprire la mappa salvata (File -> Map -> Open map).
- A questo punto, NON inserite la mappa. Quello che dovete fare è copia-incollarla manualmente: Ctrl + tasto destro del mouse, trascinate il cursore, selezionate un pezzo di mappa; Aprite la mappa di destinazione, e incollatelo lì. Ripeti finché non avete copia-incollato tutta la mappa. È un procedimento lento e meccanico e noioso da morire, ma è sicuro.
 Mi Piace Ricevuti: 
eMMe97, PacoScarso, Andrea, Bonnox, Boh, 80C, ~Ketan, IvanFGK like this post
Cita messaggio }
#2
Io penso che dopo tutta la fatica che stai facendo smembrando Ruby con tutti i bug che ci capitano, tu sia secondo a pochi in Italia, sia per quanto riguarda script e problem solving sia per quanto riguarda la dedizione nel finire le cose.
Ah dimenticavo, eccellente stesura, tutte le guide che hai scritto sono al top.
Contributo al forum 10/10
Contributo a Drab 9/10
Contributo all’enciclopedia delle bestemmie 12/10
Heart
 Mi Piace Ricevuti: 
Cita messaggio }




Utenti che stanno guardando questa discussione: 1 Ospite(i)