about summary refs log tree commit diff stats
diff options
context:
space:
mode:
-rw-r--r--gba/source/serialize.c31
-rw-r--r--include/pokemon.h7
2 files changed, 33 insertions, 5 deletions
diff --git a/gba/source/serialize.c b/gba/source/serialize.c index f5446ef..ddb156c 100644 --- a/gba/source/serialize.c +++ b/gba/source/serialize.c
@@ -12,6 +12,20 @@
12#include "dexorder.h" 12#include "dexorder.h"
13#include "sha2.h" 13#include "sha2.h"
14 14
15// See pokemon.h for more information about this.
16struct HashDeterminer {
17 u32 otId;
18 u32 personality;
19 u32 hpIV:5;
20 u32 attackIV:5;
21 u32 defenseIV:5;
22 u32 speedIV:5;
23 u32 spAttackIV:5;
24 u32 spDefenseIV:5;
25 u32 isShedinja:1;
26 u32 zero:1;
27};
28
15u32 CalculateStat( 29u32 CalculateStat(
16 u8 base, 30 u8 base,
17 u32 iv, 31 u32 iv,
@@ -50,13 +64,20 @@ void PokemonIntermediateInit(
50 struct PokemonSubstruct2* sub2 = GetBoxPokemonSubstruct2(bpkm); 64 struct PokemonSubstruct2* sub2 = GetBoxPokemonSubstruct2(bpkm);
51 struct PokemonSubstruct3* sub3 = GetBoxPokemonSubstruct3(bpkm); 65 struct PokemonSubstruct3* sub3 = GetBoxPokemonSubstruct3(bpkm);
52 66
53 u32 identifier[3]; 67 struct HashDeterminer identifier;
54 identifier[0] = bpkm->otId; // original trainer 68 identifier.otId = bpkm->otId;
55 identifier[1] = bpkm->personality; // personality value 69 identifier.personality = bpkm->personality;
56 identifier[2] = ((const u32*)sub3)[1]; // IVs (plus two non-random bits) 70 identifier.hpIV = sub3->hpIV;
71 identifier.attackIV = sub3->attackIV;
72 identifier.defenseIV = sub3->defenseIV;
73 identifier.speedIV = sub3->speedIV;
74 identifier.spAttackIV = sub3->spAttackIV;
75 identifier.spDefenseIV = sub3->spDefenseIV;
76 identifier.isShedinja = (sub0->species == SHEDINJA_SPECIES_INDEX) ? 1 : 0;
77 identifier.zero = 0;
57 78
58 sha224( 79 sha224(
59 (const unsigned char*)identifier, 80 (const unsigned char*)&identifier,
60 12, 81 12,
61 (unsigned char*)pki->key); 82 (unsigned char*)pki->key);
62 83
diff --git a/include/pokemon.h b/include/pokemon.h index 95af35e..dbf0d41 100644 --- a/include/pokemon.h +++ b/include/pokemon.h
@@ -35,6 +35,13 @@ struct __attribute__((aligned(4))) PokemonIntermediate {
35 // while not uniformly random (amongst Pokémon), is included as a sort of 35 // while not uniformly random (amongst Pokémon), is included as a sort of
36 // "namespace", in that any Pokémon with matching PVs and IVs must also have 36 // "namespace", in that any Pokémon with matching PVs and IVs must also have
37 // the same OT, thus preventing collaboratively finding PV and IV collisions. 37 // the same OT, thus preventing collaboratively finding PV and IV collisions.
38 // there is one deterministic way that two Pokémon can have the same hash:
39 // when a Nincada evolves into a Ninjask and a Shedinja is generated, the
40 // Shedinja is guaranteed to have the same IVs and personality value as the
41 // Ninjask. we circumvent this by also including a boolean in the hash which
42 // is set to true if the Pokémon is a Shedinja, and false otherwise. this
43 // differentiates a Shedinja from the Ninjask it came from, but also allows
44 // the Ninjask to be associated with the Nincada it used to be.
38 u32 key[7]; 45 u32 key[7];
39 46
40 u32 experience; 47 u32 experience;