summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/code_2.c1
-rw-r--r--src/code_800D090.c30
-rw-r--r--src/code_80118A4.c2
-rw-r--r--src/code_801AFA4.c173
-rw-r--r--src/code_801D760.c1
-rw-r--r--src/code_8040094.c1
-rw-r--r--src/code_80983D8.c32
-rw-r--r--src/code_8098BDC.c1
-rw-r--r--src/credits.c2
-rw-r--r--src/debug_menu_1.c40
-rw-r--r--src/debug_menu_2.c24
-rw-r--r--src/debug_menu_mid.c1
-rw-r--r--src/felicity_bank_1.c1
-rw-r--r--src/friend_area.c2
-rw-r--r--src/friend_area_action_menu.c17
-rw-r--r--src/friend_area_action_menu_1.c35
-rw-r--r--src/ground_link.c33
-rw-r--r--src/ground_map.c77
-rw-r--r--src/gulpin_shop.c8
-rw-r--r--src/items.c1
-rw-r--r--src/kangaskhan_storage_2.c1
-rw-r--r--src/kecleon_items_1.c170
-rw-r--r--src/load_screen.c3
-rw-r--r--src/mailbox.c2
-rw-r--r--src/mailbox_1.c11
-rw-r--r--src/more_input.c1
-rw-r--r--src/music.c16
-rw-r--r--src/music_pre.c320
-rw-r--r--src/other_menus.c2
-rw-r--r--src/pelipper_board_1.c12
-rw-r--r--src/pokemon.c2
-rw-r--r--src/pokemon_3.c21
-rw-r--r--src/pokemon_mid.c65
-rw-r--r--src/save.c7
-rw-r--r--src/thank_you_wonder_mail.c1
-rw-r--r--src/trade_items_menu.c1
-rw-r--r--src/wonder_mail.c2
-rw-r--r--src/wonder_mail_2.c308
-rw-r--r--src/wonder_mail_3.c4
-rw-r--r--src/wonder_mail_3_mid.c8
40 files changed, 1192 insertions, 247 deletions
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;
};