mirror of
https://github.com/pret/pmd-red.git
synced 2026-03-23 02:24:49 -05:00
554 lines
14 KiB
C
554 lines
14 KiB
C
#include "global.h"
|
|
#include "constants/colors.h"
|
|
#include "constants/input.h"
|
|
#include "constants/iq_skill.h"
|
|
#include "memory.h"
|
|
#include "pokemon.h"
|
|
#include "pokemon_3.h"
|
|
#include "team_inventory.h"
|
|
#include "text1.h"
|
|
#include "text2.h"
|
|
#include "item.h"
|
|
#include "menu_input.h"
|
|
#include "code_8023144.h"
|
|
#include "code_800D090.h"
|
|
#include "friend_area.h"
|
|
#include "kecleon_bros.h"
|
|
#include "code_80130A8.h"
|
|
#include "code_801B3C0.h"
|
|
#include "code_80118A4.h"
|
|
|
|
struct unkStruct_3001B5C
|
|
{
|
|
// size: 0x3fC
|
|
u8 unk0;
|
|
u32 unk4;
|
|
u32 unk8;
|
|
s16 unkC[2];
|
|
u32 unk10;
|
|
u8 fill14[0x354 - 0x14];
|
|
u8 unk354;
|
|
u8 fill355[0x35C - 0x355];
|
|
struct MenuInputStruct input;
|
|
u32 unk390;
|
|
struct UnkTextStruct2 *unk394;
|
|
struct UnkTextStruct2 unk398[4];
|
|
u8 unk3F8[4];
|
|
};
|
|
|
|
IWRAM_DATA struct unkStruct_3001B5C *gUnknown_3001B5C;
|
|
struct unkStruct_203B294 *gUnknown_203B294;
|
|
|
|
extern u32 gUnknown_203B298;
|
|
extern u16 gUnknown_203B29C;
|
|
extern u16 gUnknown_203B29E;
|
|
extern struct UnkTextStruct2 gUnknown_80DC91C;
|
|
extern struct UnkTextStruct2 gUnknown_80DC904;
|
|
|
|
void sub_8023758(void);
|
|
void sub_80237E0(void);
|
|
extern bool8 sub_8098134(s32);
|
|
extern void sub_8023730(void);
|
|
extern u8 sub_8023704(u8);
|
|
extern void sub_8023420(void);
|
|
extern void sub_80234BC(void);
|
|
extern u32 sub_80236A4(void);
|
|
|
|
|
|
extern u8 gUnknown_80DC5EC[];
|
|
extern u8 gUnknown_202DE58[];
|
|
extern u8 gUnknown_80DC8F0[];
|
|
extern u8 gUnknown_80DC8F8[];
|
|
extern u8 *gUnknown_80D4940[];
|
|
extern u8 *gUnknown_80D4970[];
|
|
extern void sub_8022924(s32);
|
|
extern u32 sub_801B00C(void);
|
|
extern void sub_801B048(void);
|
|
|
|
void GetGummiItemStatBoost(struct PokemonStruct* pokemon, u8 id, bool8 checkBoostFlags, struct Gummi* gummi);
|
|
|
|
extern void sub_8099690(u32);
|
|
s32 GetNumAvailableIQSkills(u8 *iqSkillBuffer, s32 pokeIQ);
|
|
|
|
void sub_8022D2C(void) {
|
|
s32 index;
|
|
s32 loopMax = 0;
|
|
MemoryFill16(gUnknown_203B294->unk138, 0, sizeof(gUnknown_203B294->unk138));
|
|
if(gUnknown_203B294->pokeStruct)
|
|
{
|
|
gUnknown_203B294->unkF8[loopMax].text = gUnknown_80DC8F0;
|
|
gUnknown_203B294->unkF8[loopMax].menuAction = 5;
|
|
if(!IsGummiItem(gUnknown_203B294->item.id))
|
|
{
|
|
gUnknown_203B294->unk138[loopMax] = 1;
|
|
}
|
|
loopMax += 1;
|
|
}
|
|
else {
|
|
if(GetItemCategory(gUnknown_203B294->item.id) == CATEGORY_TMS_HMS)
|
|
{
|
|
gUnknown_203B294->unkF8[loopMax].text = gUnknown_80DC8F8;
|
|
gUnknown_203B294->unkF8[loopMax].menuAction = 6;
|
|
loopMax += 1;
|
|
}
|
|
gUnknown_203B294->unkF8[loopMax].text = *gUnknown_80D4940;
|
|
gUnknown_203B294->unkF8[loopMax].menuAction = 4;
|
|
loopMax += 1;
|
|
}
|
|
gUnknown_203B294->unkF8[loopMax].text = *gUnknown_80D4970;
|
|
gUnknown_203B294->unkF8[loopMax].menuAction = 7;
|
|
loopMax += 1;
|
|
gUnknown_203B294->unkF8[loopMax].text = NULL;
|
|
gUnknown_203B294->unkF8[loopMax].menuAction = 1;
|
|
|
|
for(index = 0; index < loopMax; index++)
|
|
{
|
|
if(gUnknown_203B294->unk138[index] == 0)
|
|
{
|
|
if(gUnknown_203B294->unkF8[index].menuAction == gUnknown_203B294->menuAction)
|
|
return;
|
|
}
|
|
}
|
|
|
|
for(index = 0; index < loopMax; index++)
|
|
{
|
|
if(gUnknown_203B294->unk138[index] == 0)
|
|
{
|
|
gUnknown_203B294->menuAction = gUnknown_203B294->unkF8[index].menuAction;
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
void sub_8022E78(void)
|
|
{
|
|
switch(sub_801A6E8(TRUE))
|
|
{
|
|
case 3:
|
|
gUnknown_203B294->itemIndex = sub_801A8AC();
|
|
gUnknown_203B294->item = gTeamInventoryRef->teamItems[gUnknown_203B294->itemIndex];
|
|
sub_8022924(2);
|
|
break;
|
|
case 4:
|
|
gUnknown_203B294->itemIndex = sub_801A8AC();
|
|
gUnknown_203B294->item = gTeamInventoryRef->teamItems[gUnknown_203B294->itemIndex];
|
|
sub_8099690(0);
|
|
sub_8022924(4);
|
|
break;
|
|
case 2:
|
|
sub_8022924(0x16);
|
|
break;
|
|
}
|
|
}
|
|
|
|
void sub_8022EF4(void)
|
|
{
|
|
s32 menuAction;
|
|
s32 boostAmount;
|
|
|
|
menuAction = 0;
|
|
sub_801A6E8(FALSE);
|
|
if (sub_8012FD8(&gUnknown_203B294->unk54) == 0) {
|
|
sub_8013114(&gUnknown_203B294->unk54,&menuAction);
|
|
if(menuAction != 1) gUnknown_203B294->menuAction = menuAction;
|
|
}
|
|
|
|
switch(menuAction)
|
|
{
|
|
case 1:
|
|
sub_8022924(1);
|
|
break;
|
|
case 2:
|
|
case 3:
|
|
break;
|
|
case 5:
|
|
gUnknown_203B294->availIQSkillPreGummi = GetNumAvailableIQSkills(gUnknown_203B294->iqSkillPreGummi, gUnknown_203B294->pokeStruct->IQ);
|
|
GetGummiItemStatBoost(gUnknown_203B294->pokeStruct, gUnknown_203B294->item.id, FALSE, &gUnknown_203B294->gummi);
|
|
gUnknown_203B294->availIQSkillPostGummi = GetNumAvailableIQSkills(gUnknown_203B294->iqSkillPostGummi, gUnknown_203B294->pokeStruct->IQ);
|
|
gUnknown_203B294->unk40 = 1;
|
|
boostAmount = gUnknown_203B294->gummi.boostAmount;
|
|
|
|
sub_8090E14(gUnknown_202DE58, &gTeamInventoryRef->teamItems[gUnknown_203B294->itemIndex], NULL);
|
|
|
|
if(boostAmount != -1)
|
|
ShiftItemsDownFrom(gUnknown_203B294->itemIndex);
|
|
|
|
sub_8099690(0);
|
|
gUnknown_203B294->fallbackState = 0xA;
|
|
|
|
switch(boostAmount + 1)
|
|
{
|
|
case 1:
|
|
sub_8022924(6);
|
|
break;
|
|
case 2:
|
|
sub_8022924(7);
|
|
break;
|
|
case 3:
|
|
sub_8022924(8);
|
|
break;
|
|
case 4:
|
|
sub_8022924(9);
|
|
break;
|
|
default:
|
|
case 0:
|
|
gUnknown_203B294->fallbackState = 0x16;
|
|
sub_8022924(5);
|
|
break;
|
|
}
|
|
break;
|
|
case 6:
|
|
sub_8022924(0x15);
|
|
break;
|
|
case 4:
|
|
sub_8022924(3);
|
|
break;
|
|
case 7:
|
|
sub_8099690(0);
|
|
sub_8022924(4);
|
|
break;
|
|
}
|
|
}
|
|
|
|
void sub_8023068(void)
|
|
{
|
|
s32 menuAction;
|
|
|
|
menuAction = 0;
|
|
sub_801A6E8(FALSE);
|
|
sub_8012FD8(&gUnknown_203B294->unk54);
|
|
if (sub_8012FD8(&gUnknown_203B294->unkA4) == 0) {
|
|
sub_8013114(&gUnknown_203B294->unkA4,&menuAction);
|
|
}
|
|
|
|
switch(menuAction)
|
|
{
|
|
case 1:
|
|
case 3:
|
|
sub_8022924(1);
|
|
break;
|
|
case 2:
|
|
ShiftItemsDownFrom(gUnknown_203B294->itemIndex);
|
|
if (GetNumberOfFilledInventorySlots() == 0) {
|
|
sub_8099690(0);
|
|
sub_801A928();
|
|
sub_8022924(0x14);
|
|
}
|
|
else {
|
|
sub_8022924(1);
|
|
}
|
|
break;
|
|
}
|
|
}
|
|
|
|
void sub_80230E8(void)
|
|
{
|
|
switch(sub_801B410())
|
|
{
|
|
case 2:
|
|
case 3:
|
|
sub_801B450();
|
|
sub_8022924(1);
|
|
case 1:
|
|
case 0:
|
|
break;
|
|
}
|
|
}
|
|
|
|
void sub_8023104(void)
|
|
{
|
|
switch(sub_801B00C())
|
|
{
|
|
case 2:
|
|
case 3:
|
|
sub_801B048();
|
|
sub_8022924(1);
|
|
case 1:
|
|
case 0:
|
|
break;
|
|
}
|
|
}
|
|
|
|
void sub_8023120(void)
|
|
{
|
|
s32 temp;
|
|
if(sub_80144A4(&temp) == 0)
|
|
{
|
|
sub_8022924(gUnknown_203B294->fallbackState);
|
|
}
|
|
}
|
|
|
|
bool8 sub_8023144(s32 param_1, s32 index, struct UnkTextStruct2_sub *sub, u32 param_4)
|
|
{
|
|
u8 param_1_u8 = param_1;
|
|
|
|
if (sub_8023704(param_1_u8))
|
|
return 0;
|
|
|
|
if (gUnknown_3001B5C == NULL)
|
|
gUnknown_3001B5C = MemoryAlloc(sizeof(struct unkStruct_3001B5C), 8);
|
|
|
|
gUnknown_3001B5C->unk0 = param_1_u8;
|
|
gUnknown_3001B5C->unk4 = gUnknown_203B298;
|
|
|
|
gUnknown_3001B5C->unk390 = index;
|
|
gUnknown_3001B5C->unk394 = &gUnknown_3001B5C->unk398[index];
|
|
sub_8006518(gUnknown_3001B5C->unk398);
|
|
gUnknown_3001B5C->unk398[gUnknown_3001B5C->unk390] = gUnknown_80DC91C;
|
|
|
|
gUnknown_3001B5C->unk394->unk14 = gUnknown_3001B5C->unk3F8;
|
|
|
|
if (sub != NULL)
|
|
gUnknown_3001B5C->unk398[gUnknown_3001B5C->unk390].unk8 = *sub;
|
|
|
|
sub_8012D08(gUnknown_3001B5C->unk394,param_4);
|
|
ResetUnusedInputStruct();
|
|
sub_800641C(gUnknown_3001B5C->unk398,1,1);
|
|
sub_8013818(&gUnknown_3001B5C->input,sub_80236A4(),param_4,index);
|
|
gUnknown_3001B5C->input.menuIndex = gUnknown_203B29C;
|
|
gUnknown_3001B5C->input.unk1E = gUnknown_203B29E;
|
|
sub_8013984(&gUnknown_3001B5C->input);
|
|
sub_8023420();
|
|
sub_80234BC();
|
|
return 1;
|
|
}
|
|
|
|
|
|
u8 sub_8023278(u8 param_1)
|
|
{
|
|
s32 iVar3;
|
|
u32 temp;
|
|
|
|
if (param_1 == 0) {
|
|
sub_8013660(&gUnknown_3001B5C->input);
|
|
return 0;
|
|
}
|
|
switch(GetKeyPress(&gUnknown_3001B5C->input))
|
|
{
|
|
case INPUT_B_BUTTON:
|
|
PlayMenuSoundEffect(1);
|
|
return 2;
|
|
case INPUT_A_BUTTON:
|
|
PlayMenuSoundEffect(0);
|
|
return 3;
|
|
case INPUT_SELECT_BUTTON:
|
|
PlayMenuSoundEffect(5);
|
|
if (temp = gUnknown_3001B5C->unk4, iVar3 = 1, temp < 2) {
|
|
iVar3 = temp + 1;
|
|
}
|
|
gUnknown_3001B5C->unk4 = iVar3;
|
|
sub_80236A4();
|
|
break;
|
|
default:
|
|
if (sub_80138B8(&gUnknown_3001B5C->input, 1) == 0) {
|
|
return 0;
|
|
}
|
|
break;
|
|
}
|
|
sub_8023420();
|
|
sub_80234BC();
|
|
return 1;
|
|
}
|
|
|
|
s16 sub_802331C(void)
|
|
{
|
|
return gUnknown_3001B5C->unkC[gUnknown_3001B5C->input.unk1E * gUnknown_3001B5C->input.unk1C + gUnknown_3001B5C->input.menuIndex];
|
|
}
|
|
|
|
void sub_8023354(u8 param_1)
|
|
{
|
|
ResetUnusedInputStruct();
|
|
sub_800641C(gUnknown_3001B5C->unk398,0,0);
|
|
sub_8013984(&gUnknown_3001B5C->input);
|
|
sub_8023420();
|
|
sub_80234BC();
|
|
if (param_1 != 0) {
|
|
AddMenuCursorSprite(&gUnknown_3001B5C->input);
|
|
}
|
|
}
|
|
|
|
|
|
void sub_80233A0(void)
|
|
{
|
|
if (gUnknown_3001B5C != NULL) {
|
|
gUnknown_203B298 = gUnknown_3001B5C->unk4;
|
|
gUnknown_203B29C = gUnknown_3001B5C->input.menuIndex;
|
|
gUnknown_203B29E = gUnknown_3001B5C->input.unk1E;
|
|
gUnknown_3001B5C->unk398[gUnknown_3001B5C->unk390] = gUnknown_80DC904;
|
|
ResetUnusedInputStruct();
|
|
sub_800641C(gUnknown_3001B5C->unk398,1,1);
|
|
MemoryFree(gUnknown_3001B5C);
|
|
gUnknown_3001B5C = NULL;
|
|
}
|
|
}
|
|
|
|
NAKED
|
|
void sub_8023420(void)
|
|
{
|
|
asm_unified(
|
|
"\tpush {r4,r5,lr}\n"
|
|
"\tldr r4, _080234A8\n"
|
|
"\tldr r0, [r4]\n"
|
|
"\tmovs r1, 0xFE\n"
|
|
"\tlsls r1, 2\n"
|
|
"\tadds r0, r1\n"
|
|
"\tmovs r2, 0\n"
|
|
"\tmovs r1, 0x1\n"
|
|
"\tstrb r1, [r0]\n"
|
|
"\tldr r0, [r4]\n"
|
|
"\tldr r1, _080234AC\n"
|
|
"\tadds r0, r1\n"
|
|
"\tstrb r2, [r0]\n"
|
|
"\tldr r0, [r4]\n"
|
|
"\tadds r1, 0x1\n"
|
|
"\tadds r0, r1\n"
|
|
"\tmovs r1, 0xC\n"
|
|
"\tstrb r1, [r0]\n"
|
|
"\tldr r0, [r4]\n"
|
|
"\tldr r1, _080234B0\n"
|
|
"\tadds r0, r1\n"
|
|
"\tstrb r2, [r0]\n"
|
|
"\tldr r0, [r4]\n"
|
|
"\tldr r2, _080234B4\n"
|
|
"\tadds r0, r2\n"
|
|
"\tmovs r1, 0\n"
|
|
"\tldrsh r0, [r0, r1]\n"
|
|
"\tmovs r1, 0xC\n"
|
|
"\tbl sub_80095E4\n"
|
|
"\tadds r0, 0x2\n"
|
|
"\tldr r3, [r4]\n"
|
|
"\tmovs r2, 0xE4\n"
|
|
"\tlsls r2, 2\n"
|
|
"\tadds r5, r3, r2\n"
|
|
"\tldr r2, [r5]\n"
|
|
"\tlsls r1, r2, 1\n"
|
|
"\tadds r1, r2\n"
|
|
"\tlsls r1, 3\n"
|
|
"\tadds r1, r3, r1\n"
|
|
"\tldr r2, _080234B8\n"
|
|
"\tadds r1, r2\n"
|
|
"\tlsls r0, 16\n"
|
|
"\tlsrs r0, 16\n"
|
|
"\tstrh r0, [r1]\n"
|
|
"\tldr r2, [r5]\n"
|
|
"\tlsls r1, r2, 1\n"
|
|
"\tadds r1, r2\n"
|
|
"\tlsls r1, 3\n"
|
|
"\tadds r3, r1\n"
|
|
"\tmovs r1, 0xEA\n"
|
|
"\tlsls r1, 2\n"
|
|
"\tadds r3, r1\n"
|
|
"\tstrh r0, [r3]\n"
|
|
"\tbl ResetUnusedInputStruct\n"
|
|
"\tldr r0, [r4]\n"
|
|
"\tmovs r2, 0xE6\n"
|
|
"\tlsls r2, 2\n"
|
|
"\tadds r0, r2\n"
|
|
"\tmovs r1, 0x1\n"
|
|
"\tmovs r2, 0x1\n"
|
|
"\tbl sub_800641C\n"
|
|
"\tpop {r4,r5}\n"
|
|
"\tpop {r0}\n"
|
|
"\tbx r0\n"
|
|
"\t.align 2, 0\n"
|
|
"_080234A8: .4byte gUnknown_3001B5C\n"
|
|
"_080234AC: .4byte 0x000003f9\n"
|
|
"_080234B0: .4byte 0x000003fb\n"
|
|
"_080234B4: .4byte 0x00000376\n"
|
|
"_080234B8: .4byte 0x000003a6");
|
|
}
|
|
|
|
extern u8 gUnknown_80DC934[];
|
|
|
|
bool8 HasRecruitedMon(s16 species_);
|
|
extern u8 gUnknown_80DC93C[];
|
|
|
|
void sub_80234BC(void)
|
|
{
|
|
u8 cVar2;
|
|
u32 y;
|
|
s32 uVar3;
|
|
s32 iVar4;
|
|
s32 species;
|
|
u32 color;
|
|
s32 index;
|
|
u8 buffer2 [256];
|
|
u8 buffer1 [100];
|
|
struct unkStruct_8092638 auStack_2c;
|
|
|
|
sub_8008C54(gUnknown_3001B5C->unk390);
|
|
sub_80073B8(gUnknown_3001B5C->unk390);
|
|
xxx_call_draw_string(10,0,gUnknown_80DC934,gUnknown_3001B5C->unk390,0); // Pokemon
|
|
sub_8012BC4(gUnknown_3001B5C->unk3F8[2] * 8 + 4,0,
|
|
gUnknown_3001B5C->input.unk1E + 1,2,7,gUnknown_3001B5C->unk390);
|
|
for(index = 0; index < gUnknown_3001B5C->input.unk1A; index++)
|
|
{
|
|
y = sub_8013800(&gUnknown_3001B5C->input,index);
|
|
species = gUnknown_3001B5C->unkC[(gUnknown_3001B5C->input.unk1E * gUnknown_3001B5C->input.unk1C + index)];
|
|
sub_8092638(GetFriendArea(species),&auStack_2c,0,0);
|
|
color = COLOR_WHITE_2;
|
|
if (auStack_2c.hasFriendArea) {
|
|
color = HasRecruitedMon(species) ? COLOR_CYAN : COLOR_GREEN;
|
|
}
|
|
iVar4 = GetDexInternalNo(species,0);
|
|
cVar2 = (iVar4 % 10) + 0x30;
|
|
sub_8012C60(0x14,y,cVar2,color,gUnknown_3001B5C->unk390);
|
|
if (9 < iVar4) {
|
|
iVar4 /= 10;
|
|
cVar2 = (iVar4 % 10) + 0x30;
|
|
sub_8012C60(0xd,y,cVar2,color,gUnknown_3001B5C->unk390);
|
|
if (9 < iVar4) {
|
|
uVar3 = iVar4 / 10;
|
|
cVar2 = (uVar3 % 10) + 0x30;
|
|
sub_8012C60(6,y,cVar2,color,gUnknown_3001B5C->unk390);
|
|
}
|
|
}
|
|
sub_808D930(buffer1,species);
|
|
sprintfStatic(buffer2,gUnknown_80DC93C,color,buffer1); // {COLOR_2}%c%s
|
|
xxx_call_draw_string(0x24,y,buffer2,gUnknown_3001B5C->unk390,0);
|
|
}
|
|
sub_80073E0(gUnknown_3001B5C->unk390);
|
|
}
|
|
|
|
u32 sub_80236A4(void)
|
|
{
|
|
s32 index;
|
|
|
|
gUnknown_3001B5C->unk8 = 0;
|
|
for(index = 0; index < 0x1a8; index++)
|
|
{
|
|
if ((sub_8098134((s16)index)) &&
|
|
((s16)index == GetBaseSpeciesNoUnown(index))) {
|
|
gUnknown_3001B5C->unkC[gUnknown_3001B5C->unk8++] = index;
|
|
}
|
|
}
|
|
sub_8023730();
|
|
return gUnknown_3001B5C->unk8;
|
|
}
|
|
|
|
bool8 sub_8023704(u8 unused)
|
|
{
|
|
s32 index;
|
|
|
|
for(index = 0; index < 0x1a8; index++)
|
|
{
|
|
if (sub_8098134((s16)index))
|
|
return FALSE;
|
|
}
|
|
return TRUE;
|
|
}
|
|
|
|
void sub_8023730(void)
|
|
{
|
|
switch(gUnknown_3001B5C->unk4)
|
|
{
|
|
case 1:
|
|
sub_8023758();
|
|
break;
|
|
case 2:
|
|
sub_80237E0();
|
|
break;
|
|
|
|
}
|
|
}
|