mirror of
https://github.com/pret/pmd-red.git
synced 2026-03-21 17:46:39 -05:00
620 lines
14 KiB
C
620 lines
14 KiB
C
#include "global.h"
|
|
#include "globaldata.h"
|
|
#include "code_800D090.h"
|
|
#include "code_8094F88.h"
|
|
#include "constants/communication_error_codes.h"
|
|
#include "constants/dungeon.h"
|
|
#include "main_menu1.h"
|
|
#include "memory.h"
|
|
#include "other_menus1.h"
|
|
#include "other_menus2.h"
|
|
#include "pokemon.h"
|
|
#include "save.h"
|
|
#include "menu_input.h"
|
|
#include "structs/str_dungeon.h"
|
|
|
|
typedef struct unkStruct_800D670
|
|
{
|
|
u8 buffer[16];
|
|
u32 unk10;
|
|
} unkStruct_800D670;
|
|
|
|
// rescue_password_menu.c
|
|
extern s32 gCommsTimeout; // Counts to 100 and then errors if other player hasn't connected
|
|
|
|
EWRAM_DATA static s32 gUnknown_202EC38 = 0;
|
|
UNUSED EWRAM_DATA static u8 sUnused = 0;
|
|
EWRAM_DATA static s32 gUnknown_202EC40[2] = {0};
|
|
EWRAM_DATA static s32 gUnknown_202EC48 = 0;
|
|
|
|
extern UnkStruct_203B184 *gUnknown_203B184;
|
|
|
|
#include "data/other_menus2.h"
|
|
|
|
// code_800D090.s
|
|
extern s32 sub_800D33C(void);
|
|
extern void sub_800D494(void);
|
|
extern void sub_800D510(void);
|
|
extern void sub_800D520(void);
|
|
extern void sub_800D570(void);
|
|
extern void sub_800D59C(void *, u32);
|
|
extern u8 sub_800D600(void);
|
|
extern void sub_800D670(s32 idx, void *dst, s32 size);
|
|
extern void sub_800D68C(u32);
|
|
void sub_800D414(void);
|
|
|
|
// Inline needed for 8-bit return cast
|
|
static inline bool8 IsNotChunsoft(unkStruct_800D670 *unk)
|
|
{
|
|
return strcmp(unk->buffer, sChunsoft) != 0;
|
|
}
|
|
|
|
bool8 sub_8037A48(void)
|
|
{
|
|
bool8 found;
|
|
unkStruct_800D670 stack;
|
|
unkStruct_800D670 stack_1;
|
|
s32 i;
|
|
|
|
found = TRUE;
|
|
sub_800D670(0, &stack, sizeof(unkStruct_800D670));
|
|
sub_800D670(1, &stack_1, sizeof(unkStruct_800D670));
|
|
|
|
for (i = 0; i < 2; i++)
|
|
gUnknown_202EC40[i] = 8;
|
|
|
|
gUnknown_202EC40[0] = stack.unk10;
|
|
gUnknown_202EC40[1] = stack_1.unk10;
|
|
|
|
if (IsNotChunsoft(&stack) || IsNotChunsoft(&stack_1))
|
|
return FALSE;
|
|
|
|
if ((stack.unk10 == 0 && stack_1.unk10 == 1)
|
|
|| (stack.unk10 == 1 && stack_1.unk10 == 0)) {
|
|
//found = TRUE;
|
|
}
|
|
else if ((stack.unk10 == 2 && stack_1.unk10 == 3)
|
|
|| (stack.unk10 == 3 && stack_1.unk10 == 2)) {
|
|
//found = TRUE;
|
|
}
|
|
else if ((stack.unk10 == 9 && stack_1.unk10 == 10)
|
|
|| (stack.unk10 == 10 && stack_1.unk10 == 9)) {
|
|
//found = TRUE;
|
|
}
|
|
else if ((stack.unk10 == 4 && stack_1.unk10 == 5)
|
|
|| (stack.unk10 == 5 && stack_1.unk10 == 4)) {
|
|
//found = TRUE;
|
|
}
|
|
else if ((stack.unk10 == 6 && stack_1.unk10 == 7)
|
|
|| (stack.unk10 == 7 && stack_1.unk10 == 6)) {
|
|
//found = TRUE;
|
|
}
|
|
else {
|
|
found = FALSE;
|
|
}
|
|
|
|
return found;
|
|
}
|
|
|
|
static inline void InitUnk(unkStruct_800D670 *dst, const u8 *chunsoft, s32 mode)
|
|
{
|
|
MemoryFill8(dst, 0, sizeof(unkStruct_800D670));
|
|
strcpy(dst->buffer, chunsoft);
|
|
dst->unk10 = mode;
|
|
}
|
|
|
|
s32 sub_8037B28(s32 mode)
|
|
{
|
|
s32 i;
|
|
s32 ret;
|
|
unkStruct_800D670 stack;
|
|
s32 r5 = 0;
|
|
|
|
sub_800D414();
|
|
gUnknown_202EC38 = 0;
|
|
InitUnk(&stack, sChunsoft, mode);
|
|
sub_800D59C(&stack, sizeof(unkStruct_800D670));
|
|
|
|
while (TRUE) {
|
|
for (i = 0; i < 1; i++) {
|
|
sub_80373C4();
|
|
switch (GetMenuInput()) {
|
|
case 2:
|
|
case 3:
|
|
sub_800D520();
|
|
sub_800D510();
|
|
return 1;
|
|
}
|
|
}
|
|
|
|
r5 = sub_800D33C();
|
|
sub_800D570();
|
|
|
|
if (r5 == 2) {
|
|
break;
|
|
}
|
|
else if (r5 == 3) {
|
|
sub_800D520();
|
|
sub_800D510();
|
|
return 2;
|
|
}
|
|
else if (r5 == 4) {
|
|
sub_800D520();
|
|
sub_800D510();
|
|
return 3;
|
|
}
|
|
else if (r5 == 5) {
|
|
sub_800D520();
|
|
sub_800D510();
|
|
return 1;
|
|
}
|
|
|
|
if (gUnknown_202EC38 < 1800) {
|
|
gUnknown_202EC38++;
|
|
}
|
|
else {
|
|
sub_800D520();
|
|
sub_800D510();
|
|
return COMMS_NOT_READY;
|
|
}
|
|
}
|
|
|
|
if (sub_800D600() != 0) {
|
|
if (sub_8037A48() == 0) {
|
|
ret = 4;
|
|
sub_800D520();
|
|
sub_800D510();
|
|
}
|
|
else {
|
|
ret = 0;
|
|
}
|
|
}
|
|
else {
|
|
ret = 5;
|
|
sub_800D520();
|
|
sub_800D510();
|
|
}
|
|
return ret;
|
|
}
|
|
|
|
s32 sub_8037C10(bool8 a0)
|
|
{
|
|
s32 ret;
|
|
|
|
if (a0) {
|
|
if (sub_800D588())
|
|
ret = gUnknown_202EC40[0];
|
|
else
|
|
ret = gUnknown_202EC40[1];
|
|
}
|
|
else {
|
|
if (sub_800D588())
|
|
ret = gUnknown_202EC40[1];
|
|
else
|
|
ret = gUnknown_202EC40[0];
|
|
}
|
|
|
|
return ret;
|
|
}
|
|
|
|
static void sub_8037C44(s32 mode, void *data)
|
|
{
|
|
s32 i;
|
|
|
|
for (i = 0; i < 2; i++)
|
|
sub_800D68C(i);
|
|
|
|
switch (mode) {
|
|
case 0:
|
|
case 1:
|
|
sub_800D59C(data, sizeof(unkStruct_8035D94));
|
|
break;
|
|
case 2:
|
|
case 3:
|
|
case 6:
|
|
case 7:
|
|
sub_800D59C(data, sizeof(unkStruct_203B480));
|
|
break;
|
|
case 4:
|
|
case 5:
|
|
sub_800D59C(data, sizeof(WonderMailStruct_203B2C0_sub));
|
|
break;
|
|
case 9:
|
|
case 10:
|
|
sub_800D59C(data, 0xB4);
|
|
break;
|
|
}
|
|
}
|
|
|
|
static void sub_8037CC4(s32 mode, void *param_2, void *param_3)
|
|
{
|
|
switch (mode) {
|
|
case 0:
|
|
case 1:
|
|
sub_800D670(0, param_2, sizeof(unkStruct_8035D94));
|
|
sub_800D670(1, param_3, sizeof(unkStruct_8035D94));
|
|
break;
|
|
case 2:
|
|
case 3:
|
|
case 6:
|
|
case 7:
|
|
sub_800D670(0, param_2, sizeof(unkStruct_203B480));
|
|
sub_800D670(1, param_3, sizeof(unkStruct_203B480));
|
|
break;
|
|
case 4:
|
|
case 5:
|
|
sub_800D670(0, param_2, sizeof(WonderMailStruct_203B2C0_sub));
|
|
sub_800D670(1, param_3, sizeof(WonderMailStruct_203B2C0_sub));
|
|
break;
|
|
case 9:
|
|
case 10:
|
|
sub_800D670(0, param_2, 0xB4);
|
|
sub_800D670(1, param_3, 0xB4);
|
|
break;
|
|
}
|
|
}
|
|
|
|
s32 sub_8037D64(u32 mode, void * param_2, void *param_3)
|
|
{
|
|
s32 iVar2 = 0;
|
|
s32 linkStatus = 0;
|
|
|
|
gUnknown_202EC48 = 0;
|
|
sub_800D494();
|
|
sub_8037C44(mode, param_2);
|
|
|
|
while (TRUE) {
|
|
sub_80373C4();
|
|
iVar2 = sub_800D33C();
|
|
sub_800D570();
|
|
|
|
if (iVar2 == 2) {
|
|
break;
|
|
}
|
|
|
|
if (iVar2 == 3 || iVar2 == 4 || iVar2 == 5) {
|
|
sub_800D520();
|
|
sub_800D510();
|
|
return 1;
|
|
}
|
|
else {
|
|
|
|
if (gUnknown_202EC48 < 100)
|
|
gUnknown_202EC48++;
|
|
else {
|
|
sub_800D520();
|
|
sub_800D510();
|
|
return COMMS_NOT_READY;
|
|
}
|
|
}
|
|
}
|
|
|
|
if (sub_800D600() != 0) {
|
|
linkStatus = 0;
|
|
}
|
|
else {
|
|
sub_800D520();
|
|
sub_800D510();
|
|
linkStatus = 5;
|
|
}
|
|
|
|
sub_8037CC4(mode, param_2, param_3);
|
|
return linkStatus;
|
|
}
|
|
|
|
static s32 sub_8037DF0(void)
|
|
{
|
|
s32 linkStatus;
|
|
s32 iStack_10;
|
|
s32 iStack_c;
|
|
|
|
linkStatus = COMMS_GOOD;
|
|
sub_800D670(0, &iStack_10, 4);
|
|
sub_800D670(1, &iStack_c, 4);
|
|
if ((iStack_10 != 0) || (iStack_c != 0)) {
|
|
linkStatus = !sub_800D588() ? iStack_c : iStack_10;
|
|
if (linkStatus == COMMS_GOOD) {
|
|
linkStatus = 0xe;
|
|
}
|
|
}
|
|
return linkStatus;
|
|
}
|
|
|
|
static void sub_8037E38(unkStruct_8035D94 *param_1,unkStruct_8035D94 *param_2)
|
|
{
|
|
unkStruct_8035D94 *r3;
|
|
unkStruct_8035D94 *r4;
|
|
u32 load;
|
|
|
|
r4 = !sub_800D588() ? param_2 : param_1;
|
|
r3 = !sub_800D588() ? param_1 : param_2;
|
|
|
|
if (r4->itemIndex == r3->itemIndex) {
|
|
load = gTeamInventoryRef->teamStorage[r4->itemIndex];
|
|
load += r3->numItems;
|
|
gTeamInventoryRef->teamStorage[r4->itemIndex] = load;
|
|
}
|
|
else {
|
|
load = gTeamInventoryRef->teamStorage[r3->itemIndex];
|
|
load += r3->numItems;
|
|
gTeamInventoryRef->teamStorage[r3->itemIndex] = load;
|
|
}
|
|
}
|
|
|
|
static void sub_8037E90(unkStruct_203B480 *param_1, unkStruct_203B480 *param_2)
|
|
{
|
|
if (!sub_800D588())
|
|
param_2 = param_1;
|
|
|
|
param_2->mailType = 2;
|
|
sub_80951BC(param_2);
|
|
sub_8095274(param_2->unk10.unk10);
|
|
}
|
|
|
|
static void nullsub_53(void *param_1, void *param_2)
|
|
{
|
|
}
|
|
|
|
static void sub_8037EBC(WonderMailStruct_203B2C0_sub *param_1, WonderMailStruct_203B2C0_sub *param_2)
|
|
{
|
|
unkStruct_203B480 *mail;
|
|
WonderMailStruct_203B2C0_sub *puVar2;
|
|
|
|
if (!sub_800D588())
|
|
puVar2 = param_1;
|
|
else
|
|
puVar2 = param_2;
|
|
|
|
mail = GetMailatIndex(GetMailIndex(1, (puVar2->mail).unk10.unk10));
|
|
*mail = (*puVar2).mail;
|
|
mail->mailType = 5;
|
|
sub_80951FC(mail);
|
|
mail->mailType = 7;
|
|
|
|
if(puVar2->pokemon.speciesNum != MONSTER_NONE)
|
|
{
|
|
gUnknown_203B484->unk0 = puVar2->mail.unk10.unk10;
|
|
gUnknown_203B484->unk4 = puVar2->pokemon;
|
|
gUnknown_203B484->unk4.dungeonLocation.id = DUNGEON_UNKNOWN_WORLD;
|
|
gUnknown_203B484->unk4.dungeonLocation.floor = 1;
|
|
}
|
|
else
|
|
{
|
|
MemoryFill8(gUnknown_203B484, 0, sizeof(unkStruct_203B484));
|
|
gUnknown_203B484->unk4.speciesNum = MONSTER_NONE;
|
|
}
|
|
}
|
|
|
|
static void sub_8037F4C(unkStruct_203B480 *param_1, unkStruct_203B480 *param_2)
|
|
{
|
|
unkStruct_203B480 *mail;
|
|
MainMenu1Work *mainMenu;
|
|
|
|
if (!sub_800D588())
|
|
param_2 = param_1;
|
|
|
|
mail = GetMailatIndex(GetMailIndex(4, param_2->unk10.unk10));
|
|
*mail = *param_2;
|
|
mail->mailType = 6;
|
|
mainMenu = GetMainMenu();
|
|
if(mainMenu)
|
|
{
|
|
mainMenu->unk3A = 1;
|
|
}
|
|
}
|
|
|
|
static void sub_8037F9C(u32 mode, void *param_2, void *param_3)
|
|
{
|
|
switch(mode)
|
|
{
|
|
case 0:
|
|
case 1:
|
|
sub_8037E38(param_2, param_3);
|
|
break;
|
|
case 7:
|
|
sub_8037F4C(param_2, param_3);
|
|
break;
|
|
case 3:
|
|
sub_8037E90(param_2, param_3);
|
|
break;
|
|
case 5:
|
|
sub_8037EBC(param_2, param_3);
|
|
break;
|
|
case 10:
|
|
nullsub_53(param_2, param_3);
|
|
break;
|
|
}
|
|
}
|
|
|
|
static s32 sub_8038014(unkStruct_8035D94 *param_1,unkStruct_8035D94 *param_2)
|
|
{
|
|
s32 linkStatus;
|
|
s32 r2;
|
|
unkStruct_8035D94 *r3;
|
|
unkStruct_8035D94 *r4;
|
|
|
|
r4 = !sub_800D588() ? param_2 : param_1;
|
|
r3 = !sub_800D588() ? param_1 : param_2;
|
|
|
|
if (r4->itemIndex == r3->itemIndex) {
|
|
r2 = gTeamInventoryRef->teamStorage[r4->itemIndex];
|
|
r2 += r3->numItems;
|
|
if (r2 > 999) {
|
|
linkStatus = COMMS_NO_ROOM_STORAGE;
|
|
}
|
|
else
|
|
linkStatus = COMMS_GOOD;
|
|
}
|
|
else {
|
|
r2 = gTeamInventoryRef->teamStorage[r3->itemIndex];
|
|
r2 += r3->numItems;
|
|
if (r2 > 999) {
|
|
linkStatus = COMMS_NO_ROOM_STORAGE;
|
|
}
|
|
else
|
|
linkStatus = COMMS_GOOD;
|
|
|
|
}
|
|
return linkStatus;
|
|
}
|
|
|
|
static s32 sub_8038078(unkStruct_203B480 *param_1,unkStruct_203B480 *param_2)
|
|
{
|
|
u32 uVar2;
|
|
u32 uVar3;
|
|
|
|
if (!sub_800D588())
|
|
param_2 = param_1;
|
|
|
|
uVar3 = param_2->unk10.unk10;
|
|
if (gUnknown_203B184 != NULL) {
|
|
uVar2 = gUnknown_203B184->unk050;
|
|
}
|
|
else {
|
|
uVar2 = sub_8011C34();
|
|
}
|
|
if (HasMail(4,uVar3) && (param_2->unk28 == uVar2)) {
|
|
return COMMS_GOOD;
|
|
}
|
|
else {
|
|
return COMMS_NOT_ELIGIBLE_2;
|
|
}
|
|
}
|
|
|
|
static s32 sub_80380C4(unkStruct_203B480 *param_1,unkStruct_203B480 *param_2)
|
|
{
|
|
u32 uVar2;
|
|
unkStruct_203B480 *mail;
|
|
|
|
if (!sub_800D588())
|
|
mail = param_1;
|
|
else
|
|
mail = param_2;
|
|
|
|
uVar2 = mail->unk10.unk10;
|
|
if (HasMail(2,uVar2) || HasMail(4,uVar2) || HasMail(6,uVar2))
|
|
{
|
|
return COMMS_DUPLICATE_MAIL;
|
|
}
|
|
if(sub_8095298(mail->unk10.unk10))
|
|
{
|
|
return COMMS_DUPLICATE_MAIL;
|
|
}
|
|
else if (FindOpenMailSlot() == -1)
|
|
{
|
|
return COMMS_NO_ROOM_MAIL;
|
|
}
|
|
else
|
|
{
|
|
return COMMS_GOOD;
|
|
}
|
|
}
|
|
|
|
static s32 sub_803812C(unkStruct_203B480 *param_1, unkStruct_203B480 *param_2)
|
|
{
|
|
if (!sub_800D588())
|
|
param_2 = param_1;
|
|
|
|
if (HasMail(1, (param_2->unk10).unk10)) {
|
|
return COMMS_GOOD;
|
|
}
|
|
else {
|
|
return COMMS_NOT_ELIGIBLE_1;
|
|
}
|
|
}
|
|
|
|
static s32 sub_8038158(void *param_1, void *param_2)
|
|
{
|
|
return COMMS_GOOD;
|
|
}
|
|
|
|
static s32 sub_803815C(u32 mode, void *param_2, void *param_3)
|
|
{
|
|
s32 linkStatus;
|
|
|
|
linkStatus = COMMS_GOOD;
|
|
switch(mode) {
|
|
case 0:
|
|
case 1:
|
|
linkStatus = sub_8038014(param_2, param_3);
|
|
break;
|
|
case 7:
|
|
linkStatus = sub_8038078(param_2, param_3);
|
|
break;
|
|
case 3:
|
|
linkStatus = sub_80380C4(param_2, param_3);
|
|
break;
|
|
case 5:
|
|
linkStatus = sub_803812C(param_2, param_3);
|
|
break;
|
|
case 10:
|
|
linkStatus = sub_8038158(param_2, param_3);
|
|
break;
|
|
}
|
|
return linkStatus;
|
|
}
|
|
|
|
UNUSED static void sub_80381DC(u32 mode, void * param_2, void * param_3)
|
|
{
|
|
sub_8037F9C(mode, param_2, param_3);
|
|
}
|
|
|
|
UNUSED static s32 sub_80381E8(u32 mode, void * param_2, void * param_3)
|
|
{
|
|
return sub_803815C(mode, param_2, param_3);
|
|
}
|
|
|
|
s32 sub_80381F4(u32 mode, void *param_2, void *param_3)
|
|
{
|
|
s32 iVar2 = 0;
|
|
s32 linkStatus = sub_803815C(mode, param_2, param_3);
|
|
gCommsTimeout = 0;
|
|
sub_800D494();
|
|
sub_800D59C(&linkStatus, 4);
|
|
|
|
while (TRUE) {
|
|
sub_80373C4();
|
|
iVar2 = sub_800D33C();
|
|
sub_800D570();
|
|
if (iVar2 == 2) {
|
|
break;
|
|
}
|
|
|
|
if (iVar2 == 3 || iVar2 == 4 || iVar2 == 5) {
|
|
sub_800D520();
|
|
sub_800D510();
|
|
return 1;
|
|
}
|
|
|
|
if (gCommsTimeout < 100) {
|
|
gCommsTimeout++;
|
|
}
|
|
else
|
|
{
|
|
sub_800D520();
|
|
sub_800D510();
|
|
return COMMS_NOT_READY;
|
|
}
|
|
}
|
|
|
|
if (sub_800D600() != 0) {
|
|
linkStatus = sub_8037DF0();
|
|
}
|
|
else {
|
|
sub_800D520();
|
|
sub_800D510();
|
|
linkStatus = 5;
|
|
}
|
|
|
|
if (linkStatus == COMMS_GOOD) {
|
|
sub_8037F9C(mode, param_2, param_3);
|
|
}
|
|
else {
|
|
sub_800D520();
|
|
sub_800D510();
|
|
}
|
|
|
|
sub_800D520();
|
|
return linkStatus;
|
|
}
|