Questo Forum utilizza i Cookies
Questo Forum fa uso di Cookies per memorizzare le informazioni di login se sei registrato o sulla tua ultima visita se non siete registrati. I Cookies sono piccoli documenti di testo memorizzati sul vostro computer; i Cookies impostati dal Forum possono essere utilizzati solo su questo sito e non costituiscono rischio per la sicurezza. I Cookies su questo forum servono anche a monitorare gli argomenti specifici che hai letto. Si prega di confermare se accettare o rifiutare i Cookies impostati.

Un cookie verrà memorizzato nel browser indipendentemente dalla scelta, per evitare che il Forum faccia nuovamente questa domanda. Sarete in grado di modificare le impostazioni dei cookies in qualsiasi momento tramite il link a piè di pagina

Rispondi 
[Gba] Struttura dati dei Pok√©mon in squadra - Infliggere status alterati con WTBO e altro
Flygon
Dessert Spirit
******
Offline

Messaggi: 2,707
Registrato: 13-06-2014
Reputazione: 47
Mi Piace Ricevuti: 2134
PH Points: 13,704.00
Messaggio: #1
Struttura dati dei Pokémon in squadra - Infliggere status alterati con WTBO e altro
FONTI

Bulbapedia - Pokémon data structure (Gen III)
Bulbapedia - Pokémon data sub-structure (Gen III)
Pokemonhacking.it - 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:
writebytetoffset 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:
00
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".
Citazione:writebytetoffset 0x08 0x030043B0: Avvelenato
writebytetoffset 0x10 0x030043B0: Scottato
writebytetoffset 0x20 0x030043B0: Congelato
writebytetoffset 0x40 0x030043B0: Paralizzato
writebytetoffset 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. Ricordatevi che stiamo lavorando in binario, quindi se vogliamo che dorma per 5 turni dovremo scrivere:
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
writebytetoffset 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: Potremmo 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.



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!

23-03-2022 05:24 PM
Cerca Cita
 Mi piace ricevuti da: Bonnox , eMMe97 , Boh , Avon , s n a r m p h
eMMe97
Professione: Genio
******
Offline

Messaggi: 1,740
Registrato: 09-10-2014
Reputazione: 30
Mi Piace Ricevuti: 2223
PH Points: 5,248.00
Messaggio: #2
RE: Struttura dati dei Pokémon in squadra
Ma che bbbbbravooo!!!
23-03-2022 08:32 PM
Cerca Cita
 Mi piace ricevuti da: Flygon , IvanFGK
IvanFGK
Scemo chi Legge!
*******
Offline

Messaggi: 7,521
Registrato: 12-06-2014
Reputazione: 64
Mi Piace Ricevuti: 4544
PH Points: 22,301.00
Messaggio: #3
RE: Struttura dati dei Pokémon in squadra
Anzi che @Andrea tira fuori guide così scritte bene. Pacman Heart
Flygon capo drabbone Heart
23-03-2022 09:16 PM
Sito Web Cerca Cita
Rispondi 




Utente(i) che stanno guardando questa discussione: 1 Ospite(i)
Powered by MyBB, © 2002-2022 MyBB Group. Copyright ¬© | 2022 Pok√©mon Hacking