Benvenuto Visitatore!  / Create an account

Valutazione discussione:
  • 0 voto(i) - 0 media
  • 1
  • 2
  • 3
  • 4
  • 5
[Gba] Struttura dati dei Pokémon in squadra - Infliggere status alterati con WTBO e altro
#1
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: 0x03004360
Emerald: 0x02024190 (0x020244EC nelle versioni US e FR del gioco)
Fire Red 0x02024284
La stessa pagina di Bulbapedia ci informa anche riguardo al funzionamento di questi byte. Per facilità di consultazione riporto qui di seguito la tabella:
Se faticate ad interpretare questa tabella, forse può esservi utile un esempio grafico, utilizzando il memory viewer del vostro emulatore preferito:
Per leggere informazioni più dettagliate su cosa significhi ogni voce, vi invito a leggere la pagina di Bulbapedia, il cui link è all'inizio di questa guida.

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)
Io ho riportato i dati per Pokémon Ruby, ma voi potete tranquillamente localizzare i dati su Fire Red o Emerald, partendo dall'offset del primo Pokémon in squadra (0x02024284 su Fire Red, 0x020244EC su Emerald) e aggiungendo 100 byte (0x64) per andare al secondo, il terzo e così via. Per farlo potete usare un quasiasi calcolatore esadecimale online.

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
Infliggeremo lo status di sonno al primo Pokémon in squadra.
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
Leggendo i numeri al contrario, il funzionamento è il seguente:
Citazione:0000 0000: Sonno
0000 0000: Veleno
0000 0000: Scottatura
0000 0000: Congelamento
0000 0000: Paralisi
0000 0000: Iperavvelenato
Per 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:
Citazione:writebytetooffset 0x08 0x030043B0: Avvelenato
writebytetooffset 0x10 0x030043B0: Scottato
writebytetooffset 0x20 0x030043B0: Congelato
writebytetooffset 0x40 0x030043B0: Paralizzato
writebytetooffset 0x80 0x030043B0: Iperavvelenato
Il 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.
Codice:
DECIMALE: 5
BINARIO: 0000 0101
ESADECIMALE: 05
Che si traduce in:
Citazione:writebytetooffset 0x05 0x030043B0
La 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
Questo script farà addormentare per due turni il primo Pokémon in squadra. Sfortunatamente non abbiamo modo di sapere se il Pokémon in questione sia un bersaglio valido o meno: rischiamo dunque di far addormentare un Pokémon KO.
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
[...]
Questo script compara il byte all'offset 0x030043B6 (gli HP del primo Pokémon in squadra) a 0. Se è 0 significa che il Pokémon ha 0 HP, cioè è svenuto, e in tal caso andrà a fare lo stesso check col secondo Pokémon, e così via.
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 value
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
In 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.
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!
 Mi Piace Ricevuti: 
eMMe97, Avon, Boh, s n a r m p h, Bonnox like this post
Cita messaggio
#2
Ma che bbbbbravooo!!!
 Mi Piace Ricevuti: 
Flygon and IvanFGK like this post
Cita messaggio
#3
Anzi che @Andrea tira fuori guide così scritte bene. Pacman Heart
Flygon capo drabbone Heart
 Mi Piace Ricevuti: 
Cita messaggio




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