about summary refs log tree commit diff stats
path: root/gba
diff options
context:
space:
mode:
authorKelly Rauchenberger <fefferburbia@gmail.com>2017-09-24 19:54:16 -0400
committerKelly Rauchenberger <fefferburbia@gmail.com>2017-09-24 19:54:16 -0400
commit8d9df7cc26ef86c7af1d4aa6fd4633667bb3a743 (patch)
tree361e0f09222e6254b45c9f4003a76ff4b4cc944b /gba
parent433df9a40045288ab70ab4f317bdd5e4e53ecb1b (diff)
downloadgen3uploader-8d9df7cc26ef86c7af1d4aa6fd4633667bb3a743.tar.gz
gen3uploader-8d9df7cc26ef86c7af1d4aa6fd4633667bb3a743.tar.bz2
gen3uploader-8d9df7cc26ef86c7af1d4aa6fd4633667bb3a743.zip
Fixed Shedinja hash collision
A Shedinja will always have the same IVs, personality value, and
original trainer as the Nincada that generated it, meaning that it is
guaranteed to have the same hash as the Ninjask that the Nincada evolved
into. To cirvument this, there is now a boolean field in the hash
determiner that is set if and only if the Pokémon is a Shedinja. This
allows the Ninjask to be considered the same Pokémon as the Nincada it
evolved from, but for the Shedinja to be considered a new Pokémon.

Because the hash determiner has changed, all old hashes are now invalid.
Diffstat (limited to 'gba')
-rw-r--r--gba/source/serialize.c31
1 files changed, 26 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