summaryrefslogtreecommitdiff
path: root/src/code_80958E8.c
diff options
context:
space:
mode:
authorSeth Barberee <seth.barberee@gmail.com>2021-06-18 17:56:20 -0500
committerSeth Barberee <seth.barberee@gmail.com>2021-06-18 17:56:20 -0500
commitf1fdcc2b0ade13ad1a4cc7360eac70f27396d26a (patch)
tree3ac5b9f61650299f96095e3d3c09ad771793be08 /src/code_80958E8.c
parente806b05526bfcc540cb2c1f3165a96e76f6c235d (diff)
more splitting and labeling with some decomp
Diffstat (limited to 'src/code_80958E8.c')
-rw-r--r--src/code_80958E8.c178
1 files changed, 178 insertions, 0 deletions
diff --git a/src/code_80958E8.c b/src/code_80958E8.c
new file mode 100644
index 0000000..462b408
--- /dev/null
+++ b/src/code_80958E8.c
@@ -0,0 +1,178 @@
+#include "global.h"
+#include "memory.h"
+#include "friend_area.h"
+#include "constants/friend_area.h"
+#include "wonder_mail.h"
+#include "constants/wonder_mail.h"
+
+struct subStruct_203B490
+{
+ // size: 0xC
+ u8 unk0;
+ u8 unk1;
+ u8 fill2[2];
+ u32 unk4;
+ u32 unk8;
+};
+
+
+struct unkStruct_203B490
+{
+ // size: 0x330?
+
+ u8 fill0[0x190];
+ u8 unk190[0x28];
+ u8 unk1B8[0x78];
+ struct subStruct_203B490 unk230[16];
+ u8 unk2F0[0x38];
+ u8 unk328;
+};
+
+
+extern u8 sub_809095C(u8);
+extern s32 sub_8090298(u8);
+extern u8 sub_809017C(u8 *);
+extern s16 sub_808E770(s16);
+extern u8 sub_8092040(u8);
+extern u8 sub_803C1D0(u8 *, u8);
+extern u8 sub_8090A60(u8);
+extern u8 sub_8091524(u8);
+extern u8 sub_8091E60(u8 ,u8 );
+extern u32 GetMaxItemCount(u8);
+extern u8 sub_803C0DC(s16);
+extern void sub_8096040(u8);
+extern void sub_80965B8(u8);
+extern void sub_8096C3C(u8);
+extern bool8 ValidateWonderMail(struct WonderMail *);
+
+extern struct unkStruct_203B490 *gUnknown_203B490;
+extern struct unkStruct_203B490 gUnknown_2039448;
+
+void sub_80958E8()
+{
+ gUnknown_203B490 = &gUnknown_2039448;
+}
+
+struct unkStruct_203B490 *sub_80958F8(void)
+{
+ return &gUnknown_2039448;
+}
+
+void sub_8095900(void)
+{
+ s32 iVar2;
+ for(iVar2 = 0; iVar2 < 4; iVar2++)
+ {
+ sub_8096040(iVar2);
+ }
+ for(iVar2 = 0; iVar2 < 8; iVar2++)
+ {
+ sub_80965B8(iVar2);
+ }
+ for(iVar2 = 0; iVar2 < 8; iVar2++)
+ {
+ sub_8096C3C(iVar2);
+ }
+ for(iVar2 = 0; iVar2 < 0x38; iVar2++)
+ {
+ gUnknown_203B490->unk2F0[iVar2] = 0;
+ }
+ gUnknown_203B490->unk328 = 0;
+ MemoryClear8(gUnknown_203B490->unk190, sizeof(gUnknown_203B490->unk190));
+ MemoryClear8(gUnknown_203B490->unk1B8, sizeof(gUnknown_203B490->unk1B8));
+ for(iVar2 = 0; iVar2 < 16; iVar2++)
+ {
+ gUnknown_203B490->unk230[iVar2].unk0 = 0x63;
+ gUnknown_203B490->unk230[iVar2].unk1 = 1;
+ gUnknown_203B490->unk230[iVar2].unk4 = 0;
+ gUnknown_203B490->unk230[iVar2].unk8 = 0;
+ }
+}
+
+bool8 IsValidWonderMail(struct WonderMail *WonderMailData)
+{
+ // Has to equal 5 for Wonder Mail
+ // https://web.archive.org/web/20080913124416/http://www.upokecenter.com/games/dungeon/guides/passwords.html
+ //
+ if(WonderMailData->mailType != 5)
+ {
+ return FALSE;
+ }
+ else
+ {
+ return ValidateWonderMail(WonderMailData);
+ }
+}
+
+bool8 ValidateWonderMail(struct WonderMail *data)
+{
+
+ if(data->missionType > DELIVER_ITEM)
+ return FALSE;
+ else
+ {
+ if(data->missionType == DELIVER_ITEM && GetMaxItemCount(data->dungeon) == 0)
+ return FALSE;
+
+ if(data->unk2 > 9)
+ return FALSE;
+
+ if(sub_809095C(data->dungeon) != 0)
+ return FALSE;
+ if(data->floor >= sub_8090298(data->dungeon))
+ return FALSE;
+ if(sub_809017C(&(data->dungeon)) != 0)
+ return FALSE;
+
+ if(data->clientPoke == SPECIES_NONE)
+ return FALSE;
+ if(data->clientPoke > SPECIES_RAYQUAZA_CUTSCENE)
+ return FALSE;
+ if(data->clientPoke != sub_808E770(data->clientPoke))
+ return FALSE;
+ if(sub_803C0DC(data->clientPoke) == 0)
+ return FALSE;
+
+ if(data->targetPoke > SPECIES_RAYQUAZA_CUTSCENE)
+ return FALSE;
+ if(data->targetPoke != sub_808E770(data->targetPoke))
+ return FALSE;
+ if(sub_803C0DC(data->targetPoke) == 0)
+ return FALSE;
+
+ // Item Delivery/Finding
+ if((u8)(data->missionType - 1) > FIND_POKE)
+ if(data->targetPoke != data->clientPoke)
+ return FALSE;
+
+ if(sub_8092040(data->targetItem) != 0)
+ return FALSE;
+ if(sub_8090A60(data->targetItem) != 0)
+ return FALSE;
+ if(sub_8091524(data->targetItem) == 0)
+ return FALSE;
+
+ // Item finding
+ if(data->missionType == FIND_ITEM && sub_8091E60(data->dungeon, data->targetItem) == 0)
+ return FALSE;
+
+ if(data->rewardType == BLANK_4 || data->rewardType == END_REWARDS || data->rewardType > END_REWARDS)
+ return FALSE;
+
+ if(sub_8092040(data->itemReward) != 0)
+ return FALSE;
+
+ // Friend Area Reward
+ if(data->friendAreaReward > FINAL_ISLAND)
+ return FALSE;
+
+ if(data->rewardType == FRIEND_AREA)
+ {
+ if(GetFriendAreaUnlockCondition(data->friendAreaReward) != UNLOCK_WONDER_MAIL)
+ return FALSE;
+ if(sub_803C1D0(&(data->dungeon), data->missionType) == 0)
+ return FALSE;
+ }
+ return TRUE;
+ }
+}