From 3e5dd1d047bada52ab0dce2fe58b04e39bcaa1cc Mon Sep 17 00:00:00 2001 From: Seth Barberee Date: Fri, 22 Oct 2021 10:01:07 -0700 Subject: Death by 74 files (#65) * death by 74 files * 20% reached * doc move stuff in pokemon * fix undef reference * doc more and plumb a few more constanst for num party members and num moves * that struct is def PokemonMove.. clean up all code with it --- src/code_2.c | 1 - src/code_800D090.c | 30 ++-- src/code_80118A4.c | 2 - src/code_801AFA4.c | 173 ++++++++++++++++++---- src/code_801D760.c | 1 - src/code_8040094.c | 1 - src/code_80983D8.c | 32 ++++ src/code_8098BDC.c | 1 - src/credits.c | 2 - src/debug_menu_1.c | 40 +++-- src/debug_menu_2.c | 24 +-- src/debug_menu_mid.c | 1 - src/felicity_bank_1.c | 1 - src/friend_area.c | 2 - src/friend_area_action_menu.c | 17 ++- src/friend_area_action_menu_1.c | 35 +++-- src/ground_link.c | 33 +++++ src/ground_map.c | 77 ++++++++++ src/gulpin_shop.c | 8 +- src/items.c | 1 - src/kangaskhan_storage_2.c | 1 - src/kecleon_items_1.c | 170 ++++++++++++++++++++- src/load_screen.c | 3 - src/mailbox.c | 2 +- src/mailbox_1.c | 11 +- src/more_input.c | 1 - src/music.c | 16 +- src/music_pre.c | 320 +++++++++++++++++++++++++++++++++++++--- src/other_menus.c | 2 - src/pelipper_board_1.c | 12 +- src/pokemon.c | 2 +- src/pokemon_3.c | 21 ++- src/pokemon_mid.c | 65 ++++---- src/save.c | 7 +- src/thank_you_wonder_mail.c | 1 - src/trade_items_menu.c | 1 - src/wonder_mail.c | 2 - src/wonder_mail_2.c | 308 +++++++++++++++++++++++++++++++++++++- src/wonder_mail_3.c | 4 +- src/wonder_mail_3_mid.c | 8 +- 40 files changed, 1192 insertions(+), 247 deletions(-) create mode 100644 src/ground_link.c create mode 100644 src/ground_map.c (limited to 'src') diff --git a/src/code_2.c b/src/code_2.c index c26b20b..29f1088 100644 --- a/src/code_2.c +++ b/src/code_2.c @@ -65,7 +65,6 @@ extern u32 gUnknown_203B03C; extern u16 gUnknown_2026E4E; extern s32 gUnknown_2000A80; extern struct OpenedFile *gTitlePaletteFile; -extern struct Inputs gRealInputs; extern struct UnkSaveStruct1 *gUnknown_203B46C; extern char gPMDBuildVersion[]; diff --git a/src/code_800D090.c b/src/code_800D090.c index 45f89f7..fd1c948 100644 --- a/src/code_800D090.c +++ b/src/code_800D090.c @@ -8,13 +8,8 @@ extern void SoundBiasReset(void); extern void SoundBiasSet(void); -struct unkStruct_202DB60 -{ - u32 unk0; - u32 unk4; -}; - -extern struct unkStruct_202DB60 gUnknown_202DB60; +extern u32 gUnknown_202DB60[2]; +extern u16 gUnknown_202DB30[2][8]; void Hang(void) { @@ -24,7 +19,6 @@ void Hang(void) } } - // Unused void sub_800D098(void) { @@ -127,9 +121,25 @@ void nullsub_187(void) u32 sub_800D1C0(void) { - if(gUnknown_202DB60.unk0 != 2) + if(gUnknown_202DB60[0] != 2) return 0; - if(gUnknown_202DB60.unk4 != 2) + if(gUnknown_202DB60[1] != 2) return 0; return 1; } + +void sub_800D1E0(void) +{ + s32 iVar1; + u32 iVar2; + for(iVar1 = 0; iVar1 < 2; iVar1++) + { + for(iVar2 = 0; iVar2 < 8; iVar2++) + { + if(gUnknown_202DB30[iVar1][iVar2] == 0xfdfd) + { + gUnknown_202DB60[iVar1] = 1; + } + } + } +} diff --git a/src/code_80118A4.c b/src/code_80118A4.c index d6832ba..2a21607 100644 --- a/src/code_80118A4.c +++ b/src/code_80118A4.c @@ -17,8 +17,6 @@ extern void sub_801199C(u16 r0); extern void sub_800C298(u16 r0); extern u8 sub_800C5D0(u16 r0); -extern struct PlayTimeStruct *gPlayTimeRef; - struct UnkSaveStruct1 { /* 0x0 */ u32 unk0; diff --git a/src/code_801AFA4.c b/src/code_801AFA4.c index b7b9234..9ab6fec 100644 --- a/src/code_801AFA4.c +++ b/src/code_801AFA4.c @@ -4,12 +4,11 @@ #include "item.h" #include "team_inventory.h" #include "menu.h" - -extern struct TeamInventory *gTeamInventory_203B460; +#include "pokemon.h" extern void sub_8092C84(u8 *, u16); extern void sub_8099690(u32); -extern u32 sub_801B2F4(void); +extern s32 GetNumMonsAbleToLearnItemMove(void); extern void sub_801B064(s32); @@ -24,47 +23,52 @@ extern u32 gUnknown_80DB9E4; extern u32 gUnknown_80DBA0C; extern u8 gUnknown_202E1C8[0x50]; +extern u8 gAvailablePokemonNames[0x50]; +extern u8 gUnknown_202E218[0x50]; +extern void sub_8092AD4(struct PokemonMove*, u16); +extern void sub_809401C(struct PokemonMove *, struct PokemonMove *); extern bool8 IsHMItem(u8); -extern void DisplayGulpinDialogueSprite(u32, u32, u32 *); +extern void DisplayGulpinDialogueSprite(u32, u32, void *); extern void sub_801B178(void); -extern void sub_8094060(u32 *, u32 *); +extern void sub_8094060(void *, struct PokemonMove *); extern void PlaySound(u32); extern void sub_80141B4(u32 *, u32, u32 ,u32); extern void sub_8014248(u32 *, u32, u32, struct MenuItem *, u32, u32, u32, u32, u32); +extern void sub_808DA34(u8 *buffer, struct PokemonStruct *pokemon); +extern s32 sub_80144A4(s32 *); +extern u32 sub_801E8C0(void); +extern void sub_801E93C(void); -struct subStruct_203B22C -{ - u8 fill0[0x2C]; - u32 unk2C; -}; +extern bool8 CanMonLearnMove(u16 moveID, s16 _species); +extern s32 sub_808D580(s32*); struct unkStruct_203B22C { // size: 0xa4 - s32 state; - u32 unk4; - u8 unk8; // item index - u16 unkA; // item move?? - u32 unkC; - u8 fill10[0x58 - 0x10]; - s16 unk58; - u16 unk5A; - struct subStruct_203B22C *unk5C; + /* 0x0 */ s32 state; + /* 0x4 */ u32 teamItemIndex; + /* 0x8 */ u8 itemIndex; // item index + /* 0xA */ u16 moveID; // item move?? + /* 0xC */ struct PokemonMove moves[MAX_MON_MOVES * 2]; + /* 0x4C */ s32 monsAbleToLearnMove; // number of party members able to learn move + /* 0x50 */ s16 unk50[MAX_TEAM_MEMBERS]; // species IDs of each member able to learn move + /* 0x58 */ s16 chosenPokemon; // species of pokemon that will learn move + /* 0x5C */ struct PokemonStruct *pokeStruct; // PokemonStruct of said pokemon u32 unk60; /* 0x64 */ struct MenuItem menuItems[8]; }; extern struct unkStruct_203B22C *gUnknown_203B22C; -u32 sub_801AFA4(u32 r0) +u32 sub_801AFA4(u32 index) { gUnknown_203B22C = MemoryAlloc(sizeof(struct unkStruct_203B22C), 8); - gUnknown_203B22C->unk4 = r0; - gUnknown_203B22C->unk8 = gTeamInventory_203B460->teamItems[r0].itemIndex; - gUnknown_203B22C->unkA = GetItemMove(gUnknown_203B22C->unk8); - sub_8092C84(gUnknown_202E1C8, gUnknown_203B22C->unkA); + gUnknown_203B22C->teamItemIndex = index; + gUnknown_203B22C->itemIndex = gTeamInventory_203B460->teamItems[index].itemIndex; + gUnknown_203B22C->moveID = GetItemMove(gUnknown_203B22C->itemIndex); + sub_8092C84(gUnknown_202E1C8, gUnknown_203B22C->moveID); sub_8099690(0); - if(sub_801B2F4() == 0) + if(GetNumMonsAbleToLearnItemMove() == 0) { sub_801B064(3); } @@ -126,14 +130,14 @@ void sub_801B080(void) sub_8014248(&gUnknown_80DB9BC, 0, gUnknown_203B22C->unk60, gUnknown_203B22C->menuItems, 0, 4, 0, 0, 0x20); break; case 1: - DisplayGulpinDialogueSprite(2, gUnknown_203B22C->unk58, &gUnknown_203B22C->unkC); + DisplayGulpinDialogueSprite(2, gUnknown_203B22C->chosenPokemon, gUnknown_203B22C->moves); break; case 2: - sub_8094060(&gUnknown_203B22C->unkC, &gUnknown_203B22C->unk5C->unk2C); - if(!IsHMItem(gUnknown_203B22C->unk8)) + sub_8094060(gUnknown_203B22C->moves, gUnknown_203B22C->pokeStruct->moves); + if(!IsHMItem(gUnknown_203B22C->itemIndex)) { - gTeamInventory_203B460->teamItems[gUnknown_203B22C->unk4].numItems = gUnknown_203B22C->unk8 - 0x7D; - gTeamInventory_203B460->teamItems[gUnknown_203B22C->unk4].itemIndex = ITEM_ID_USED_TM; + gTeamInventory_203B460->teamItems[gUnknown_203B22C->teamItemIndex].numItems = gUnknown_203B22C->itemIndex - 0x7D; + gTeamInventory_203B460->teamItems[gUnknown_203B22C->teamItemIndex].itemIndex = ITEM_ID_USED_TM; } PlaySound(0x9C << 1); // #+CM$m8#R learned @@ -150,3 +154,112 @@ void sub_801B080(void) break; } } + +void sub_801B178(void) +{ + int monIndex; + u8 *bufferPtr; + + for(monIndex = 0; monIndex < gUnknown_203B22C->monsAbleToLearnMove; monIndex++) + { + bufferPtr = gAvailablePokemonNames + (0x50 * monIndex); + sub_808DA34(bufferPtr, &gRecruitedPokemonRef->pokemon[gUnknown_203B22C->unk50[monIndex]]); + gUnknown_203B22C->menuItems[monIndex].text = bufferPtr; + gUnknown_203B22C->menuItems[monIndex].menuAction = monIndex + 4; + } + gUnknown_203B22C->menuItems[monIndex].text = NULL; + gUnknown_203B22C->menuItems[monIndex].menuAction = 1; +} + +void sub_801B200(void) +{ + s32 temp; + s32 moveIndex; + struct PokemonMove *pokeMove; + + if(sub_80144A4(&temp) == 0) + { + gUnknown_203B22C->unk60 = temp; + switch(temp) + { + case 1: + sub_801B064(4); + break; + default: + gUnknown_203B22C->chosenPokemon = gUnknown_203B22C->unk50[temp - 4]; + gUnknown_203B22C->pokeStruct = &gRecruitedPokemonRef->pokemon[gUnknown_203B22C->chosenPokemon]; + sub_808DA34(gUnknown_202E218, gUnknown_203B22C->pokeStruct); + sub_809401C(gUnknown_203B22C->moves, gUnknown_203B22C->pokeStruct->moves); + for(moveIndex = 0; moveIndex < MAX_MON_MOVES * 2; moveIndex++) + { + pokeMove = &gUnknown_203B22C->moves[moveIndex]; + if((pokeMove->moveFlags & MOVE_FLAG_EXISTS) == 0) + { + sub_8092AD4(pokeMove, gUnknown_203B22C->moveID); + break; + } + } + if(moveIndex >= MAX_MON_MOVES) + sub_801B064(1); + else + sub_801B064(2); + break; + case 0: + break; + } + } +} + +void sub_801B2AC(void) +{ + switch(sub_801E8C0()) + { + case 3: + sub_801E93C(); + sub_801B064(2); + break; + case 2: + sub_801E93C(); + sub_801B064(0); + break; + case 0: + case 1: + break; + } +} + + +void sub_801B2D8(void) +{ + s32 temp; + + if(sub_80144A4(&temp) == 0) + { + sub_801B064(4); + } +} + +s32 GetNumMonsAbleToLearnItemMove(void) +{ + s32 length; + s32 iVar4; + s32 index; + s32 team [MAX_TEAM_MEMBERS]; + struct PokemonStruct *preload; + + + length = sub_808D580(team); + gUnknown_203B22C->monsAbleToLearnMove = 0; + + for(index = 0; index < length; index++) + { + preload = &gRecruitedPokemonRef->pokemon[team[index]]; + if (CanMonLearnMove(gUnknown_203B22C->moveID, preload->speciesNum)) { + gUnknown_203B22C->unk50[gUnknown_203B22C->monsAbleToLearnMove] = team[index]; + iVar4 = gUnknown_203B22C->monsAbleToLearnMove; + if (iVar4 >= MAX_TEAM_MEMBERS) break; + gUnknown_203B22C->monsAbleToLearnMove = iVar4 + 1; + } + } + return gUnknown_203B22C->monsAbleToLearnMove; +} diff --git a/src/code_801D760.c b/src/code_801D760.c index f48e717..f19925f 100644 --- a/src/code_801D760.c +++ b/src/code_801D760.c @@ -95,7 +95,6 @@ struct unk_203B250 struct unk_203B250 *gUnknown_203B250; -extern struct TeamInventory *gTeamInventory_203B460; void sub_801D680(void) { diff --git a/src/code_8040094.c b/src/code_8040094.c index 4db3e6c..d220844 100644 --- a/src/code_8040094.c +++ b/src/code_8040094.c @@ -3,7 +3,6 @@ #include "file_system.h" #include "dungeon_global_data.h" -extern struct PlayTimeStruct *gPlayTimeRef; extern struct DungeonGlobalData *gDungeonGlobalData; extern s32 gUnknown_80F6568[]; extern u8 gUnknown_202EE01; diff --git a/src/code_80983D8.c b/src/code_80983D8.c index ef1e59d..c6acf93 100644 --- a/src/code_80983D8.c +++ b/src/code_80983D8.c @@ -1,5 +1,36 @@ #include "global.h" +extern u32 gUnknown_8115E94[5][3]; // NOTE: Factor of two difference in array sizes + +s32 sub_80983D8(short *param_1,short *param_2) +{ + s32 uVar1; + s32 uVar2; + s32 uVar3; + + uVar3 = param_2[0] - param_1[0]; + uVar2 = param_2[1] - param_1[1]; + if ((uVar3 == 0) && (uVar2 == 0)) { + uVar1 = 0; + } + else { + if (0 < uVar3) { + uVar3 = 1; + } + if (0 < uVar2) { + uVar2 = 1; + } + if (-1 >= uVar3) { + uVar3 = -1; + } + if (-1 >= uVar2) { + uVar2 = -1; + } + uVar1 = gUnknown_8115E94[(uVar2 + 1)][(uVar3 + 1)]; + } + return uVar1; +} + s32 sub_8098434(short param_1[],short param_2[]) { s32 diff_index1; @@ -18,3 +49,4 @@ s32 sub_8098434(short param_1[],short param_2[]) } return diff_index1; } + diff --git a/src/code_8098BDC.c b/src/code_8098BDC.c index b77cdf8..e379542 100644 --- a/src/code_8098BDC.c +++ b/src/code_8098BDC.c @@ -3,7 +3,6 @@ #include "input.h" #include "debug.h" -extern struct PlayTimeStruct *gPlayTimeRef; extern u32 gUnknown_20398A8; extern u32 gUnknown_20398AC; extern u32 gUnknown_20398B0; diff --git a/src/credits.c b/src/credits.c index 33fa3ba..1e0a8ae 100644 --- a/src/credits.c +++ b/src/credits.c @@ -2,8 +2,6 @@ #include "input.h" #include "memory.h" -extern struct Inputs gRealInputs; - struct unkStruct_203B344 { u32 state; // state variable diff --git a/src/debug_menu_1.c b/src/debug_menu_1.c index 4386c87..f23e1eb 100644 --- a/src/debug_menu_1.c +++ b/src/debug_menu_1.c @@ -1,26 +1,38 @@ #include "global.h" #include "pokemon.h" +#include "debug_menu.h" -struct unkStruct_203B3F8 -{ - // size: 0x140 - u32 state; - u32 unk4; - struct PokemonStruct *pokemon; - u8 fill4[4]; - u32 unk10; - u8 fill14[0x60 - 0x14]; - u32 unk60; -}; extern struct unkStruct_203B3F8 *gUnknown_203B3F8; extern u32 sub_8013BBC(u32 *); -extern void sub_8023A94(u32); -extern u8 sub_8012FD8(u32 *); +extern u8 sub_8012FD8(void *); extern void sub_803AE58(void); extern u32 sub_8016080(void); extern void sub_803ACD0(u32); extern void sub_80160D8(void); -extern void sub_8013114(u32 *, s32 *); +extern void sub_8013114(void *, s32 *); + +extern u32 sub_8023A94(u32); +extern s16 sub_8023B44(void); +extern void sub_8023C60(void); + +void sub_803AF38(void) +{ + switch(sub_8023A94(1)) + { + case 3: + gUnknown_203B3F8->unk4 = sub_8023B44(); + gUnknown_203B3F8->pokemon = &gRecruitedPokemonRef->pokemon[gUnknown_203B3F8->unk4]; + sub_803ACD0(3); + break; + case 2: + sub_8023C60(); + sub_803ACD0(7); + break; + case 1: + case 0: + break; + } +} void sub_803AF88(void) { diff --git a/src/debug_menu_2.c b/src/debug_menu_2.c index 0704581..56c73c6 100644 --- a/src/debug_menu_2.c +++ b/src/debug_menu_2.c @@ -4,30 +4,8 @@ #include "text.h" #include "input.h" #include "menu.h" +#include "debug_menu.h" -struct unkStruct_203B3F8 -{ - // size: 0x140 - u32 state; - u32 unk4; - struct PokemonStruct *pokemon; - u32 unkC; - const char *unk10; - u8 fill14[0x60 - 0x14]; - u32 unk60; - u32 unk64; - u32 unk68; - u32 unk6C; - u32 unk70; - u32 unk74; - struct UnkTextStruct2 *unk78; - u32 unk7C; - u32 unk80; - u8 fill84[0x90 - 0x84]; - struct MenuItem unk90[8]; - u16 unkD0[8]; - struct UnkTextStruct2 unkE0[4]; -}; extern struct unkStruct_203B3F8 *gUnknown_203B3F8; extern struct UnkTextStruct2 gUnknown_80E7ED4; extern struct UnkTextStruct2 gUnknown_80E7EEC; diff --git a/src/debug_menu_mid.c b/src/debug_menu_mid.c index c210773..31d7bbf 100644 --- a/src/debug_menu_mid.c +++ b/src/debug_menu_mid.c @@ -47,7 +47,6 @@ struct unkStruct_203B3F4 extern struct unkStruct_203B3F4 *gUnknown_203B3F4; -extern struct TeamInventory *gTeamInventory_203B460; extern void sub_801B3C0(struct ItemSlot *); extern void sub_8013AA0(u32 *); diff --git a/src/felicity_bank_1.c b/src/felicity_bank_1.c index ac7a1db..19f8e7c 100644 --- a/src/felicity_bank_1.c +++ b/src/felicity_bank_1.c @@ -3,7 +3,6 @@ #include "team_inventory.h" #include "felicity_bank.h" -extern struct TeamInventory *gTeamInventory_203B460; extern struct unkStruct_203B204 *gUnknown_203B204; extern u8 gUnknown_80DB738; diff --git a/src/friend_area.c b/src/friend_area.c index 0e74848..4854c23 100644 --- a/src/friend_area.c +++ b/src/friend_area.c @@ -7,8 +7,6 @@ bool8 gBoughtFriendAreas[NUM_FRIEND_AREAS]; EWRAM_DATA bool8 *gFriendAreas; -extern struct unkStruct_203B45C *gRecruitedPokemonRef; - extern bool8 *gFriendAreas; extern u32 gFriendAreaDescriptions[]; diff --git a/src/friend_area_action_menu.c b/src/friend_area_action_menu.c index 3ffed40..3cd9c84 100644 --- a/src/friend_area_action_menu.c +++ b/src/friend_area_action_menu.c @@ -4,6 +4,7 @@ #include "input.h" #include "menu.h" #include "item.h" +#include "pokemon.h" #include "team_inventory.h" #include "friend_area_action_menu.h" @@ -34,7 +35,7 @@ extern void sub_801A8D0(u32); extern void sub_801A9E0(); extern void sub_801F1B0(u32, u32); extern void sub_801B3C0(struct ItemSlot *); -extern void sub_809401C(u32 *, u32 *); +extern void sub_809401C(u32 *, struct PokemonMove *); extern void sub_801EE10(u32, s16, u32 *, u32, u32, u32); extern void sub_8012CAC(struct UnkTextStruct2 *, struct MenuItem *); @@ -167,7 +168,7 @@ void sub_802719C(void) void sub_8027274(void) { - struct ItemSlot auStack12; + struct ItemSlot slot; switch(gUnknown_203B2BC->state) { case 0: @@ -185,10 +186,10 @@ void sub_8027274(void) sub_8012D60(&gUnknown_203B2BC->unk7C,gUnknown_203B2BC->menuItems,0,&gUnknown_203B2BC->unk16C,gUnknown_203B2BC->unk70,2); break; case 4: - sub_8024458(gUnknown_203B2BC->unk8,2); + sub_8024458(gUnknown_203B2BC->targetPoke,2); break; case 5: - sub_801BEEC(gUnknown_203B2BC->unk8); + sub_801BEEC(gUnknown_203B2BC->targetPoke); break; case 10: sub_801A5D8(1,0,0,10); @@ -201,12 +202,12 @@ void sub_8027274(void) sub_8012D60(&gUnknown_203B2BC->unk7C,gUnknown_203B2BC->menuItems,0,&gUnknown_203B2BC->unk16C,gUnknown_203B2BC->unk74,2); break; case 0xd: - HeldItemToSlot(&auStack12,&gUnknown_203B2BC->unk10); - sub_801B3C0(&auStack12); + HeldItemToSlot(&slot, &gUnknown_203B2BC->itemToGive); + sub_801B3C0(&slot); break; case 0xe: - sub_809401C(&gUnknown_203B2BC->unk28,&gUnknown_203B2BC->unk18->unk2C); - sub_801EE10(3,gUnknown_203B2BC->unk8,&gUnknown_203B2BC->unk28,0,0,0); + sub_809401C(&gUnknown_203B2BC->unk28,gUnknown_203B2BC->unk18->moves); + sub_801EE10(3,gUnknown_203B2BC->targetPoke,&gUnknown_203B2BC->unk28,0,0,0); break; case 0xf: sub_801F1B0(1,0); diff --git a/src/friend_area_action_menu_1.c b/src/friend_area_action_menu_1.c index 98427f8..33cbded 100644 --- a/src/friend_area_action_menu_1.c +++ b/src/friend_area_action_menu_1.c @@ -30,7 +30,7 @@ extern u32 sub_801A6E8(u32); extern s32 sub_80144A4(s32 *); extern void sub_8027EB8(); -extern void sub_808D31C(struct unkSubStruct_203B2BC *); +extern void sub_808D31C(struct PokemonStruct *); void sub_8027AE4(void) { @@ -56,15 +56,15 @@ void sub_8027B28(void) switch(sub_801A6E8(1)) { case 3: - gUnknown_203B2BC->unkC = sub_801A8AC(); - gUnknown_203B2BC->unk10.itemIndex = gTeamInventory_203B460->teamItems[gUnknown_203B2BC->unkC].itemIndex; - gUnknown_203B2BC->unk10.numItems = gTeamInventory_203B460->teamItems[gUnknown_203B2BC->unkC].numItems; + gUnknown_203B2BC->itemIndex = sub_801A8AC(); + gUnknown_203B2BC->itemToGive.itemIndex = gTeamInventory_203B460->teamItems[gUnknown_203B2BC->itemIndex].itemIndex; + gUnknown_203B2BC->itemToGive.numItems = gTeamInventory_203B460->teamItems[gUnknown_203B2BC->itemIndex].numItems; SetFriendAreaActionMenuState(0xc); break; case 4: - gUnknown_203B2BC->unkC = sub_801A8AC(); - gUnknown_203B2BC->unk10.itemIndex = gTeamInventory_203B460->teamItems[gUnknown_203B2BC->unkC].itemIndex; - gUnknown_203B2BC->unk10.numItems = gTeamInventory_203B460->teamItems[gUnknown_203B2BC->unkC].numItems; + gUnknown_203B2BC->itemIndex = sub_801A8AC(); + gUnknown_203B2BC->itemToGive.itemIndex = gTeamInventory_203B460->teamItems[gUnknown_203B2BC->itemIndex].itemIndex; + gUnknown_203B2BC->itemToGive.numItems = gTeamInventory_203B460->teamItems[gUnknown_203B2BC->itemIndex].numItems; sub_8099690(0); SetFriendAreaActionMenuState(0xd); break; @@ -91,12 +91,12 @@ void sub_8027BD8(void) { case 10: PlaySound(0x14d); - ShiftItemsDownFrom(gUnknown_203B2BC->unkC); + ShiftItemsDownFrom(gUnknown_203B2BC->itemIndex); FillInventoryGaps(); if (gUnknown_203B2BC->unk14.itemFlags != 0) { sub_8091274(&gUnknown_203B2BC->unk14); } - GivePokemonItem(gUnknown_203B2BC->unk8,&gUnknown_203B2BC->unk10); + GivePokemonItem(gUnknown_203B2BC->targetPoke,&gUnknown_203B2BC->itemToGive); sub_801A928(); nullsub_104(); SetFriendAreaActionMenuState(2); @@ -113,11 +113,14 @@ void sub_8027BD8(void) void sub_8027C84() { - u32 temp = sub_801B410(); - if(temp <= 1) - return; - if(temp > 3) - return; - sub_801B450(); - SetFriendAreaActionMenuState(0xB); + switch(sub_801B410()) + { + case 2: + case 3: + sub_801B450(); + SetFriendAreaActionMenuState(0xB); + case 0: + case 1: + break; + } } diff --git a/src/ground_link.c b/src/ground_link.c new file mode 100644 index 0000000..80e0294 --- /dev/null +++ b/src/ground_link.c @@ -0,0 +1,33 @@ +#include "global.h" +#include "debug.h" + +struct unkStruct_80A77D0 +{ + u32 unk0; + u32 unk4; + u32 unk8; +}; + +struct unkStruct_203B4B8 +{ + u32 unk0; +}; + +extern struct unkStruct_203B4B8 gUnknown_203B4B8; +extern struct DebugLocation gUnknown_8118798; +extern struct unkStruct_80A77D0 *sub_80A77D0(s16 r0, struct DebugLocation *r1); + +void sub_80AD868(void) +{ + gUnknown_203B4B8.unk0 = 0; +} + +void sub_80AD874(void) +{ + gUnknown_203B4B8.unk0 = 0; +} + +void GroundLink_Select(s16 r0) +{ + gUnknown_203B4B8.unk0 = sub_80A77D0(r0, &gUnknown_8118798)->unk8; +} diff --git a/src/ground_map.c b/src/ground_map.c new file mode 100644 index 0000000..967589d --- /dev/null +++ b/src/ground_map.c @@ -0,0 +1,77 @@ +#include "global.h" +#include "memory.h" +#include "debug.h" + +struct unkStruct_3001B6C +{ + // size: 0x110 + u8 fill0[0xE4]; + u16 unkE4; +}; + +extern struct unkStruct_3001B6C *gUnknown_3001B6C; +extern u8 gUnknown_811736C[]; +extern struct DebugLocation gUnknown_8117538[]; + +extern u8 *gUnknown_3001B70; + +extern void sub_809D600(void *, u8 *, u32, u32, u32); +extern void GroundMap_Reset(void); +extern void sub_80A5E8C(u32); +extern void sub_809D648(void *); +extern void sub_80A5EBC(void); + +extern void sub_80A2D00(void *); +extern void sub_80015C0(u32, u32); +extern void sub_80A5EDC(u32); +extern void sub_809D754(void *, struct DebugLocation *); +extern void sub_80A2D68(void *); +extern void nullsub_121(void); +extern void sub_80A2D88(void *); +extern void nullsub_122(void); + +void sub_80A4A7C(void) +{ + gUnknown_3001B6C = MemoryAlloc(0x110, 6); + gUnknown_3001B6C->unkE4 = -1; + sub_809D600(gUnknown_3001B6C, gUnknown_811736C, 0, -1, -1); + sub_80A5E8C(0); + GroundMap_Reset(); +} + +void sub_80A4AC4(void) +{ + GroundMap_Reset(); + sub_80A5EBC(); + sub_809D648(gUnknown_3001B6C); + MemoryFree(gUnknown_3001B6C); + gUnknown_3001B6C = NULL; +} + +void GroundMap_Reset(void) +{ + sub_80015C0(0, 0x37); + sub_80015C0(0, 0x38); + sub_809D754(gUnknown_3001B6C, gUnknown_8117538); + if(gUnknown_3001B70 != NULL) + { + sub_80A2D00(gUnknown_3001B70); + MemoryFree(gUnknown_3001B70); + gUnknown_3001B70 = NULL; + } + sub_80A5EDC(0); +} + +void sub_80A4B38(void) +{ + nullsub_121(); + if(gUnknown_3001B70 != NULL) + sub_80A2D68(gUnknown_3001B70); +} + +void sub_80A4B54(void) +{ + if(gUnknown_3001B70 != NULL) + sub_80A2D88(gUnknown_3001B70); + nullsub_122(); +} diff --git a/src/gulpin_shop.c b/src/gulpin_shop.c index 69c6a52..d5ebc6b 100644 --- a/src/gulpin_shop.c +++ b/src/gulpin_shop.c @@ -21,16 +21,16 @@ extern void sub_801EA28(); extern void sub_8012CAC(struct UnkTextStruct2 *, struct MenuItem *); extern void sub_801EBC4(); -u32 DisplayGulpinDialogueSprite(s32 param_1,s16 param_2,struct unkStruct_Gulpin *param_3) +u32 DisplayGulpinDialogueSprite(s32 param_1,s16 pokeSpecies,struct unkStruct_Gulpin *param_3) { struct OpenedFile *faceFile; - s32 param2_32; + s32 species_32; - param2_32 = param_2; // dumb cast needed to get lsr/asr combo + species_32 = pokeSpecies; // dumb cast needed to get lsr/asr combo gUnknown_203B26C = MemoryAlloc(sizeof(struct unkStruct_203B26C),8); gUnknown_203B26C->unk0 = param_1; - gUnknown_203B26C->unkC = param2_32; + gUnknown_203B26C->speciesNum = species_32; gUnknown_203B26C->unk10 = param_3; gUnknown_203B26C->unk1C = param_3->unk22; diff --git a/src/items.c b/src/items.c index 5f6a626..0d41510 100644 --- a/src/items.c +++ b/src/items.c @@ -11,7 +11,6 @@ extern struct TeamInventory *gTeamInventory_203B460; extern struct TeamInventory gUnknown_20389A8; extern struct FileArchive gSystemFileArchive; -extern struct unkStruct_203B45C *gRecruitedPokemonRef; extern const char gItemParaFileName[]; extern const char gUnknown_8109794[]; extern const char gUnknown_81097A4[]; diff --git a/src/kangaskhan_storage_2.c b/src/kangaskhan_storage_2.c index a1f0c7e..007aea6 100644 --- a/src/kangaskhan_storage_2.c +++ b/src/kangaskhan_storage_2.c @@ -8,7 +8,6 @@ #include "kangaskhan_storage.h" extern struct unkStruct_203B208 *gUnknown_203B208; -extern struct TeamInventory *gTeamInventory_203B460; struct unkStruct_203B20C { diff --git a/src/kecleon_items_1.c b/src/kecleon_items_1.c index 6d73eb0..610fd4f 100644 --- a/src/kecleon_items_1.c +++ b/src/kecleon_items_1.c @@ -1,5 +1,6 @@ #include "global.h" #include "file_system.h" +#include "memory.h" #include "pokemon.h" #include "input.h" #include "item.h" @@ -7,10 +8,7 @@ #include "team_inventory.h" extern struct unkStruct_203B210 *gUnknown_203B210; -extern struct TeamInventory *gTeamInventory_203B460; -extern u32 GetStackSellPrice(struct ItemSlot *); -extern u32 xxx_count_inv_unk230(void); extern s32 sub_80144A4(s32 *); void UpdateKecleonStoreState(u32); extern u32 sub_801B410(void); @@ -19,13 +17,64 @@ extern void sub_801B450(void); extern void sub_8099690(u32); extern u8 sub_8012FD8(u32 *); extern void sub_8013114(u32 *, u32 *); -extern void sub_8019EDC(u32); +extern u32 sub_8019EDC(u8); extern void sub_801A2A8(u32); extern s32 sub_801A8AC(void); extern u32 sub_801A6E8(u32); extern void sub_801A928(void); extern void DrawTeamMoneyBox(u32); +struct unkStruct_203B214 +{; + // size: 0xA0 + u8 fill0[0x18]; + // NOTE: has to be packed here so it doesn't take 4 bytes.. + union __attribute__ ((__packed__)) temp2 + { + u16 unk18; + u8 unk18_u8; + } temp; + s16 unk1A; + s16 unk1C; + s16 unk1E; + s16 unk20; + u16 unk22; + u8 fill24[0x34 - 0x24]; + u32 unk34; + struct UnkTextStruct2 *unk38; + struct UnkTextStruct2 unk3C[4]; + u8 unk9C[4]; +}; + +extern struct unkStruct_203B214 *gUnknown_203B214; + +struct ItemSlot_Alt +{ + union temp { + struct ItemSlot norm; + u32 full_bits; + } temp; +}; + +extern void sub_8013818(void *, u32, u32, u32); + +extern u8 sub_8019FB0(void); +extern u8 sub_80138B8(void *, u32); + +extern void PlayMenuSoundEffect(u32); +extern s32 GetStackBuyPrice(struct ItemSlot *); +extern s32 GetKeyPress(void *); +extern void sub_8013660(void *); + +extern struct UnkTextStruct2 gUnknown_80DB8CC; +extern struct UnkTextStruct2 gUnknown_80DB8B4; +extern u16 gUnknown_203B218; +extern void sub_8013984(u8 *); +extern void sub_801A064(void); +extern void sub_801A0D8(void); +extern void AddMenuCursorSprite(void *); +extern s32 xxx_count_inv_unk230(); + void sub_8019B08(void) { switch(sub_801A6E8(1)) @@ -207,3 +256,116 @@ void sub_8019E04(s32 param_1) } } +u32 sub_8019E40(u32 r0) +{ + if(xxx_count_inv_unk230() == 0) + { + return 0; + } + else + { + gUnknown_203B214 = MemoryAlloc(sizeof(struct unkStruct_203B214), 0x8); + gUnknown_203B214->unk34 = r0; + gUnknown_203B214->unk38 = &gUnknown_203B214->unk3C[gUnknown_203B214->unk34]; + sub_8006518(gUnknown_203B214->unk3C); + gUnknown_203B214->unk3C[gUnknown_203B214->unk34] = gUnknown_80DB8CC; + gUnknown_203B214->unk38->unk14 = gUnknown_203B214->unk9C; + ResetUnusedInputStruct(); + sub_800641C(gUnknown_203B214->unk3C, 1, 1); + sub_8013818(gUnknown_203B214, xxx_count_inv_unk230(), 0xA, r0); + gUnknown_203B214->temp.unk18 = gUnknown_203B218; + sub_8013984((u8 *)gUnknown_203B214); + sub_801A064(); + sub_801A0D8(); + return 1; + } +} + +u32 sub_8019EDC(u8 r0) +{ + struct ItemSlot_Alt slot; + struct HeldItem *return_var; + u32 r2; + u32 r3; + + if(r0 == 0) + { + sub_8013660(gUnknown_203B214); + return 0; + } + else + { + switch(GetKeyPress(gUnknown_203B214)) + { + case 2: + PlayMenuSoundEffect(1); + return 2; + case 1: + return_var = xxx_get_inv_unk230_at_809185C(sub_8019FB0()); + + // NOTE: needs seperate vars to match + r2 = return_var->itemIndex << 16; + slot.temp.full_bits = (slot.temp.full_bits & 0xff00ffff) | r2; + r3 = return_var->numItems << 8; + slot.temp.full_bits = (slot.temp.full_bits & 0xffff00ff) | r3; + + if(GetStackBuyPrice((struct ItemSlot *)&slot) > gTeamInventory_203B460->teamMoney) + { + PlayMenuSoundEffect(2); + } + else + { + PlayMenuSoundEffect(0); + } + return 3; + case 4: + PlayMenuSoundEffect(4); + return 4; + default: + if(sub_80138B8(gUnknown_203B214, 1) != 0) + { + sub_801A064(); + sub_801A0D8(); + return 1; + } + else + { + return 0; + } + } + } +} + +u8 sub_8019FB0(void) +{ + return (gUnknown_203B214->unk1E * gUnknown_203B214->unk1C) + gUnknown_203B214->temp.unk18_u8; +} + +void sub_8019FCC(u32 r0) +{ + u8 r0_u8; + + r0_u8 = r0; + + ResetUnusedInputStruct(); + sub_800641C(gUnknown_203B214->unk3C, 0, 0); + gUnknown_203B214->unk22 = xxx_count_inv_unk230(); + sub_8013984((u8 *)gUnknown_203B214); + sub_801A064(); + sub_801A0D8(); + if(r0_u8) + AddMenuCursorSprite(gUnknown_203B214); +} + +void sub_801A010(void) +{ + if(gUnknown_203B214 != NULL) + { + gUnknown_203B218 = gUnknown_203B214->temp.unk18; + gUnknown_203B214->unk3C[gUnknown_203B214->unk34] = gUnknown_80DB8B4; + ResetUnusedInputStruct(); + sub_800641C(gUnknown_203B214->unk3C, 1, 1); + MemoryFree(gUnknown_203B214); + gUnknown_203B214 = NULL; + } +} diff --git a/src/load_screen.c b/src/load_screen.c index cad8049..a4e260a 100644 --- a/src/load_screen.c +++ b/src/load_screen.c @@ -9,9 +9,6 @@ #include "pokemon.h" #include "save.h" -extern struct PlayTimeStruct *gPlayTimeRef; -extern struct PlayTimeStruct gPlayTime; - extern const struct FileArchive gTitleMenuFileArchive; struct unkStruct_203B484 diff --git a/src/mailbox.c b/src/mailbox.c index d7301db..88eabdd 100644 --- a/src/mailbox.c +++ b/src/mailbox.c @@ -176,7 +176,7 @@ void sub_802E1AC(void) sub_802B7D0(1); break; case 0xB: - sub_802B9FC(gUnknown_203B304->unk9); + sub_802B9FC(gUnknown_203B304->mailIndex); break; case 0: case 2: diff --git a/src/mailbox_1.c b/src/mailbox_1.c index ee212ae..18bb8fc 100644 --- a/src/mailbox_1.c +++ b/src/mailbox_1.c @@ -9,13 +9,12 @@ extern u8 gMailAccepted[]; extern u8 gUnknown_80E0324[]; extern void xxx_call_draw_string(s32 x, u32 y, u8 *, u32 , u32); extern void sub_8012BC4(u32 x, u32 y, u32, u32, u32, u32); -extern u32 sub_80969AC(void); extern void sub_8008C54(u32); extern void sub_80073B8(u32); extern void sub_80073E0(u32); extern u32 sub_802BA8C(void); extern void sub_802BACC(void); -extern u8 sub_802B7A8(void); +extern u8 GetPokemonNewsIndex(void); extern void sub_802B81C(void); extern u32 sub_802B720(u32); extern u32 sub_802C898(void); @@ -63,7 +62,7 @@ void sub_802E774(void) break; case 3: case 4: - gUnknown_203B304->unk9 = sub_802B7A8(); + gUnknown_203B304->mailIndex = GetPokemonNewsIndex(); gUnknown_203B304->unk4 = 0xA; SetMailboxState(0xB); break; @@ -97,8 +96,8 @@ void CreateMailAcceptedStatusBox(u32 r0) sub_8008C54(r0); sub_80073B8(r0); xxx_call_draw_string(3, 0, gMailAccepted, r0, 0); - sub_8012BC4(0x12, 0xD, sub_80969AC(), 2, 7, r0); - xxx_call_draw_string(0x16, 0xD, gUnknown_80E0324, r0, 0); - sub_8012BC4(0x23, 0xD, 0x8, 0x2, 7, r0); + sub_8012BC4(0x12, 0xD, GetNumAcceptedJobs(), 2, 7, r0); + xxx_call_draw_string(0x16, 0xD, gUnknown_80E0324, r0, 0); // "/" + sub_8012BC4(0x23, 0xD, MAX_ACCEPTED_JOBS, 2, 7, r0); sub_80073E0(r0); } diff --git a/src/more_input.c b/src/more_input.c index d3c030c..cd8dd5b 100644 --- a/src/more_input.c +++ b/src/more_input.c @@ -3,7 +3,6 @@ extern void nullsub_34(struct UnkInputStruct *r0); -extern struct Inputs gRealInputs; u32 sub_8012AE8(void); u32 sub_8012A64(struct UnkInputStruct *r0, u32 r1) diff --git a/src/music.c b/src/music.c index 896bd5b..8d06025 100644 --- a/src/music.c +++ b/src/music.c @@ -1,6 +1,7 @@ #include "global.h" #include "m4a.h" #include "constants/bg_music.h" +#include "music.h" extern u8 sub_80023E4(u32); extern void sub_80118C4(u16); @@ -27,11 +28,6 @@ extern u8 gUnknown_202D694; extern u32 gUnknown_203B0B8; extern u16 gRawKeyInput; -bool8 IsBGSong(u32); -bool8 sub_800CAAC(u32); -bool8 sub_800CACC(u32); -u16 sub_800CAE0(u16); - void StopBGMusicVSync(void) { bool8 interrupt_flag; @@ -106,21 +102,21 @@ u8 sub_800CA38(u32 songIndex) { if(IsBGSong(songIndex)) { - if(sub_800CAE0(songIndex) == 0) + if(GetMusicPlayerIndex(songIndex) == 0) { return 1; } } if(sub_800CACC(songIndex)) { - if(sub_800CAE0(songIndex) == 1) + if(GetMusicPlayerIndex(songIndex) == 1) { return 1; } } else if(sub_800CAAC(songIndex)) { - if(sub_800CAE0(songIndex) > 1) + if(GetMusicPlayerIndex(songIndex) > 1) { return 1; } @@ -159,7 +155,7 @@ bool8 sub_800CACC(u32 songIndex) return FALSE; } -u16 sub_800CAE0(u16 songIndex) +u16 GetMusicPlayerIndex(u16 songIndex) { return gSongTable[songIndex].ms; } @@ -178,7 +174,7 @@ void nullsub_20(u16 songIndex) { } -void nullsub_21(void) +void nullsub_21(u16 songIndex) { } diff --git a/src/music_pre.c b/src/music_pre.c index 034fe93..cb983d3 100644 --- a/src/music_pre.c +++ b/src/music_pre.c @@ -3,6 +3,7 @@ #include "m4a.h" #include "bg.h" #include "music.h" +#include "input.h" extern bool8 EnableInterrupts(void); extern bool8 DisableInterrupts(void); @@ -12,9 +13,7 @@ extern void AckInterrupt(u16); extern void nullsub_25(); extern void nullsub_18(); extern void UpdateSound(); -extern void UpdateInput(); - -extern void sub_800C298(u16 r0); +extern void nullsub_21(u16); typedef void (*IntrCallback)(void); extern IntrCallback gIntrCallbacks[]; @@ -59,6 +58,7 @@ struct unkStruct_3000FD8 }; extern struct unkStruct_3000FD8 gUnknown_3000FD8[8]; +extern struct unkStruct_3000FD8 gUnknown_3000FE8[4]; extern u8 gUnknown_202D7FE; extern u16 gBldCnt; @@ -396,8 +396,6 @@ void UpdateBGControlRegisters(void) void InitMusic(void) { s32 counter; - u16 zero; - u16 zero2; struct unkStruct_3000FD8 *preload; @@ -416,20 +414,12 @@ void InitMusic(void) gUnknown_202D692 = 0; gUnknown_202D694 = 0; - // Kinda hacky but makes things match - preload = gUnknown_3000FD8; - zero = 0; - zero2 = 0; - counter = 7; - - while(counter >= 0) + for(counter = 0, preload = &gUnknown_3000FD8[0]; counter < 8; counter++, preload++) { - preload->unk0 = zero2; + preload->unk0 = 0; preload->songIndex = 0x3e5; - preload->unk4 = zero2; - preload->unk6 = zero; - counter--; - preload++; + preload->unk4 = 0; + preload->unk6 = 0; } nullsub_19(); } @@ -455,7 +445,7 @@ void StartNewBGM(u16 songIndex) if((u16)(gBGMusicPlayerState - 1) <= 1) return; } - if(sub_800CAE0(songIndex)) + if(GetMusicPlayerIndex(songIndex)) { nullsub_20(songIndex); return; @@ -610,7 +600,7 @@ void sub_800C074(u16 SongIndex, u16 param_2) if (sub_800CACC(SongIndex)) { - msVar = sub_800CAE0(SongIndex); + msVar = GetMusicPlayerIndex(SongIndex); if (msVar == 1) { interrupt_flag = DisableInterrupts(); gUnknown_202D68E = SongIndex; @@ -681,7 +671,7 @@ void sub_800C074(u16 SongIndex, u16 param_2) { if (!sub_800CAAC(SongIndex)) return; - msVar = sub_800CAE0(SongIndex); + msVar = GetMusicPlayerIndex(SongIndex); preload = &gUnknown_3000FD8[msVar]; // need to load this before comparison to match if (msVar <= 1) nullsub_20(SongIndex); @@ -736,7 +726,7 @@ void sub_800C074(u16 SongIndex, u16 param_2) "\tb _0800C1B0\n" "_0800C0A4:\n" "\tadds r0, r5, 0\n" - "\tbl sub_800CAE0\n" + "\tbl GetMusicPlayerIndex\n" "\tlsls r0, 16\n" "\tlsrs r7, r0, 16\n" "\tcmp r7, 0x1\n" @@ -867,7 +857,7 @@ void sub_800C074(u16 SongIndex, u16 param_2) "\tcmp r0, 0\n" "\tbeq _0800C208\n" "\tadds r0, r5, 0\n" - "\tbl sub_800CAE0\n" + "\tbl GetMusicPlayerIndex\n" "\tlsls r0, 16\n" "\tlsrs r0, 16\n" "\tlsls r2, r0, 3\n" @@ -924,7 +914,7 @@ void sub_800C214(u16 songIndex, u16 volume) } if ((!sub_800CACC(songIndex)) && (sub_800CAAC(songIndex))) { - msVar = sub_800CAE0(songIndex); + msVar = GetMusicPlayerIndex(songIndex); info = gMPlayTable[msVar].info; preload = &gUnknown_3000FD8[msVar]; if (msVar > 1) { @@ -937,3 +927,287 @@ void sub_800C214(u16 songIndex, u16 volume) } } } + +void sub_800C298(u16 songIndex) +{ + // Each section needs a var for interrupts.. + char cVar1; + char cVar2; + char cVar3; + char cVar4; + + u32 uVar2; + int iVar4; + struct MusicPlayerInfo *puVar6; + struct unkStruct_3000FD8 *preload; + struct unkStruct_3000FD8 *puVar3; + + if (songIndex == 0x3e5) { + cVar1 = DisableInterrupts(); + + for(iVar4 = 2, puVar3 = &gUnknown_3000FE8[0]; iVar4 < 7; iVar4++, puVar3++) + { + m4aMPlayStop(gMPlayTable[iVar4].info); + puVar3->unk0 = 0; + puVar3->songIndex = 0x3e5; + puVar3->unk4 = 0; + puVar3->unk6 = 0; + } + if (cVar1 != '\0') { + EnableInterrupts(); + } + } + else if (sub_800CAAC(songIndex) != '\0') + { + uVar2 = GetMusicPlayerIndex(songIndex); + puVar6 = gMPlayTable[uVar2].info; + preload = &gUnknown_3000FD8[uVar2]; + if (uVar2 < 2) { + nullsub_21(songIndex); + } + else { + cVar2 = DisableInterrupts(); + if (preload->songIndex == songIndex) { + m4aMPlayStop(puVar6); + preload->unk0 = 0; + preload->songIndex = 0x3e5; + preload->unk4 = 0; + preload->unk6 = 0; + } + if (cVar2 != '\0') { + EnableInterrupts(); + } + } + } + else if (songIndex == 0x3e6) + { + cVar3 = DisableInterrupts(); + if (gUnknown_202D690 != 0) { + if (gUnknown_202D68E != 0x3e5) { + gUnknown_202D68E = 0x3e5; + m4aMPlayStop(&gUnknown_2000970); + } + } + if (cVar3 != '\0') { + EnableInterrupts(); + } + } + else if (sub_800CACC(songIndex) != '\0') + { + cVar4 = DisableInterrupts(); + if (gUnknown_202D690 != 0) { + if (gUnknown_202D68E == songIndex) { + gUnknown_202D68E = 0x3e5; + m4aMPlayStop(&gUnknown_2000970); + } + } + if (cVar4 != '\0') { + EnableInterrupts(); + } + } +} + +void sub_800C3F8(u16 songIndex, u16 speed) +{ + char cVar1; + char cVar2; + char cVar3; + char cVar4; + u32 comparison; + s32 uVar6; + u32 uVar8; + struct unkStruct_3000FD8 *preload; + struct unkStruct_3000FD8 *puVar3; + struct MusicPlayerInfo *puVar5; + + comparison = 0x80 << 17; // 16777216 + if((speed * 65536) > comparison) + { + speed = 16; + } + else + { + if((speed >>= 4) == 0) + { + speed = 1; + } + } + + if (songIndex == 0x3e5) { + cVar1 = DisableInterrupts(); + + for(uVar6 = 2, puVar3 = &gUnknown_3000FE8[0]; uVar6 < 7; uVar6++, puVar3++) + { + if (puVar3->songIndex != 0x3e5) { + if (sub_800CAF0(uVar6) != '\0') { + m4aMPlayFadeOut(gMPlayTable[uVar6].info,speed); + } + else { + m4aMPlayStop(gMPlayTable[uVar6].info); + puVar3->unk0 = 0; + puVar3->songIndex = 0x3e5; + puVar3->unk4 = 0; + puVar3->unk6 = 0; + } + } + } + if (cVar1 != '\0') { + EnableInterrupts(); + } + } + else { + if (sub_800CAAC(songIndex) != '\0') { + uVar8 = GetMusicPlayerIndex(songIndex); + preload = &gUnknown_3000FD8[uVar8]; + puVar5 = gMPlayTable[uVar8].info; + cVar2 = DisableInterrupts(); + if (preload->songIndex != 0x3e5) { + if (sub_800CAF0(uVar8) != '\0') { + m4aMPlayFadeOut(puVar5,speed); + } + else { + m4aMPlayStop(puVar5); + preload->unk0 = 0; + preload->songIndex = 0x3e5; + preload->unk4 = 0; + preload->unk6 = 0; + } + } + if (cVar2 != '\0') { + EnableInterrupts(); + } + } + else + { + if (songIndex == 0x3e6) { + cVar3 = DisableInterrupts(); + if ((gUnknown_202D690 != 0) && (gUnknown_202D68E != 0x3e5)) { + if (sub_800CAF0(1) != '\0') { + m4aMPlayFadeOut(&gUnknown_2000970,speed); + } + else { + m4aMPlayStop(&gUnknown_2000970); + gUnknown_202D68E = 0x3e5; + } + } + if (cVar3 != '\0') { + EnableInterrupts(); + } + } + else { + if (sub_800CACC(songIndex) != '\0') { + cVar4 = DisableInterrupts(); + if ((gUnknown_202D690 != 0) && (gUnknown_202D68E == songIndex)) { + if (sub_800CAF0(1) != '\0') { + m4aMPlayFadeOut(&gUnknown_2000970,speed); + } + else { + m4aMPlayStop(&gUnknown_2000970); + gUnknown_202D68E = 0x3e5; + } + } + if (cVar4 != '\0') { + EnableInterrupts(); + } + } + } + } + } +} + +#ifdef NONMATCHING +u8 sub_800C5D0(u16 param_1) +{ + u32 uVar3; + struct unkStruct_3000FD8 *preload; + + + if (sub_800CACC(param_1) != '\0') { + if ((gUnknown_202D690 != 0) && (gUnknown_202D68E == param_1)) { + return 1; + } + } + else + { + // NOTE: regswap of r5 for r4 here... but is functionally matching + if (sub_800CAAC(param_1) != '\0') { + uVar3 = GetMusicPlayerIndex(param_1); + preload = &gUnknown_3000FD8[uVar3]; + if ((1 < uVar3) && (preload->songIndex == param_1)) { + return 1; + } + } + } + return 0; +} +#else +NAKED +u8 sub_800C5D0(u16 param_1) +{ + asm_unified("\tpush {r4,r5,lr}\n" + "\tlsls r0, 16\n" + "\tlsrs r4, r0, 16\n" + "\tadds r5, r4, 0\n" + "\tadds r0, r4, 0\n" + "\tbl sub_800CACC\n" + "\tlsls r0, 24\n" + "\tcmp r0, 0\n" + "\tbeq _0800C600\n" + "\tldr r0, _0800C5F8\n" + "\tldrh r0, [r0]\n" + "\tcmp r0, 0\n" + "\tbeq _0800C630\n" + "\tldr r0, _0800C5FC\n" + "\tldrh r0, [r0]\n" + "\tcmp r0, r4\n" + "\tbne _0800C630\n" + "\tmovs r0, 0x1\n" + "\tb _0800C632\n" + "\t.align 2, 0\n" +"_0800C5F8: .4byte gUnknown_202D690\n" +"_0800C5FC: .4byte gUnknown_202D68E\n" +"_0800C600:\n" + "\tadds r0, r4, 0\n" + "\tbl sub_800CAAC\n" + "\tlsls r0, 24\n" + "\tcmp r0, 0\n" + "\tbeq _0800C630\n" + "\tadds r0, r4, 0\n" + "\tbl GetMusicPlayerIndex\n" + "\tlsls r0, 16\n" + "\tlsrs r0, 16\n" + "\tlsls r2, r0, 3\n" + "\tldr r1, _0800C62C\n" + "\tadds r2, r1\n" + "\tcmp r0, 0x1\n" + "\tbls _0800C630\n" + "\tldrh r0, [r2, 0x2]\n" + "\tcmp r0, r5\n" + "\tbne _0800C630\n" + "\tmovs r0, 0x1\n" + "\tb _0800C632\n" + "\t.align 2, 0\n" +"_0800C62C: .4byte gUnknown_3000FD8\n" +"_0800C630:\n" + "\tmovs r0, 0\n" +"_0800C632:\n" + "\tpop {r4,r5}\n" + "\tpop {r1}\n" + "\tbx r1"); +} +#endif + +void SoundVSync(void) +{ + u8 cVar1; + + cVar1 = DisableInterrupts(); + m4aSoundVSync(); + if(cVar1) + EnableInterrupts(); +} + + +void nullsub_18(void) +{ +} diff --git a/src/other_menus.c b/src/other_menus.c index b67e1f7..641bcfb 100644 --- a/src/other_menus.c +++ b/src/other_menus.c @@ -62,8 +62,6 @@ struct unkStruct_8035D94 extern struct unkStruct_8035D94 *sub_8035D94(); -extern struct TeamInventory *gTeamInventory_203B460; - extern void sub_8037400(void); extern void ResetSprites(u32); extern void sub_8035CF4(u32 *,u32, u32); diff --git a/src/pelipper_board_1.c b/src/pelipper_board_1.c index b8fabd0..1bccc5a 100644 --- a/src/pelipper_board_1.c +++ b/src/pelipper_board_1.c @@ -1,10 +1,10 @@ #include "global.h" +#include "mailbox.h" -extern u8 gUnknown_80E03AC[]; +extern u8 gPelipperBoard_Accepted[]; extern u8 gUnknown_80E03B8[]; extern void xxx_call_draw_string(s32 x, u32 y, u8 *, u32 , u32); extern void sub_8012BC4(u32 x, u32 y, u32, u32, u32, u32); -extern u32 sub_80969AC(void); extern void sub_8008C54(u32); extern void sub_80073B8(u32); extern void sub_80073E0(u32); @@ -52,9 +52,9 @@ void CreatePelipperAcceptedStatusBox(u32 r0) { sub_8008C54(r0); sub_80073B8(r0); - xxx_call_draw_string(3, 0, gUnknown_80E03AC, r0, 0); - sub_8012BC4(0x12, 0xD, sub_80969AC(), 2, 7, r0); - xxx_call_draw_string(0x16, 0xD, gUnknown_80E03B8, r0, 0); - sub_8012BC4(0x23, 0xD, 0x8, 0x2, 7, r0); + xxx_call_draw_string(3, 0, gPelipperBoard_Accepted, r0, 0); + sub_8012BC4(0x12, 0xD, GetNumAcceptedJobs(), 2, 7, r0); + xxx_call_draw_string(0x16, 0xD, gUnknown_80E03B8, r0, 0); // "/" + sub_8012BC4(0x23, 0xD, MAX_ACCEPTED_JOBS, 2, 7, r0); sub_80073E0(r0); } diff --git a/src/pokemon.c b/src/pokemon.c index 1b9003b..4e28437 100644 --- a/src/pokemon.c +++ b/src/pokemon.c @@ -39,7 +39,7 @@ void InitializeRecruitedPokemon(void) gRecruitedPokemonRef->pokemon2[iVar3].unk0 = 0; } - for(iVar3 = 0; iVar3 < 4; iVar3++) + for(iVar3 = 0; iVar3 < MAX_TEAM_MEMBERS; iVar3++) { gRecruitedPokemonRef->team[iVar3].speciesNum = 0; gRecruitedPokemonRef->team[iVar3].unk0 = 0; diff --git a/src/pokemon_3.c b/src/pokemon_3.c index b4cb938..5f4b833 100644 --- a/src/pokemon_3.c +++ b/src/pokemon_3.c @@ -11,7 +11,6 @@ extern u8 gUnknown_810A36B[]; extern s16 gUnknown_810A378[]; extern s32 gUnknown_810A390[]; extern u32 gUnknown_81076E4[]; -extern struct unkStruct_203B45C *gRecruitedPokemonRef; struct unkStruct_808E9EC { @@ -50,10 +49,10 @@ 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*); +extern void SavePokemonMoves(struct unkStruct_8094924*, struct PokemonMove*); 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*); +void RestorePokemonMoves(struct unkStruct_8094924*, struct PokemonMove*); extern void sub_8094184(struct unkStruct_8094924*, void*); extern void sub_809449C(struct unkStruct_8094924*, void*); @@ -650,7 +649,7 @@ void sub_808ED00() { gRecruitedPokemonRef->team[i] = gRecruitedPokemonRef->pokemon[team[i]]; } - for (; i < 4; i++) { + for (; i < MAX_TEAM_MEMBERS; i++) { gRecruitedPokemonRef->team[i].unk0 = 0; } } @@ -696,7 +695,7 @@ s32 SaveRecruitedPokemon(u8 *a1, s32 a2) SavePokemonStruct(&backup, pokemon); } - for (i = 0; i < 4; i++) { + for (i = 0; i < MAX_TEAM_MEMBERS; i++) { if ((u8)i[gRecruitedPokemonRef->team].unk0 & 1) { data_u8 = 0xff; } @@ -727,7 +726,7 @@ s32 RestoreRecruitedPokemon(u8 *a1, s32 a2) RestorePokemonStruct(&backup, &gRecruitedPokemonRef->pokemon[i]); } - for (i = 0; i < 4; i++) { + for (i = 0; i < MAX_TEAM_MEMBERS; i++) { RestoreIntegerBits(&backup, &data_u8, 1); RestorePokemonStruct(&backup, &gRecruitedPokemonRef->team[i]); if (data_u8 & 1) { @@ -769,7 +768,7 @@ void SavePokemonStruct(struct unkStruct_8094924* a1, struct PokemonStruct* pokem SaveIntegerBits(a1, &pokemon->unk20, 24); SaveIntegerBits(a1, &pokemon->unk24, 4); SaveHeldItem(a1, &pokemon->heldItem); - xxx_save_poke_sub_2c_8094108(a1, pokemon->unk2C); + SavePokemonMoves(a1, pokemon->moves); SaveIntegerBits(a1, pokemon->name, 80); } @@ -796,7 +795,7 @@ void RestorePokemonStruct(struct unkStruct_8094924* a1, struct PokemonStruct* po RestoreIntegerBits(a1, &pokemon->unk20, 24); RestoreIntegerBits(a1, &pokemon->unk24, 4); RestoreHeldItem(a1, &pokemon->heldItem); - xxx_restore_poke_sub_2c_8094128(a1, pokemon->unk2C); + RestorePokemonMoves(a1, pokemon->moves); RestoreIntegerBits(a1, pokemon->name, 80); } @@ -830,7 +829,7 @@ s32 SavePokemonStruct2(u8* a1, s32 size) SaveIntegerBits(&backup, &pokemon2->offense.def[0], 8); SaveIntegerBits(&backup, &pokemon2->offense.def[1], 8); SaveIntegerBits(&backup, &pokemon2->unk18, 24); - sub_8094184(&backup, &pokemon2->unk1C); + sub_8094184(&backup, &pokemon2->moves); SaveItemSlot(&backup, &pokemon2->itemSlot); sub_809449C(&backup, &pokemon2->unk44); sub_809449C(&backup, &pokemon2->unk48); @@ -878,7 +877,7 @@ s32 RestorePokemonStruct2(u8* a1, s32 size) RestoreIntegerBits(&backup, &pokemon2->offense.def[0], 8); RestoreIntegerBits(&backup, &pokemon2->offense.def[1], 8); RestoreIntegerBits(&backup, &pokemon2->unk18, 24); - sub_80941FC(&backup, &pokemon2->unk1C); + sub_80941FC(&backup, &pokemon2->moves); RestoreItemSlot(&backup, &pokemon2->itemSlot); sub_809447C(&backup, &pokemon2->unk44); sub_809447C(&backup, &pokemon2->unk48); @@ -911,4 +910,4 @@ 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 2c875ef..6429755 100644 --- a/src/pokemon_mid.c +++ b/src/pokemon_mid.c @@ -4,6 +4,7 @@ #include "file_system.h" #include "subStruct_203B240.h" #include "constants/colors.h" +#include "constants/move_id.h" extern struct gPokemon *gMonsterParameters; extern const char gUnknown_8107600[]; @@ -14,10 +15,10 @@ extern const char gUnknown_8107638[]; extern const char gUnknown_810763C[]; extern const char gUnknown_810768C[]; // lvmp%03d\0 extern struct FileArchive gSystemFileArchive; -extern s16 gUnknown_810ACB8; // 0x14d -extern s16 gUnknown_810ACBA; // 0x14d -extern s16 gUnknown_810ACBC; // 0x14d -extern s16 gUnknown_810ACBE; // 0x14d +extern s16 gFrenzyPlantIQReq; // 0x14d +extern s16 gHydroCannonIQReq; // 0x14d +extern s16 gBlastBurnIQReq; // 0x14d +extern s16 gVoltTackleIQReq; // 0x14d extern char* gFormattedStatusNames[]; // wram data: @@ -37,7 +38,7 @@ extern void xxx_pokemon2_to_pokemonstruct_808DF44(struct PokemonStruct*, struct 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 void sub_8092AD4(struct PokemonMove*, u16); extern u32 sub_8097DF0(char *, struct subStruct_203B240 **); struct unkStruct_8107654 { @@ -51,7 +52,6 @@ extern struct unkStruct_8107654 gUnknown_8107654[6]; extern struct gPokemon *gMonsterParameters; extern struct FileArchive gMonsterFileArchive; extern const char gUnknown_8107684[]; -extern struct unkStruct_203B45C *gRecruitedPokemonRef; bool8 sub_808D6E8() @@ -542,7 +542,7 @@ void xxx_pokemonstruct_to_pokemon2_808DE50(struct PokemonStruct2 * a1, struct Po } a1->unk18 = pokemon->unk1C; - sub_8093F50(&a1->unk1C, &pokemon->unk2C); + sub_8093F50(&a1->moves, &pokemon->moves); for (i = 0; i < POKEMON_NAME_LENGTH; i++) { a1->name[i] = pokemon->name[i]; @@ -570,7 +570,7 @@ void xxx_pokemon2_to_pokemonstruct_index_808DF2C(s32 a1, struct PokemonStruct2* xxx_pokemon2_to_pokemonstruct_808DF44(&a1[gRecruitedPokemonRef->pokemon], a2); } -extern void sub_8093FA8(struct unkPokeSubStruct_2C*, struct unkPokeSubStruct_2C*); +extern void sub_8093FA8(struct PokemonMove*, struct PokemonMove*); void xxx_pokemon2_to_pokemonstruct_808DF44(struct PokemonStruct* pokemon, struct PokemonStruct2* a2) @@ -593,7 +593,7 @@ void xxx_pokemon2_to_pokemonstruct_808DF44(struct PokemonStruct* pokemon, struct } pokemon->unk1C = a2->unk18; - sub_8093FA8(pokemon->unk2C, a2->unk1C); + sub_8093FA8(pokemon->moves, a2->moves); for (i = 0; i < POKEMON_NAME_LENGTH; i++) { pokemon->name[i] = a2->name[i]; @@ -669,7 +669,7 @@ u8* sub_808E07C(u8* a1, u16* a2) return a1; } -s32 sub_808E0AC(u16* a1, s16 species, s32 a3, s32 a4) +s32 sub_808E0AC(u16* a1, s16 species, s32 a3, s32 IQPoints) { u8* stream; u16 result; // struct? @@ -697,13 +697,12 @@ s32 sub_808E0AC(u16* a1, s16 species, s32 a3, s32 a4) break; if (v12 == a3) { bool8 cond = 1; - // I don't think these are species IDs - // the pokemon they would correspond to are pretty random if they are - // shuckle, heracross, pupitar, vibrava - if ((result == 238) && (a4 < gUnknown_810ACB8)) cond = 0; - if ((result == 239) && (a4 < gUnknown_810ACBA)) cond = 0; - if ((result == 272) && (a4 < gUnknown_810ACBC)) cond = 0; - if ((result == 354) && (a4 < gUnknown_810ACBE)) cond = 0; + + // NOTE: these moves require IQ to be > 333 + if ((result == MOVE_FRENZY_PLANT) && (IQPoints < gFrenzyPlantIQReq)) cond = 0; + if ((result == MOVE_HYDRO_CANNON) && (IQPoints < gHydroCannonIQReq)) cond = 0; + if ((result == MOVE_BLAST_BURN) && (IQPoints < gBlastBurnIQReq)) cond = 0; + if ((result == MOVE_VOLT_TACKLE) && (IQPoints < gVoltTackleIQReq)) cond = 0; if (cond) { if (count < 16) { @@ -716,7 +715,7 @@ s32 sub_808E0AC(u16* a1, s16 species, s32 a3, s32 a4) return count; } -bool8 sub_808E190(u16 a1, s16 _species) +bool8 CanMonLearnMove(u16 moveID, s16 _species) { u16 result; u16 result2; @@ -726,13 +725,13 @@ bool8 sub_808E190(u16 a1, s16 _species) if (species == SPECIES_DECOY) return 0; if (species == SPECIES_NONE) return 0; if (species == SPECIES_MUNCHLAX) return 0; - if (a1 == 352) return 0; + if (moveID == MOVE_STRUGGLE) return 0; ptr = sub_8092B18(species); while (*ptr) { ptr = sub_808E07C(ptr, &result); ptr++; - if (a1 == result) { + if (moveID == result) { return 1; } } @@ -740,7 +739,7 @@ bool8 sub_808E190(u16 a1, s16 _species) ptr = sub_8092B54(species); while (*ptr) { ptr = sub_808E07C(ptr, &result2); - if (result2 == a1) { + if (result2 == moveID) { return 1; } } @@ -779,16 +778,14 @@ s32 sub_808E218(struct unkStruct_808E218_arg* a1, struct PokemonStruct* pokemon) if (count < NUM_SPECIES) { s32 j; bool8 cond = 1; - // I don't think these are species IDs - // the pokemon they would correspond to are pretty random if they are - // shuckle, heracross, pupitar, vibrava - if ((result == 238) && (pokemon->IQ < gUnknown_810ACB8)) cond = 0; - if ((result == 239) && (pokemon->IQ < gUnknown_810ACBA)) cond = 0; - if ((result == 272) && (pokemon->IQ < gUnknown_810ACBC)) cond = 0; - if ((result == 354) && (pokemon->IQ < gUnknown_810ACBE)) cond = 0; - - for (j = 0; j < 4; j++) { - if ((pokemon->unk2C[j].unk0 & 1) && pokemon->unk2C[j].unk2 == result) { + + if ((result == MOVE_FRENZY_PLANT) && (pokemon->IQ < gFrenzyPlantIQReq)) cond = 0; + if ((result == MOVE_HYDRO_CANNON) && (pokemon->IQ < gHydroCannonIQReq)) cond = 0; + if ((result == MOVE_BLAST_BURN) && (pokemon->IQ < gBlastBurnIQReq)) cond = 0; + if ((result == MOVE_VOLT_TACKLE) && (pokemon->IQ < gVoltTackleIQReq)) cond = 0; + + for (j = 0; j < MAX_MON_MOVES; j++) { + if ((pokemon->moves[j].moveFlags & MOVE_FLAG_EXISTS) && pokemon->moves[j].moveID == result) { cond = 0; } } @@ -900,7 +897,7 @@ s32 sub_808E400(s32 _species, s16* _a2, s32 _a3, s32 _a4) return count; } -void sub_808E490(struct unkPokeSubStruct_2C* a1, s16 species) +void sub_808E490(struct PokemonMove* a1, s16 species) { u16 buffer[0x10]; s32 i; @@ -918,8 +915,8 @@ void sub_808E490(struct unkPokeSubStruct_2C* a1, s16 species) } i = count; } - while (i < 4) { - a1[i].unk0 = 0; + while (i < MAX_MON_MOVES) { + a1[i].moveFlags = 0; i++; } } diff --git a/src/save.c b/src/save.c index bdc3d3a..f4ba192 100644 --- a/src/save.c +++ b/src/save.c @@ -6,6 +6,7 @@ #include "pokemon.h" #include "random.h" #include "save.h" +#include "team_inventory.h" #include "exclusive_pokemon.h" @@ -72,9 +73,6 @@ EWRAM_DATA struct QuickSaveWrite *gQuickSaveWrite; extern s32 gUnknown_202DE28; -extern struct unkStruct_203B45C *gRecruitedPokemonRef; -extern struct TeamInventory *gTeamInventory_203B460; -extern struct RescueTeamData *gRescueTeamInfoRef; extern bool8 *gFriendAreas; extern u32 gUnknown_203B46C; extern u8 *gUnknown_203B480; @@ -83,7 +81,6 @@ extern u32 *gUnknown_203B488; extern u32 *gUnknown_203B48C; extern u32 gUnknown_203B490; extern u32 gUnknown_203B494; -extern struct ExclusivePokemonData *gUnknown_203B498; ALIGNED(4) const char PokeDungeon_Text[] = _("POKE_DUNGEON__05"); @@ -184,8 +181,6 @@ extern void sub_80974E8(void); extern void ResetNumAdventures(void); extern void sub_80993D8(void); -extern struct PlayTimeStruct *gPlayTimeRef; - extern void xxx_call_start_bg_music(void); diff --git a/src/thank_you_wonder_mail.c b/src/thank_you_wonder_mail.c index 536c9d9..501ab15 100644 --- a/src/thank_you_wonder_mail.c +++ b/src/thank_you_wonder_mail.c @@ -12,7 +12,6 @@ #include "team_inventory.h" extern struct WonderMailStruct_203B2C4 *gUnknown_203B2C4; -extern struct TeamInventory *gTeamInventory_203B460; #define THANK_YOU_MAIL_MAIN_MENU 0 #define ANYTHING_ELSE_THANK_YOU_MAIN_MENU 1 diff --git a/src/trade_items_menu.c b/src/trade_items_menu.c index d0c4598..fdc3863 100644 --- a/src/trade_items_menu.c +++ b/src/trade_items_menu.c @@ -8,7 +8,6 @@ extern struct TradeItemsMenu *gTradeItemsMenu; -extern struct TeamInventory *gTeamInventory_203B460; extern u32 gUnknown_202DE30; extern u32 gUnknown_202DE58; extern struct UnkTextStruct2 gUnknown_80E6174; diff --git a/src/wonder_mail.c b/src/wonder_mail.c index cae3233..6f7e081 100644 --- a/src/wonder_mail.c +++ b/src/wonder_mail.c @@ -11,7 +11,6 @@ #include "team_inventory.h" extern struct WonderMailStruct_203B2C0 *gUnknown_203B2C0; -extern struct TeamInventory *gTeamInventory_203B460; extern u32 sub_80144A4(s32 *r0); extern void sub_8011C28(u32); @@ -89,7 +88,6 @@ extern struct MenuItem gUnknown_80DDA80[]; extern struct MenuItem gUnknown_80DDAFC[]; extern struct MenuItem gUnknown_80DDB60[]; extern struct MenuItem gUnknown_80DDA64[]; -extern struct unkStruct_203B45C *gRecruitedPokemonRef; extern struct MenuItem gUnknown_80DDB24[]; extern struct MenuItem gUnknown_80DD9EC[]; extern u8 gUnknown_80DDACC[]; diff --git a/src/wonder_mail_2.c b/src/wonder_mail_2.c index 21074d6..fda000b 100644 --- a/src/wonder_mail_2.c +++ b/src/wonder_mail_2.c @@ -7,6 +7,7 @@ #include "menu.h" #include "save.h" #include "sub_8095228.h" +#include "gUnknown_203B46C.h" #include "wonder_mail.h" struct unkStruct_203B2C8 @@ -32,7 +33,7 @@ struct unkStruct_203B2C8 struct unkStruct_203B2CC { // size: 0xD4; - u8 unk0[0x38]; + u8 receivedNewsletters[NUM_POKEMON_NEWS]; u32 unk38; u8 fill3C[0x50 - 0x3C]; @@ -43,7 +44,7 @@ struct unkStruct_203B2CC s16 unk56; u16 unk58; - u16 unk5A; + u16 numPKMNNews; u8 fill5C[0x6C - 0x5C]; @@ -54,13 +55,38 @@ struct unkStruct_203B2CC }; extern struct unkStruct_203B2CC *gUnknown_203B2CC; -extern u32 sub_802B9A8(void); + +struct unkStruct_203B2D4 +{ + // size: 0x94 + s32 state; + u8 currMailIndex; + u8 fill5[0x8 - 0x5]; + s32 unk8; + s32 unkC; + u8 *unk10[4]; + u32 unk20; + u32 unk24; + struct UnkTextStruct2 unk28[4]; + u32 unk88; + u8 fill8C[0x94 - 0x8C]; +}; + +extern struct unkStruct_203B2D4 *gUnknown_203B2D4; + +extern struct UnkSaveStruct1 *gUnknown_203B46C; + + +extern s32 GetNumPKMNNews(void); extern void sub_802B880(void); extern void sub_802B8D4(void); extern void sub_8013818(void *, u32, u32, u32); extern void sub_8012D08(struct UnkTextStruct2 *, s32); extern void sub_8013984(u32 *); extern u8 HasNoPKMNNews(void); +extern u8 CheckPKMNNewsSlot(u8 r0); +extern struct PokemonStruct *sub_808D3BC(void); +extern void sub_808DA34(u8 *buffer, struct PokemonStruct *pokemon); extern u16 gUnknown_203B2D0; extern u16 gUnknown_203B2D2; @@ -70,10 +96,21 @@ extern s32 GetKeyPress(u32 *); extern void sub_8013660(u32 *); extern void AddMenuCursorSprite(u32 *); +extern void sub_802BB98(void); +extern void sub_802BC08(void); +extern void sub_802BB28(void); +extern void sub_8013E54(void); +extern s32 sub_8012A64(u32 *, u32); +extern void PlayMenuSoundEffect(u32); + extern struct UnkTextStruct2 gUnknown_80DFBEC; extern struct UnkTextStruct2 gUnknown_80DFBD0; +extern struct UnkTextStruct2 gUnknown_80DFC34; + +extern struct UnkTextStruct2 gUnknown_80DFC18; + extern struct unkStruct_203B2C8 *gUnknown_203B2C8; extern void sub_8014248(const char *r0, u32, u32, const struct MenuItem *r4, u32, u32, u32, struct OpenedFile **r5, u32); @@ -82,6 +119,8 @@ extern void sub_80920D8(u8 *buffer); extern void sub_8097790(void); extern char gUnknown_202E5D8[0x50]; extern char gAvailablePokemonNames[0x50]; +extern u8 gUnknown_80DFC4C[]; +extern u8 gUnknown_80DFC50[]; extern u32 sub_802F298(void); extern void sub_802F2C0(void); extern u8 sub_8099394(u8 *); @@ -103,6 +142,23 @@ extern u8 sub_80023E4(u32); extern void nullsub_131(void); extern void sub_802ABF8(void); +extern u8 gUnknown_80DFC04[]; +extern u8 gUnknown_80DFBE8[]; +extern char *GetPokemonMailHeadline(u8 index); +extern void sub_8008C54(u32); +extern void sub_80073B8(u32); +extern void sub_802BC7C(void); +extern void sub_80073E0(u32); +extern void xxx_call_draw_string(s32 x, u32 y, u8 *, u32 , u32); +extern void sub_8012BC4(u32 x, u32 y, u32, u32, u32, u32); +extern void xxx_format_and_draw(u32, u32, u8 *, u32, u32); +extern void sub_803B6B0(u32, u32, u32, u32); +extern s32 sub_8013800(u32 *, s32); + +extern void sub_802BCC4(void); +extern void sub_802BB14(u32); +extern void sub_801317C(u32 *); + ALIGNED(4) const char gUnknown_80DF9F0[] = "????"; // NOTE: had to be pre-proc'd to match @@ -348,7 +404,7 @@ u32 sub_802B640(u32 r0, struct UnkTextStruct2_sub *r1, u32 r2) ResetUnusedInputStruct(); sub_800641C(gUnknown_203B2CC->unk74, 1, 1); - sub_8013818(&gUnknown_203B2CC->unk38, sub_802B9A8(), r2, r0); + sub_8013818(&gUnknown_203B2CC->unk38, GetNumPKMNNews(), r2, r0); gUnknown_203B2CC->unk50 = gUnknown_203B2D0; gUnknown_203B2CC->unk56 = gUnknown_203B2D2; @@ -393,9 +449,9 @@ u32 sub_802B720(u8 r0) } } -u8 sub_802B7A8(void) +u8 GetPokemonNewsIndex(void) { - return gUnknown_203B2CC->unk0[(gUnknown_203B2CC->unk56 * gUnknown_203B2CC->unk54) + gUnknown_203B2CC->unk50]; + return gUnknown_203B2CC->receivedNewsletters[(gUnknown_203B2CC->unk56 * gUnknown_203B2CC->unk54) + gUnknown_203B2CC->unk50]; } void sub_802B7D0(u32 r0) @@ -407,7 +463,7 @@ void sub_802B7D0(u32 r0) ResetUnusedInputStruct(); sub_800641C(gUnknown_203B2CC->unk74, 0, 0); - gUnknown_203B2CC->unk5A = sub_802B9A8(); + gUnknown_203B2CC->numPKMNNews = GetNumPKMNNews(); sub_8013984(&gUnknown_203B2CC->unk38); sub_802B880(); sub_802B8D4(); @@ -435,3 +491,241 @@ void sub_802B81C(void) gUnknown_203B2CC = NULL; } } + +NAKED +void sub_802B880(void) +{ + asm_unified( + "\tpush {r4,lr}\n" + "\tldr r4, _0802B8D0\n" + "\tldr r0, [r4]\n" + "\tadds r0, 0x52\n" + "\tmovs r1, 0\n" + "\tldrsh r0, [r0, r1]\n" + "\tmovs r1, 0xC\n" + "\tbl sub_80095E4\n" + "\tadds r0, 0x2\n" + "\tlsls r0, 16\n" + "\tldr r2, [r4]\n" + "\tldr r3, [r2, 0x6C]\n" + "\tlsls r1, r3, 1\n" + "\tadds r1, r3\n" + "\tlsls r1, 3\n" + "\tadds r1, r2, r1\n" + "\tadds r1, 0x82\n" + "\tasrs r3, r0, 16\n" + "\tlsrs r0, 16\n" + "\tstrh r0, [r1]\n" + "\tldr r1, [r2, 0x6C]\n" + "\tlsls r0, r1, 1\n" + "\tadds r0, r1\n" + "\tlsls r0, 3\n" + "\tadds r2, r0\n" + "\tadds r3, 0x2\n" + "\tadds r2, 0x84\n" + "\tstrh r3, [r2]\n" + "\tbl ResetUnusedInputStruct\n" + "\tldr r0, [r4]\n" + "\tadds r0, 0x74\n" + "\tmovs r1, 0x1\n" + "\tmovs r2, 0x1\n" + "\tbl sub_800641C\n" + "\tpop {r4}\n" + "\tpop {r0}\n" + "\tbx r0\n" + "\t.align 2, 0\n" +"\t_0802B8D0: .4byte gUnknown_203B2CC"); +} + +void sub_802B8D4(void) +{ + s32 iVar2; + s32 retvar; + s32 new_index; + u8 mailIndex; + + + sub_8008C54(gUnknown_203B2CC->unk6C); + sub_80073B8(gUnknown_203B2CC->unk6C); + xxx_call_draw_string(0xA, 0, gUnknown_80DFC04, gUnknown_203B2CC->unk6C, 0); + sub_8012BC4(((gUnknown_80DFBE8[2] << 3) + 4), 0, gUnknown_203B2CC->unk56 + 1, 2, 7, gUnknown_203B2CC->unk6C); + for(iVar2 = 0; iVar2 < gUnknown_203B2CC->unk52; iVar2++) + { + retvar = sub_8013800(&gUnknown_203B2CC->unk38, iVar2); + new_index = (gUnknown_203B2CC->unk56 * gUnknown_203B2CC->unk54) + iVar2; + mailIndex = gUnknown_203B2CC->receivedNewsletters[new_index]; + sub_803B6B0(0xA, retvar, 6, gUnknown_203B2CC->unk6C); + sub_802BC7C(); + xxx_format_and_draw(0x15, retvar, GetPokemonMailHeadline(mailIndex), gUnknown_203B2CC->unk6C, 0); + } + sub_80073E0(gUnknown_203B2CC->unk6C); +} + +s32 GetNumPKMNNews(void) +{ + s32 iVar2; + s32 newsCount; + + newsCount = 0; + + for(iVar2 = 0; iVar2 < NUM_POKEMON_NEWS; iVar2++) + { + if(CheckPKMNNewsSlot(iVar2)) + { + gUnknown_203B2CC->receivedNewsletters[newsCount] = iVar2; + newsCount++; + } + } + return newsCount; +} + +bool8 HasNoPKMNNews(void) +{ + s32 iVar2; + + for(iVar2 = 0; iVar2 < NUM_POKEMON_NEWS; iVar2++) + { + if(CheckPKMNNewsSlot(iVar2)) + { + return FALSE; + } + } + return TRUE; +} + +u32 sub_802B9FC(u8 mailIndex) +{ + gUnknown_203B2D4 = MemoryAlloc(sizeof(struct unkStruct_203B2D4), 0x8); + gUnknown_203B2D4->currMailIndex = mailIndex; + sub_801317C(&gUnknown_203B2D4->unk88); + gUnknown_203B2D4->unk24 = 0; + gUnknown_203B2D4->unk28[0] = gUnknown_80DFC34; + gUnknown_203B2D4->unk28[1] = gUnknown_80DFC18; + gUnknown_203B2D4->unk28[2] = gUnknown_80DFC18; + gUnknown_203B2D4->unk28[3] = gUnknown_80DFC18; + ResetUnusedInputStruct(); + sub_800641C(gUnknown_203B2D4->unk28, 1, 1); + gUnknown_203B2D4->unk8 = 0; + sub_802BCC4(); + sub_802BC7C(); + sub_802BB14(0); + return 1; +} + +u32 sub_802BA8C(void) +{ + switch(gUnknown_203B2D4->state) + { + case 0: + sub_802BB98(); + break; + case 1: + sub_802BC08(); + break; + case 3: + return 3; + case 2: + default: + return 2; + + } + return 0; +} + +void sub_802BACC(void) +{ + if(gUnknown_203B2D4 != NULL) + { + gUnknown_203B2D4->unk28[gUnknown_203B2D4->unk24] = gUnknown_80DFC18; + ResetUnusedInputStruct(); + sub_800641C(gUnknown_203B2D4->unk28, 1, 1); + MemoryFree(gUnknown_203B2D4); + gUnknown_203B2D4 = NULL; + } +} + +void sub_802BB14(u32 newState) +{ + gUnknown_203B2D4->state = newState; + sub_802BB28(); +} + +void sub_802BB28(void) +{ + switch(gUnknown_203B2D4->state) + { + case 0: + case 1: + sub_8008C54(gUnknown_203B2D4->unk24); + sub_80073B8(gUnknown_203B2D4->unk24); + xxx_format_and_draw(0xA, 0, GetPokemonMailHeadline(gUnknown_203B2D4->currMailIndex), gUnknown_203B2D4->unk24, 0); + xxx_format_and_draw(0x6, 0x14, gUnknown_203B2D4->unk10[gUnknown_203B2D4->unk8], gUnknown_203B2D4->unk24, 0); + sub_80073E0(gUnknown_203B2D4->unk24); + gUnknown_203B2D4->unk8++; + break; + case 2: + case 3: + break; + } +} + +void sub_802BB98(void) +{ + if(gUnknown_203B2D4->unkC != 0) + { + if(gUnknown_203B2D4->unk20 & 8) + sub_8013E54(); + gUnknown_203B2D4->unk20++; + } + switch(sub_8012A64(&gUnknown_203B2D4->unk88, gUnknown_203B2D4->unk24)) + { + case 1: + PlayMenuSoundEffect(0); + if(gUnknown_203B2D4->unkC != 0) + sub_802BB14(1); + else + sub_802BB14(3); + break; + case 2: + PlayMenuSoundEffect(1); + sub_802BB14(2); + break; + } +} + +void sub_802BC08(void) +{ + if(gUnknown_203B2D4->unk8 < gUnknown_203B2D4->unkC) + { + if(gUnknown_203B2D4->unk20 & 8) + sub_8013E54(); + gUnknown_203B2D4->unk20++; + } + switch(sub_8012A64(&gUnknown_203B2D4->unk88, gUnknown_203B2D4->unk24)) + { + case 1: + PlayMenuSoundEffect(0); + if(gUnknown_203B2D4->unk8 < gUnknown_203B2D4->unkC) + sub_802BB14(1); + else + sub_802BB14(3); + break; + case 2: + PlayMenuSoundEffect(1); + sub_802BB14(2); + break; + } +} + +void sub_802BC7C(void) +{ + sub_808DA34(gAvailablePokemonNames, sub_808D3BC()); + if(gUnknown_203B46C->playerGender == FEMALE) + { + strcpy(gAvailablePokemonNames + 0x50, gUnknown_80DFC4C); // She + } + else + { + strcpy(gAvailablePokemonNames + 0x50, gUnknown_80DFC50); // He + } +} diff --git a/src/wonder_mail_3.c b/src/wonder_mail_3.c index 6cc1e96..aa87888 100644 --- a/src/wonder_mail_3.c +++ b/src/wonder_mail_3.c @@ -82,7 +82,7 @@ extern u8 sub_802DADC(void); extern u8 *sub_8096DD8(void); extern u8 sub_8096C08(u8 *); extern void sub_802C750(void); -extern s32 sub_80969AC(void); +extern s32 GetNumAcceptedJobs(void); extern void sub_802D1A0(u32); extern void sub_8012EA4(u8 *, u32); extern void* sub_8096AB4(u8); @@ -228,7 +228,7 @@ void sub_802D2A8(void) } } else { - if (sub_80969AC() >= 8) { + if (GetNumAcceptedJobs() >= 8) { if (sub_802DADC() != 0) { sub_802D1A0(10); } diff --git a/src/wonder_mail_3_mid.c b/src/wonder_mail_3_mid.c index 5661d44..f485246 100644 --- a/src/wonder_mail_3_mid.c +++ b/src/wonder_mail_3_mid.c @@ -65,14 +65,8 @@ extern struct unkStruct_203B310 *gUnknown_203B310; // TODO: port to ItemSlot struct ItemSlot_Alt { - // OG struct - // u8 itemFlags - // u8 numItems - // u8 itemIndex union temp { - u8 itemFlags; - u8 numItems; - u8 itemIndex; + struct ItemSlot norm; u32 full_bits; } temp; }; -- cgit v1.2.3