Struttura interna dati Pokémon

« Older   Newer »
  Share  
Kameo
view post Posted on 7/2/2011, 20:50




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
00ABCD
01ABDC
02ACBD
03ACDB
04ADBC
05ADCB
06BACD
07BADC
08BCAD
09BCDA
10BDAC
11BDCA
12CABD
13CADB
14CBAD
15CBDA
16CDAB
17CDBA
18DABC
19DACB
20DBAC
21DBCA
22DCAB
23DCBA


-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:

OffsetContents
0x00-0x03Personality value
0x04-0x05Unknown
0x06-0x07Checksum


Encrypted Bytes:

Blocco A

OffsetContents
0x08-0x09Species ID
0x0A-0x0BHeld Item
0x0C-0x0DOT ID
0x0E-0x0FOT Secret ID
0x10-0x13Experience points
0x14Friendship/Egg Steps to Hatch
0x15Ability
0x16Markings
0x17Country of Origin
0x18-0x1DEffort values
0x1E-0x23Contest stats
0x24-0x27Ribbons



Blocco B

OffsetContents
0x28-0x2FMoveset
0x30-0x33Move PP
0x34-0x37Move PP Ups
0x38-0x3BBits 0-29 - Individual values
Bit 30 - IsNicknamed Flag
Bit 31 - IsEgg Flag
0x3C-0x3FRibbons 2
0x40-0x41Bit 0 - Fateful Encountered Flag
Bit 1 - Female
Bit 2 - Genderless
Bit 3-15 - Alternate Forms (Form Index << 3)
0x42-0x43Unknown
0x44-0x45Platinum Egg Location
0x46-0x47Platinum Met at Location



Blocco C

OffsetContents
0x48-0x5DNickname
0x5E-0x5FHometown
0x60-0x63Contests
0x64-0x67Unknown



Blocco D

OffsetContents
0x68-0x77OT Name
0x78-0x7ADate Egg Received
0x7B-0x7DDate Met
0x7E-0x7FDiamond/Pearl Egg Location
0x80-0x81Diamond/Pearl Met At Location
0x82Pokérus
0x83Poké Ball
0x84Bit 0-6 - Met At Level
Bit 7 - Female OT Gender
0x85Encounter Type
0x86HG/SS Poké Ball
0x87Performance (unused in DPPt)


Ribbons:

DP immagazzina i dati dei fiocchi in words da 16 bit, ordinati come segue:

BitRibbon
0x25 & 0x01Sinnoh Champ Ribbon
0x25 & 0x02Ability Ribbon
0x25 & 0x04Great Ability Ribbon
0x25 & 0x08Double Ability Ribbon
0x25 & 0x10Multi Ability Ribbon
0x25 & 0x20Pair Ability Ribbon
0x25 & 0x40World Ability Ribbon
0x25 & 0x80Alert Ribbon
0x24 & 0x01Shock Ribbon
0x24 & 0x02Downcast Ribbon
0x24 & 0x04Careless Ribbon
0x24 & 0x08Relax Ribbon
0x24 & 0x10Snooze Ribbon
0x24 & 0x20Smile Ribbon
0x24 & 0x40Gorgeous Ribbon
0x24 & 0x80Royal Ribbon


BitRibbon
0x27 & 0x01Gorgeous Royal Ribbon
0x27 & 0x02Footprint Ribbon
0x27 & 0x04Record Ribbon
0x27 & 0x08History Ribbon
0x27 & 0x10Legend Ribbon
0x27 & 0x20Red Ribbon
0x27 & 0x40Green Ribbon
0x27 & 0x80Blue Ribbon
0x26 & 0x01Festival Ribbon
0x26 & 0x02Carnival Ribbon
0x26 & 0x04Classic Ribbon
0x26 & 0x08Premier Ribbon


BitRibbon
0x3D & 0x01Cool Ribbon
0x3D & 0x02Cool Ribbon Super
0x3D & 0x04Cool Ribbon Hyper
0x3D & 0x08Cool Ribbon Master
0x3D & 0x10Beauty Ribbon
0x3D & 0x20Beauty Ribbon Super
0x3D & 0x40Beauty Ribbon Hyper
0x3D & 0x80Beauty Ribbon Master
0x3C & 0x01Cute Ribbon
0x3C & 0x02Cute Ribbon Super
0x3C & 0x04Cute Ribbon Hyper
0x3C & 0x08Cute Ribbon Master
0x3C & 0x10Smart Ribbon
0x3C & 0x20Smart Ribbon Super
0x3C & 0x40Smart Ribbon Hyper
0x3C & 0x80Smart Ribbon Master


BitRibbon
0x3F & 0x01Tough Ribbon
0x3F & 0x02Tough Ribbon Super
0x3F & 0x04Tough Ribbon Hyper
0x3F & 0x08Tough Ribbon Master
0x3F & 0x10Champion Ribbon
0x3F & 0x20Winning Ribbon
0x3F & 0x40Victory Ribbon
0x3F & 0x80Artist Ribbon
0x3E & 0x01Effort Ribbon
0x3E & 0x02Marine Ribbon
0x3E & 0x04Land Ribbon
0x3E & 0x08Sky Ribbon
0x3E & 0x10Country Ribbon
0x3E & 0x20National Ribbon
0x3E & 0x40Earth Ribbon
0x3E & 0x80World 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
 
Top
0 replies since 7/2/2011, 20:50   51 views
  Share