diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/code_8092334.c | 8 | ||||
-rw-r--r-- | src/exclusive_pokemon_1.c | 24 | ||||
-rw-r--r-- | src/friend_area_1.c | 8 | ||||
-rw-r--r-- | src/game_options.c | 40 | ||||
-rw-r--r-- | src/items.c | 61 | ||||
-rw-r--r-- | src/play_time.c | 16 | ||||
-rw-r--r-- | src/pokemon.c | 61 | ||||
-rw-r--r-- | src/pokemon_3.c | 273 | ||||
-rw-r--r-- | src/pokemon_mid.c | 186 | ||||
-rw-r--r-- | src/rescue_team_info.c | 17 | ||||
-rw-r--r-- | src/save.c | 18 |
11 files changed, 606 insertions, 106 deletions
diff --git a/src/code_8092334.c b/src/code_8092334.c index d03f888..16d2424 100644 --- a/src/code_8092334.c +++ b/src/code_8092334.c @@ -19,7 +19,7 @@ s16 sub_8094828(u16 r0, u8 itemIndex) } } -void sub_809485C(struct unkStruct_8094924 *r0, u8 *r1, s32 size) +void xxx_init_struct_8094924_restore_809485C(struct unkStruct_8094924 *r0, u8 *r1, s32 size) { r0->unk0 = r1; r0->unk8 = 0; @@ -27,7 +27,7 @@ void sub_809485C(struct unkStruct_8094924 *r0, u8 *r1, s32 size) r0->unk4 = &r1[size]; } -void sub_809486C(struct unkStruct_8094924 *r0, u8 *r1, s32 size) +void xxx_init_struct_8094924_save_809486C(struct unkStruct_8094924 *r0, u8 *r1, s32 size) { r0->unk0 = r1; r0->unk8 = 0; @@ -41,7 +41,7 @@ void nullsub_102(struct unkStruct_8094924 *r0) } -void sub_809488C(struct unkStruct_8094924 *r0, u8 *r1, s32 size) +void SaveIntegerBits(struct unkStruct_8094924 *r0, void *r1, s32 size) { s32 r5; u8 *r6; @@ -115,7 +115,7 @@ void sub_80948E4(struct unkStruct_8094924 *r0, u8 *r1, s32 size) "\tbx r0"); } -void sub_8094924(struct unkStruct_8094924 *r0, u8 *r1, s32 size) +void RestoreIntegerBits(struct unkStruct_8094924 *r0, void *r1, s32 size) { s32 r6; u8 *r2; diff --git a/src/exclusive_pokemon_1.c b/src/exclusive_pokemon_1.c index 37b4dfe..48b5ec5 100644 --- a/src/exclusive_pokemon_1.c +++ b/src/exclusive_pokemon_1.c @@ -4,7 +4,7 @@ extern struct ExclusivePokemonData *gUnknown_203B498; extern struct ExclusivePokemon gExclusivePokemon[NUM_EXCLUSIVE_POKEMON]; -void sub_8094924(u32 *, u8 *, u32); +void RestoreIntegerBits(u32 *, void *, u32); void sub_80980B4(s16); void sub_8097FA8(u8); void sub_8098170(s32); @@ -13,7 +13,7 @@ void sub_8097FF8(void); u8 sub_8098100(u8); u8 sub_8098134(s16); u8 sub_80981A0(s32); -void sub_809488C(u32 *, u8 *, s32); +void SaveIntegerBits(u32 *, void *, s32); bool8 IsExclusivePokemonUnlocked(s16 pokeID) { @@ -59,21 +59,21 @@ void WriteExclusivePokemon(u32 *r0) zero = 0; - sub_809488C(r0, (u8 *)gUnknown_203B498, 1); + SaveIntegerBits(r0, (u8 *)gUnknown_203B498, 1); for(iVar2 = 0; iVar2 < 424; iVar2++) { stack_0 = sub_8098134(iVar2); - sub_809488C(r0, &stack_0, 1); + SaveIntegerBits(r0, &stack_0, 1); } for(iVar2 = 0; iVar2 < 64; iVar2++) { stack_1 = sub_8098100(iVar2); - sub_809488C(r0, &stack_1, 1); + SaveIntegerBits(r0, &stack_1, 1); } for(iVar2 = 0; iVar2 < 31; iVar2++) { stack_2 = sub_80981A0(iVar2); - sub_809488C(r0, &stack_2, 1); + SaveIntegerBits(r0, &stack_2, 1); } for(iVar2 = 0; iVar2 < NUM_EXCLUSIVE_POKEMON; iVar2++) { @@ -81,7 +81,7 @@ void WriteExclusivePokemon(u32 *r0) puVar2 = &neg_1; else puVar2 = &zero; - sub_809488C(r0, puVar2, 1); + SaveIntegerBits(r0, puVar2, 1); } } @@ -94,28 +94,28 @@ void ReadExclusivePokemon(u32 *r0) u8 stack_3; memset(gUnknown_203B498, 0, sizeof(struct ExclusivePokemonData)); - sub_8094924(r0, (u8 *)gUnknown_203B498, 1); + RestoreIntegerBits(r0, gUnknown_203B498, 1); for(iVar2 = 0; iVar2 < 424; iVar2++) { - sub_8094924(r0, &stack_0, 1); + RestoreIntegerBits(r0, &stack_0, 1); if(stack_0) sub_80980B4(iVar2); } for(iVar2 = 0; iVar2 < 64; iVar2++) { - sub_8094924(r0, &stack_1, 1); + RestoreIntegerBits(r0, &stack_1, 1); if(stack_1) sub_8097FA8(iVar2); } for(iVar2 = 0; iVar2 < 31; iVar2++) { - sub_8094924(r0, &stack_2, 1); + RestoreIntegerBits(r0, &stack_2, 1); if(stack_2) sub_8098170(iVar2); } for(iVar2 = 0; iVar2 < NUM_EXCLUSIVE_POKEMON; iVar2++) { - sub_8094924(r0, &stack_3, 1); + RestoreIntegerBits(r0, &stack_3, 1); do; while(0); // do/while needed for matching - jiang diff --git a/src/friend_area_1.c b/src/friend_area_1.c index ff1da5d..c7dee3f 100644 --- a/src/friend_area_1.c +++ b/src/friend_area_1.c @@ -10,14 +10,14 @@ u32 SaveFriendAreas(u8 *r0, u32 size) u32 temp; s32 counter; - sub_809486C(&unk, r0, size); + xxx_init_struct_8094924_save_809486C(&unk, r0, size); for(counter = 0; counter < NUM_FRIEND_AREAS; counter++) { if(gFriendAreas[counter] != 0) temp = -1; else temp = 0; - sub_809488C(&unk, (u8*)&temp, 1); + SaveIntegerBits(&unk, (u8*)&temp, 1); } nullsub_102(&unk); return unk.unk8; @@ -29,10 +29,10 @@ u32 ReadSavedFriendAreas(u8 *r0, s32 size) u32 temp; s32 counter; - sub_809485C(&unk, r0, size); + xxx_init_struct_8094924_restore_809485C(&unk, r0, size); for(counter = 0; counter < NUM_FRIEND_AREAS; counter++) { - sub_8094924(&unk, (u8*)&temp, 1); + RestoreIntegerBits(&unk, &temp, 1); // It's setting whether we have the friend area or not if(temp & 1) gFriendAreas[counter] = 1; diff --git a/src/game_options.c b/src/game_options.c index c5a92df..cfb95b7 100644 --- a/src/game_options.c +++ b/src/game_options.c @@ -76,7 +76,7 @@ void WriteGameOptions(struct unkStruct_8094924 *param_1) neg_1 = -1; zero = 0; - sub_809488C(param_1, &gUnknown_203B46C->unk8, 2); + SaveIntegerBits(param_1, &gUnknown_203B46C->unk8, 2); if(gUnknown_203B46C->unk9 != 0) { @@ -86,7 +86,7 @@ void WriteGameOptions(struct unkStruct_8094924 *param_1) { puVar2 = &zero; } - sub_809488C(param_1, puVar2, 1); + SaveIntegerBits(param_1, puVar2, 1); if(gUnknown_203B46C->unkA != 0) { @@ -96,7 +96,7 @@ void WriteGameOptions(struct unkStruct_8094924 *param_1) { puVar2 = &zero; } - sub_809488C(param_1, puVar2, 1); + SaveIntegerBits(param_1, puVar2, 1); if(gUnknown_203B46C->playerGender != 0) { @@ -106,7 +106,7 @@ void WriteGameOptions(struct unkStruct_8094924 *param_1) { puVar2 = &zero; } - sub_809488C(param_1, puVar2, 1); + SaveIntegerBits(param_1, puVar2, 1); if(gUnknown_203B46C->unk0 != 0) { @@ -116,7 +116,7 @@ void WriteGameOptions(struct unkStruct_8094924 *param_1) { puVar2 = &zero; } - sub_809488C(param_1, puVar2, 1); + SaveIntegerBits(param_1, puVar2, 1); if(gUnknown_203B46C->unk1 != 0) { @@ -126,7 +126,7 @@ void WriteGameOptions(struct unkStruct_8094924 *param_1) { puVar2 = &zero; } - sub_809488C(param_1, puVar2, 1); + SaveIntegerBits(param_1, puVar2, 1); if(gUnknown_203B46C->unk2 != 0) { @@ -136,7 +136,7 @@ void WriteGameOptions(struct unkStruct_8094924 *param_1) { puVar2 = &zero; } - sub_809488C(param_1, puVar2, 1); + SaveIntegerBits(param_1, puVar2, 1); if(gUnknown_203B46C->unk3 != 0) { @@ -146,43 +146,43 @@ void WriteGameOptions(struct unkStruct_8094924 *param_1) { puVar2 = &zero; } - sub_809488C(param_1, puVar2, 1); + SaveIntegerBits(param_1, puVar2, 1); - sub_809488C(param_1, &gUnknown_203B46C->unk4, 3); - sub_809488C(param_1, &gUnknown_203B46C->unkC, 2); + SaveIntegerBits(param_1, &gUnknown_203B46C->unk4, 3); + SaveIntegerBits(param_1, &gUnknown_203B46C->unkC, 2); } void ReadGameOptions(struct unkStruct_8094924 *param_1) { u8 byteArray[4]; - sub_8094924(param_1, byteArray, 2); + RestoreIntegerBits(param_1, byteArray, 2); gUnknown_203B46C->unk8 = byteArray[0] & 3; - sub_8094924(param_1, byteArray, 1); + RestoreIntegerBits(param_1, byteArray, 1); gUnknown_203B46C->unk9 = byteArray[0] & 1; - sub_8094924(param_1, byteArray, 1); + RestoreIntegerBits(param_1, byteArray, 1); gUnknown_203B46C->unkA = byteArray[0] & 1; - sub_8094924(param_1, byteArray, 1); + RestoreIntegerBits(param_1, byteArray, 1); gUnknown_203B46C->playerGender = byteArray[0] & 1; - sub_8094924(param_1, byteArray, 1); + RestoreIntegerBits(param_1, byteArray, 1); gUnknown_203B46C->unk0 = byteArray[0] & 1; - sub_8094924(param_1, byteArray, 1); + RestoreIntegerBits(param_1, byteArray, 1); gUnknown_203B46C->unk1 = byteArray[0] & 1; - sub_8094924(param_1, byteArray, 1); + RestoreIntegerBits(param_1, byteArray, 1); gUnknown_203B46C->unk2 = byteArray[0] & 1; - sub_8094924(param_1, byteArray, 1); + RestoreIntegerBits(param_1, byteArray, 1); gUnknown_203B46C->unk3 = byteArray[0] & 1; - sub_8094924(param_1, byteArray, 3); + RestoreIntegerBits(param_1, byteArray, 3); gUnknown_203B46C->unk4 = byteArray[0] & 7; - sub_8094924(param_1, byteArray, 2); + RestoreIntegerBits(param_1, byteArray, 2); gUnknown_203B46C->unkC = byteArray[0] & 3; sub_8094C14(); diff --git a/src/items.c b/src/items.c index 337e622..3ced8fe 100644 --- a/src/items.c +++ b/src/items.c @@ -1160,78 +1160,78 @@ bool8 xxx_insert_unk250_8091C1C(u8 itemIndex) { return TRUE; } -s32 sub_8091C68(u8* unk0, u32 size) +s32 SaveTeamInventory(u8* unk0, u32 size) { struct unkStruct_8094924 unk; s32 i; - sub_809486C(&unk, unk0, size); + xxx_init_struct_8094924_save_809486C(&unk, unk0, size); for (i = 0; i < INVENTORY_SIZE; i++) { - sub_8091E28(&unk, (u8*)&gTeamInventory_203B460->teamItems[i]); + SaveItemSlot(&unk, &gTeamInventory_203B460->teamItems[i]); } for (i = 0; i < NUMBER_OF_ITEM_IDS; i++) { - sub_809488C(&unk, (u8*)&gTeamInventory_203B460->teamStorage[i], 10); + SaveIntegerBits(&unk, &gTeamInventory_203B460->teamStorage[i], 10); } for (i = 0; i < 8; i++) { - sub_8091DE0(&unk, (u8*)&gTeamInventory_203B460->unk230[i]); + SaveHeldItem(&unk, &gTeamInventory_203B460->unk230[i]); } for (i = 0; i < 4; i++) { - sub_8091DE0(&unk, (u8*)&gTeamInventory_203B460->unk250[i]); + SaveHeldItem(&unk, &gTeamInventory_203B460->unk250[i]); } - sub_809488C(&unk, (u8*)&gTeamInventory_203B460->teamMoney, 24); - sub_809488C(&unk, (u8*)&gTeamInventory_203B460->teamSavings, 24); + SaveIntegerBits(&unk, &gTeamInventory_203B460->teamMoney, 24); + SaveIntegerBits(&unk, &gTeamInventory_203B460->teamSavings, 24); nullsub_102(&unk); return unk.unk8; } -s32 sub_8091D14(u8 *unk0, u32 size) +s32 RestoreTeamInventory(u8 *unk0, u32 size) { struct unkStruct_8094924 unk; s32 i; - sub_809485C(&unk, unk0, size); + xxx_init_struct_8094924_restore_809485C(&unk, unk0, size); for (i = 0; i < 20; i++) { - sub_8091E00(&unk, (u8*)&gTeamInventory_203B460->teamItems[i]); + RestoreItemSlot(&unk, &gTeamInventory_203B460->teamItems[i]); } for (i = 0; i < 240; i++) { - sub_8094924(&unk, (u8*)&gTeamInventory_203B460->teamStorage[i], 10); + RestoreIntegerBits(&unk, &gTeamInventory_203B460->teamStorage[i], 10); } for (i = 0; i < 8; i++) { - sub_8091DC0(&unk, (u8*)&gTeamInventory_203B460->unk230[i]); + RestoreHeldItem(&unk, &gTeamInventory_203B460->unk230[i]); } for (i = 0; i < 4; i++) { - sub_8091DC0(&unk, (u8*)&gTeamInventory_203B460->unk250[i]); + RestoreHeldItem(&unk, &gTeamInventory_203B460->unk250[i]); } - sub_8094924(&unk, (u8*)&gTeamInventory_203B460->teamMoney, 24); - sub_8094924(&unk, (u8*)&gTeamInventory_203B460->teamSavings, 24); + RestoreIntegerBits(&unk, &gTeamInventory_203B460->teamMoney, 24); + RestoreIntegerBits(&unk, &gTeamInventory_203B460->teamSavings, 24); nullsub_102(&unk); return unk.unk8; } -void sub_8091DC0(struct unkStruct_8094924 *a1, u8 *a2) +void RestoreHeldItem(struct unkStruct_8094924 *a1, struct HeldItem *item) { - sub_8094924(a1, a2, 8); - sub_8094924(a1, a2 + 1, 7); + RestoreIntegerBits(a1, &item->itemIndex, 8); + RestoreIntegerBits(a1, &item->numItems, 7); } -void sub_8091DE0(struct unkStruct_8094924 *a1, u8 *a2) +void SaveHeldItem(struct unkStruct_8094924 *a1, struct HeldItem *item) { - sub_809488C(a1, a2, 8); - sub_809488C(a1, a2 + 1, 7); + SaveIntegerBits(a1, &item->itemIndex, 8); + SaveIntegerBits(a1, &item->numItems, 7); } -void sub_8091E00(struct unkStruct_8094924 *a1, u8 *a2) +void RestoreItemSlot(struct unkStruct_8094924 *a1, struct ItemSlot *slot) { - sub_8094924(a1, a2, 8); - sub_8094924(a1, a2 + 1, 7); - sub_8094924(a1, a2 + 2, 8); + RestoreIntegerBits(a1, &slot->unk0, 8); + RestoreIntegerBits(a1, &slot->numItems, 7); + RestoreIntegerBits(a1, &slot->itemIndex, 8); } -void sub_8091E28(struct unkStruct_8094924 *a1, u8 *a2) +void SaveItemSlot(struct unkStruct_8094924 *a1, struct ItemSlot *slot) { - sub_809488C(a1, a2, 8); - sub_809488C(a1, a2 + 1, 7); - sub_809488C(a1, a2 + 2, 8); + SaveIntegerBits(a1, &slot->unk0, 8); + SaveIntegerBits(a1, &slot->numItems, 7); + SaveIntegerBits(a1, &slot->itemIndex, 8); } u32 sub_8091E50(u8 index) @@ -1465,6 +1465,7 @@ s32 sub_8091E94(s32 a1, s32 a2, s32 a3) "\tbx r1\n"); #endif } + void ClearAllItems_8091FB4() { s32 i; diff --git a/src/play_time.c b/src/play_time.c index 8b2e567..97a9754 100644 --- a/src/play_time.c +++ b/src/play_time.c @@ -77,16 +77,16 @@ void DeconstructPlayTime(struct PlayTimeStruct *r0, u32 *outHours, u32 *outMinut void WritePlayTime(struct unkStruct_8094924 *r0) { - sub_809488C(r0, (&(gPlayTimeRef->frames)), 6); - sub_809488C(r0, (&(gPlayTimeRef->seconds)), 6); - sub_809488C(r0, (&(gPlayTimeRef->minutes)), 6); - sub_809488C(r0, (u8 *)(&(gPlayTimeRef->hours)), 14); + SaveIntegerBits(r0, &gPlayTimeRef->frames, 6); + SaveIntegerBits(r0, &gPlayTimeRef->seconds, 6); + SaveIntegerBits(r0, &gPlayTimeRef->minutes, 6); + SaveIntegerBits(r0, &gPlayTimeRef->hours, 14); } void ReadPlayTime(struct unkStruct_8094924 *r0) { - sub_8094924(r0, (&(gPlayTimeRef->frames)), 6); - sub_8094924(r0, (&(gPlayTimeRef->seconds)), 6); - sub_8094924(r0, (&(gPlayTimeRef->minutes)), 6); - sub_8094924(r0, (u8*)(&(gPlayTimeRef->hours)), 14); + RestoreIntegerBits(r0, &gPlayTimeRef->frames, 6); + RestoreIntegerBits(r0, &gPlayTimeRef->seconds, 6); + RestoreIntegerBits(r0, &gPlayTimeRef->minutes, 6); + RestoreIntegerBits(r0, &gPlayTimeRef->hours, 14); } diff --git a/src/pokemon.c b/src/pokemon.c index a9ca120..1b9003b 100644 --- a/src/pokemon.c +++ b/src/pokemon.c @@ -45,3 +45,64 @@ void InitializeRecruitedPokemon(void) gRecruitedPokemonRef->team[iVar3].unk0 = 0; } } + +// void sub_808CE74(s32 _species, u8 a2, u8* a3) +// { +// struct PokemonStruct pokemon; +// u8 name_buffer[20]; +// u8 friend_area; +// s32 i; +// register s16 species asm("r7") = (s16)_species; +// s32 cond = a2 << 24; + +// pokemon.unk0 = 3; +// if (cond) { +// pokemon.unk2 = 1; +// pokemon.unk4.unk4 = 64; +// } +// else { +// pokemon.unk2 = 1; +// pokemon.unk4.unk4 = 65; +// } +// pokemon.unkHasNextStage = 1; +// pokemon.pokeHP = GetBaseHP(species); +// pokemon.offense.att[0] = GetPokemonAttSpatt(species, 0); +// pokemon.offense.att[1] = GetPokemonAttSpatt(species, 1); +// pokemon.offense.def[0] = GetPokemonDefSpdef(species, 0); +// pokemon.offense.def[1] = GetPokemonDefSpdef(species, 1); +// pokemon.IQ = 1; +// pokemon.unkC[0].unk0 = 0; +// pokemon.unkC[1].unk0 = 0; +// sub_808EC94((u8*)&pokemon.unk20, 0); +// pokemon.speciesNum = species; +// pokemon.heldItem.itemIndex = 0; +// pokemon.heldItem.numItems = 0; +// pokemon.unk1C = 0; +// pokemon.unk24 = 0; +// pokemon.unk4.unk5 = 0; +// sub_808E490(pokemon.unk2C, species); + +// // mostly incorrect below this: +// if (!a3) { +// CopySpeciesNametoBuffer(name_buffer, species); +// BoundedCopyStringtoBuffer(pokemon.name, name_buffer, 10); +// } +// else { +// s32 j; +// for (j = 0; j < 10; j++) { +// pokemon.name[j] = a3[j]; +// } +// } +// friend_area = gMonsterParameters[species].friend_area; +// for (i = 0; i < 413; i++) { +// if (!((u8)gRecruitedPokemonRef->pokemon[i].unk0 & 1)) { +// u8 species_friend_area = sub_80923D4(i); +// if (species_friend_area == friend_area) { +// gRecruitedPokemonRef->pokemon[i] = pokemon; +// gFriendAreas[species_friend_area] = 1; +// sub_80980B4(species); +// break; +// } +// } +// } +// } diff --git a/src/pokemon_3.c b/src/pokemon_3.c index 72005ed..b4cb938 100644 --- a/src/pokemon_3.c +++ b/src/pokemon_3.c @@ -48,6 +48,20 @@ extern bool8 sub_808ECD0(u8 *, u32); extern void sub_808EC30(u8 *, u32); extern void AddSprite(u16 *, u32, u32, u32); +extern void xxx_save_poke_sub_4_80902F4(struct unkStruct_8094924*, struct unkPokeSubStruct_4*); +extern void xxx_save_poke_sub_c_808F41C(struct unkStruct_8094924*, struct unkPokeSubStruct_C*); +extern void xxx_save_poke_sub_2c_8094108(struct unkStruct_8094924*, struct unkPokeSubStruct_2C*); +void xxx_restore_poke_sub_4_8090314(struct unkStruct_8094924*, struct unkPokeSubStruct_4*); +void xxx_restore_poke_sub_c_808F410(struct unkStruct_8094924*, struct unkPokeSubStruct_C*); +void xxx_restore_poke_sub_2c_8094128(struct unkStruct_8094924*, struct unkPokeSubStruct_2C*); + +extern void sub_8094184(struct unkStruct_8094924*, void*); +extern void sub_809449C(struct unkStruct_8094924*, void*); +extern void sub_808F448(struct unkStruct_8094924*, struct unkStruct_808E6F4*); +extern void sub_80941FC(struct unkStruct_8094924*, void*); +extern void sub_809447C(struct unkStruct_8094924*, void*); +extern void sub_808F428(struct unkStruct_8094924*, struct unkStruct_808E6F4*); + bool8 sub_808E668(s16 a1, s16* a2, s16* a3) { @@ -94,7 +108,7 @@ bool8 HasRecruitedMon(s16 species_) { s32 i = 0; struct PokemonStruct *pokemon = gRecruitedPokemonRef->pokemon; - for (i = 0; i < 413; i++) { + for (i = 0; i < NUM_SPECIES; i++) { if (((u8)pokemon->unk0 & 1)) { if(pokemon->speciesNum == species) return TRUE; @@ -641,3 +655,260 @@ void sub_808ED00() { } } +s32 SaveRecruitedPokemon(u8 *a1, s32 a2) +{ + u16 buffer[6]; + struct unkStruct_8094924 backup; + u8 data_u8; + s16 data_s16; + s32 count; + s32 i; + + xxx_init_struct_8094924_save_809486C(&backup, a1, a2); + + for (i = 0; i < 6; i++) { + buffer[i] = -1; + } + + data_s16 = 1; + data_s16 = -data_s16; + count = 0; + for (i = 0; i < NUM_SPECIES; i++) { +#ifdef NONMATCHING + struct PokemonStruct* pokemon = &gRecruitedPokemonRef->pokemon[i]; +#else + struct PokemonStruct* pokemon; + register struct unkStruct_203B45C** recruited asm("r2") = &gRecruitedPokemonRef; + + pokemon = &(*recruited)->pokemon[i]; +#endif + if (pokemon->unk0 & 1) { + if (pokemon->unk0 & 2) { + buffer[count++] = i; + } + if (pokemon->unk2) { + data_s16 = i; + } + } + else { + pokemon->unkHasNextStage = 0; + } + SavePokemonStruct(&backup, pokemon); + } + + for (i = 0; i < 4; i++) { + if ((u8)i[gRecruitedPokemonRef->team].unk0 & 1) { + data_u8 = 0xff; + } + else { + data_u8 = 0; + } + SaveIntegerBits(&backup, &data_u8, 1); + SavePokemonStruct(&backup, &gRecruitedPokemonRef->team[i]); + } + + for (i = 0; i < 6; i++) { + SaveIntegerBits(&backup, (u8*)&buffer[i], 16); + } + SaveIntegerBits(&backup, (u8*)&data_s16, 16); + nullsub_102(&backup); + return backup.unk8; +} + +s32 RestoreRecruitedPokemon(u8 *a1, s32 a2) +{ + struct unkStruct_8094924 backup; + u8 data_u8; // same as saverecruitedpokemon + s16 data_s16; // same as saverecruitedpokemon + s32 i; + + xxx_init_struct_8094924_restore_809485C(&backup, a1, a2); + for (i = 0; i < NUM_SPECIES; i++) { + RestorePokemonStruct(&backup, &gRecruitedPokemonRef->pokemon[i]); + } + + for (i = 0; i < 4; i++) { + RestoreIntegerBits(&backup, &data_u8, 1); + RestorePokemonStruct(&backup, &gRecruitedPokemonRef->team[i]); + if (data_u8 & 1) { + gRecruitedPokemonRef->team[i].unk0 = 3; + } + else { + gRecruitedPokemonRef->team[i].unk0 = 0; + } + } + + for (i = 0; i < 6; i++) { + RestoreIntegerBits(&backup, &data_s16, 16); + if ((u16)data_s16 < NUM_SPECIES) { + gRecruitedPokemonRef->pokemon[data_s16].unk0 |= 2; + } + } + RestoreIntegerBits(&backup, &data_s16, 16); + if ((u16)data_s16 < NUM_SPECIES) { + gRecruitedPokemonRef->pokemon[data_s16].unk2 = 1; + } + nullsub_102(&backup); + return backup.unk8; +} + +void SavePokemonStruct(struct unkStruct_8094924* a1, struct PokemonStruct* pokemon) +{ + SaveIntegerBits(a1, &pokemon->unkHasNextStage, 7); + SaveIntegerBits(a1, &pokemon->speciesNum, 9); + xxx_save_poke_sub_4_80902F4(a1, &pokemon->unk4); + xxx_save_poke_sub_c_808F41C(a1, &pokemon->unkC[0]); + xxx_save_poke_sub_c_808F41C(a1, &pokemon->unkC[1]); + SaveIntegerBits(a1, &pokemon->IQ, 10); + SaveIntegerBits(a1, &pokemon->pokeHP, 10); + SaveIntegerBits(a1, &pokemon->offense.att[0], 8); + SaveIntegerBits(a1, &pokemon->offense.att[1], 8); + SaveIntegerBits(a1, &pokemon->offense.def[0], 8); + SaveIntegerBits(a1, &pokemon->offense.def[1], 8); + SaveIntegerBits(a1, &pokemon->unk1C, 24); + SaveIntegerBits(a1, &pokemon->unk20, 24); + SaveIntegerBits(a1, &pokemon->unk24, 4); + SaveHeldItem(a1, &pokemon->heldItem); + xxx_save_poke_sub_2c_8094108(a1, pokemon->unk2C); + SaveIntegerBits(a1, pokemon->name, 80); +} + +void RestorePokemonStruct(struct unkStruct_8094924* a1, struct PokemonStruct* pokemon) +{ + memset(pokemon, 0, sizeof(struct PokemonStruct)); + pokemon->unk0 = 0; + pokemon->unk2 = 0; + RestoreIntegerBits(a1, &pokemon->unkHasNextStage, 7); + if (pokemon->unkHasNextStage) { + pokemon->unk0 |= 1; + } + RestoreIntegerBits(a1, &pokemon->speciesNum, 9); + xxx_restore_poke_sub_4_8090314(a1, &pokemon->unk4); + xxx_restore_poke_sub_c_808F410(a1, &pokemon->unkC[0]); + xxx_restore_poke_sub_c_808F410(a1, &pokemon->unkC[1]); + RestoreIntegerBits(a1, &pokemon->IQ, 10); + RestoreIntegerBits(a1, &pokemon->pokeHP, 10); + RestoreIntegerBits(a1, &pokemon->offense.att[0], 8); + RestoreIntegerBits(a1, &pokemon->offense.att[1], 8); + RestoreIntegerBits(a1, &pokemon->offense.def[0], 8); + RestoreIntegerBits(a1, &pokemon->offense.def[1], 8); + RestoreIntegerBits(a1, &pokemon->unk1C, 24); + RestoreIntegerBits(a1, &pokemon->unk20, 24); + RestoreIntegerBits(a1, &pokemon->unk24, 4); + RestoreHeldItem(a1, &pokemon->heldItem); + xxx_restore_poke_sub_2c_8094128(a1, pokemon->unk2C); + RestoreIntegerBits(a1, pokemon->name, 80); +} + +s32 SavePokemonStruct2(u8* a1, s32 size) +{ + struct unkStruct_8094924 backup; + s32 i; + u8 data_u8_neg1; + u8 data_u8_zero; + + xxx_init_struct_8094924_save_809486C(&backup, a1, size); + data_u8_neg1 = -1; + data_u8_zero = 0; + + for (i = 0; i < 4; i++) { + struct PokemonStruct2* pokemon2 = &gRecruitedPokemonRef->pokemon2[i]; + SaveIntegerBits(&backup, &pokemon2->unk0, 2); + + SaveIntegerBits(&backup, pokemon2->unk2 ? &data_u8_neg1 : &data_u8_zero, 1); + SaveIntegerBits(&backup, &pokemon2->unkHasNextStage, 7); + + xxx_save_poke_sub_4_80902F4(&backup, &pokemon2->unk4); + SaveIntegerBits(&backup, &pokemon2->IQ, 10); + SaveIntegerBits(&backup, &pokemon2->unkA, 16); + SaveIntegerBits(&backup, &pokemon2->unkC, 16); + SaveIntegerBits(&backup, &pokemon2->speciesNum, 9); + SaveIntegerBits(&backup, &pokemon2->unk10, 10); + SaveIntegerBits(&backup, &pokemon2->unk12, 10); + SaveIntegerBits(&backup, &pokemon2->offense.att[0], 8); + SaveIntegerBits(&backup, &pokemon2->offense.att[1], 8); + SaveIntegerBits(&backup, &pokemon2->offense.def[0], 8); + SaveIntegerBits(&backup, &pokemon2->offense.def[1], 8); + SaveIntegerBits(&backup, &pokemon2->unk18, 24); + sub_8094184(&backup, &pokemon2->unk1C); + SaveItemSlot(&backup, &pokemon2->itemSlot); + sub_809449C(&backup, &pokemon2->unk44); + sub_809449C(&backup, &pokemon2->unk48); + SaveIntegerBits(&backup, &pokemon2->unk4C, 24); + SaveIntegerBits(&backup, &pokemon2->unk50, 4); + sub_808F448(&backup, &pokemon2->unk54); + SaveIntegerBits(&backup, &pokemon2->name, 80); + } + nullsub_102(&backup); + return backup.unk8; +} + +s32 RestorePokemonStruct2(u8* a1, s32 size) +{ + struct unkStruct_8094924 backup; + s32 i; + + xxx_init_struct_8094924_restore_809485C(&backup, a1, size); + for (i = 0; i < 4; i++) { + struct PokemonStruct2* pokemon2 = &gRecruitedPokemonRef->pokemon2[i]; + u8 unk2; + + memset(pokemon2, 0, sizeof(struct PokemonStruct2)); + + RestoreIntegerBits(&backup, &pokemon2->unk0, 2); + + RestoreIntegerBits(&backup, &unk2, 1); + if (unk2 & 1) { + pokemon2->unk2 = TRUE; + } + else { + pokemon2->unk2 = FALSE; + } + RestoreIntegerBits(&backup, &pokemon2->unkHasNextStage, 7); + + xxx_restore_poke_sub_4_8090314(&backup, &pokemon2->unk4); + RestoreIntegerBits(&backup, &pokemon2->IQ, 10); + RestoreIntegerBits(&backup, &pokemon2->unkA, 16); + RestoreIntegerBits(&backup, &pokemon2->unkC, 16); + RestoreIntegerBits(&backup, &pokemon2->speciesNum, 9); + RestoreIntegerBits(&backup, &pokemon2->unk10, 10); + RestoreIntegerBits(&backup, &pokemon2->unk12, 10); + RestoreIntegerBits(&backup, &pokemon2->offense.att[0], 8); + RestoreIntegerBits(&backup, &pokemon2->offense.att[1], 8); + RestoreIntegerBits(&backup, &pokemon2->offense.def[0], 8); + RestoreIntegerBits(&backup, &pokemon2->offense.def[1], 8); + RestoreIntegerBits(&backup, &pokemon2->unk18, 24); + sub_80941FC(&backup, &pokemon2->unk1C); + RestoreItemSlot(&backup, &pokemon2->itemSlot); + sub_809447C(&backup, &pokemon2->unk44); + sub_809447C(&backup, &pokemon2->unk48); + RestoreIntegerBits(&backup, &pokemon2->unk4C, 24); + RestoreIntegerBits(&backup, &pokemon2->unk50, 4); + sub_808F428(&backup, &pokemon2->unk54); + RestoreIntegerBits(&backup, &pokemon2->name, 80); + } + nullsub_102(&backup); + return backup.unk8; +} + +void xxx_restore_poke_sub_c_808F410(struct unkStruct_8094924* a1, struct unkPokeSubStruct_C* unkC) +{ + RestoreIntegerBits(a1, &unkC->unk0, 7); +} + +void xxx_save_poke_sub_c_808F41C(struct unkStruct_8094924* a1, struct unkPokeSubStruct_C* unkC) +{ + SaveIntegerBits(a1, &unkC->unk0, 7); +} + +void sub_808F428(struct unkStruct_8094924* a1, struct unkStruct_808E6F4* a2) +{ + RestoreIntegerBits(a1, &a2->unk0, 10); + RestoreIntegerBits(a1, &a2->unk2, 5); +} + +void sub_808F448(struct unkStruct_8094924* a1, struct unkStruct_808E6F4* a2) +{ + SaveIntegerBits(a1, &a2->unk0, 10); + SaveIntegerBits(a1, &a2->unk2, 5); +}
\ No newline at end of file diff --git a/src/pokemon_mid.c b/src/pokemon_mid.c index 56d49fe..d4a3bee 100644 --- a/src/pokemon_mid.c +++ b/src/pokemon_mid.c @@ -2,6 +2,7 @@ #include "pokemon.h" #include "item.h" #include "file_system.h" +#include "subStruct_203B240.h" extern struct gPokemon *gMonsterParameters; extern const char gUnknown_8107600[]; @@ -16,6 +17,7 @@ extern s16 gUnknown_810ACB8; // 0x14d extern s16 gUnknown_810ACBA; // 0x14d extern s16 gUnknown_810ACBC; // 0x14d extern s16 gUnknown_810ACBE; // 0x14d +extern char* gFormattedStatusNames[]; // wram data: extern u16 gLevelCurrentPokeId; @@ -30,10 +32,12 @@ extern u32 ReturnIntFromChar(u8 r0); extern void CopyStringtoBuffer(char *r0, char *r1); extern void sub_8093F50(void*, void*); extern void sub_80943A0(void*, s32); -extern void xxx_unk_to_pokemonstruct_808DF44(struct PokemonStruct*, struct unkStruct_808DE50*); +extern void xxx_pokemon2_to_pokemonstruct_808DF44(struct PokemonStruct*, struct PokemonStruct2*); extern u8* sub_8092B18(s16); extern u8* sub_808E07C(u8* a1, u16* a2); extern u8* sub_8092B54(s32); +extern void sub_8092AD4(struct unkPokeSubStruct_2C*, u16); +extern u32 sub_8097DF0(char *, struct subStruct_203B240 **); struct unkStruct_8107654 { s16 unk0; @@ -48,6 +52,103 @@ extern struct FileArchive gMonsterFileArchive; extern const char gUnknown_8107684[]; extern struct unkStruct_203B45C *gRecruitedPokemonRef; + +bool8 sub_808D6E8() +{ + s32 i; + s32 count = 0; + s32 size_count = 0; + for (i = 0; i < NUM_SPECIES; i++) { + struct PokemonStruct* pokemon = &gRecruitedPokemonRef->pokemon[i]; + if ((1 & pokemon->unk0) && ((pokemon->unk0 >> 1) % 2)) { + size_count += GetPokemonSize(pokemon->speciesNum); + count++; + } + } + if ((size_count < 6) && (count < 4)) { + return 1; + } + return 0; +} + +// this one is surprisingly frustrating +NAKED +bool8 sub_808D750(s16 index_) { + asm_unified( +"\tpush {r4-r7,lr}\n" +"\tmov r7, r9\n" +"\tmov r6, r8\n" +"\tpush {r6,r7}\n" +"\tlsls r0, 16\n" +"\tasrs r0, 16\n" +"\tmov r8, r0\n" +"\tmovs r6, 0\n" +"\tmovs r5, 0\n" +"\tmovs r4, 0\n" +"\tldr r0, _0808D7C8\n" +"\tmov r9, r0\n" +"\tmovs r7, 0x1\n" +"_0808D76A:\n" +"\tmovs r0, 0x58\n" +"\tadds r1, r4, 0\n" +"\tmuls r1, r0\n" +"\tmov r2, r9\n" +"\tldr r0, [r2]\n" +"\tadds r1, r0, r1\n" +"\tldrh r2, [r1]\n" +"\tadds r0, r7, 0\n" +"\tands r0, r2\n" +"\tcmp r0, 0\n" +"\tbeq _0808D798\n" +"\tlsrs r0, r2, 1\n" +"\tands r0, r7\n" +"\tcmp r0, 0\n" +"\tbeq _0808D798\n" +"\tmovs r2, 0x8\n" +"\tldrsh r0, [r1, r2]\n" +"\tbl GetPokemonSize\n" +"\tlsls r0, 24\n" +"\tlsrs r0, 24\n" +"\tadds r5, r0\n" +"\tadds r6, 0x1\n" +"_0808D798:\n" +"\tadds r4, 0x1\n" +"\tmovs r0, 0xCE\n" +"\tlsls r0, 1\n" +"\tcmp r4, r0\n" +"\tble _0808D76A\n" +"\tcmp r6, 0x3\n" +"\tbgt _0808D7CC\n" +"\tldr r2, _0808D7C8\n" +"\tmovs r0, 0x58\n" +"\tmov r1, r8\n" +"\tmuls r1, r0\n" +"\tldr r0, [r2]\n" +"\tadds r1, r0, r1\n" +"\tmovs r2, 0x8\n" +"\tldrsh r0, [r1, r2]\n" +"\tbl GetPokemonSize\n" +"\tlsls r0, 24\n" +"\tlsrs r0, 24\n" +"\tadds r5, r0\n" +"\tcmp r5, 0x6\n" +"\tbgt _0808D7CC\n" +"\tmovs r0, 0x1\n" +"\tb _0808D7CE\n" +"\t.align 2, 0\n" +"_0808D7C8: .4byte gRecruitedPokemonRef\n" +"_0808D7CC:\n" +"\tmovs r0, 0\n" +"_0808D7CE:\n" +"\tpop {r3,r4}\n" +"\tmov r8, r3\n" +"\tmov r9, r4\n" +"\tpop {r4-r7}\n" +"\tpop {r1}\n" +"\tbx r1\n" + ); +} + // bool8 sub_808D750(s16 index_) { // s32 i; // register s32 index asm("r8") = index_; @@ -410,12 +511,12 @@ bool8 IsPokemonDialogueSpriteAvail(s16 index, s32 r1) return (gMonsterParameters[index].dialogue_sprites >> r1) & 1; } -void xxx_pokemonstruct_index_to_unk_808DE30(void* r0, u32 r1) +void xxx_pokemonstruct_index_to_pokemon2_808DE30(void* r0, u32 r1) { - xxx_pokemonstruct_to_unk_808DE50(r0, &gRecruitedPokemonRef->pokemon[r1], r1); + xxx_pokemonstruct_to_pokemon2_808DE50(r0, &gRecruitedPokemonRef->pokemon[r1], r1); } -void xxx_pokemonstruct_to_unk_808DE50(struct unkStruct_808DE50 * a1, struct PokemonStruct *pokemon, s32 a3) +void xxx_pokemonstruct_to_pokemon2_808DE50(struct PokemonStruct2 * a1, struct PokemonStruct *pokemon, s32 a3) { s32 i; struct HeldItem* held; @@ -465,15 +566,15 @@ void xxx_pokemonstruct_to_unk_808DE50(struct unkStruct_808DE50 * a1, struct Poke a1->unk48 = somestruct2_80943A0; } -void xxx_unk_to_pokemonstruct_index_808DF2C(s32 a1, struct unkStruct_808DE50* a2) +void xxx_pokemon2_to_pokemonstruct_index_808DF2C(s32 a1, struct PokemonStruct2* a2) { - xxx_unk_to_pokemonstruct_808DF44(&a1[gRecruitedPokemonRef->pokemon], a2); + xxx_pokemon2_to_pokemonstruct_808DF44(&a1[gRecruitedPokemonRef->pokemon], a2); } extern void sub_8093FA8(struct unkPokeSubStruct_2C*, struct unkPokeSubStruct_2C*); -void xxx_unk_to_pokemonstruct_808DF44(struct PokemonStruct* pokemon, struct unkStruct_808DE50* a2) +void xxx_pokemon2_to_pokemonstruct_808DF44(struct PokemonStruct* pokemon, struct PokemonStruct2* a2) { s32 i; @@ -507,7 +608,7 @@ void xxx_unk_to_pokemonstruct_808DF44(struct PokemonStruct* pokemon, struct unkS } } -void sub_808DFDC(s32 a1, struct unkStruct_808DE50* a2) +void sub_808DFDC(s32 a1, struct PokemonStruct2* a2) { // transfer item from unk to pokemon at index struct PokemonStruct* pokemon = &gRecruitedPokemonRef->pokemon[a1]; @@ -770,4 +871,71 @@ s32 GetEvolutionSequence(struct PokemonStruct* pokemon, struct EvolveStage* a2) } return count; #endif -}
\ No newline at end of file +} + + +s32 sub_808E400(s32 _species, s16* _a2, s32 _a3, s32 _a4) +{ + // this is horrible + s32 i; + register s32 species asm("r9") = (s16)_species; + s32 a3 = (u8)_a3; + s32 a4 = (u8)_a4; + s32 count = 0; + register s16* a2 asm("r6"); + i = 1; + a2 = _a2; + for (i = 1; i <= SPECIES_RAYQUAZA_CUTSCENE; i++) { + register s32 current asm("r8") = (s16)i; + if (species != GetPokemonEvolveFrom(i)) { + continue; + } + if (!a3 && (GetPokemonSize(species) != GetPokemonSize(i))) { + continue; + } + if (!a4 && ((s16)i == SPECIES_SHEDINJA)) { + continue; + } + *a2++ = current; + count++; + } + return count; +} + +void sub_808E490(struct unkPokeSubStruct_2C* a1, s16 species) +{ + u16 buffer[0x10]; + s32 i; + s32 count = sub_808E0AC(buffer, species, 1, 999); + if (count == 0) { + count = 1; + buffer[0] = 408; + } + + i = 0; + if (i < count) { + while (i < count) { + sub_8092AD4(&a1[i], buffer[i]); + i++; + } + i = count; + } + while (i < 4) { + a1[i].unk0 = 0; + i++; + } +} + +char* sub_808E4FC(s32 a1) +{ + struct subStruct_203B240 *result[4]; + sub_8097DF0(gFormattedStatusNames[a1], result); + return result[0]->unk0; +} + +char* sub_808E51C(s32 a1) +{ + struct subStruct_203B240 *result[4]; + sub_8097DF0(gFormattedStatusNames[a1], result); + return result[0]->unk4; +} diff --git a/src/rescue_team_info.c b/src/rescue_team_info.c index 61c0184..ccae32c 100644 --- a/src/rescue_team_info.c +++ b/src/rescue_team_info.c @@ -18,6 +18,7 @@ bool32 sub_8092040(u8 param_1) { s32 index; + // NUMBER_OF_ITEM_IDS == 0xf0 if (param_1 >= 0xF0) return TRUE; else { @@ -138,9 +139,9 @@ u32 SaveRescueTeamInfo(u8 *param_1, u32 size) neg1 = -1; zero = 0; - sub_809486C(&auStack36, param_1, size); - sub_809488C(&auStack36, gRescueTeamInfoRef->teamName, 0x58); - sub_809488C(&auStack36, (u8 *)&gRescueTeamInfoRef->teamRankPts, 0x20); + xxx_init_struct_8094924_save_809486C(&auStack36, param_1, size); + SaveIntegerBits(&auStack36, gRescueTeamInfoRef->teamName, 0x58); + SaveIntegerBits(&auStack36, (u8 *)&gRescueTeamInfoRef->teamRankPts, 0x20); gRescueTeamInfoRef->unk10 = sub_80023E4(0); if (gRescueTeamInfoRef->unk10 != 0) @@ -151,7 +152,7 @@ u32 SaveRescueTeamInfo(u8 *param_1, u32 size) { puVar2 = &zero; } - sub_809488C(&auStack36,puVar2,1); + SaveIntegerBits(&auStack36,puVar2,1); nullsub_102(&auStack36); return auStack36.unk8; } @@ -161,10 +162,10 @@ u32 ReadRescueTeamInfo(u8 *param_1, u32 size) struct unkStruct_8094924 auStack32; u8 byteArray[4]; - sub_809485C(&auStack32, param_1, size); - sub_8094924(&auStack32, gRescueTeamInfoRef->teamName, 0x58); - sub_8094924(&auStack32, (u8 *)&gRescueTeamInfoRef->teamRankPts, 0x20); - sub_8094924(&auStack32, byteArray, 1); + xxx_init_struct_8094924_restore_809485C(&auStack32, param_1, size); + RestoreIntegerBits(&auStack32, gRescueTeamInfoRef->teamName, 0x58); + RestoreIntegerBits(&auStack32, &gRescueTeamInfoRef->teamRankPts, 0x20); + RestoreIntegerBits(&auStack32, byteArray, 1); gRescueTeamInfoRef->unk10 = byteArray[0] & 1; nullsub_102(&auStack32); return auStack32.unk8; @@ -152,11 +152,9 @@ extern void sub_8014114(); extern void sub_80141B4(const char *r0, u32 r1, u8 *r2, u16 r3); extern u32 sub_80144A4(u32 *a); extern u32 SaveRecruitedPokemon(u8 *, u32); -extern u32 ReadRecruitedPokemon(void* a, s32 b); -extern u32 sub_808F154(u8 *, u32); -extern u32 sub_808F2B0(void* a, s32 b); -extern u32 sub_8091C68(u8 *, u32); -extern u32 sub_8091D14(void* a, s32 b); +extern u32 RestoreRecruitedPokemon(void* a, s32 b); +extern u32 SavePokemonStruct2(u8 *, u32); +extern u32 RestorePokemonStruct2(void* a, s32 b); extern u32 sub_80921C4(u8 *, u32); extern u8 *sub_8095100(void); extern u32 *sub_8095108(void); @@ -365,17 +363,17 @@ u32 ReadSaveFromPak(u32 *a) } if (!r7) { - r1 = ReadRecruitedPokemon(r4, 0x4650); + r1 = RestoreRecruitedPokemon(r4, 0x4650); if (r1 != r5->savedRecruitedPokemon) { r7 = 3; } r4 += 0x4650; - r1 = sub_808F2B0(r4, 0x258); + r1 = RestorePokemonStruct2(r4, 0x258); if (r1 != r5->unk428) { r7 = 3; } r4 += 0x258; - r1 = sub_8091D14(r4, 0x1D8); + r1 = RestoreTeamInventory(r4, 0x1D8); if (r1 != r5->unk430) { r7 = 3; } @@ -488,9 +486,9 @@ u32 WriteSavetoPak(s32 *param_1,u32 param_2) iVar1->savedRecruitedPokemon = SaveRecruitedPokemon(array_ptr,0x4650); array_ptr += 0x4650; - iVar1->unk428 = sub_808F154(array_ptr,0x258); + iVar1->unk428 = SavePokemonStruct2(array_ptr,0x258); array_ptr += 0x258; - iVar1->unk430 = sub_8091C68(array_ptr,0x1D8); + iVar1->unk430 = SaveTeamInventory(array_ptr,0x1D8); array_ptr += 0x1D8; iVar1->savedRescueTeamInfo = SaveRescueTeamInfo(array_ptr,0x10); array_ptr += 0x10; |