summaryrefslogtreecommitdiff
path: root/arm9/src
diff options
context:
space:
mode:
Diffstat (limited to 'arm9/src')
-rw-r--r--arm9/src/itemtool.c4
-rw-r--r--arm9/src/nutdata.c20
-rw-r--r--arm9/src/pokedex.c784
-rw-r--r--arm9/src/pokemon.c2
-rw-r--r--arm9/src/save_arrays.c3
5 files changed, 798 insertions, 15 deletions
diff --git a/arm9/src/itemtool.c b/arm9/src/itemtool.c
index 75785ee8..6b892d6d 100644
--- a/arm9/src/itemtool.c
+++ b/arm9/src/itemtool.c
@@ -810,8 +810,8 @@ u32 GetItemAttr_PreloadedItemData(struct ItemData * itemData, u32 attr)
return itemData->unk6;
case ITEMATTR_NATURAL_GIFT_POWER:
return itemData->naturalGiftPower;
- case ITEMATTR_UNK8_0:
- return itemData->unk8_0;
+ case ITEMATTR_NATURAL_GIFT_TYPE:
+ return itemData->naturalGiftType;
case ITEMATTR_UNK8_B:
return itemData->unk8_B;
case ITEMATTR_PARTY_USE:
diff --git a/arm9/src/nutdata.c b/arm9/src/nutdata.c
index 27c600fa..2d51b2d3 100644
--- a/arm9/src/nutdata.c
+++ b/arm9/src/nutdata.c
@@ -36,27 +36,27 @@ u32 GetNutAttr(struct NutData * nut, u32 attr)
switch (attr)
{
case 0:
- return nut->unk0;
+ return nut->size;
case 1:
- return nut->unk2;
+ return nut->firmness;
case 2:
- return nut->unk3;
+ return nut->yieldCategory;
case 3:
- return nut->unk4;
+ return nut->stageDuration;
case 4:
return nut->unk5;
case 5:
- return nut->unk6;
+ return nut->spicy;
case 6:
- return nut->unk7;
+ return nut->dry;
case 7:
- return nut->unk8;
+ return nut->sweet;
case 8:
- return nut->unk9;
+ return nut->bitter;
case 9:
- return nut->unkA;
+ return nut->sour;
case 10:
- return nut->unkB;
+ return nut->smoothness;
default:
return 0;
}
diff --git a/arm9/src/pokedex.c b/arm9/src/pokedex.c
new file mode 100644
index 00000000..307196bc
--- /dev/null
+++ b/arm9/src/pokedex.c
@@ -0,0 +1,784 @@
+#include "global.h"
+#include "save_block_2.h"
+#include "heap.h"
+#include "MI_memory.h"
+#include "pokemon.h"
+#include "pokedex.h"
+#include "unk_02087A1C.h"
+#include "constants/species.h"
+
+#pragma thumb on
+
+static inline BOOL CheckDexFlag(u8 * flagArray, u16 species)
+{
+ species--;
+ return (flagArray[species >> 3] & (1 << (species & 7))) != 0;
+}
+
+static inline void UpdateDexFlag(u8 * flagArray, u16 species, u8 state)
+{
+ GF_ASSERT(state < 2);
+ species--;
+ flagArray[species >> 3] &= ~(1 << (species & 7));
+ flagArray[species >> 3] |= (state << (species & 7));
+}
+
+static inline void SetDexFlag(u8 * flagArray, u16 species)
+{
+ species--;
+ flagArray[species >> 3] |= (1 << (species & 7));
+}
+
+static inline s32 CheckDexFlagPair(u8 * flagArray, u16 offset)
+{
+ return (flagArray[offset >> 2] >> (2 * (offset & 3))) & 3;
+}
+
+static inline void UpdateDexFlagPair(u8 * flagArray, u16 offset, u8 state)
+{
+ GF_ASSERT(state < 4);
+ flagArray[offset >> 2] &= ~(3 << (2 * (offset & 3)));
+ flagArray[offset >> 2] |= (state << (2 * (offset & 3)));
+}
+
+u32 Sav2_Pokedex_sizeof(void)
+{
+ return sizeof(struct Pokedex);
+}
+
+struct Pokedex * Sav2_Pokedex_new(u32 heap_id)
+{
+ struct Pokedex * ret = (struct Pokedex *)AllocFromHeap(heap_id, sizeof(struct Pokedex));
+ Sav2_Pokedex_init(ret);
+ return ret;
+}
+
+void Sav2_Pokedex_Copy(const struct Pokedex * src, struct Pokedex * dest)
+{
+ MI_CpuCopy8(src, dest, sizeof(struct Pokedex));
+}
+
+s32 FUN_02023D8C(struct Pokedex * pokedex, u32 species)
+{
+ GF_ASSERT(species == SPECIES_SHELLOS || species == SPECIES_GASTRODON);
+ if (!FUN_020245F0(pokedex, (u16)species))
+ return 0;
+ u8 *flags = species == SPECIES_SHELLOS ? &pokedex->field_0108[0] : &pokedex->field_0108[1];
+ BOOL r2 = CheckDexFlag(flags, 1);
+ BOOL r0 = CheckDexFlag(flags, 2);
+ return (r2 == r0) ? 1 : 2;
+}
+
+BOOL FUN_02023DEC(struct Pokedex * pokedex, u32 species, u8 state)
+{
+ GF_ASSERT(species == SPECIES_SHELLOS || species == SPECIES_GASTRODON);
+ if (!FUN_020245F0(pokedex, (u16)species))
+ return FALSE;
+ u8 *flags = species == SPECIES_SHELLOS ? &pokedex->field_0108[0] : &pokedex->field_0108[1];
+ u32 r0 = (u32)FUN_02023D8C(pokedex, species);
+ for (int i = 0; i < r0; i++)
+ {
+ BOOL r2 = CheckDexFlag(flags, (u16)(i + 1));
+ if (r2 == state)
+ return TRUE;
+ }
+ return FALSE;
+}
+
+void FUN_02023E70(struct Pokedex * pokedex, u32 species, u32 state)
+{
+ GF_ASSERT(species == SPECIES_SHELLOS || species == SPECIES_GASTRODON);
+ if (FUN_02023DEC(pokedex, species, (u8)state))
+ return;
+ u8 *flags = species == SPECIES_SHELLOS ? &pokedex->field_0108[0] : &pokedex->field_0108[1];
+ s32 r5 = FUN_02023D8C(pokedex, species);
+ if (r5 < 2)
+ {
+ UpdateDexFlag(flags, (u16)(r5 + 1), (u8)state);
+ if (r5 == 0)
+ {
+ UpdateDexFlag(flags, (u16)(r5 + 2), (u8)state);
+ }
+ }
+}
+
+s32 FUN_02023F2C(struct Pokedex * pokedex, u32 species)
+{
+ GF_ASSERT(species == SPECIES_BURMY || species == SPECIES_WORMADAM);
+ if (!FUN_020245F0(pokedex, (u16)species))
+ return 0;
+ u8 *flags = species == SPECIES_BURMY ? &pokedex->field_010A[0] : &pokedex->field_010A[1];
+ s32 i;
+ for (i = 0; i < 3; i++)
+ {
+ s32 r2 = CheckDexFlagPair(flags, (u16)i);
+ if (r2 == 3)
+ break;
+ }
+ return i;
+}
+
+BOOL FUN_02023F88(struct Pokedex * pokedex, u32 species, u8 state)
+{
+ GF_ASSERT(species == SPECIES_BURMY || species == SPECIES_WORMADAM);
+ if (!FUN_020245F0(pokedex, (u16)species))
+ return FALSE;
+ u8 *flags = species == SPECIES_BURMY ? &pokedex->field_010A[0] : &pokedex->field_010A[1];
+ s32 i;
+ for (i = 0; i < 3; i++)
+ {
+ s32 r2 = CheckDexFlagPair(flags, (u16)i);
+ if (r2 == state)
+ return TRUE;
+ }
+ return FALSE;
+}
+
+void FUN_02023FEC(struct Pokedex * pokedex, u32 species, s32 state)
+{
+ GF_ASSERT(species == SPECIES_BURMY || species == SPECIES_WORMADAM);
+ if (FUN_02023F88(pokedex, species, (u8)state))
+ return;
+ u8 *flags = species == SPECIES_BURMY ? &pokedex->field_010A[0] : &pokedex->field_010A[1];
+ s32 r5 = FUN_02023F2C(pokedex, species);
+ if (r5 >= 3)
+ return;
+ UpdateDexFlagPair(flags, (u16)r5, (u8)state);
+}
+
+static inline void SetDeoxysFormeFlag(struct Pokedex * pokedex, u8 r4, u8 r6)
+{
+ GF_ASSERT(r6 < 4);
+ GF_ASSERT(r4 <= 15);
+ if (r6 < 2)
+ {
+ pokedex->field_0040 &= ~(15 << (24 + 4 * r6));
+ pokedex->field_0040 |= r4 << (24 + 4 * r6);
+ }
+ else
+ {
+ r6 -= 2;
+ pokedex->field_0080 &= ~(15 << (24 + 4 * r6));
+ pokedex->field_0080 |= r4 << (24 + 4 * r6);
+ }
+}
+
+void FUN_02024068(struct Pokedex * pokedex, u8 r4, u8 r6)
+{
+ SetDeoxysFormeFlag(pokedex, r4, r6);
+}
+
+static inline u32 GetDeoxysFormeFlag(struct Pokedex * pokedex, u8 r6)
+{
+ if (r6 < 2)
+ {
+ return (pokedex->field_0040 >> (24 + 4 * r6)) & 15;
+ }
+ else
+ {
+ r6 -= 2;
+ return (pokedex->field_0080 >> (24 + 4 * r6)) & 15;
+ }
+}
+
+s32 FUN_020240D0(struct Pokedex * pokedex)
+{
+ s32 i;
+ for (i = 0; i < 4; i++)
+ {
+ u32 r2 = GetDeoxysFormeFlag(pokedex, (u8)i);
+ if (r2 == 15)
+ break;
+ }
+ return i;
+}
+
+BOOL FUN_02024114(struct Pokedex * pokedex, u32 state)
+{
+ s32 i;
+ for (i = 0; i < 4; i++)
+ {
+ u32 r4 = GetDeoxysFormeFlag(pokedex, (u8)i);
+ if (state == r4)
+ return TRUE;
+ }
+ return FALSE;
+}
+
+void FUN_0202415C(struct Pokedex * pokedex, u16 species, struct Pokemon * pokemon)
+{
+ u8 forme = (u8)GetMonData(pokemon, MON_DATA_FORME, NULL);
+ if (species == SPECIES_DEOXYS && !FUN_02024114(pokedex, forme))
+ {
+ s32 r2 = FUN_020240D0(pokedex);
+ FUN_02024068(pokedex, forme, (u8)r2);
+ }
+}
+
+void FUN_0202419C(struct Pokedex * pokedex)
+{
+ s32 i;
+ for (i = 0; i < 4; i++)
+ {
+ FUN_02024068(pokedex, 15, (u8)i);
+ }
+}
+
+static inline BOOL HasUnownLetterBeenSeen(struct Pokedex * pokedex, u8 letter)
+{
+ u8 * arr;
+ s32 i;
+ for (i = 0, arr = (u8 *)pokedex; i < 28; i++, arr++)
+ {
+ u8 val = arr[0x010C];
+ if (letter == val)
+ return TRUE;
+ }
+ return FALSE;
+}
+
+static inline s32 FindFirstAvailableUnownLetterSlot(struct Pokedex * pokedex)
+{
+ u8 * arr;
+ s32 i;
+ for (i = 0, arr = (u8 *)pokedex; i < 28; i++, arr++)
+ {
+ u8 val = arr[0x010C];
+ if (val == 0xFF)
+ break;
+ }
+ return i;
+}
+
+static inline void SetSeenUnownLetter(struct Pokedex * pokedex, u32 species, s32 letter)
+{
+#pragma unused(species)
+ s32 idx;
+ if (HasUnownLetterBeenSeen(pokedex, (u8)letter))
+ return;
+ idx = FindFirstAvailableUnownLetterSlot(pokedex);
+ if (idx >= 28)
+ return;
+ pokedex->field_010C[idx] = (u8)letter;
+}
+
+void FUN_020241B8(struct Pokedex * pokedex, u16 species, struct Pokemon * pokemon)
+{
+ if (species == SPECIES_UNOWN)
+ {
+ SetSeenUnownLetter(pokedex, species, GetMonUnownLetter(pokemon));
+ }
+ else if (species == SPECIES_BURMY)
+ {
+ FUN_02023FEC(pokedex, species, (s32)GetMonData(pokemon, MON_DATA_FORME, NULL));
+ }
+ else if (species == SPECIES_WORMADAM)
+ {
+ FUN_02023FEC(pokedex, species, (s32)GetMonData(pokemon, MON_DATA_FORME, NULL));
+ }
+ else if (species == SPECIES_SHELLOS)
+ {
+ FUN_02023E70(pokedex, species, GetMonData(pokemon, MON_DATA_FORME, NULL));
+ }
+ else if (species == SPECIES_GASTRODON)
+ {
+ FUN_02023E70(pokedex, species, GetMonData(pokemon, MON_DATA_FORME, NULL));
+ }
+ else if (species == SPECIES_DEOXYS)
+ {
+ FUN_0202415C(pokedex, species, pokemon);
+ }
+}
+
+void FUN_02024294(struct Pokedex * pokedex, u32 species, u32 language)
+{
+ s32 r4 = FUN_02087A50(species);
+ s32 r0 = FUN_02087A1C(language);
+ if (r4 != 14 && r0 != 6)
+ {
+ pokedex->field_0129[r4] |= (1 << r0);
+ }
+}
+
+s32 FUN_020242C8(struct Pokedex * pokedex, u16 species, s32 r4)
+{
+ u8 r0;
+ u8 r1;
+ if (GetMonBaseStat(species, BASE_GENDER_RATIO) == MON_RATIO_UNKNOWN)
+ {
+ return r4 == 0 ? 2 : -1;
+ }
+ r1 = (u8)CheckDexFlag(pokedex->field_0084, species);
+ if (r4 == 1)
+ {
+ r0 = (u8)CheckDexFlag(pokedex->field_00C4, species);
+ if (r0 == r1)
+ return -1;
+ else
+ return r0;
+ }
+ return r1;
+}
+
+const u16 UNK_020EE940 = SPECIES_MANAPHY;
+
+const u16 UNK_020EE942[] = {
+ SPECIES_MEW,
+ SPECIES_LUGIA,
+ SPECIES_HO_OH,
+ SPECIES_CELEBI,
+ SPECIES_JIRACHI,
+ SPECIES_DEOXYS,
+ SPECIES_PHIONE,
+ SPECIES_MANAPHY,
+ SPECIES_DARKRAI,
+ SPECIES_SHAYMIN,
+ SPECIES_ARCEUS
+};
+
+BOOL FUN_02024340(u16 species)
+{
+ s32 i;
+ BOOL ret = TRUE;
+ for (i = 0; i < (s32)NELEMS(UNK_020EE942); i++)
+ {
+ if (species == UNK_020EE942[i])
+ ret = FALSE;
+ }
+ return ret;
+}
+
+BOOL FUN_02024364(u16 a0)
+{
+ BOOL ret = TRUE;
+ if (a0 == SPECIES_MANAPHY)
+ ret = FALSE;
+ return ret;
+}
+
+void Sav2_Pokedex_init(struct Pokedex * pokedex)
+{
+ memset(pokedex, 0, sizeof(struct Pokedex));
+ pokedex->magic = 0xBEEFCAFE;
+ pokedex->field_0139 = 0;
+ memset(pokedex->field_010C, 0xFF, 28);
+ pokedex->field_0108[0] = 0xFF;
+ pokedex->field_0108[1] = 0xFF;
+ pokedex->field_010A[0] = 0xFF;
+ pokedex->field_010A[1] = 0xFF;
+ FUN_0202419C(pokedex);
+}
+
+u16 FUN_020243C8(struct Pokedex * pokedex)
+{
+ GF_ASSERT(pokedex->magic == 0xBEEFCAFE);
+ s32 i;
+ s32 count = 0;
+ for (i = 1; i <= NATIONAL_DEX_COUNT; i++)
+ {
+ if (FUN_02024594(pokedex, (u16)i) == TRUE)
+ count++;
+ }
+ return (u16)count;
+}
+
+u16 FUN_02024404(struct Pokedex * pokedex)
+{
+ GF_ASSERT(pokedex->magic == 0xBEEFCAFE);
+ s32 i;
+ s32 count = 0;
+ for (i = 1; i <= NATIONAL_DEX_COUNT; i++)
+ {
+ if (FUN_020245F0(pokedex, (u16)i) == TRUE)
+ count++;
+ }
+ return (u16)count;
+}
+
+u16 FUN_02024440(struct Pokedex * pokedex)
+{
+ if (Pokedex_GetNatDexFlag(pokedex))
+ return FUN_02024404(pokedex);
+ else
+ return FUN_020244A4(pokedex);
+}
+
+u16 FUN_0202445C(struct Pokedex * pokedex)
+{
+ GF_ASSERT(pokedex->magic == 0xBEEFCAFE);
+ s32 i;
+ s32 count = 0;
+ for (i = 1; i <= NATIONAL_DEX_COUNT; i++)
+ {
+ if (FUN_02024594(pokedex, (u16)i) == TRUE && SpeciesToSinnohDexNo((u16)i) != 0)
+ count++;
+ }
+ return (u16)count;
+}
+
+u16 FUN_020244A4(struct Pokedex * pokedex)
+{
+ GF_ASSERT(pokedex->magic == 0xBEEFCAFE);
+ s32 i;
+ s32 count = 0;
+ for (i = 1; i <= NATIONAL_DEX_COUNT; i++)
+ {
+ if (FUN_020245F0(pokedex, (u16)i) == TRUE && SpeciesToSinnohDexNo((u16)i) != 0)
+ count++;
+ }
+ return (u16)count;
+}
+
+BOOL FUN_020244EC(struct Pokedex * pokedex)
+{
+ return FUN_02024518(pokedex) >= 482;
+}
+
+BOOL FUN_02024504(struct Pokedex * pokedex)
+{
+ return FUN_02024550(pokedex) >= 150;
+}
+
+u16 FUN_02024518(struct Pokedex * pokedex)
+{
+ s32 i;
+ u16 count = 0;
+ for (i = 1; i <= NATIONAL_DEX_COUNT; i++)
+ {
+ if (FUN_02024594(pokedex, (u16)i) == TRUE && FUN_02024340((u16)i) == TRUE)
+ count++;
+ }
+ return count;
+}
+
+u16 FUN_02024550(struct Pokedex * pokedex)
+{
+ s32 i;
+ u16 count = 0;
+ for (i = 1; i <= NATIONAL_DEX_COUNT; i++)
+ {
+ if (FUN_020245F0(pokedex, (u16)i) == TRUE && SpeciesToSinnohDexNo((u16)i) != 0 && FUN_02024364((u16)i) == TRUE)
+ count++;
+ }
+ return count;
+}
+
+static inline BOOL DexSpeciesIsInvalid(u16 species)
+{
+ if (species == SPECIES_NONE || species > NATIONAL_DEX_COUNT)
+ {
+ GF_ASSERT(0);
+ return TRUE;
+ }
+ return FALSE;
+}
+
+BOOL FUN_02024594(struct Pokedex * pokedex, u16 species)
+{
+ GF_ASSERT(pokedex->magic == 0xBEEFCAFE);
+ if (DexSpeciesIsInvalid(species))
+ return FALSE;
+ if (!CheckDexFlag(pokedex->field_0004, species) || !CheckDexFlag(pokedex->field_0044, species))
+ return FALSE;
+ return TRUE;
+}
+
+BOOL FUN_020245F0(struct Pokedex * pokedex, u16 species)
+{
+ GF_ASSERT(pokedex->magic == 0xBEEFCAFE);
+ if (DexSpeciesIsInvalid(species))
+ return FALSE;
+ return CheckDexFlag(pokedex->field_0044, species);
+}
+
+u32 FUN_02024648(struct Pokedex * pokedex, u32 a1)
+{
+ u32 r6;
+ GF_ASSERT(pokedex->magic == 0xBEEFCAFE);
+ if (a1 == 0)
+ r6 = (u32)pokedex->field_0104;
+ else
+ GF_ASSERT(0); // r6 is not initialized because execution should halt here
+ return r6;
+}
+
+s32 FUN_02024674(struct Pokedex * pokedex, u16 species, s32 r6)
+{
+ GF_ASSERT(pokedex->magic == 0xBEEFCAFE);
+ if (DexSpeciesIsInvalid(species))
+ return -1;
+ if (CheckDexFlag(pokedex->field_0044, species))
+ return FUN_020242C8(pokedex, species, r6);
+ else
+ return -1;
+}
+
+static inline s32 FindFirstAvailableUnownLetterSlot_2(struct Pokedex * pokedex)
+{
+ s32 i;
+ for (i = 0; i < 28; i++)
+ {
+ if (pokedex->field_010C[i] == 0xFF)
+ break;
+ }
+ return i;
+}
+
+s32 FUN_020246DC(struct Pokedex * pokedex, s32 a1)
+{
+ GF_ASSERT(pokedex->magic == 0xBEEFCAFE);
+ s32 i;
+ i = FindFirstAvailableUnownLetterSlot_2(pokedex);
+ if (i <= a1)
+ return -1;
+ return pokedex->field_010C[a1];
+}
+
+s32 FUN_0202471C(struct Pokedex * pokedex)
+{
+ GF_ASSERT(pokedex->magic == 0xBEEFCAFE);
+ return FindFirstAvailableUnownLetterSlot_2(pokedex);
+}
+
+BOOL FUN_02024748(struct Pokedex * pokedex, s32 a1)
+{
+ GF_ASSERT(pokedex->magic == 0xBEEFCAFE);
+ if (FUN_02023D8C(pokedex, SPECIES_SHELLOS) <= a1)
+ return -1;
+ GF_ASSERT(a1 < 2);
+ return CheckDexFlag(&pokedex->field_0108[0], (u16)(a1 + 1));
+}
+
+s32 FUN_020247A4(struct Pokedex * pokedex)
+{
+ GF_ASSERT(pokedex->magic == 0xBEEFCAFE);
+ return FUN_02023D8C(pokedex, SPECIES_SHELLOS);
+}
+
+BOOL FUN_020247C8(struct Pokedex * pokedex, s32 a1)
+{
+ GF_ASSERT(pokedex->magic == 0xBEEFCAFE);
+ if (FUN_02023D8C(pokedex, SPECIES_GASTRODON) <= a1)
+ return -1;
+ GF_ASSERT(a1 < 2);
+ return CheckDexFlag(&pokedex->field_0108[1], (u16)(a1 + 1));
+}
+
+s32 FUN_02024828(struct Pokedex * pokedex)
+{
+ GF_ASSERT(pokedex->magic == 0xBEEFCAFE);
+ return FUN_02023D8C(pokedex, SPECIES_GASTRODON);
+}
+
+s32 FUN_0202484C(struct Pokedex * pokedex, s32 a1)
+{
+ GF_ASSERT(pokedex->magic == 0xBEEFCAFE);
+ if (FUN_02023F2C(pokedex, SPECIES_BURMY) <= a1)
+ return -1;
+ GF_ASSERT(a1 < 3);
+ return CheckDexFlagPair(&pokedex->field_010A[0], (u16)a1);
+}
+
+s32 FUN_0202489C(struct Pokedex * pokedex)
+{
+ GF_ASSERT(pokedex->magic == 0xBEEFCAFE);
+ return FUN_02023F2C(pokedex, SPECIES_BURMY);
+}
+
+s32 FUN_020248BC(struct Pokedex * pokedex, s32 a1)
+{
+ GF_ASSERT(pokedex->magic == 0xBEEFCAFE);
+ if (FUN_02023F2C(pokedex, SPECIES_WORMADAM) <= a1)
+ return -1;
+ GF_ASSERT(a1 < 3);
+ return CheckDexFlagPair(&pokedex->field_010A[1], (u16)a1);
+}
+
+s32 FUN_0202490C(struct Pokedex * pokedex)
+{
+ GF_ASSERT(pokedex->magic == 0xBEEFCAFE);
+ return FUN_02023F2C(pokedex, SPECIES_WORMADAM);
+}
+
+s32 FUN_02024930(struct Pokedex * pokedex, s32 a1)
+{
+ GF_ASSERT(pokedex->magic == 0xBEEFCAFE);
+ return (s32)GetDeoxysFormeFlag(pokedex, (u8)a1);
+}
+
+s32 FUN_02024970(struct Pokedex * pokedex)
+{
+ GF_ASSERT(pokedex->magic == 0xBEEFCAFE);
+ return FUN_020240D0(pokedex);
+}
+
+static inline void SetSeenCaughtGender(struct Pokedex * pokedex, u16 species, u8 gender)
+{
+ GF_ASSERT(gender <= 2);
+ if (gender == 2)
+ gender = 0;
+ UpdateDexFlag(pokedex->field_00C4, species, gender);
+ UpdateDexFlag(pokedex->field_0084, species, gender);
+}
+
+static inline void SetSeenGender(struct Pokedex * pokedex, u16 species, u8 gender)
+{
+ GF_ASSERT(gender <= 2);
+ if (gender == 2)
+ gender = 0;
+ UpdateDexFlag(pokedex->field_00C4, species, gender);
+}
+
+void FUN_0202498C(struct Pokedex * pokedex, struct Pokemon * pokemon)
+{
+ u16 species = (u16)GetMonData(pokemon, MON_DATA_SPECIES, NULL);
+ u32 personality = GetMonData(pokemon, MON_DATA_PERSONALITY, NULL);
+ u32 gender = GetMonGender(pokemon);
+ GF_ASSERT(pokedex->magic == 0xBEEFCAFE);
+ if (DexSpeciesIsInvalid(species))
+ return;
+ if (!CheckDexFlag(pokedex->field_0044, species))
+ {
+ if (species == SPECIES_SPINDA)
+ pokedex->field_0104 = personality;
+ SetSeenCaughtGender(pokedex, species, (u8)gender);
+ }
+ else
+ {
+ u8 seen_gender = (u8)CheckDexFlag(pokedex->field_0084, species);
+ if (seen_gender != gender)
+ {
+ SetSeenGender(pokedex, species, (u8)gender);
+ }
+ }
+ FUN_020241B8(pokedex, species, pokemon);
+ SetDexFlag(pokedex->field_0044, species);
+}
+
+void FUN_02024AF0(struct Pokedex * pokedex, struct Pokemon * pokemon)
+{
+ u32 language; // sp08
+ u32 personality; // sp04
+ u32 gender; // r7
+ u16 species; // r6
+
+ species = (u16)GetMonData(pokemon, MON_DATA_SPECIES, NULL);
+ language = GetMonData(pokemon, MON_DATA_GAME_LANGUAGE, NULL);
+ personality = GetMonData(pokemon, MON_DATA_PERSONALITY, NULL);
+ gender = GetMonGender(pokemon);
+ GF_ASSERT(pokedex->magic == 0xBEEFCAFE);
+ if (DexSpeciesIsInvalid(species))
+ return;
+ if (!CheckDexFlag(pokedex->field_0044, species))
+ {
+ if (species == SPECIES_SPINDA)
+ pokedex->field_0104 = personality;
+ SetSeenCaughtGender(pokedex, species, (u8)gender);
+ }
+ else
+ {
+ u8 seen_gender = (u8)CheckDexFlag(pokedex->field_0084, species);
+ if (seen_gender != gender)
+ {
+ SetSeenGender(pokedex, species, (u8)gender);
+ }
+ }
+ FUN_020241B8(pokedex, species, pokemon);
+ FUN_02024294(pokedex, species, language);
+ SetDexFlag(pokedex->field_0004, species);
+ SetDexFlag(pokedex->field_0044, species);
+}
+
+void Pokedex_SetNatDexFlag(struct Pokedex * pokedex)
+{
+ GF_ASSERT(pokedex->magic == 0xBEEFCAFE);
+ pokedex->field_0139 = 1;
+}
+
+BOOL Pokedex_GetNatDexFlag(struct Pokedex * pokedex)
+{
+ GF_ASSERT(pokedex->magic == 0xBEEFCAFE);
+ return pokedex->field_0139;
+}
+
+BOOL FUN_02024CC4(struct Pokedex * pokedex)
+{
+ GF_ASSERT(pokedex->magic == 0xBEEFCAFE);
+ return pokedex->field_0128;
+}
+
+void FUN_02024CE0(struct Pokedex * pokedex)
+{
+ GF_ASSERT(pokedex->magic == 0xBEEFCAFE);
+ pokedex->field_0128 = 1;
+}
+
+s32 FUN_02024D00(struct Pokedex * pokedex, u32 species, u32 language)
+{
+ GF_ASSERT(language < 8);
+ GF_ASSERT(pokedex->magic == 0xBEEFCAFE);
+ s32 r5 = FUN_02087A50(species);
+ if (r5 == 14)
+ return 0;
+ s32 r0 = FUN_02087A1C(language);
+ return pokedex->field_0129[r5] & (1 << r0);
+}
+
+void FUN_02024D4C(struct Pokedex * pokedex)
+{
+ pokedex->field_0137 = 1;
+}
+
+BOOL FUN_02024D58(struct Pokedex * pokedex)
+{
+ return pokedex->field_0137;
+}
+
+BOOL FUN_02024D64(struct Pokedex * pokedex)
+{
+ GF_ASSERT(pokedex->magic == 0xBEEFCAFE);
+ return pokedex->field_0138;
+}
+
+void FUN_02024D80(struct Pokedex * pokedex)
+{
+ GF_ASSERT(pokedex->magic == 0xBEEFCAFE);
+ pokedex->field_0138 = 1;
+}
+
+struct Pokedex * FUN_02024DA0(struct SaveBlock2 * sav2)
+{
+ return (struct Pokedex *)SavArray_get(sav2, 7);
+}
+
+s32 FUN_02024DAC(struct Pokedex * pokedex, s32 a1, u32 a2)
+{
+ switch (a1)
+ {
+ case SPECIES_UNOWN:
+ if (a2 < FUN_0202471C(pokedex))
+ return FUN_020246DC(pokedex, (s32)a2);
+ break;
+ case SPECIES_SHELLOS:
+ if (a2 < FUN_020247A4(pokedex))
+ return FUN_02024748(pokedex, (s32)a2);
+ break;
+ case SPECIES_GASTRODON:
+ if (a2 < FUN_02024828(pokedex))
+ return FUN_020247C8(pokedex, (s32)a2);
+ break;
+ case SPECIES_BURMY:
+ if (a2 < FUN_0202489C(pokedex))
+ return FUN_0202484C(pokedex, (s32)a2);
+ break;
+ case SPECIES_WORMADAM:
+ if (a2 < FUN_0202490C(pokedex))
+ return FUN_020248BC(pokedex, (s32)a2);
+ break;
+ case SPECIES_DEOXYS:
+ if (a2 < FUN_02024970(pokedex))
+ return FUN_02024930(pokedex, (s32)a2);
+ break;
+ }
+ return 0;
+}
diff --git a/arm9/src/pokemon.c b/arm9/src/pokemon.c
index 347cb5ac..0fb6d121 100644
--- a/arm9/src/pokemon.c
+++ b/arm9/src/pokemon.c
@@ -3026,7 +3026,7 @@ u8 FUN_02069AEC(struct PlayerParty * party)
return ret;
}
-u16 FUN_02069B40(u16 species)
+u16 SpeciesToSinnohDexNo(u16 species)
{
u16 ret;
ReadFromNarcMemberByIdPair(&ret, NARC_POKETOOL_POKEZUKAN, 0, species * sizeof(u16), sizeof(u16));
diff --git a/arm9/src/save_arrays.c b/arm9/src/save_arrays.c
index bccdcc11..4ba492b8 100644
--- a/arm9/src/save_arrays.c
+++ b/arm9/src/save_arrays.c
@@ -11,10 +11,10 @@
#include "unk_020286F8.h"
#include "unk_020254B8.h"
#include "daycare.h"
+#include "pokedex.h"
extern u32 FUN_0202AC20(void);
extern u32 FUN_02034D7C(void);
-extern u32 Sav2_Pokedex_sizeof(void);
extern u32 FUN_02024E64(void);
extern u32 FUN_02034D80(void);
extern u32 FUN_02025954(void);
@@ -40,7 +40,6 @@ extern u32 FUN_0202C0E0(void);
extern u32 FUN_02013B28(void);
extern void FUN_0202AC28(void *);
extern void FUN_02034D98(void *);
-extern void Sav2_Pokedex_init(void *);
extern void FUN_02024E6C(void *);
extern void FUN_02034D88(void *);
extern void FUN_0202597C(void *);