pmd-red/src/code_80972F4.c
2023-07-28 11:10:45 -07:00

473 lines
11 KiB
C

#include "global.h"
#include "constants/dungeon.h"
#include "pokemon.h"
#include "wonder_mail.h"
#include "code_80958E8.h"
#include "dungeon.h"
#include "exclusive_pokemon.h"
#include "event_flag.h"
struct MissionText
{
u8 *text;
u8 unk4;
u8 unk5;
u8 unk6;
u8 unk7;
};
extern struct MissionText gStoryMissionText[];
extern const char gFinalScenarioText[];
extern const char gMeetNinetalesText[];
extern const char gAvoidCaptureText[];
extern const u8 gUnknown_8109CC0[];
extern const u8 gDummyScenarioText[];
extern u8 sub_80A270C(s16);
extern u8 sub_80A2728(s16);
extern void sub_800199C(u8, u8, u16, s32);
void SaveWonderMail(struct unkStruct_8094924 *a, struct WonderMail *b);
void RestoreWonderMail(struct unkStruct_8094924 *a, struct WonderMail *b);
extern s32 sub_8096EB0(struct WonderMail *);
extern void SaveDungeonLocation(struct unkStruct_8094924*, struct DungeonLocation*);
extern void RestoreDungeonLocation(struct unkStruct_8094924*, struct DungeonLocation*);
extern void sub_80015C0(u8, u8);
extern u32 sub_8001784(u32, u32, u16);
extern void GeneratePelipperJobs(void);
s16 sub_80A26B8(s16);
extern void sub_80018D8(u8, u8, u32);
bool8 sub_8096F50(struct WonderMail *mail)
{
s32 index;
s32 temp2;
struct subStruct_203B490 *temp;
temp2 = sub_8096EB0(mail);
for(index = 0; index < 0x10; index++)
{
temp = &gUnknown_203B490->unk230[index];
if(temp->dungeon.id == mail->dungeon.id)
if(temp->dungeon.floor == mail->dungeon.floor)
if(temp->unk4 == mail->unk8)
if(temp->unk8 == temp2)
return TRUE;
}
return FALSE;
}
u32 RestoreMailInfo(u8 *r0, u32 size)
{
s32 index;
struct unkStruct_8094924 backup;
u32 temp;
xxx_init_struct_8094924_restore_809485C(&backup, r0, size);
for(index = 0; index < NUM_MAILBOX_SLOTS; index++)
{
RestoreWonderMail(&backup, &gUnknown_203B490->mailboxSlots[index]);
}
for(index = 0; index < MAX_ACCEPTED_JOBS; index++)
{
RestoreWonderMail(&backup, &gUnknown_203B490->pelipperBoardJobs[index]);
}
for(index = 0; index < MAX_ACCEPTED_JOBS; index++)
{
RestoreWonderMail(&backup, &gUnknown_203B490->jobSlots[index]);
}
for(index = 0; index < 0x38; index++)
{
RestoreIntegerBits(&backup, &temp, 1);
if(temp & 1)
gUnknown_203B490->PKMNNewsReceived[index] = TRUE;
else
gUnknown_203B490->PKMNNewsReceived[index] = FALSE;
}
RestoreIntegerBits(&backup, &temp, 1);
if(temp & 1)
gUnknown_203B490->unk328 = TRUE;
else
gUnknown_203B490->unk328 = FALSE;
RestoreIntegerBits(&backup, gUnknown_203B490->unk190, 0x140);
RestoreIntegerBits(&backup, gUnknown_203B490->unk1B8, 0x3C0);
for(index = 0; index < 0x10; index++)
{
RestoreIntegerBits(&backup, &gUnknown_203B490->unk230[index].unk8, 0x20);
RestoreIntegerBits(&backup, &gUnknown_203B490->unk230[index].unk4, 0x18);
RestoreDungeonLocation(&backup, &gUnknown_203B490->unk230[index].dungeon);
}
nullsub_102(&backup);
return backup.unk8;
}
u32 SaveMailInfo(u8 *r0, u32 size)
{
s32 index;
struct unkStruct_8094924 backup;
u32 temp;
xxx_init_struct_8094924_save_809486C(&backup, r0, size);
for(index = 0; index < NUM_MAILBOX_SLOTS; index++)
{
SaveWonderMail(&backup, &gUnknown_203B490->mailboxSlots[index]);
}
for(index = 0; index < MAX_ACCEPTED_JOBS; index++)
{
SaveWonderMail(&backup, &gUnknown_203B490->pelipperBoardJobs[index]);
}
for(index = 0; index < MAX_ACCEPTED_JOBS; index++)
{
SaveWonderMail(&backup, &gUnknown_203B490->jobSlots[index]);
}
for(index = 0; index < 0x38; index++)
{
if(gUnknown_203B490->PKMNNewsReceived[index] != 0)
temp = -1;
else
temp = 0;
SaveIntegerBits(&backup, &temp, 1);
}
if(gUnknown_203B490->unk328)
temp = -1;
else
temp = 0;
SaveIntegerBits(&backup, &temp, 1);
SaveIntegerBits(&backup, gUnknown_203B490->unk190, 0x140);
SaveIntegerBits(&backup, gUnknown_203B490->unk1B8, 0x3C0);
for(index = 0; index < 0x10; index++)
{
SaveIntegerBits(&backup, &gUnknown_203B490->unk230[index].unk8, 0x20);
SaveIntegerBits(&backup, &gUnknown_203B490->unk230[index].unk4, 0x18);
SaveDungeonLocation(&backup, &gUnknown_203B490->unk230[index].dungeon);
}
nullsub_102(&backup);
return backup.unk8;
}
void RestoreWonderMail(struct unkStruct_8094924 *a, struct WonderMail *b)
{
RestoreIntegerBits(a, &b->mailType, 4);
RestoreIntegerBits(a, &b->missionType, 3);
RestoreIntegerBits(a, &b->unk2, 4);
RestoreIntegerBits(a, &b->clientSpecies, 9);
RestoreIntegerBits(a, &b->targetSpecies, 9);
RestoreIntegerBits(a, &b->targetItem, 8);
RestoreIntegerBits(a, &b->rewardType, 4);
RestoreIntegerBits(a, &b->itemReward, 8);
RestoreIntegerBits(a, &b->friendAreaReward, 6);
RestoreIntegerBits(a, &b->unk8, 0x18);
RestoreDungeonLocation(a, &b->dungeon);
}
void SaveWonderMail(struct unkStruct_8094924 *a, struct WonderMail *b)
{
SaveIntegerBits(a, &b->mailType, 4);
SaveIntegerBits(a, &b->missionType, 3);
SaveIntegerBits(a, &b->unk2, 4);
SaveIntegerBits(a, &b->clientSpecies, 9);
SaveIntegerBits(a, &b->targetSpecies, 9);
SaveIntegerBits(a, &b->targetItem, 8);
SaveIntegerBits(a, &b->rewardType, 4);
SaveIntegerBits(a, &b->itemReward, 8);
SaveIntegerBits(a, &b->friendAreaReward, 6);
SaveIntegerBits(a, &b->unk8, 0x18);
SaveDungeonLocation(a, &b->dungeon);
}
void sub_80972F4(void)
{
sub_80015C0(0, 0x2B);
sub_80015C0(0, 0x2C);
sub_80015C0(0, 0x2D);
}
void nullsub_128(void)
{}
s32 sub_8097318(s16 param_1)
{
s32 iVar1;
s32 param_1_s32;
param_1_s32 = param_1;
if (param_1_s32 == 0xd) {
iVar1 = 0;
}
else {
iVar1 = sub_8001784(0,0x2b,param_1_s32);
if (iVar1 != 0) {
iVar1 = 1;
}
}
return iVar1;
}
void sub_809733C(short param_1,u32 param_2)
{
s32 uVar2;
u8 param_2_u8;
u16 uVar2_u16;
uVar2 = param_1;
param_2_u8 = param_2;
if (uVar2 != 0xd) {
uVar2_u16 = uVar2;
if ((((sub_8001784(0,0x2c,uVar2_u16) == 0) && (sub_800199C(0,0x2b,uVar2_u16,param_2_u8), param_2_u8 != '\0')))){
switch(uVar2)
{
case 0xE:
case 0xF:
case 0x1C:
GeneratePelipperJobs();
break;
}
}
}
}
bool32 sub_8097384(s16 param_1)
{
bool32 iVar1;
if (param_1 == 0xd) {
iVar1 = FALSE;
}
else {
iVar1 = sub_8001784(0,0x2c,param_1 & 0xffff);
if (iVar1 != 0) {
iVar1 = TRUE;
}
}
return iVar1;
}
void sub_80973A8(s16 param_1,u32 param_2)
{
s32 sVar1;
s32 param_1_s32 = param_1;
u8 param_2_u32 = param_2;
if (param_1_s32 != 0xd) {
if (param_2_u32 != 0) {
sVar1 = sub_80A26B8(param_1);
sub_800199C(0,0x2b,param_1_s32,0);
if (sVar1 != -1) {
sub_80018D8(0,0x12,sVar1);
}
}
sub_800199C(0,0x2c,param_1_s32,param_2_u32);
}
}
s32 sub_80973F4(s32 param_1)
{
s32 iVar1;
s16 param_1_u16 = param_1;
if (param_1_u16 == 0xd) {
iVar1 = 0;
}
else {
s32 param_1_s32 = param_1_u16;
u16 param_1_temp = param_1_s32;
iVar1 = sub_8001784(0,0x2d,param_1_temp);
if (iVar1 != 0) {
iVar1 = 1;
}
}
return iVar1;
}
void sub_8097418(s16 index,u32 param_2)
{
int index_s32 = index;
u8 param_2_u8 = param_2;
if (index_s32 != 0xd) {
if ((param_2_u8 != 0) && (sub_800199C(0,0x2c,index_s32,0), index_s32 < 0x1f)) {
struct MissionText *mt = &gStoryMissionText[index_s32];
if (mt->unk4 != 0xFF) {
sub_8097FA8(mt->unk4);
}
if (mt->unk5 != 0xFF) {
sub_8097FA8(mt->unk5);
}
if (index_s32 == 9) {
sub_8097FA8(0x1f);
}
sub_8097FF8();
}
sub_800199C(0,0x2d,index_s32,param_2_u8);
}
}
const u8 *sub_809747C(s16 index)
{
if(index == 0xD)
{
return gDummyScenarioText;
}
else
{
return GetDungeonName1(sub_80A270C(index));
}
}
const u8 *sub_80974A0(s16 index)
{
if(index == 0xD)
{
return gDummyScenarioText;
}
else
{
return GetDungeonName1(sub_80A270C(index));
}
}
const u8 *GetCurrentMissionText(s16 index)
{
if(index < 0x1F)
{
struct MissionText *mt = &gStoryMissionText[index];
return mt->text;
}
else
{
return gUnknown_8109CC0;
}
}
void sub_80974E8(void)
{
sub_80015C0(0, 0x2E);
sub_80015C0(0, 0x2F);
}
void nullsub_208(void)
{
}
bool8 sub_8097504(s16 mazeIndex)
{
s32 mazeIndex_s32;
#ifndef NONMATCHING
register s32 mazeIndex_s32_1 asm("r1");
#else
s32 mazeIndex_s32_1;
#endif
s32 uVar3;
mazeIndex_s32 = mazeIndex;
mazeIndex_s32_1 = mazeIndex_s32;
if(mazeIndex_s32 < 17)
{
switch(mazeIndex_s32) {
case 2:
case 10:
case 11:
case 12:
uVar3 = 14;
break;
case 0:
case 1:
case 5:
case 7:
case 9:
case 14:
uVar3 = 15;
break;
case 3:
case 4:
case 6:
case 8:
return TRUE;
case 13:
uVar3 = 6;
break;
default:
return TRUE;
}
}
else
{
if (mazeIndex_s32_1 > 22) return FALSE;
if (mazeIndex_s32_1 == 22) return FALSE;
if (mazeIndex_s32_1 == 21) return FALSE;
uVar3 = 6;
}
if (!sub_80023E4(uVar3)) {
return FALSE;
}
else {
return TRUE;
}
}
// TODO: this should probably be bool8 but can't get a match just yet
bool32 IsMazeCompleted(s16 mazeIndex)
{
bool32 mazeCompletion;
mazeCompletion = sub_8001784(0, 0x2e, mazeIndex);
if (mazeCompletion) {
mazeCompletion = TRUE;
}
return mazeCompletion;
}
void sub_80975A8(s16 param_1,u8 param_2)
{
u16 param_1_u16 = param_1;
sub_800199C(0,0x2e,param_1_u16,param_2);
}
const u8 *sub_80975C4(s16 index)
{
return GetDungeonName1(sub_80A2728(index));
}
const char *sub_80975DC(u32 r0)
{
// TODO: slight hack but matches
r0 <<= 16;
if((0xffe90000 + r0) >> 16 < 2)
if(sub_8001D08(0x3, 0xE, -1))
return gMeetNinetalesText;
else
return gAvoidCaptureText;
else
return gFinalScenarioText;
}
bool8 HasCompletedAllMazes(void)
{
s32 index;
for(index = 0; index < NUM_BASIC_DUNGEON_MAZE; index++)
{
if(!(bool8)IsMazeCompleted(index))
return FALSE;
}
return TRUE;
}
bool8 sub_8097640(void)
{
if(sub_8001784(0, 0x2E, 0x1F) == 0 && HasCompletedAllMazes())
{
sub_800199C(0, 0x2E, 0x1F, 1);
return TRUE;
}
else
{
return FALSE;
}
}