23-03-2022, 06:24 PM
FONTI
Bulbapedia - Pokémon data structure (Gen III)
Bulbapedia - Pokémon data sub-structure (Gen III)
pokehack.altervista.org - Andrea: Offset attributes
INTRODUZIONE
Tempo fa lessi la guida di Andrea e la trovai incredibilmente affascinante. La possibilità di operare a piacimento sullo status di un Pokémon apre nuove possibilità in campo di scripting e storytelling. Sfortunatamente la sua è più una guida dimostrativa che non una informativa, e non riporta le informazioni necessarie nella loro completezza.
In particolare, sebbene la guida mostri come modificare lo status del primo Pokémon in squadra, non mostra come cambiarlo agli altri; e persino se la nostra intenzione fosse solo modificare lo status del primo in squdra, la dimostrazione in sé non basta, perché sono necessari altri check per rendere operabile lo script (ad esempio, controllare che il Pokémon non abbia altri status e non sia KO prima di avvelenarlo).
Questa guida serve quindi a sopperire a questa mancanza e a completare la già ottima guida di Andrea, di modo che qualcuno interessato ad operare queste modifiche ma che non dispone della necessaria documentazione possa trovarla qui in italiano e facilmente consultabile.
LA STRUTTURA DEI DATI
Ogni Pokémon in squadra ha associati 100 (0x64) byte. Bulbapedia ci informa della locazione di questi dati:
Citazione:Ruby: 0x03004360La stessa pagina di Bulbapedia ci informa anche riguardo al funzionamento di questi byte. Per facilità di consultazione riporto qui di seguito la tabella:
Emerald: 0x02024190 (0x020244EC nelle versioni US e FR del gioco)
Fire Red 0x02024284
Data structure (Clicca per visualizzare)
Memory viewer (Clicca per visualizzare)
Sapendo che ogni Pokémon ha cento byte associati e che i byte del primo Pokémon iniziano a 0x03004360, possiamo facilmente dedurre la posizione dei byte dei successivi cinque Pokémon facendo una semplice operazione matematica (aggiungiamo 0x64 a 0x03004360). Giungiamo così a conoscere la locazione dei dati di tutti i Pokémon:
Data location (Pokémon Ruby) (Clicca per visualizzare)
MODIFICARE I DATI
Come spiegato dall'ottima guida di Andrea, con un comando "Writebytetooffset" possiamo agire sui singoli byte che compongono il Pokémon, e cambiarne così alcune caratteristiche. Ad esempio, scrivendo:
Codice:
writebytetooffset 0x2 0x030043B0
Per una spiegazione più dettagliata di come funziona lo status consiglio di leggere la sua guida, ma per semplicità andrò a riassumerne i punti salienti qui di seguito.
Per comprendere il funzionamento di byte di status dobbiamo guardare al primo dei quattro byte di questo gruppo in forma binaria anziché esadecimale:
Codice:
HEX: 00
BINARY: 0000 0000
Citazione:0000 0000: SonnoPer modificare lo status a nostro piacimento, ci basta settare a 1 il numero corrispondente allo status che vogliamo attivare, dopodiché riconvertire il numero in esadecimale. Il numero risultante è quello che vogliamo impostare con il comando "Writebytetooffset". Ovviamente il comando usa valori in esadecimale, quindi per mettere a 1 la cifra corretta dovremo convertire il valore da binario a esadecimale, in questo modo:
0000 0000: Veleno
0000 0000: Scottatura
0000 0000: Congelamento
0000 0000: Paralisi
0000 0000: Iperavvelenato
Citazione:writebytetooffset 0x08 0x030043B0: AvvelenatoIl discorso è leggermente diverso per lo status Sonno, dove il numero che impostiamo si traduce nel numero di turni che il Pokémon passerà da addormentato. Invece di inserire 1 e basta, quindi, dovremmo pensare a quanti turni vogliamo che il Pokémon dorma, dopodiché impostare quel numero.
writebytetooffset 0x10 0x030043B0: Scottato
writebytetooffset 0x20 0x030043B0: Congelato
writebytetooffset 0x40 0x030043B0: Paralizzato
writebytetooffset 0x80 0x030043B0: Iperavvelenato
Codice:
DECIMALE: 5
BINARIO: 0000 0101
ESADECIMALE: 05
Citazione:writebytetooffset 0x05 0x030043B0La guida di Andrea si conclude qui, ma con le informazioni in nostro possesso possiamo fare un passo ulteriore in avanti.
COMPAREFARBYTETOBYTE
Prendiamo ad esempio il seguente script:
Codice:
#dynamic 0x800000
#org @start
writebytetooffset 0x2 0x030043B0
end
Mettiamo quindi un check per valutare quest'eventualità:
Codice:
#dynamic 0x800000
#org @slot1
comparefarbytetobyte 0x030043B6 0x0
if 1 goto @slot2
writebytetooffset 2 0x030043B0 'SLOT1
end
#org @slot2
comparefarbytetobyte 0x0300441A 0x0
if 1 goto @slot3
writebytetooffset 2 0x03004414 'SLOT2
end
#org @slot3
[...]
Così come abbiamo fatto un check per gli HP, possiamo fare un check per il byte corrispondente allo status, ed infliggere lo status solamente se il byte è 0 (che significa che il Pokémon non ha status inflitti).
COSA POSSIAMO MODIFICARE
Teoricamente parlando, tutto. In pratica, però, c'è un'alta probabilità che il Pokémon si tramuti istantaneamente in un BadEgg se non facciamo attenzione.
Citazione:Personality valueIn verde sono i valori che potete modificare senza timore con un WTBO. In rosso sono quelli che dovreste lasciare perdere. Il gioco esegue costantemente dei check incrociati per stabilire se un Pokémon sia valido oppure no - Se non lo è, lo tramuta immediatamente in un BadEgg.
Original trainer's ID number
Nickname
Language
Egg name
Original trainer's name
Markings
Checksum
???
Data
Status condition
Level
Pokérus (remaining)
HP (current)
HP (total)
ATK
DEF
SPD
S.ATK
S.DEF
Modificare, ad esempio, la natura di un Pokémon, dunque, va oltre le possibilità offerte da un semplice WTBO. Se cercate su Pokecommunity dovreste trovare delle routine ASM che facciano questo, ma sono esclusive per Fire Red o Emerald. Se volete segnalarne qualcuna qui, inserite pure il link in una risposta.
Le statistiche (in giallo) possono essere modificate, ma torneranno ai valori "normali" quando il pokémon salirà di livello, o nel caso in cui il Pokémon dovesse essere depositato nel PC o nella pensione.
Il livello può essere modificato, ma le statistiche non cambieranno con esso, e al prossimo level up il gioco va in freeze, quindi non toccatelo!
Ed eccoci alla fine della guida. Mi sono limitato solamente a raccogliere informazioni presenti in pagine in lingua inglese e riportarle qui, con qualche comodo esempio grafico per rendere più chiara la spiegazione, ma mi auguro che sia sufficiente.
Buon hacking a tutti!
Altre guide:
- Flag/ID/Var table - Lista flag e variabili libere e occupate
- Trainer AI - Guida al comportamento degli allenatori in battaglia
- Pokémon data structure - Struttura dei dati dei Pokémon in squadra, e come modificarli con un WTBO
- Cinematic event - Barre nere ai margini dello schermo
- Pokémon Ruby: Fanfare values - Valori per il comando fanfare
- Advance Map error "Invalid pointer to map footer": How to fix it
- Advance Map error "Error on compressed data" & "Access violation at address 00000000": How to fix it
- G3T - Offset per Rosso Fuoco ITA
- Hopeless Trainer Editor - Offset per Smeraldo ITA
- Cambiare impostazioni di default (velocità testo, stile lotta, etc...)