Pokémon data structure
I Pokémon depositati nei Box, in DPP, hanno una struttura di 136 bytes di dati. Tutti i valori non criptati sono conservati in formato little endian: il gioco cripta questi valori soltanto nel momento del salvataggio. I Pokémon nella squadra del player hanno poi dei valori aggiuntivi per tenere conto delle statistiche.
Questa č la struttura dei Pokémon dei box:
Parametri:-Checksum
Il Checksum ha una duplice funzione: quella di controllare i dati una volta decriptati e quella di fornire una chiave per criptare i dati stessi.
Si calcola in questo modo:
Si dividono i dati fra gli offsets 0x08 e 0x87 in words da due byte, si prende il sum delle parole e si tronca a 16 bit.
-Block Shuffling
La struttura di 128 bytes dei Pokémon č suddivisa in quattro substrutture da 32 bytes, che vengono ordinate secondo uno Shift Value derivato dal
Personality Value del Pokémon.
Se poniamo che questo Personality Value sia pv, questa č l'espressione con cui si puň ricavare lo Shift Value:
Shift Value = ((pv >> 0xD) & 0x1F) % 24
*pv >> 0xD č equivalente a una divisione per 8192.
In base allo Shift Value ottenuto, i quattro blocchi di informazioni che chiameremo A, B, C e D verranno disposti nei seguenti modi:
Shift Value (decimal) | Block Order |
---|
00 | ABCD |
01 | ABDC |
02 | ACBD |
03 | ACDB |
04 | ADBC |
05 | ADCB |
06 | BACD |
07 | BADC |
08 | BCAD |
09 | BCDA |
10 | BDAC |
11 | BDCA |
12 | CABD |
13 | CADB |
14 | CBAD |
15 | CBDA |
16 | CDAB |
17 | CDBA |
18 | DABC |
19 | DACB |
20 | DBAC |
21 | DBCA |
22 | DCAB |
23 | DCBA |
-Encryption
Per cifrare i dati vengono usati dei prng (Pseudo Random Number Generator), in questo caso dei generatori di numeri casuali con il metodo della congruenza lineare. Gli elementi del PRNG possono essere definiti tramite la successione per ricorrenza:
X[n+1] = (0x41C64E6D * X[n] + 0x6073)
Per decrittare i dati, data una funzione ran(), che restituisce i primi 2 bytes trasformati tramite la successione da poco enunciata.
Bisogna seedare il PRNG tramite la somma di controllo (sia Xn la somma di controllo). Sequenzialmente, per ogni parola di due byte (denotata con Y) da 0x08 a 0x87, si applica la seguente trasformazione: byte non criptato = Y xor rand()
dove lo xor č l'algoritmo di disgiunzione esclusiva. Infine ogni blocco viene riordinato tramite l'algoritmo di cui si č parlato precedentemente.
Per criptare i dati, usiamo invece l'algoritmo di riordinamento prima di applicare le altre funzioni.
Unencrypted Bytes:Encrypted Bytes:Blocco A
Offset | Contents |
---|
0x08-0x09 | Species ID |
0x0A-0x0B | Held Item |
0x0C-0x0D | OT ID |
0x0E-0x0F | OT Secret ID |
0x10-0x13 | Experience points |
0x14 | Friendship/Egg Steps to Hatch |
0x15 | Ability |
0x16 | Markings |
0x17 | Country of Origin |
0x18-0x1D | Effort values |
0x1E-0x23 | Contest stats |
0x24-0x27 | Ribbons |
Blocco B
Offset | Contents |
---|
0x28-0x2F | Moveset |
0x30-0x33 | Move PP |
0x34-0x37 | Move PP Ups |
0x38-0x3B | Bits 0-29 - Individual values Bit 30 - IsNicknamed Flag Bit 31 - IsEgg Flag |
0x3C-0x3F | Ribbons 2 |
0x40-0x41 | Bit 0 - Fateful Encountered Flag Bit 1 - Female Bit 2 - Genderless Bit 3-15 - Alternate Forms (Form Index << 3) |
0x42-0x43 | Unknown |
0x44-0x45 | Platinum Egg Location |
0x46-0x47 | Platinum Met at Location |
Blocco C
Offset | Contents |
---|
0x48-0x5D | Nickname |
0x5E-0x5F | Hometown |
0x60-0x63 | Contests |
0x64-0x67 | Unknown |
Blocco D
Offset | Contents |
---|
0x68-0x77 | OT Name |
0x78-0x7A | Date Egg Received |
0x7B-0x7D | Date Met |
0x7E-0x7F | Diamond/Pearl Egg Location |
0x80-0x81 | Diamond/Pearl Met At Location |
0x82 | Pokérus |
0x83 | Poké Ball |
0x84 | Bit 0-6 - Met At Level Bit 7 - Female OT Gender |
0x85 | Encounter Type |
0x86 | HG/SS Poké Ball |
0x87 | Performance (unused in DPPt) |
Ribbons:DP immagazzina i dati dei fiocchi in words da 16 bit, ordinati come segue:
Bit | Ribbon |
---|
0x25 & 0x01 | Sinnoh Champ Ribbon |
0x25 & 0x02 | Ability Ribbon |
0x25 & 0x04 | Great Ability Ribbon |
0x25 & 0x08 | Double Ability Ribbon |
0x25 & 0x10 | Multi Ability Ribbon |
0x25 & 0x20 | Pair Ability Ribbon |
0x25 & 0x40 | World Ability Ribbon |
0x25 & 0x80 | Alert Ribbon |
0x24 & 0x01 | Shock Ribbon |
0x24 & 0x02 | Downcast Ribbon |
0x24 & 0x04 | Careless Ribbon |
0x24 & 0x08 | Relax Ribbon |
0x24 & 0x10 | Snooze Ribbon |
0x24 & 0x20 | Smile Ribbon |
0x24 & 0x40 | Gorgeous Ribbon |
0x24 & 0x80 | Royal Ribbon |
Bit | Ribbon |
---|
0x27 & 0x01 | Gorgeous Royal Ribbon |
0x27 & 0x02 | Footprint Ribbon |
0x27 & 0x04 | Record Ribbon |
0x27 & 0x08 | History Ribbon |
0x27 & 0x10 | Legend Ribbon |
0x27 & 0x20 | Red Ribbon |
0x27 & 0x40 | Green Ribbon |
0x27 & 0x80 | Blue Ribbon |
0x26 & 0x01 | Festival Ribbon |
0x26 & 0x02 | Carnival Ribbon |
0x26 & 0x04 | Classic Ribbon |
0x26 & 0x08 | Premier Ribbon |
Bit | Ribbon |
---|
0x3D & 0x01 | Cool Ribbon |
0x3D & 0x02 | Cool Ribbon Super |
0x3D & 0x04 | Cool Ribbon Hyper |
0x3D & 0x08 | Cool Ribbon Master |
0x3D & 0x10 | Beauty Ribbon |
0x3D & 0x20 | Beauty Ribbon Super |
0x3D & 0x40 | Beauty Ribbon Hyper |
0x3D & 0x80 | Beauty Ribbon Master |
0x3C & 0x01 | Cute Ribbon |
0x3C & 0x02 | Cute Ribbon Super |
0x3C & 0x04 | Cute Ribbon Hyper |
0x3C & 0x08 | Cute Ribbon Master |
0x3C & 0x10 | Smart Ribbon |
0x3C & 0x20 | Smart Ribbon Super |
0x3C & 0x40 | Smart Ribbon Hyper |
0x3C & 0x80 | Smart Ribbon Master |
Bit | Ribbon |
---|
0x3F & 0x01 | Tough Ribbon |
0x3F & 0x02 | Tough Ribbon Super |
0x3F & 0x04 | Tough Ribbon Hyper |
0x3F & 0x08 | Tough Ribbon Master |
0x3F & 0x10 | Champion Ribbon |
0x3F & 0x20 | Winning Ribbon |
0x3F & 0x40 | Victory Ribbon |
0x3F & 0x80 | Artist Ribbon |
0x3E & 0x01 | Effort Ribbon |
0x3E & 0x02 | Marine Ribbon |
0x3E & 0x04 | Land Ribbon |
0x3E & 0x08 | Sky Ribbon |
0x3E & 0x10 | Country Ribbon |
0x3E & 0x20 | National Ribbon |
0x3E & 0x40 | Earth Ribbon |
0x3E & 0x80 | World Ribbon |
Location:I Pokémon della squadra sono memorizzati nel save file con l'offset 0x00098 per il primo paio di blocchi, e con l'offset 0x40098 per il secondo paio. Ogni Pokémon pesa 236 bytes.
I Pokémon del pc sono memorizzati nel save file dal box 1 al 18. Iniziano con l'offset 0x0C104 nel primo paio di blocchi e con 0x4C104 nel secondo paio. Ogni Pokémon pesa 136 bytes.
Per un file csv con ogni box e ogni offset per ogni box slot,
cliccate qui.
Edited by Kameo - 7/2/2011, 21:33