mirror of
https://github.com/pret/pmd-red.git
synced 2026-08-01 16:24:04 -05:00
248 lines
6.5 KiB
C
248 lines
6.5 KiB
C
#include "global.h"
|
|
#include "globaldata.h"
|
|
#include "code_80118A4.h"
|
|
#include "code_80130A8.h"
|
|
#include "code_801C244.h"
|
|
#include "input.h"
|
|
#include "memory.h"
|
|
#include "menu_input.h"
|
|
#include "pokemon_3.h"
|
|
#include "text1.h"
|
|
#include "text2.h"
|
|
|
|
extern u8 gUnknown_202DEA8[];
|
|
|
|
static EWRAM_DATA_2 struct unkStruct_203B23C *sUnknown_203B23C = {0};
|
|
|
|
#include "data/code_801C244.h"
|
|
|
|
static void sub_801C440(void);
|
|
|
|
bool8 sub_801C244(s16 species, u32 index, u32 a2)
|
|
{
|
|
#ifndef NONMATCHING
|
|
register s32 species_s32 asm("r4");
|
|
#else
|
|
s32 species_s32;
|
|
#endif
|
|
|
|
species_s32 = species;
|
|
|
|
if (HasNoAvailIQSkills(species))
|
|
return FALSE;
|
|
|
|
if (sUnknown_203B23C == NULL)
|
|
sUnknown_203B23C = MemoryAlloc(sizeof(struct unkStruct_203B23C), 8);
|
|
|
|
sUnknown_203B23C->species = species_s32;
|
|
sUnknown_203B23C->pokeStruct = &gRecruitedPokemonRef->pokemon[species_s32];
|
|
sUnknown_203B23C->numIQSkills = GetNumAvailableIQSkills(sUnknown_203B23C->iqSkills, sUnknown_203B23C->pokeStruct->IQ);
|
|
sUnknown_203B23C->unk58 = index;
|
|
sUnknown_203B23C->unk5C = &sUnknown_203B23C->unk60[index];
|
|
sub_8006518(sUnknown_203B23C->unk60);
|
|
sUnknown_203B23C->unk60[sUnknown_203B23C->unk58] = sUnknown_80DBDF0;
|
|
sUnknown_203B23C->unk5C->unk14 = &sUnknown_203B23C->unkC0;
|
|
sub_8012D08(sUnknown_203B23C->unk5C, a2);
|
|
ResetUnusedInputStruct();
|
|
sub_800641C(sUnknown_203B23C->unk60, TRUE, TRUE);
|
|
sub_8013818(&sUnknown_203B23C->input, sUnknown_203B23C->numIQSkills, a2, index);
|
|
sub_801C440();
|
|
sub_801C4C8();
|
|
return TRUE;
|
|
}
|
|
|
|
u32 sub_801C308(bool8 a0)
|
|
{
|
|
if (!a0) {
|
|
sub_8013660(&sUnknown_203B23C->input);
|
|
return 0;
|
|
}
|
|
|
|
switch (GetKeyPress(&sUnknown_203B23C->input)) {
|
|
case 2:
|
|
PlayMenuSoundEffect(1);
|
|
return 2;
|
|
case 1:
|
|
PlayMenuSoundEffect(0);
|
|
return 3;
|
|
case 4:
|
|
PlayMenuSoundEffect(4);
|
|
return 4;
|
|
default:
|
|
if (sub_80138B8(&sUnknown_203B23C->input, 1) != 0) {
|
|
sub_801C440();
|
|
sub_801C4C8();
|
|
return 1;
|
|
}
|
|
return 0;
|
|
}
|
|
}
|
|
|
|
s32 sub_801C390(void)
|
|
{
|
|
return (sUnknown_203B23C->input.unk1E * sUnknown_203B23C->input.unk1C) + sUnknown_203B23C->input.menuIndex;
|
|
}
|
|
|
|
void sub_801C3B0(bool8 r0)
|
|
{
|
|
ResetUnusedInputStruct();
|
|
sub_800641C(sUnknown_203B23C->unk60, FALSE, FALSE);
|
|
sUnknown_203B23C->input.unk22 = sUnknown_203B23C->numIQSkills;
|
|
sub_8013984(&sUnknown_203B23C->input);
|
|
sub_801C440();
|
|
sub_801C4C8();
|
|
|
|
if (r0)
|
|
AddMenuCursorSprite(&sUnknown_203B23C->input);
|
|
}
|
|
|
|
void sub_801C3F8(void)
|
|
{
|
|
if (sUnknown_203B23C != NULL) {
|
|
sUnknown_203B23C->unk60[sUnknown_203B23C->unk58] = sUnknown_80DBDD8;
|
|
ResetUnusedInputStruct();
|
|
sub_800641C(sUnknown_203B23C->unk60, TRUE, TRUE);
|
|
MemoryFree(sUnknown_203B23C);
|
|
sUnknown_203B23C = NULL;
|
|
}
|
|
}
|
|
|
|
#ifdef NONMATCHING // sub_80095E4 memes
|
|
// https://decomp.me/scratch/NdDP3 (98.06% matching) - Seth
|
|
static void sub_801C440(void)
|
|
{
|
|
u16 sVar2;
|
|
|
|
sUnknown_203B23C->unkC0 = sUnknown_203B23C->unk24.unk20;
|
|
sUnknown_203B23C->unkC1 = sUnknown_203B23C->unk24.unk1E;
|
|
sUnknown_203B23C->unkC2 = 10;
|
|
sUnknown_203B23C->unkC3 = 0;
|
|
ResetUnusedInputStruct();
|
|
sub_800641C(sUnknown_203B23C->unk60, TRUE, TRUE);
|
|
sVar2 = sub_80095E4(sUnknown_203B23C->unk24.unk1A, 12) + 2;
|
|
sUnknown_203B23C->unk60[sUnknown_203B23C->unk58].unkE = sVar2;
|
|
sUnknown_203B23C->unk60[sUnknown_203B23C->unk58].unk10 = sVar2;
|
|
ResetUnusedInputStruct();
|
|
sub_800641C(sUnknown_203B23C->unk60, TRUE, TRUE);
|
|
}
|
|
#else
|
|
NAKED
|
|
static void sub_801C440(void)
|
|
{
|
|
asm_unified(
|
|
"\tpush {r4,lr}\n"
|
|
"\tldr r4, _0801C4C4\n"
|
|
"\tldr r0, [r4]\n"
|
|
"\tadds r1, r0, 0\n"
|
|
"\tadds r1, 0x44\n"
|
|
"\tldrh r1, [r1]\n"
|
|
"\tadds r0, 0xC0\n"
|
|
"\tmovs r2, 0\n"
|
|
"\tstrb r1, [r0]\n"
|
|
"\tldr r0, [r4]\n"
|
|
"\tadds r1, r0, 0\n"
|
|
"\tadds r1, 0x42\n"
|
|
"\tldrh r1, [r1]\n"
|
|
"\tadds r0, 0xC1\n"
|
|
"\tstrb r1, [r0]\n"
|
|
"\tldr r0, [r4]\n"
|
|
"\tadds r0, 0xC2\n"
|
|
"\tmovs r1, 0xA\n"
|
|
"\tstrb r1, [r0]\n"
|
|
"\tldr r0, [r4]\n"
|
|
"\tadds r0, 0xC3\n"
|
|
"\tstrb r2, [r0]\n"
|
|
"\tbl ResetUnusedInputStruct\n"
|
|
"\tldr r0, [r4]\n"
|
|
"\tadds r0, 0x60\n"
|
|
"\tmovs r1, 0x1\n"
|
|
"\tmovs r2, 0x1\n"
|
|
"\tbl sub_800641C\n"
|
|
"\tldr r0, [r4]\n"
|
|
"\tmovs r1, 0x3E\n"
|
|
"\tldrsh r0, [r0, r1]\n"
|
|
"\tmovs r1, 0xC\n"
|
|
"\tbl sub_80095E4\n"
|
|
"\tadds r0, 0x2\n"
|
|
"\tldr r2, [r4]\n"
|
|
"\tldr r3, [r2, 0x58]\n"
|
|
"\tlsls r1, r3, 1\n"
|
|
"\tadds r1, r3\n"
|
|
"\tlsls r1, 3\n"
|
|
"\tadds r1, r2, r1\n"
|
|
"\tadds r1, 0x6E\n"
|
|
"\tlsls r0, 16\n"
|
|
"\tlsrs r0, 16\n"
|
|
"\tstrh r0, [r1]\n"
|
|
"\tldr r3, [r2, 0x58]\n"
|
|
"\tlsls r1, r3, 1\n"
|
|
"\tadds r1, r3\n"
|
|
"\tlsls r1, 3\n"
|
|
"\tadds r2, r1\n"
|
|
"\tadds r2, 0x70\n"
|
|
"\tstrh r0, [r2]\n"
|
|
"\tbl ResetUnusedInputStruct\n"
|
|
"\tldr r0, [r4]\n"
|
|
"\tadds r0, 0x60\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"
|
|
"_0801C4C4: .4byte sUnknown_203B23C"
|
|
);
|
|
}
|
|
#endif
|
|
|
|
void sub_801C4C8(void)
|
|
{
|
|
u32 y;
|
|
s32 x;
|
|
s32 x2;
|
|
u32 skillIndex;
|
|
s32 counter;
|
|
|
|
sub_8008C54(sUnknown_203B23C->unk58);
|
|
sub_80073B8(sUnknown_203B23C->unk58);
|
|
x = sUnknown_203B23C->input.unk1E * 8;
|
|
x2 = x;
|
|
x2 += 10;
|
|
xxx_call_draw_string(x2, 0, sIQSkills, sUnknown_203B23C->unk58, 0);
|
|
|
|
x += 4;
|
|
x2 = x + sUnknown_203B23C->unkC2 * 8;
|
|
sub_8012BC4(x2, 0, sUnknown_203B23C->input.unk1E + 1, 1, 7, sUnknown_203B23C->unk58);
|
|
|
|
for (counter = 0; counter < sUnknown_203B23C->input.unk1A; counter++) {
|
|
skillIndex = sUnknown_203B23C->iqSkills[(sUnknown_203B23C->input.unk1E * sUnknown_203B23C->input.unk1C) + counter];
|
|
|
|
y = sub_8013800(&sUnknown_203B23C->input, counter);
|
|
strncpy(gUnknown_202DEA8, GetIQSkillName(skillIndex), 80);
|
|
|
|
if (IsIQSkillSet((u8 *)&sUnknown_203B23C->pokeStruct->IQSkills, 1 << skillIndex))
|
|
strcpy(gUnknown_202DEA8 - 80, sStarBullet);
|
|
else
|
|
strcpy(gUnknown_202DEA8 - 80, sUnknown_80DBE18);
|
|
|
|
xxx_format_and_draw(12, y, sFmt01, sUnknown_203B23C->unk58, 0);
|
|
}
|
|
|
|
sub_80073E0(sUnknown_203B23C->unk58);
|
|
}
|
|
|
|
bool8 HasNoAvailIQSkills(s16 species)
|
|
{
|
|
s32 species_s32;
|
|
u8 iqSkillBuffer[NUM_IQ_SKILLS];
|
|
PokemonStruct1 *pokeStruct;
|
|
|
|
species_s32 = species;
|
|
pokeStruct = &gRecruitedPokemonRef->pokemon[species_s32];
|
|
|
|
if (GetNumAvailableIQSkills(iqSkillBuffer, pokeStruct->IQ) == 0)
|
|
return TRUE;
|
|
|
|
return FALSE;
|
|
} |