pmd-red/src/code_801AFA4.c
2024-12-17 15:57:28 +01:00

230 lines
6.0 KiB
C

#include "global.h"
#include "globaldata.h"
#include "code_80118A4.h"
#include "string_format.h"
#include "code_801AFA4.h"
#include "code_8099360.h"
#include "gulpin_shop.h"
#include "memory.h"
#include "moves.h"
#include "pokemon.h"
static EWRAM_INIT unkStruct_203B22C *sUnknown_203B22C = {NULL};
#include "data/code_801AFA4.h"
static s32 GetNumMonsAbleToLearnItemMove(void);
static void nullsub_37(void);
static void sub_801B064(s32);
static void sub_801B080(void);
static void sub_801B178(void);
static void sub_801B200(void);
static void sub_801B2AC(void);
static void sub_801B2D8(void);
bool8 sub_801AFA4(u32 index)
{
sUnknown_203B22C = MemoryAlloc(sizeof(unkStruct_203B22C), 8);
sUnknown_203B22C->teamItemIndex = index;
sUnknown_203B22C->id = gTeamInventoryRef->teamItems[index].id;
sUnknown_203B22C->moveID = GetItemMoveID(sUnknown_203B22C->id);
sub_8092C84(gFormatBuffer_Monsters[7], sUnknown_203B22C->moveID);
sub_8099690(0);
if (GetNumMonsAbleToLearnItemMove() == 0)
sub_801B064(3);
else {
sUnknown_203B22C->unk60 = 4;
sub_801B064(0);
}
return TRUE;
}
u32 sub_801B00C(void)
{
switch (sUnknown_203B22C->state) {
case 4:
return 3;
case 0:
sub_801B200();
break;
case 1:
sub_801B2AC();
break;
default:
sub_801B2D8();
break;
}
return 0;
}
void sub_801B048(void)
{
if (sUnknown_203B22C != NULL) {
MemoryFree(sUnknown_203B22C);
sUnknown_203B22C = NULL;
}
}
static void sub_801B064(s32 newState)
{
sUnknown_203B22C->state = newState;
nullsub_37();
sub_801B080();
}
static void nullsub_37(void)
{
}
static void sub_801B080(void)
{
switch (sUnknown_203B22C->state) {
case 0:
sub_801B178();
CreateMenuDialogueBoxAndPortrait(sFmtWhoWillLearnTheMove, 0, sUnknown_203B22C->unk60, sUnknown_203B22C->menuItems, 0, 4, 0, NULL, 32);
break;
case 1:
CreateGulpinShop(2, sUnknown_203B22C->chosenPokemon, sUnknown_203B22C->moves);
break;
case 2:
sub_8094060(sUnknown_203B22C->moves, sUnknown_203B22C->pokeStruct->moves);
if (!IsHMItem(sUnknown_203B22C->id)) {
gTeamInventoryRef->teamItems[sUnknown_203B22C->teamItemIndex].quantity = sUnknown_203B22C->id - 125;
gTeamInventoryRef->teamItems[sUnknown_203B22C->teamItemIndex].id = ITEM_TM_USED_TM;
}
PlaySound(312);
CreateDialogueBoxAndPortrait(sFmtLearnedTheMove, 0, 0, 0x121);
break;
case 3:
CreateDialogueBoxAndPortrait(sFmtNoOneCanLearnThisMove, 0, 0, 0x121);
break;
default:
case 4:
break;
}
}
static void sub_801B178(void)
{
s32 monIndex;
u8 *bufferPtr;
for (monIndex = 0; monIndex < sUnknown_203B22C->monsAbleToLearnMove; monIndex++) {
bufferPtr = gFormatBuffer_Monsters[monIndex];
PrintPokeNameToBuffer(bufferPtr, &gRecruitedPokemonRef->pokemon[sUnknown_203B22C->unk50[monIndex]]);
sUnknown_203B22C->menuItems[monIndex].text = bufferPtr;
sUnknown_203B22C->menuItems[monIndex].menuAction = monIndex + 4;
}
sUnknown_203B22C->menuItems[monIndex].text = NULL;
sUnknown_203B22C->menuItems[monIndex].menuAction = 1;
}
static void sub_801B200(void)
{
s32 temp;
s32 moveIndex;
Move *pokeMove;
if (sub_80144A4(&temp))
return;
sUnknown_203B22C->unk60 = temp;
switch (temp) {
case 1:
sub_801B064(4);
break;
default:
sUnknown_203B22C->chosenPokemon = sUnknown_203B22C->unk50[temp - 4];
sUnknown_203B22C->pokeStruct = &gRecruitedPokemonRef->pokemon[sUnknown_203B22C->chosenPokemon];
PrintPokeNameToBuffer(gFormatBuffer_Monsters[8], sUnknown_203B22C->pokeStruct);
unk_CopyMoves4To8(sUnknown_203B22C->moves, sUnknown_203B22C->pokeStruct->moves);
for (moveIndex = 0; moveIndex < MAX_MON_MOVES * 2; moveIndex++) {
pokeMove = &sUnknown_203B22C->moves[moveIndex];
if ((pokeMove->moveFlags & MOVE_FLAG_EXISTS) == 0) {
InitZeroedPPPokemonMove(pokeMove, sUnknown_203B22C->moveID);
break;
}
}
if (moveIndex >= MAX_MON_MOVES)
sub_801B064(1);
else
sub_801B064(2);
break;
case 0:
break;
}
}
static void sub_801B2AC(void)
{
switch (sub_801E8C0()) {
case 3:
DestroyGulpinShop();
sub_801B064(2);
break;
case 2:
DestroyGulpinShop();
sub_801B064(0);
break;
case 0:
case 1:
break;
}
}
static void sub_801B2D8(void)
{
s32 temp;
if (sub_80144A4(&temp) == 0)
sub_801B064(4);
}
static s32 GetNumMonsAbleToLearnItemMove(void)
{
s32 length;
s32 numMons;
s32 i;
s32 team[MAX_TEAM_MEMBERS];
PokemonStruct1 *preload;
length = sub_808D580(team);
sUnknown_203B22C->monsAbleToLearnMove = 0;
for (i = 0; i < length; i++) {
preload = &gRecruitedPokemonRef->pokemon[team[i]];
if (CanMonLearnMove(sUnknown_203B22C->moveID, preload->speciesNum)) {
sUnknown_203B22C->unk50[sUnknown_203B22C->monsAbleToLearnMove] = team[i];
numMons = sUnknown_203B22C->monsAbleToLearnMove;
if (numMons >= MAX_TEAM_MEMBERS)
break;
sUnknown_203B22C->monsAbleToLearnMove = numMons + 1;
}
}
return sUnknown_203B22C->monsAbleToLearnMove;
}
UNUSED static bool8 sub_801B374(u8 id)
{
u16 moveID;
PokemonStruct1 *pokeStruct;
s32 i;
pokeStruct = &gRecruitedPokemonRef->pokemon[0];
moveID = GetItemMoveID(id);
for (i = 0; i < NUM_MONSTERS; i++, pokeStruct++) {
if ((pokeStruct->unk0 >> 1) & 1)
if (CanMonLearnMove(moveID, pokeStruct->speciesNum))
return FALSE;
}
return TRUE;
}