Document some pokenav menu handlers

This commit is contained in:
GriffinR 2020-02-01 00:25:50 -05:00 committed by huderlem
parent 0cf84d13ef
commit be5d417236
13 changed files with 504 additions and 375 deletions

View File

@ -91,6 +91,18 @@
#define CHAR_NEWLINE 0xFE #define CHAR_NEWLINE 0xFE
#define EOS 0xFF // end of string #define EOS 0xFF // end of string
// Special F9 chars
#define CHAR_UP_ARROW_2 0x00
#define CHAR_DOWN_ARROW_2 0x01
#define CHAR_LEFT_ARROW_2 0x02
#define CHAR_RIGHT_ARROW_2 0x03
#define CHAR_PLUS_2 0x04
#define CHAR_LV_2 0x05
#define CHAR_PP 0x06
#define CHAR_ID 0x07
#define CHAR_NO 0x08
#define CHAR_UNDERSCROE 0x09
#define EXT_CTRL_CODE_COLOR 0x1 #define EXT_CTRL_CODE_COLOR 0x1
#define EXT_CTRL_CODE_HIGHLIGHT 0x2 #define EXT_CTRL_CODE_HIGHLIGHT 0x2
#define EXT_CTRL_CODE_SHADOW 0x3 #define EXT_CTRL_CODE_SHADOW 0x3

View File

@ -85,6 +85,39 @@ enum
POKENAV_MENU_E, POKENAV_MENU_E,
}; };
enum
{
POKENAV_MENU_TYPE_DEFAULT,
POKENAV_MENU_TYPE_UNLOCK_MC,
POKENAV_MENU_TYPE_UNLOCK_MC_RIBBONS,
POKENAV_MENU_TYPE_CONDITION,
POKENAV_MENU_TYPE_CONDITION_SEARCH,
POKENAV_MENU_TYPE_COUNT
};
// Global IDs for menu selections
// As opposed to the cursor position, which is only relative to the number of options for the current menu
enum
{
POKENAV_MENUITEM_MAP,
POKENAV_MENUITEM_CONDITION,
POKENAV_MENUITEM_MATCH_CALL,
POKENAV_MENUITEM_RIBBONS,
POKENAV_MENUITEM_SWITCH_OFF,
POKENAV_MENUITEM_CONDITION_PARTY,
POKENAV_MENUITEM_CONDITION_SEARCH,
POKENAV_MENUITEM_CONDITION_CANCEL,
POKENAV_MENUITEM_CONDITION_SEARCH_COOL,
POKENAV_MENUITEM_CONDITION_SEARCH_BEAUTY,
POKENAV_MENUITEM_CONDITION_SEARCH_CUTE,
POKENAV_MENUITEM_CONDITION_SEARCH_SMART,
POKENAV_MENUITEM_CONDITION_SEARCH_TOUGH,
POKENAV_MENUITEM_CONDITION_SEARCH_CANCEL,
};
// Max menu options (condition search uses 6)
#define MAX_POKENAV_MENUITEMS 6
enum enum
{ {
HELPBAR_NONE, HELPBAR_NONE,
@ -150,6 +183,23 @@ enum
[CHECK_PAGE_INTRO_1] = gText_MatchCall##name##_Intro1, \ [CHECK_PAGE_INTRO_1] = gText_MatchCall##name##_Intro1, \
[CHECK_PAGE_INTRO_2] = gText_MatchCall##name##_Intro2} [CHECK_PAGE_INTRO_2] = gText_MatchCall##name##_Intro2}
// Pokenav Function IDs
// Indices into the LoopedTask tables for each of the main Pokenav features
enum
{
POKENAV_MENU_FUNC_NONE,
POKENAV_MENU_FUNC_MOVE_CURSOR,
POKENAV_MENU_FUNC_OPEN_CONDITION,
POKENAV_MENU_FUNC_RETURN_TO_MAIN,
POKENAV_MENU_FUNC_OPEN_CONDITION_SEARCH,
POKENAV_MENU_FUNC_RETURN_TO_CONDITION,
POKENAV_MENU_FUNC_NO_RIBBON_WINNERS,
POKENAV_MENU_FUNC_RESHOW_DESCRIPTION,
POKENAV_MENU_FUNC_OPEN_FEATURE,
};
enum enum
{ {
POKENAV_MC_FUNC_NONE, POKENAV_MC_FUNC_NONE,
@ -171,8 +221,8 @@ enum
}; };
// pokenav.c // pokenav.c
void sub_81C7694(u32); void SetSelectedConditionSearch(u32);
u32 sub_81C76AC(void); u32 GetSelectedConditionSearch(void);
void CB2_InitPokeNav(void); void CB2_InitPokeNav(void);
u32 CreateLoopedTask(LoopedTask loopedTask, u32 priority); u32 CreateLoopedTask(LoopedTask loopedTask, u32 priority);
@ -255,15 +305,15 @@ bool32 PokenavCallback_Init_2(void);
bool32 PokenavCallback_Init_3(void); bool32 PokenavCallback_Init_3(void);
u32 sub_81C941C(void); u32 sub_81C941C(void);
void sub_81C9430(void); void sub_81C9430(void);
int sub_81C9894(void); int GetPokenavMenuType(void);
int sub_81C98A4(void); int GetPokenavCursorPos(void);
int sub_81C98B4(void); int GetCurrentMenuItemId(void);
u16 GetHelpBarTextId(void); u16 GetHelpBarTextId(void);
// pokenav_unk_2.c // pokenav_unk_2.c
bool32 sub_81C9924(void); bool32 sub_81C9924(void);
bool32 sub_81C9940(void); bool32 sub_81C9940(void);
void sub_81C9990(s32 ltIdx); void CreateMenuHandlerLoopedTask(s32 ltIdx);
bool32 sub_81C99C0(void); bool32 sub_81C99C0(void);
void sub_81C99D4(void); void sub_81C99D4(void);
void sub_81CAADC(void); void sub_81CAADC(void);
@ -292,7 +342,7 @@ bool32 IsRematchEntryRegistered(int index);
// pokenav_unk_4.c // pokenav_unk_4.c
bool32 sub_81CB260(void); bool32 sub_81CB260(void);
void sub_81CB29C(s32 index); void CreateMatchCallLoopedTask(s32 index);
u32 sub_81CB2CC(void); u32 sub_81CB2CC(void);
void sub_81CB2E0(void); void sub_81CB2E0(void);

View File

@ -6351,7 +6351,7 @@ static void PutLevelAndGenderOnLvlUpBox(void)
txtPtr = gStringVar4; txtPtr = gStringVar4;
gStringVar4[0] = CHAR_SPECIAL_F9; gStringVar4[0] = CHAR_SPECIAL_F9;
txtPtr++; txtPtr++;
txtPtr[0] = 5; txtPtr[0] = CHAR_LV_2;
txtPtr++; txtPtr++;
var = (u32)(txtPtr); var = (u32)(txtPtr);

View File

@ -955,7 +955,7 @@ static u8 *sub_81D2CD0(u8 *dst, u16 boxId, u16 monId)
*(str++) = 9; *(str++) = 9;
*(str++) = CHAR_SLASH; *(str++) = CHAR_SLASH;
*(str++) = CHAR_SPECIAL_F9; *(str++) = CHAR_SPECIAL_F9;
*(str++) = 5; *(str++) = CHAR_LV_2;
str = ConvertIntToDecimalStringN(str, level, STR_CONV_MODE_LEFT_ALIGN, 3); str = ConvertIntToDecimalStringN(str, level, STR_CONV_MODE_LEFT_ALIGN, 3);
*(str++) = CHAR_SPACE; *(str++) = CHAR_SPACE;
*str = EOS; *str = EOS;

View File

@ -6898,7 +6898,7 @@ static void SetCursorMonData(void *pokemon, u8 mode)
*(txtPtr++) = 3; *(txtPtr++) = 3;
*(txtPtr++) = 0; *(txtPtr++) = 0;
*(txtPtr++) = CHAR_SPECIAL_F9; *(txtPtr++) = CHAR_SPECIAL_F9;
*(txtPtr++) = 5; *(txtPtr++) = CHAR_LV_2;
txtPtr = ConvertIntToDecimalStringN(txtPtr, sPSSData->cursorMonLevel, STR_CONV_MODE_LEFT_ALIGN, 3); txtPtr = ConvertIntToDecimalStringN(txtPtr, sPSSData->cursorMonLevel, STR_CONV_MODE_LEFT_ALIGN, 3);
txtPtr[0] = CHAR_SPACE; txtPtr[0] = CHAR_SPACE;

View File

@ -21,7 +21,7 @@ struct PokenavResources
u32 (*currentMenuCb1)(void); u32 (*currentMenuCb1)(void);
u32 currentMenuIndex; u32 currentMenuIndex;
u16 mode; u16 mode;
u16 fieldA; u16 conditionSearchId;
bool32 hasAnyRibbons; bool32 hasAnyRibbons;
void *field10[SUBSTRUCT_COUNT]; void *field10[SUBSTRUCT_COUNT];
}; };
@ -57,7 +57,7 @@ const struct UnknownPokenavCallbackStruct PokenavMenuCallbacks[15] =
.unk0 = PokenavCallback_Init_0, .unk0 = PokenavCallback_Init_0,
.unk4 = sub_81C941C, .unk4 = sub_81C941C,
.unk8 = sub_81C9924, .unk8 = sub_81C9924,
.unkC = sub_81C9990, .unkC = CreateMenuHandlerLoopedTask,
.unk10 = sub_81C99C0, .unk10 = sub_81C99C0,
.unk14 = sub_81C9430, .unk14 = sub_81C9430,
.unk18 = sub_81C99D4, .unk18 = sub_81C99D4,
@ -66,7 +66,7 @@ const struct UnknownPokenavCallbackStruct PokenavMenuCallbacks[15] =
.unk0 = PokenavCallback_Init_0, .unk0 = PokenavCallback_Init_0,
.unk4 = sub_81C941C, .unk4 = sub_81C941C,
.unk8 = sub_81C9940, .unk8 = sub_81C9940,
.unkC = sub_81C9990, .unkC = CreateMenuHandlerLoopedTask,
.unk10 = sub_81C99C0, .unk10 = sub_81C99C0,
.unk14 = sub_81C9430, .unk14 = sub_81C9430,
.unk18 = sub_81C99D4, .unk18 = sub_81C99D4,
@ -75,7 +75,7 @@ const struct UnknownPokenavCallbackStruct PokenavMenuCallbacks[15] =
.unk0 = PokenavCallback_Init_2, .unk0 = PokenavCallback_Init_2,
.unk4 = sub_81C941C, .unk4 = sub_81C941C,
.unk8 = sub_81C9940, .unk8 = sub_81C9940,
.unkC = sub_81C9990, .unkC = CreateMenuHandlerLoopedTask,
.unk10 = sub_81C99C0, .unk10 = sub_81C99C0,
.unk14 = sub_81C9430, .unk14 = sub_81C9430,
.unk18 = sub_81C99D4, .unk18 = sub_81C99D4,
@ -84,7 +84,7 @@ const struct UnknownPokenavCallbackStruct PokenavMenuCallbacks[15] =
.unk0 = PokenavCallback_Init_3, .unk0 = PokenavCallback_Init_3,
.unk4 = sub_81C941C, .unk4 = sub_81C941C,
.unk8 = sub_81C9940, .unk8 = sub_81C9940,
.unkC = sub_81C9990, .unkC = CreateMenuHandlerLoopedTask,
.unk10 = sub_81C99C0, .unk10 = sub_81C99C0,
.unk14 = sub_81C9430, .unk14 = sub_81C9430,
.unk18 = sub_81C99D4, .unk18 = sub_81C99D4,
@ -93,7 +93,7 @@ const struct UnknownPokenavCallbackStruct PokenavMenuCallbacks[15] =
.unk0 = PokenavCallback_Init_4, .unk0 = PokenavCallback_Init_4,
.unk4 = sub_81C941C, .unk4 = sub_81C941C,
.unk8 = sub_81C9940, .unk8 = sub_81C9940,
.unkC = sub_81C9990, .unkC = CreateMenuHandlerLoopedTask,
.unk10 = sub_81C99C0, .unk10 = sub_81C99C0,
.unk14 = sub_81C9430, .unk14 = sub_81C9430,
.unk18 = sub_81C99D4, .unk18 = sub_81C99D4,
@ -102,7 +102,7 @@ const struct UnknownPokenavCallbackStruct PokenavMenuCallbacks[15] =
.unk0 = PokenavCallback_Init_5, .unk0 = PokenavCallback_Init_5,
.unk4 = sub_81C941C, .unk4 = sub_81C941C,
.unk8 = sub_81C9940, .unk8 = sub_81C9940,
.unkC = sub_81C9990, .unkC = CreateMenuHandlerLoopedTask,
.unk10 = sub_81C99C0, .unk10 = sub_81C99C0,
.unk14 = sub_81C9430, .unk14 = sub_81C9430,
.unk18 = sub_81C99D4, .unk18 = sub_81C99D4,
@ -156,7 +156,7 @@ const struct UnknownPokenavCallbackStruct PokenavMenuCallbacks[15] =
.unk0 = PokenavCallback_Init_11, .unk0 = PokenavCallback_Init_11,
.unk4 = sub_81CAB24, .unk4 = sub_81CAB24,
.unk8 = sub_81CB260, .unk8 = sub_81CB260,
.unkC = sub_81CB29C, .unkC = CreateMatchCallLoopedTask,
.unk10 = sub_81CB2CC, .unk10 = sub_81CB2CC,
.unk14 = sub_81CAB38, .unk14 = sub_81CAB38,
.unk18 = sub_81CB2E0, .unk18 = sub_81CB2E0,
@ -554,18 +554,18 @@ void SetPokenavMode(u16 mode)
gPokenavResources->mode = mode; gPokenavResources->mode = mode;
} }
void sub_81C7694(u32 a0) void SetSelectedConditionSearch(u32 cursorPos)
{ {
u32 value = a0; u32 searchId = cursorPos;
if (value > 4) if (searchId > POKENAV_MENUITEM_CONDITION_SEARCH_TOUGH - POKENAV_MENUITEM_CONDITION_SEARCH_COOL)
value = 0; searchId = 0;
gPokenavResources->fieldA = value; gPokenavResources->conditionSearchId = searchId;
} }
u32 sub_81C76AC(void) u32 GetSelectedConditionSearch(void)
{ {
return gPokenavResources->fieldA; return gPokenavResources->conditionSearchId;
} }
bool32 CanViewRibbonsMenu(void) bool32 CanViewRibbonsMenu(void)

View File

@ -9,50 +9,92 @@ struct Pokenav1Struct
{ {
u16 menuType; u16 menuType;
s16 cursorPos; s16 cursorPos;
u16 descriptionId; u16 currMenuItem;
u16 helpBarIndex; u16 helpBarIndex;
u32 unk8; u32 unk8;
u32 (*callback)(struct Pokenav1Struct*); u32 (*callback)(struct Pokenav1Struct*);
}; };
static bool32 sub_81C9814(struct Pokenav1Struct *a0); static bool32 UpdateMenuCursorPos(struct Pokenav1Struct *state);
static void sub_81C97F8(struct Pokenav1Struct *a0); static void ReturnToConditionMenu(struct Pokenav1Struct *state);
static void sub_81C97C0(struct Pokenav1Struct *a0); static void ReturnToMainMenu(struct Pokenav1Struct *state);
static u32 sub_81C97BC(struct Pokenav1Struct *a0); static u32 sub_81C97BC(struct Pokenav1Struct *state);
static void sub_81C97B0(struct Pokenav1Struct *a0, u32 a1); static void sub_81C97B0(struct Pokenav1Struct *state, u32 a1);
static u32 sub_81C97A4(struct Pokenav1Struct *a0); static u32 CB2_ReturnToConditionMenu(struct Pokenav1Struct *state);
static u32 sub_81C9798(struct Pokenav1Struct *a0); static u32 CB2_ReturnToMainMenu(struct Pokenav1Struct *state);
static u32 sub_81C96FC(struct Pokenav1Struct *a0); static u32 HandleConditionSearchMenuInput(struct Pokenav1Struct *state);
static u32 sub_81C963C(struct Pokenav1Struct *a0); static u32 HandleConditionMenuInput(struct Pokenav1Struct *state);
static u32 sub_81C9600(struct Pokenav1Struct *a0); static u32 HandleCantOpenRibbonsInput(struct Pokenav1Struct *state);
static u32 sub_81C9588(struct Pokenav1Struct *a0); static u32 HandleMainMenuInputEndTutorial(struct Pokenav1Struct *state);
static u32 sub_81C9520(struct Pokenav1Struct *a0); static u32 HandleMainMenuInputTutorial(struct Pokenav1Struct *state);
static u32 sub_81C943C(struct Pokenav1Struct *a0); static u32 HandleMainMenuInput(struct Pokenav1Struct *state);
static u32 (*sub_81C93EC(void))(struct Pokenav1Struct*); static u32 (*GetMainMenuInputHandler(void))(struct Pokenav1Struct*);
static void sub_81C939C(struct Pokenav1Struct *state); static void SetMenuInputHandler(struct Pokenav1Struct *state);
static const u8 sLastCursorPositions[] = {2, 3, 4, 2, 5}; // Number of entries - 1 for that menu type
static const u8 sLastCursorPositions[] =
static const u8 sDescriptionIds[][6] =
{ {
{ 0, 1, 4, 4, 4, 4 }, [POKENAV_MENU_TYPE_DEFAULT] = 2,
{ 0, 1, 2, 4, 4, 4 }, [POKENAV_MENU_TYPE_UNLOCK_MC] = 3,
{ 0, 1, 2, 3, 4, 4 }, [POKENAV_MENU_TYPE_UNLOCK_MC_RIBBONS] = 4,
{ 5, 6, 7, 4, 4, 4 }, [POKENAV_MENU_TYPE_CONDITION] = 2,
{ 8, 9, 10, 11, 12, 13 }, [POKENAV_MENU_TYPE_CONDITION_SEARCH] = 5
};
static const u8 sMenuItems[][6] =
{
[POKENAV_MENU_TYPE_DEFAULT] =
{
POKENAV_MENUITEM_MAP,
POKENAV_MENUITEM_CONDITION,
[2 ... 5] = POKENAV_MENUITEM_SWITCH_OFF
},
[POKENAV_MENU_TYPE_UNLOCK_MC] =
{
POKENAV_MENUITEM_MAP,
POKENAV_MENUITEM_CONDITION,
POKENAV_MENUITEM_MATCH_CALL,
[3 ... 5] = POKENAV_MENUITEM_SWITCH_OFF
},
[POKENAV_MENU_TYPE_UNLOCK_MC_RIBBONS] =
{
POKENAV_MENUITEM_MAP,
POKENAV_MENUITEM_CONDITION,
POKENAV_MENUITEM_MATCH_CALL,
POKENAV_MENUITEM_RIBBONS,
[4 ... 5] = POKENAV_MENUITEM_SWITCH_OFF
},
[POKENAV_MENU_TYPE_CONDITION] =
{
POKENAV_MENUITEM_CONDITION_PARTY,
POKENAV_MENUITEM_CONDITION_SEARCH,
POKENAV_MENUITEM_CONDITION_CANCEL,
[3 ... 5] = POKENAV_MENUITEM_SWITCH_OFF
},
[POKENAV_MENU_TYPE_CONDITION_SEARCH] =
{
POKENAV_MENUITEM_CONDITION_SEARCH_COOL,
POKENAV_MENUITEM_CONDITION_SEARCH_BEAUTY,
POKENAV_MENUITEM_CONDITION_SEARCH_CUTE,
POKENAV_MENUITEM_CONDITION_SEARCH_SMART,
POKENAV_MENUITEM_CONDITION_SEARCH_TOUGH,
POKENAV_MENUITEM_CONDITION_SEARCH_CANCEL
},
}; };
static u8 GetPokenavMainMenuType(void) static u8 GetPokenavMainMenuType(void)
{ {
u8 retVal = 0; u8 menuType = POKENAV_MENU_TYPE_DEFAULT;
if (FlagGet(FLAG_ADDED_MATCH_CALL_TO_POKENAV)) if (FlagGet(FLAG_ADDED_MATCH_CALL_TO_POKENAV))
{ {
retVal = 1; menuType = POKENAV_MENU_TYPE_UNLOCK_MC;
if (FlagGet(FLAG_SYS_RIBBON_GET)) if (FlagGet(FLAG_SYS_RIBBON_GET))
retVal = 2; menuType = POKENAV_MENU_TYPE_UNLOCK_MC_RIBBONS;
} }
return retVal; return menuType;
} }
bool32 PokenavCallback_Init_0(void) bool32 PokenavCallback_Init_0(void)
@ -63,9 +105,9 @@ bool32 PokenavCallback_Init_0(void)
state->menuType = GetPokenavMainMenuType(); state->menuType = GetPokenavMainMenuType();
state->cursorPos = 0; state->cursorPos = 0;
state->descriptionId = 0; state->currMenuItem = POKENAV_MENUITEM_MAP;
state->helpBarIndex = HELPBAR_NONE; state->helpBarIndex = HELPBAR_NONE;
sub_81C939C(state); SetMenuInputHandler(state);
return TRUE; return TRUE;
} }
@ -77,9 +119,9 @@ bool32 PokenavCallback_Init_4(void)
state->menuType = GetPokenavMainMenuType(); state->menuType = GetPokenavMainMenuType();
state->cursorPos = 2; state->cursorPos = 2;
state->descriptionId = 2; state->currMenuItem = POKENAV_MENUITEM_MATCH_CALL;
state->helpBarIndex = HELPBAR_NONE; state->helpBarIndex = HELPBAR_NONE;
sub_81C939C(state); SetMenuInputHandler(state);
return TRUE; return TRUE;
} }
@ -91,8 +133,8 @@ bool32 PokenavCallback_Init_5(void)
state->menuType = GetPokenavMainMenuType(); state->menuType = GetPokenavMainMenuType();
state->cursorPos = 3; state->cursorPos = 3;
state->descriptionId = 3; state->currMenuItem = POKENAV_MENUITEM_RIBBONS;
sub_81C939C(state); SetMenuInputHandler(state);
return TRUE; return TRUE;
} }
@ -102,11 +144,11 @@ bool32 PokenavCallback_Init_2(void)
if (!state) if (!state)
return FALSE; return FALSE;
state->menuType = 3; state->menuType = POKENAV_MENU_TYPE_CONDITION;
state->cursorPos = 0; state->cursorPos = 0;
state->descriptionId = 5; state->currMenuItem = POKENAV_MENUITEM_CONDITION_PARTY;
state->helpBarIndex = HELPBAR_NONE; state->helpBarIndex = HELPBAR_NONE;
sub_81C939C(state); SetMenuInputHandler(state);
return TRUE; return TRUE;
} }
@ -116,45 +158,45 @@ bool32 PokenavCallback_Init_3(void)
if (!state) if (!state)
return FALSE; return FALSE;
state->menuType = 4; state->menuType = POKENAV_MENU_TYPE_CONDITION_SEARCH;
state->cursorPos = sub_81C76AC(); state->cursorPos = GetSelectedConditionSearch();
state->descriptionId = state->cursorPos + 8; state->currMenuItem = state->cursorPos + POKENAV_MENUITEM_CONDITION_SEARCH_COOL;
state->helpBarIndex = HELPBAR_NONE; state->helpBarIndex = HELPBAR_NONE;
sub_81C939C(state); SetMenuInputHandler(state);
return TRUE; return TRUE;
} }
static void sub_81C939C(struct Pokenav1Struct *state) static void SetMenuInputHandler(struct Pokenav1Struct *state)
{ {
switch (state->menuType) switch (state->menuType)
{ {
case 0: case POKENAV_MENU_TYPE_DEFAULT:
SetPokenavMode(POKENAV_MODE_NORMAL); SetPokenavMode(POKENAV_MODE_NORMAL);
// fallthrough // fallthrough
case 1: case POKENAV_MENU_TYPE_UNLOCK_MC:
case 2: case POKENAV_MENU_TYPE_UNLOCK_MC_RIBBONS:
state->callback = sub_81C93EC(); state->callback = GetMainMenuInputHandler();
break; break;
case 3: case POKENAV_MENU_TYPE_CONDITION:
state->callback = sub_81C963C; state->callback = HandleConditionMenuInput;
break; break;
case 4: case POKENAV_MENU_TYPE_CONDITION_SEARCH:
state->callback = sub_81C96FC; state->callback = HandleConditionSearchMenuInput;
break; break;
} }
} }
static u32 (*sub_81C93EC(void))(struct Pokenav1Struct*) static u32 (*GetMainMenuInputHandler(void))(struct Pokenav1Struct*)
{ {
switch (GetPokenavMode()) switch (GetPokenavMode())
{ {
default: default:
case POKENAV_MODE_NORMAL: case POKENAV_MODE_NORMAL:
return sub_81C943C; return HandleMainMenuInput;
case POKENAV_MODE_FORCE_CALL_READY: case POKENAV_MODE_FORCE_CALL_READY:
return sub_81C9520; return HandleMainMenuInputTutorial;
case POKENAV_MODE_FORCE_CALL_EXIT: case POKENAV_MODE_FORCE_CALL_EXIT:
return sub_81C9588; return HandleMainMenuInputEndTutorial;
} }
} }
@ -169,42 +211,42 @@ void sub_81C9430(void)
FreePokenavSubstruct(1); FreePokenavSubstruct(1);
} }
static u32 sub_81C943C(struct Pokenav1Struct *a0) static u32 HandleMainMenuInput(struct Pokenav1Struct *state)
{ {
if (sub_81C9814(a0)) if (UpdateMenuCursorPos(state))
return 1; return POKENAV_MENU_FUNC_MOVE_CURSOR;
if (gMain.newKeys & A_BUTTON) if (gMain.newKeys & A_BUTTON)
{ {
switch (sDescriptionIds[a0->menuType][a0->cursorPos]) switch (sMenuItems[state->menuType][state->cursorPos])
{ {
case 0: case POKENAV_MENUITEM_MAP:
a0->helpBarIndex = gSaveBlock2Ptr->regionMapZoom ? HELPBAR_MAP_ZOOMED_IN : HELPBAR_MAP_ZOOMED_OUT; state->helpBarIndex = gSaveBlock2Ptr->regionMapZoom ? HELPBAR_MAP_ZOOMED_IN : HELPBAR_MAP_ZOOMED_OUT;
sub_81C97B0(a0, POKENAV_MENU_6); sub_81C97B0(state, POKENAV_MENU_6);
return 8; return POKENAV_MENU_FUNC_OPEN_FEATURE;
case 1: case POKENAV_MENUITEM_CONDITION:
a0->menuType = 3; state->menuType = POKENAV_MENU_TYPE_CONDITION;
a0->cursorPos = 0; state->cursorPos = 0;
a0->descriptionId = sDescriptionIds[3][0]; state->currMenuItem = sMenuItems[POKENAV_MENU_TYPE_CONDITION][0];
a0->callback = sub_81C963C; state->callback = HandleConditionMenuInput;
return 2; return POKENAV_MENU_FUNC_OPEN_CONDITION;
case 2: case POKENAV_MENUITEM_MATCH_CALL:
a0->helpBarIndex = HELPBAR_MC_TRAINER_LIST; state->helpBarIndex = HELPBAR_MC_TRAINER_LIST;
sub_81C97B0(a0, POKENAV_MENU_B); sub_81C97B0(state, POKENAV_MENU_B);
return 8; return POKENAV_MENU_FUNC_OPEN_FEATURE;
case 3: case POKENAV_MENUITEM_RIBBONS:
if (CanViewRibbonsMenu()) if (CanViewRibbonsMenu())
{ {
a0->helpBarIndex = HELPBAR_RIBBONS_MON_LIST; state->helpBarIndex = HELPBAR_RIBBONS_MON_LIST;
sub_81C97B0(a0, POKENAV_MENU_C); sub_81C97B0(state, POKENAV_MENU_C);
return 8; return POKENAV_MENU_FUNC_OPEN_FEATURE;
} }
else else
{ {
a0->callback = sub_81C9600; state->callback = HandleCantOpenRibbonsInput;
return 6; return POKENAV_MENU_FUNC_NO_RIBBON_WINNERS;
} }
case 4: case POKENAV_MENUITEM_SWITCH_OFF:
return -1; return -1;
} }
} }
@ -212,56 +254,58 @@ static u32 sub_81C943C(struct Pokenav1Struct *a0)
if (gMain.newKeys & B_BUTTON) if (gMain.newKeys & B_BUTTON)
return -1; return -1;
return 0; return POKENAV_MENU_FUNC_NONE;
} }
static u32 sub_81C9520(struct Pokenav1Struct *a0) // Force the player to select Match Call during the call Mr. Stone pokenav tutorial
static u32 HandleMainMenuInputTutorial(struct Pokenav1Struct *state)
{ {
if (sub_81C9814(a0)) if (UpdateMenuCursorPos(state))
return 1; return POKENAV_MENU_FUNC_MOVE_CURSOR;
if (gMain.newKeys & A_BUTTON) if (gMain.newKeys & A_BUTTON)
{ {
if (sDescriptionIds[a0->menuType][a0->cursorPos] == 2) if (sMenuItems[state->menuType][state->cursorPos] == POKENAV_MENUITEM_MATCH_CALL)
{ {
a0->helpBarIndex = HELPBAR_MC_TRAINER_LIST; state->helpBarIndex = HELPBAR_MC_TRAINER_LIST;
sub_81C97B0(a0, POKENAV_MENU_B); sub_81C97B0(state, POKENAV_MENU_B);
return 8; return POKENAV_MENU_FUNC_OPEN_FEATURE;
} }
else else
{ {
PlaySE(SE_HAZURE); PlaySE(SE_HAZURE);
return 0; return POKENAV_MENU_FUNC_NONE;
} }
} }
if (gMain.newKeys & B_BUTTON) if (gMain.newKeys & B_BUTTON)
{ {
PlaySE(SE_HAZURE); PlaySE(SE_HAZURE);
return 0; return POKENAV_MENU_FUNC_NONE;
} }
return 0; return POKENAV_MENU_FUNC_NONE;
} }
static u32 sub_81C9588(struct Pokenav1Struct *a0) // After calling Mr. Stone during the pokenav tutorial, force player to exit or use Match Call again
static u32 HandleMainMenuInputEndTutorial(struct Pokenav1Struct *state)
{ {
if (sub_81C9814(a0)) if (UpdateMenuCursorPos(state))
return 1; return POKENAV_MENU_FUNC_MOVE_CURSOR;
if (gMain.newKeys & A_BUTTON) if (gMain.newKeys & A_BUTTON)
{ {
u32 v0 = sDescriptionIds[a0->menuType][a0->cursorPos]; u32 menuItem = sMenuItems[state->menuType][state->cursorPos];
if (v0 != 2 && v0 != 4) if (menuItem != POKENAV_MENUITEM_MATCH_CALL && menuItem != POKENAV_MENUITEM_SWITCH_OFF)
{ {
PlaySE(SE_HAZURE); PlaySE(SE_HAZURE);
return 0; return POKENAV_MENU_FUNC_NONE;
} }
else if (v0 == 2) else if (menuItem == POKENAV_MENUITEM_MATCH_CALL)
{ {
a0->helpBarIndex = HELPBAR_MC_TRAINER_LIST; state->helpBarIndex = HELPBAR_MC_TRAINER_LIST;
sub_81C97B0(a0, POKENAV_MENU_B); sub_81C97B0(state, POKENAV_MENU_B);
return 8; return POKENAV_MENU_FUNC_OPEN_FEATURE;
} }
else else
{ {
@ -272,167 +316,168 @@ static u32 sub_81C9588(struct Pokenav1Struct *a0)
{ {
return -1; return -1;
} }
return 0; return POKENAV_MENU_FUNC_NONE;
} }
static u32 sub_81C9600(struct Pokenav1Struct *a0) // Handles input after selecting Ribbons when there are no ribbon winners left
// Selecting it again just reprints the Ribbon description to replace the "No Ribbon winners" message
static u32 HandleCantOpenRibbonsInput(struct Pokenav1Struct *state)
{ {
if (sub_81C9814(a0)) if (UpdateMenuCursorPos(state))
{ {
a0->callback = sub_81C93EC(); state->callback = GetMainMenuInputHandler();
return 1; return POKENAV_MENU_FUNC_MOVE_CURSOR;
} }
if (gMain.newKeys & (A_BUTTON | B_BUTTON)) if (gMain.newKeys & (A_BUTTON | B_BUTTON))
{ {
a0->callback = sub_81C93EC(); state->callback = GetMainMenuInputHandler();
return 7; return POKENAV_MENU_FUNC_RESHOW_DESCRIPTION;
} }
return 0; return POKENAV_MENU_FUNC_NONE;
} }
static u32 sub_81C963C(struct Pokenav1Struct *a0) static u32 HandleConditionMenuInput(struct Pokenav1Struct *state)
{ {
u32 v0 = sub_81C9814(a0); if (UpdateMenuCursorPos(state))
if (v0) return POKENAV_MENU_FUNC_MOVE_CURSOR;
return 1;
if (gMain.newKeys & A_BUTTON) if (gMain.newKeys & A_BUTTON)
{ {
switch (sDescriptionIds[a0->menuType][a0->cursorPos]) switch (sMenuItems[state->menuType][state->cursorPos])
{ {
case 6: case POKENAV_MENUITEM_CONDITION_SEARCH:
a0->menuType = 4; state->menuType = POKENAV_MENU_TYPE_CONDITION_SEARCH;
a0->cursorPos = v0; state->cursorPos = 0;
a0->descriptionId = sDescriptionIds[4][0]; state->currMenuItem = sMenuItems[POKENAV_MENU_TYPE_CONDITION_SEARCH][0];
a0->callback = sub_81C96FC; state->callback = HandleConditionSearchMenuInput;
return 4; return POKENAV_MENU_FUNC_OPEN_CONDITION_SEARCH;
case 5: case POKENAV_MENUITEM_CONDITION_PARTY:
a0->helpBarIndex = v0; state->helpBarIndex = 0;
sub_81C97B0(a0, POKENAV_MENU_7); sub_81C97B0(state, POKENAV_MENU_7);
return 8; return POKENAV_MENU_FUNC_OPEN_FEATURE;
case 7: case POKENAV_MENUITEM_CONDITION_CANCEL:
PlaySE(SE_SELECT); PlaySE(SE_SELECT);
sub_81C97C0(a0); ReturnToMainMenu(state);
return 3; return POKENAV_MENU_FUNC_RETURN_TO_MAIN;
} }
} }
if (gMain.newKeys & B_BUTTON) if (gMain.newKeys & B_BUTTON)
{ {
if (a0->cursorPos != sLastCursorPositions[a0->menuType]) if (state->cursorPos != sLastCursorPositions[state->menuType])
{ {
a0->cursorPos = sLastCursorPositions[a0->menuType]; state->cursorPos = sLastCursorPositions[state->menuType];
a0->callback = sub_81C9798; state->callback = CB2_ReturnToMainMenu;
return 1; return POKENAV_MENU_FUNC_MOVE_CURSOR;
} }
else else
{ {
PlaySE(SE_SELECT); PlaySE(SE_SELECT);
sub_81C97C0(a0); ReturnToMainMenu(state);
return 3; return POKENAV_MENU_FUNC_RETURN_TO_MAIN;
} }
} }
return 0; return POKENAV_MENU_FUNC_NONE;
} }
static u32 sub_81C96FC(struct Pokenav1Struct *a0) static u32 HandleConditionSearchMenuInput(struct Pokenav1Struct *state)
{ {
if (sub_81C9814(a0)) if (UpdateMenuCursorPos(state))
return 1; return POKENAV_MENU_FUNC_MOVE_CURSOR;
if (gMain.newKeys & A_BUTTON) if (gMain.newKeys & A_BUTTON)
{ {
u8 v0 = sDescriptionIds[a0->menuType][a0->cursorPos]; u8 menuItem = sMenuItems[state->menuType][state->cursorPos];
if (v0 != 13) if (menuItem != POKENAV_MENUITEM_CONDITION_SEARCH_CANCEL)
{ {
sub_81C7694(v0 - 8); SetSelectedConditionSearch(menuItem - POKENAV_MENUITEM_CONDITION_SEARCH_COOL);
sub_81C97B0(a0, POKENAV_MENU_8); sub_81C97B0(state, POKENAV_MENU_8);
a0->helpBarIndex = HELPBAR_CONDITION_MON_LIST; state->helpBarIndex = HELPBAR_CONDITION_MON_LIST;
return 8; return POKENAV_MENU_FUNC_OPEN_FEATURE;
} }
else else
{ {
PlaySE(SE_SELECT); PlaySE(SE_SELECT);
sub_81C97F8(a0); ReturnToConditionMenu(state);
return 5; return POKENAV_MENU_FUNC_RETURN_TO_CONDITION;
} }
} }
if (gMain.newKeys & B_BUTTON) if (gMain.newKeys & B_BUTTON)
{ {
if (a0->cursorPos != sLastCursorPositions[a0->menuType]) if (state->cursorPos != sLastCursorPositions[state->menuType])
{ {
a0->cursorPos = sLastCursorPositions[a0->menuType]; state->cursorPos = sLastCursorPositions[state->menuType];
a0->callback = sub_81C97A4; state->callback = CB2_ReturnToConditionMenu;
return 1; return POKENAV_MENU_FUNC_MOVE_CURSOR;
} }
else else
{ {
PlaySE(SE_SELECT); PlaySE(SE_SELECT);
sub_81C97F8(a0); ReturnToConditionMenu(state);
return 5; return POKENAV_MENU_FUNC_RETURN_TO_CONDITION;
} }
} }
return 0; return POKENAV_MENU_FUNC_NONE;
} }
static u32 sub_81C9798(struct Pokenav1Struct *a0) static u32 CB2_ReturnToMainMenu(struct Pokenav1Struct *state)
{ {
sub_81C97C0(a0); ReturnToMainMenu(state);
return 3; return POKENAV_MENU_FUNC_RETURN_TO_MAIN;
} }
static u32 sub_81C97A4(struct Pokenav1Struct *a0) static u32 CB2_ReturnToConditionMenu(struct Pokenav1Struct *state)
{ {
sub_81C97F8(a0); ReturnToConditionMenu(state);
return 5; return POKENAV_MENU_FUNC_RETURN_TO_CONDITION;
} }
static void sub_81C97B0(struct Pokenav1Struct *a0, u32 a1) static void sub_81C97B0(struct Pokenav1Struct *state, u32 a1)
{ {
a0->unk8 = a1; state->unk8 = a1;
a0->callback = sub_81C97BC; state->callback = sub_81C97BC;
} }
static u32 sub_81C97BC(struct Pokenav1Struct *a0) static u32 sub_81C97BC(struct Pokenav1Struct *state)
{ {
return a0->unk8; return state->unk8;
} }
static void sub_81C97C0(struct Pokenav1Struct *a0) static void ReturnToMainMenu(struct Pokenav1Struct *state)
{ {
a0->menuType = GetPokenavMainMenuType(); state->menuType = GetPokenavMainMenuType();
a0->cursorPos = 1; state->cursorPos = 1;
a0->descriptionId = sDescriptionIds[a0->menuType][a0->cursorPos]; state->currMenuItem = sMenuItems[state->menuType][state->cursorPos];
a0->callback = sub_81C943C; state->callback = HandleMainMenuInput;
} }
static void sub_81C97F8(struct Pokenav1Struct *a0) static void ReturnToConditionMenu(struct Pokenav1Struct *state)
{ {
a0->menuType = 3; state->menuType = POKENAV_MENU_TYPE_CONDITION;
a0->cursorPos = 1; state->cursorPos = 1;
a0->descriptionId = sDescriptionIds[3][1]; state->currMenuItem = sMenuItems[POKENAV_MENU_TYPE_CONDITION][1];
a0->callback = sub_81C963C; state->callback = HandleConditionMenuInput;
} }
static bool32 sub_81C9814(struct Pokenav1Struct *a0) static bool32 UpdateMenuCursorPos(struct Pokenav1Struct *state)
{ {
if (gMain.newKeys & DPAD_UP) if (gMain.newKeys & DPAD_UP)
{ {
if (--a0->cursorPos < 0) if (--state->cursorPos < 0)
a0->cursorPos = sLastCursorPositions[a0->menuType]; state->cursorPos = sLastCursorPositions[state->menuType];
a0->descriptionId = sDescriptionIds[a0->menuType][a0->cursorPos]; state->currMenuItem = sMenuItems[state->menuType][state->cursorPos];
return TRUE; return TRUE;
} }
else if (gMain.newKeys & DPAD_DOWN) else if (gMain.newKeys & DPAD_DOWN)
{ {
a0->cursorPos++; state->cursorPos++;
if (a0->cursorPos > sLastCursorPositions[a0->menuType]) if (state->cursorPos > sLastCursorPositions[state->menuType])
a0->cursorPos = 0; state->cursorPos = 0;
a0->descriptionId = sDescriptionIds[a0->menuType][a0->cursorPos]; state->currMenuItem = sMenuItems[state->menuType][state->cursorPos];
return TRUE; return TRUE;
} }
else else
@ -441,22 +486,24 @@ static bool32 sub_81C9814(struct Pokenav1Struct *a0)
} }
} }
int sub_81C9894(void) int GetPokenavMenuType(void)
{ {
struct Pokenav1Struct *state = GetSubstructPtr(1); struct Pokenav1Struct *state = GetSubstructPtr(1);
return state->menuType; return state->menuType;
} }
int sub_81C98A4(void) // Position of cursor relative to number of current menu options
int GetPokenavCursorPos(void)
{ {
struct Pokenav1Struct *state = GetSubstructPtr(1); struct Pokenav1Struct *state = GetSubstructPtr(1);
return state->cursorPos; return state->cursorPos;
} }
int sub_81C98B4(void) // ID of menu item the cursor is currently on
int GetCurrentMenuItemId(void)
{ {
struct Pokenav1Struct *state = GetSubstructPtr(1); struct Pokenav1Struct *state = GetSubstructPtr(1);
return state->descriptionId; return state->currMenuItem;
} }
u16 GetHelpBarTextId(void) u16 GetHelpBarTextId(void)

View File

@ -122,8 +122,8 @@ static const u16 gUnknown_08624038[] = INCBIN_U16("graphics/pokenav/ribbons_icon
static const u16 gUnknown_08624058[] = INCBIN_U16("graphics/pokenav/ribbons_icon4.gbapal"); static const u16 gUnknown_08624058[] = INCBIN_U16("graphics/pokenav/ribbons_icon4.gbapal");
static const u16 gUnknown_08624078[] = INCBIN_U16("graphics/pokenav/ribbons_icon5.gbapal"); static const u16 gUnknown_08624078[] = INCBIN_U16("graphics/pokenav/ribbons_icon5.gbapal");
static const u16 gUnknown_08624098[] = INCBIN_U16("graphics/pokenav/8624098.gbapal"); static const u16 gUnknown_08624098[] = INCBIN_U16("graphics/pokenav/8624098.gbapal");
static const u32 gUnknown_086240B8[] = INCBIN_U32("graphics/pokenav/ribbons_icon.4bpp.lz"); static const u32 sRibbonIconsSmall_Gfx[] = INCBIN_U32("graphics/pokenav/ribbons_icon.4bpp.lz");
static const u32 gUnknown_08624280[] = INCBIN_U32("graphics/pokenav/ribbons_icon_big.4bpp.lz"); static const u32 sRibbonIconsBig_Gfx[] = INCBIN_U32("graphics/pokenav/ribbons_icon_big.4bpp.lz");
static const struct BgTemplate gUnknown_08624B98[] = static const struct BgTemplate gUnknown_08624B98[] =
{ {
@ -235,7 +235,7 @@ u32 sub_81D0548(struct PokenavSub13 *structPtr)
u32 sub_81D05D4(struct PokenavSub13 *structPtr) u32 sub_81D05D4(struct PokenavSub13 *structPtr)
{ {
return 100014; return POKENAV_MENU_E;
} }
bool32 sub_81D05DC(struct PokenavSub13 *structPtr) bool32 sub_81D05DC(struct PokenavSub13 *structPtr)
@ -527,7 +527,7 @@ u32 sub_81D0A6C(s32 state)
if (!free_temp_tile_data_buffers_if_possible()) if (!free_temp_tile_data_buffers_if_possible())
{ {
sub_8199DF0(1, 0, 0, 1); sub_8199DF0(1, 0, 0, 1);
decompress_and_copy_tile_data_to_vram(1, gUnknown_086240B8, 0, 1, 0); decompress_and_copy_tile_data_to_vram(1, sRibbonIconsSmall_Gfx, 0, 1, 0);
SetBgTilemapBuffer(1, structPtr->tilemapBuffers[1]); SetBgTilemapBuffer(1, structPtr->tilemapBuffers[1]);
FillBgTilemapBufferRect_Palette0(1, 0, 0, 0, 32, 20); FillBgTilemapBufferRect_Palette0(1, 0, 0, 0, 32, 20);
CopyPaletteIntoBufferUnfaded(gUnknown_08623FF8, 0x20, 0xA0); CopyPaletteIntoBufferUnfaded(gUnknown_08623FF8, 0x20, 0xA0);
@ -837,7 +837,7 @@ void sub_81D0FF0(struct PokenavSub14 *structPtr)
txtPtr = StringCopy(gStringVar1, genderTxt); txtPtr = StringCopy(gStringVar1, genderTxt);
*(txtPtr++) = CHAR_SLASH; *(txtPtr++) = CHAR_SLASH;
*(txtPtr++) = CHAR_SPECIAL_F9; *(txtPtr++) = CHAR_SPECIAL_F9;
*(txtPtr++) = 5; *(txtPtr++) = CHAR_LV_2;
ConvertIntToDecimalStringN(txtPtr, level, STR_CONV_MODE_LEFT_ALIGN, 3); ConvertIntToDecimalStringN(txtPtr, level, STR_CONV_MODE_LEFT_ALIGN, 3);
AddTextPrinterParameterized(windowId, 1, gStringVar1, 60, 1, TEXT_SPEED_FF, NULL); AddTextPrinterParameterized(windowId, 1, gStringVar1, 60, 1, TEXT_SPEED_FF, NULL);
CopyWindowToVram(windowId, 2); CopyWindowToVram(windowId, 2);
@ -1041,7 +1041,7 @@ void sub_81D13BC(u16 *dst, u32 id)
static const struct CompressedSpriteSheet gUnknown_08624C78 = static const struct CompressedSpriteSheet gUnknown_08624C78 =
{ {
gUnknown_08624280, 0x1800, 9 sRibbonIconsBig_Gfx, 0x1800, 9
}; };
static const struct SpritePalette gUnknown_08624C80[] = static const struct SpritePalette gUnknown_08624C80[] =

View File

@ -23,31 +23,31 @@ struct Pokenav2Struct
{ {
bool32 (*callback)(void); bool32 (*callback)(void);
u32 loopedTaskId; u32 loopedTaskId;
u16 optionDescriptionWindowId; u16 optionDescWindowId;
u8 bg3ScrollTaskId; u8 bg3ScrollTaskId;
u8 cursorPos; u8 cursorPos;
bool8 otherIconsInMotion; bool8 otherIconsInMotion;
u8 field_00d; u8 field_00d;
bool32 iconVisible[6]; bool32 iconVisible[MAX_POKENAV_MENUITEMS];
struct Sprite * field_028; struct Sprite * field_028;
struct Sprite * iconSprites[6][4]; struct Sprite * iconSprites[MAX_POKENAV_MENUITEMS][4];
u16 bg1TilemapBuffer[0x400]; u16 bg1TilemapBuffer[0x400];
}; };
static struct Pokenav2Struct * sub_81C9958(void); static struct Pokenav2Struct * sub_81C9958(void);
static bool32 sub_81C99FC(void); static bool32 sub_81C99FC(void);
static u32 sub_81C9A10(s32 state); static u32 sub_81C9A10(s32 state);
static u32 sub_81C9C6C(s32 state); static u32 LoopedTask_MoveMenuCursor(s32 state);
static u32 sub_81C9CA8(s32 state); static u32 LoopedTask_OpenConditionMenu(s32 state);
static u32 sub_81C9D44(s32 state); static u32 LoopedTask_ReturnToMainMenu(s32 state);
static u32 sub_81C9DD8(s32 state); static u32 LoopedTask_OpenConditionSearchMenu(s32 state);
static u32 sub_81C9E58(s32 state); static u32 LoopedTask_ReturnToConditionMenu(s32 state);
static u32 sub_81C9EC8(s32 state); static u32 LoopedTask_SelectRibbonsNoWinners(s32 state);
static u32 sub_81C9EF8(s32 state); static u32 LoopedTask_ReShowDescription(s32 state);
static u32 sub_81C9F28(s32 state); static u32 LoopedTask_OpenPokenavFeature(s32 state);
static void sub_81C9FC4(void); static void sub_81C9FC4(void);
static void sub_81C9FEC(void); static void sub_81C9FEC(void);
static void sub_81CA02C(void); static void CreateMenuOptionSprites(void);
static void sub_81CA094(void); static void sub_81CA094(void);
static void sub_81CA0C8(void); static void sub_81CA0C8(void);
static void sub_81CA0EC(const u16 *const * a0, s32 a1, s32 a2); static void sub_81CA0EC(const u16 *const * a0, s32 a1, s32 a2);
@ -56,7 +56,7 @@ static void sub_81CA278(void);
static void sub_81CA35C(struct Sprite ** sprites, s32 a1, s32 a2, s32 a3); static void sub_81CA35C(struct Sprite ** sprites, s32 a1, s32 a2, s32 a3);
static void sub_81CA3B4(struct Sprite ** sprites); static void sub_81CA3B4(struct Sprite ** sprites);
static void sub_81CA2DC(void); static void sub_81CA2DC(void);
static bool32 sub_81CA324(void); static bool32 AreMenuOptionSpritesMoving(void);
static void sub_81CA448(struct Sprite ** sprites, bool32 a1); static void sub_81CA448(struct Sprite ** sprites, bool32 a1);
static void sub_81CA474(struct Sprite * sprite); static void sub_81CA474(struct Sprite * sprite);
static void sub_81CA4AC(struct Sprite * sprite); static void sub_81CA4AC(struct Sprite * sprite);
@ -64,9 +64,9 @@ static void sub_81CA580(u8 taskId);
static void sub_81CA640(void); static void sub_81CA640(void);
static void sub_81CA6AC(struct Sprite * sprite); static void sub_81CA6AC(struct Sprite * sprite);
static void sub_81CA698(void); static void sub_81CA698(void);
static void sub_81CA6E0(void); static void AddOptionDescriptionWindow(void);
static void sub_81CA714(void); static void PrintCurrentOptionDescription(void);
static void sub_81CA770(void); static void PrintNoRibbonWinners(void);
static bool32 sub_81CA7C4(void); static bool32 sub_81CA7C4(void);
static void sub_81CA7D4(void); static void sub_81CA7D4(void);
static void sub_81CA7F4(void); static void sub_81CA7F4(void);
@ -120,16 +120,16 @@ static const struct BgTemplate gUnknown_08620194[] = {
} }
}; };
static const LoopedTask gUnknown_086201A0[] = { static const LoopedTask sMenuHandlerLoopTaskFuncs[] = {
NULL, [POKENAV_MENU_FUNC_NONE] = NULL,
sub_81C9C6C, [POKENAV_MENU_FUNC_MOVE_CURSOR] = LoopedTask_MoveMenuCursor,
sub_81C9CA8, [POKENAV_MENU_FUNC_OPEN_CONDITION] = LoopedTask_OpenConditionMenu,
sub_81C9D44, [POKENAV_MENU_FUNC_RETURN_TO_MAIN] = LoopedTask_ReturnToMainMenu,
sub_81C9DD8, [POKENAV_MENU_FUNC_OPEN_CONDITION_SEARCH] = LoopedTask_OpenConditionSearchMenu,
sub_81C9E58, [POKENAV_MENU_FUNC_RETURN_TO_CONDITION] = LoopedTask_ReturnToConditionMenu,
sub_81C9EC8, [POKENAV_MENU_FUNC_NO_RIBBON_WINNERS] = LoopedTask_SelectRibbonsNoWinners,
sub_81C9EF8, [POKENAV_MENU_FUNC_RESHOW_DESCRIPTION] = LoopedTask_ReShowDescription,
sub_81C9F28 [POKENAV_MENU_FUNC_OPEN_FEATURE] = LoopedTask_OpenPokenavFeature
}; };
static const struct CompressedSpriteSheet gUnknown_086201C4[] = static const struct CompressedSpriteSheet gUnknown_086201C4[] =
@ -175,39 +175,45 @@ struct UnkStruct_08620240
{ {
u16 unk0; u16 unk0;
u16 unk2; u16 unk2;
const u16 *unk4[6]; const u16 *unk4[MAX_POKENAV_MENUITEMS];
}; };
static const struct UnkStruct_08620240 gUnknown_08620240[5] = // TODO
static const struct UnkStruct_08620240 gUnknown_08620240[POKENAV_MENU_TYPE_COUNT] =
{ {
[POKENAV_MENU_TYPE_DEFAULT] =
{ {
0x2A, 0x2A,
0x14, 0x14,
{gUnknown_0862020C, gUnknown_08620210, gUnknown_0862021C} {gUnknown_0862020C, gUnknown_08620210, gUnknown_0862021C}
}, },
[POKENAV_MENU_TYPE_UNLOCK_MC] =
{ {
0x2A, 0x2A,
0x14, 0x14,
{gUnknown_0862020C, gUnknown_08620210, gUnknown_08620214, gUnknown_0862021C} {gUnknown_0862020C, gUnknown_08620210, gUnknown_08620214, gUnknown_0862021C}
}, },
[POKENAV_MENU_TYPE_UNLOCK_MC_RIBBONS] =
{ {
0x2A, 0x2A,
0x14, 0x14,
{gUnknown_0862020C, gUnknown_08620210, gUnknown_08620214, gUnknown_08620218, gUnknown_0862021C} {gUnknown_0862020C, gUnknown_08620210, gUnknown_08620214, gUnknown_08620218, gUnknown_0862021C}
}, },
[POKENAV_MENU_TYPE_CONDITION] =
{ {
0x38, 0x38,
0x14, 0x14,
{gUnknown_08620220, gUnknown_08620224, gUnknown_0862023C} {gUnknown_08620220, gUnknown_08620224, gUnknown_0862023C}
}, },
[POKENAV_MENU_TYPE_CONDITION_SEARCH] =
{ {
0x28, 0x28,
0x10, 0x10,
{gUnknown_08620228, gUnknown_0862022C, gUnknown_08620230, gUnknown_08620234, gUnknown_08620238, gUnknown_0862023C} {gUnknown_08620228, gUnknown_0862022C, gUnknown_08620230, gUnknown_08620234, gUnknown_08620238, gUnknown_0862023C}
}, },
}; };
static const struct WindowTemplate gUnknown_086202CC = static const struct WindowTemplate sOptionDescWindowTemplate =
{ {
.bg = 1, .bg = 1,
.tilemapLeft = 3, .tilemapLeft = 3,
@ -218,28 +224,28 @@ static const struct WindowTemplate gUnknown_086202CC =
.baseBlock = 8 .baseBlock = 8
}; };
static const u8 *const gUnknown_086202D4[] = static const u8 *const sPageDescriptions[] =
{ {
gText_CheckMapOfHoenn, [POKENAV_MENUITEM_MAP] = gText_CheckMapOfHoenn,
gText_CheckPokemonInDetail, [POKENAV_MENUITEM_CONDITION] = gText_CheckPokemonInDetail,
gText_CallRegisteredTrainer, [POKENAV_MENUITEM_MATCH_CALL] = gText_CallRegisteredTrainer,
gText_CheckObtainedRibbons, [POKENAV_MENUITEM_RIBBONS] = gText_CheckObtainedRibbons,
gText_PutAwayPokenav, [POKENAV_MENUITEM_SWITCH_OFF] = gText_PutAwayPokenav,
gText_CheckPartyPokemonInDetail, [POKENAV_MENUITEM_CONDITION_PARTY] = gText_CheckPartyPokemonInDetail,
gText_CheckAllPokemonInDetail, [POKENAV_MENUITEM_CONDITION_SEARCH] = gText_CheckAllPokemonInDetail,
gText_ReturnToPokenavMenu, [POKENAV_MENUITEM_CONDITION_CANCEL] = gText_ReturnToPokenavMenu,
gText_FindCoolPokemon, [POKENAV_MENUITEM_CONDITION_SEARCH_COOL] = gText_FindCoolPokemon,
gText_FindBeautifulPokemon, [POKENAV_MENUITEM_CONDITION_SEARCH_BEAUTY] = gText_FindBeautifulPokemon,
gText_FindCutePokemon, [POKENAV_MENUITEM_CONDITION_SEARCH_CUTE] = gText_FindCutePokemon,
gText_FindSmartPokemon, [POKENAV_MENUITEM_CONDITION_SEARCH_SMART] = gText_FindSmartPokemon,
gText_FindToughPokemon, [POKENAV_MENUITEM_CONDITION_SEARCH_TOUGH] = gText_FindToughPokemon,
gText_ReturnToConditionMenu [POKENAV_MENUITEM_CONDITION_SEARCH_CANCEL] = gText_ReturnToConditionMenu
}; };
static const u8 sOptionDescTextColors[] = {TEXT_COLOR_GREEN, TEXT_COLOR_BLUE, TEXT_COLOR_LIGHT_GREEN}; static const u8 sOptionDescTextColors[] = {TEXT_COLOR_GREEN, TEXT_COLOR_BLUE, TEXT_COLOR_LIGHT_GREEN};
static const u8 sOptionDescTextColors2[] = {TEXT_COLOR_GREEN, TEXT_COLOR_BLUE, TEXT_COLOR_LIGHT_GREEN}; static const u8 sOptionDescTextColors2[] = {TEXT_COLOR_GREEN, TEXT_COLOR_BLUE, TEXT_COLOR_LIGHT_GREEN};
static const struct OamData gUnknown_08620314 = static const struct OamData sOamData_MenuOption =
{ {
.y = 0, .y = 0,
.affineMode = ST_OAM_AFFINE_OFF, .affineMode = ST_OAM_AFFINE_OFF,
@ -266,20 +272,20 @@ static const union AffineAnimCmd gUnknown_0862032C[] =
AFFINEANIMCMD_END, AFFINEANIMCMD_END,
}; };
static const union AffineAnimCmd *const gUnknown_08620344[] = static const union AffineAnimCmd *const sSpriteAnims_MenuOption[] =
{ {
gUnknown_0862031C, gUnknown_0862031C,
gUnknown_0862032C gUnknown_0862032C
}; };
static const struct SpriteTemplate gUnknown_0862034C = static const struct SpriteTemplate sMenuOptionSpriteTemplate =
{ {
.tileTag = 3, .tileTag = 3,
.paletteTag = 4, .paletteTag = 4,
.oam = &gUnknown_08620314, .oam = &sOamData_MenuOption,
.anims = gDummySpriteAnimTable, .anims = gDummySpriteAnimTable,
.images = NULL, .images = NULL,
.affineAnims = gUnknown_08620344, .affineAnims = sSpriteAnims_MenuOption,
.callback = SpriteCallbackDummy, .callback = SpriteCallbackDummy,
}; };
@ -368,11 +374,11 @@ static struct Pokenav2Struct * sub_81C9958(void)
} }
void sub_81C9990(s32 ltIdx) void CreateMenuHandlerLoopedTask(s32 ltIdx)
{ {
struct Pokenav2Struct * unk = GetSubstructPtr(2); struct Pokenav2Struct * unk = GetSubstructPtr(2);
unk->loopedTaskId = CreateLoopedTask(gUnknown_086201A0[ltIdx], 1); unk->loopedTaskId = CreateLoopedTask(sMenuHandlerLoopTaskFuncs[ltIdx], 1);
unk->callback = sub_81C99FC; unk->callback = sub_81C99FC;
} }
@ -388,7 +394,7 @@ void sub_81C99D4(void)
struct Pokenav2Struct * unk = GetSubstructPtr(2); struct Pokenav2Struct * unk = GetSubstructPtr(2);
sub_81CA7F4(); sub_81CA7F4();
RemoveWindow(unk->optionDescriptionWindowId); RemoveWindow(unk->optionDescWindowId);
sub_81C9FEC(); sub_81C9FEC();
sub_81CA994(); sub_81CA994();
FreePokenavSubstruct(2); FreePokenavSubstruct(2);
@ -434,21 +440,21 @@ static u32 sub_81C9A10(s32 state)
decompress_and_copy_tile_data_to_vram(3, gUnknown_0861FC98, 0, 0, 0); decompress_and_copy_tile_data_to_vram(3, gUnknown_0861FC98, 0, 0, 0);
decompress_and_copy_tile_data_to_vram(3, gUnknown_0861FCAC, 0, 0, 1); decompress_and_copy_tile_data_to_vram(3, gUnknown_0861FCAC, 0, 0, 1);
CopyPaletteIntoBufferUnfaded(gUnknown_0861FC78, 0x30, 0x20); CopyPaletteIntoBufferUnfaded(gUnknown_0861FC78, 0x30, 0x20);
if (sub_81C9894() == 3 || sub_81C9894() == 4) if (GetPokenavMenuType() == POKENAV_MENU_TYPE_CONDITION || GetPokenavMenuType() == POKENAV_MENU_TYPE_CONDITION_SEARCH)
sub_81CA850(); sub_81CA850();
return LT_INC_AND_PAUSE; return LT_INC_AND_PAUSE;
case 3: case 3:
if (free_temp_tile_data_buffers_if_possible()) if (free_temp_tile_data_buffers_if_possible())
return LT_PAUSE; return LT_PAUSE;
sub_81CA6E0(); AddOptionDescriptionWindow();
sub_81CA7D4(); sub_81CA7D4();
return LT_INC_AND_CONTINUE; return LT_INC_AND_CONTINUE;
case 4: case 4:
sub_81C9FC4(); sub_81C9FC4();
return LT_INC_AND_CONTINUE; return LT_INC_AND_CONTINUE;
case 5: case 5:
sub_81CA714(); PrintCurrentOptionDescription();
sub_81CA02C(); CreateMenuOptionSprites();
sub_81CA640(); sub_81CA640();
sub_81CA0C8(); sub_81CA0C8();
return LT_INC_AND_PAUSE; return LT_INC_AND_PAUSE;
@ -467,12 +473,12 @@ static u32 sub_81C9A10(s32 state)
PlaySE(SE_PN_ON); PlaySE(SE_PN_ON);
sub_81C7AC0(3); sub_81C7AC0(3);
} }
switch (sub_81C9894()) switch (GetPokenavMenuType())
{ {
case 4: case POKENAV_MENU_TYPE_CONDITION_SEARCH:
LoadLeftHeaderGfxForIndex(7); LoadLeftHeaderGfxForIndex(7);
// fallthrough // fallthrough
case 3: case POKENAV_MENU_TYPE_CONDITION:
LoadLeftHeaderGfxForIndex(1); LoadLeftHeaderGfxForIndex(1);
break; break;
default: default:
@ -483,12 +489,12 @@ static u32 sub_81C9A10(s32 state)
case 8: case 8:
if (IsPaletteFadeActive()) if (IsPaletteFadeActive())
return LT_PAUSE; return LT_PAUSE;
switch (sub_81C9894()) switch (GetPokenavMenuType())
{ {
case 4: case POKENAV_MENU_TYPE_CONDITION_SEARCH:
sub_81C7FA0(7, FALSE, FALSE); sub_81C7FA0(7, FALSE, FALSE);
// fallthrough // fallthrough
case 3: case POKENAV_MENU_TYPE_CONDITION:
sub_81C7FA0(1, FALSE, FALSE); sub_81C7FA0(1, FALSE, FALSE);
break; break;
default: default:
@ -499,7 +505,7 @@ static u32 sub_81C9A10(s32 state)
sub_81CA92C(); sub_81CA92C();
return LT_INC_AND_CONTINUE; return LT_INC_AND_CONTINUE;
case 9: case 9:
if (sub_81CA324()) if (AreMenuOptionSpritesMoving())
return LT_PAUSE; return LT_PAUSE;
if (sub_81C8010()) if (sub_81C8010())
return LT_PAUSE; return LT_PAUSE;
@ -508,18 +514,18 @@ static u32 sub_81C9A10(s32 state)
return LT_FINISH; return LT_FINISH;
} }
static u32 sub_81C9C6C(s32 state) static u32 LoopedTask_MoveMenuCursor(s32 state)
{ {
switch (state) switch (state)
{ {
case 0: case 0:
sub_81CAA3C(); sub_81CAA3C();
sub_81CA278(); sub_81CA278();
sub_81CA714(); PrintCurrentOptionDescription();
PlaySE(SE_SELECT); PlaySE(SE_SELECT);
return LT_INC_AND_PAUSE; return LT_INC_AND_PAUSE;
case 1: case 1:
if (sub_81CA324()) if (AreMenuOptionSpritesMoving())
return LT_PAUSE; return LT_PAUSE;
if (sub_81CA7C4()) if (sub_81CA7C4())
return LT_PAUSE; return LT_PAUSE;
@ -528,7 +534,7 @@ static u32 sub_81C9C6C(s32 state)
return LT_FINISH; return LT_FINISH;
} }
static u32 sub_81C9CA8(s32 state) static u32 LoopedTask_OpenConditionMenu(s32 state)
{ {
switch (state) switch (state)
{ {
@ -539,7 +545,7 @@ static u32 sub_81C9CA8(s32 state)
PlaySE(SE_SELECT); PlaySE(SE_SELECT);
return LT_INC_AND_PAUSE; return LT_INC_AND_PAUSE;
case 1: case 1:
if (sub_81CA324()) if (AreMenuOptionSpritesMoving())
return LT_PAUSE; return LT_PAUSE;
if (sub_81C8010()) if (sub_81C8010())
return LT_PAUSE; return LT_PAUSE;
@ -550,10 +556,10 @@ static u32 sub_81C9CA8(s32 state)
sub_81CA20C(); sub_81CA20C();
sub_81C7FA0(1, FALSE, FALSE); sub_81C7FA0(1, FALSE, FALSE);
sub_81CA818(); sub_81CA818();
sub_81CA714(); PrintCurrentOptionDescription();
return LT_INC_AND_PAUSE; return LT_INC_AND_PAUSE;
case 3: case 3:
if (sub_81CA324()) if (AreMenuOptionSpritesMoving())
return LT_PAUSE; return LT_PAUSE;
if (sub_81C8010()) if (sub_81C8010())
return LT_PAUSE; return LT_PAUSE;
@ -567,7 +573,7 @@ static u32 sub_81C9CA8(s32 state)
return LT_FINISH; return LT_FINISH;
} }
static u32 sub_81C9D44(s32 state) static u32 LoopedTask_ReturnToMainMenu(s32 state)
{ {
switch (state) switch (state)
{ {
@ -577,7 +583,7 @@ static u32 sub_81C9D44(s32 state)
sub_81C7FC4(1, 0); sub_81C7FC4(1, 0);
return LT_INC_AND_PAUSE; return LT_INC_AND_PAUSE;
case 1: case 1:
if (sub_81CA324()) if (AreMenuOptionSpritesMoving())
return LT_PAUSE; return LT_PAUSE;
if (sub_81C8010()) if (sub_81C8010())
return LT_PAUSE; return LT_PAUSE;
@ -588,10 +594,10 @@ static u32 sub_81C9D44(s32 state)
sub_81CA20C(); sub_81CA20C();
sub_81C7FA0(0, FALSE, FALSE); sub_81C7FA0(0, FALSE, FALSE);
sub_81CA864(); sub_81CA864();
sub_81CA714(); PrintCurrentOptionDescription();
return LT_INC_AND_PAUSE; return LT_INC_AND_PAUSE;
case 3: case 3:
if (sub_81CA324()) if (AreMenuOptionSpritesMoving())
return LT_PAUSE; return LT_PAUSE;
if (sub_81C8010()) if (sub_81C8010())
return LT_PAUSE; return LT_PAUSE;
@ -605,7 +611,7 @@ static u32 sub_81C9D44(s32 state)
return LT_FINISH; return LT_FINISH;
} }
static u32 sub_81C9DD8(s32 state) static u32 LoopedTask_OpenConditionSearchMenu(s32 state)
{ {
switch (state) switch (state)
{ {
@ -615,7 +621,7 @@ static u32 sub_81C9DD8(s32 state)
PlaySE(SE_SELECT); PlaySE(SE_SELECT);
return LT_INC_AND_PAUSE; return LT_INC_AND_PAUSE;
case 1: case 1:
if (sub_81CA324()) if (AreMenuOptionSpritesMoving())
return LT_PAUSE; return LT_PAUSE;
LoadLeftHeaderGfxForIndex(7); LoadLeftHeaderGfxForIndex(7);
sub_81CA0C8(); sub_81CA0C8();
@ -623,10 +629,10 @@ static u32 sub_81C9DD8(s32 state)
case 2: case 2:
sub_81CA20C(); sub_81CA20C();
sub_81C7FA0(7, FALSE, FALSE); sub_81C7FA0(7, FALSE, FALSE);
sub_81CA714(); PrintCurrentOptionDescription();
return LT_INC_AND_PAUSE; return LT_INC_AND_PAUSE;
case 3: case 3:
if (sub_81CA324()) if (AreMenuOptionSpritesMoving())
return LT_PAUSE; return LT_PAUSE;
if (sub_81C8010()) if (sub_81C8010())
return LT_PAUSE; return LT_PAUSE;
@ -638,7 +644,7 @@ static u32 sub_81C9DD8(s32 state)
return LT_FINISH; return LT_FINISH;
} }
static u32 sub_81C9E58(s32 state) static u32 LoopedTask_ReturnToConditionMenu(s32 state)
{ {
switch (state) switch (state)
{ {
@ -648,7 +654,7 @@ static u32 sub_81C9E58(s32 state)
sub_81C7FC4(7, 0); sub_81C7FC4(7, 0);
return LT_INC_AND_PAUSE; return LT_INC_AND_PAUSE;
case 1: case 1:
if (sub_81CA324()) if (AreMenuOptionSpritesMoving())
return LT_PAUSE; return LT_PAUSE;
if (sub_81C8010()) if (sub_81C8010())
return LT_PAUSE; return LT_PAUSE;
@ -656,10 +662,10 @@ static u32 sub_81C9E58(s32 state)
return LT_INC_AND_PAUSE; return LT_INC_AND_PAUSE;
case 2: case 2:
sub_81CA20C(); sub_81CA20C();
sub_81CA714(); PrintCurrentOptionDescription();
return LT_INC_AND_PAUSE; return LT_INC_AND_PAUSE;
case 3: case 3:
if (sub_81CA324()) if (AreMenuOptionSpritesMoving())
return LT_PAUSE; return LT_PAUSE;
if (sub_81CA89C()) if (sub_81CA89C())
return LT_PAUSE; return LT_PAUSE;
@ -669,13 +675,13 @@ static u32 sub_81C9E58(s32 state)
return LT_FINISH; return LT_FINISH;
} }
static u32 sub_81C9EC8(s32 state) static u32 LoopedTask_SelectRibbonsNoWinners(s32 state)
{ {
switch (state) switch (state)
{ {
case 0: case 0:
PlaySE(SE_HAZURE); PlaySE(SE_HAZURE);
sub_81CA770(); PrintNoRibbonWinners();
return LT_INC_AND_PAUSE; return LT_INC_AND_PAUSE;
case 1: case 1:
if (IsDma3ManagerBusyWithBgCopy()) if (IsDma3ManagerBusyWithBgCopy())
@ -685,13 +691,14 @@ static u32 sub_81C9EC8(s32 state)
return LT_FINISH; return LT_FINISH;
} }
static u32 sub_81C9EF8(s32 state) // For redisplaying the Ribbons description to replace the No Ribbon Winners message
static u32 LoopedTask_ReShowDescription(s32 state)
{ {
switch (state) switch (state)
{ {
case 0: case 0:
PlaySE(SE_SELECT); PlaySE(SE_SELECT);
sub_81CA714(); PrintCurrentOptionDescription();
return LT_INC_AND_PAUSE; return LT_INC_AND_PAUSE;
case 1: case 1:
if (IsDma3ManagerBusyWithBgCopy()) if (IsDma3ManagerBusyWithBgCopy())
@ -701,7 +708,8 @@ static u32 sub_81C9EF8(s32 state)
return LT_FINISH; return LT_FINISH;
} }
static u32 sub_81C9F28(s32 state) // For selecting a feature option from a menu, e.g. the Map, Match Call, Beauty search, etc.
static u32 LoopedTask_OpenPokenavFeature(s32 state)
{ {
switch (state) switch (state)
{ {
@ -714,12 +722,12 @@ static u32 sub_81C9F28(s32 state)
sub_81C7880(); sub_81C7880();
sub_81CA9C8(); sub_81CA9C8();
sub_81CA2DC(); sub_81CA2DC();
switch (sub_81C9894()) switch (GetPokenavMenuType())
{ {
case 4: case POKENAV_MENU_TYPE_CONDITION_SEARCH:
sub_81C7FC4(7, FALSE); sub_81C7FC4(7, FALSE);
// fallthrough // fallthrough
case 3: case POKENAV_MENU_TYPE_CONDITION:
sub_81C7FC4(1, FALSE); sub_81C7FC4(1, FALSE);
break; break;
default: default:
@ -729,7 +737,7 @@ static u32 sub_81C9F28(s32 state)
PlaySE(SE_SELECT); PlaySE(SE_SELECT);
return LT_INC_AND_PAUSE; return LT_INC_AND_PAUSE;
case 2: case 2:
if (sub_81CA324()) if (AreMenuOptionSpritesMoving())
return LT_PAUSE; return LT_PAUSE;
if (sub_81C8010()) if (sub_81C8010())
return LT_PAUSE; return LT_PAUSE;
@ -766,16 +774,17 @@ static void sub_81C9FEC(void)
sub_81CA698(); sub_81CA698();
} }
static void sub_81CA02C(void) static void CreateMenuOptionSprites(void)
{ {
s32 i, j; s32 i, j;
struct Pokenav2Struct * unk = GetSubstructPtr(2); struct Pokenav2Struct * unk = GetSubstructPtr(2);
for (i = 0; i < 6; i++) for (i = 0; i < MAX_POKENAV_MENUITEMS; i++)
{ {
// Each menu option is 4 subsprites
for (j = 0; j < 4; j++) for (j = 0; j < 4; j++)
{ {
u8 spriteId = CreateSprite(&gUnknown_0862034C, 0x8c, 20 * i + 40, 3); u8 spriteId = CreateSprite(&sMenuOptionSpriteTemplate, 0x8c, 20 * i + 40, 3);
unk->iconSprites[i][j] = &gSprites[spriteId]; unk->iconSprites[i][j] = &gSprites[spriteId];
gSprites[spriteId].pos2.x = 32 * j; gSprites[spriteId].pos2.x = 32 * j;
} }
@ -787,7 +796,7 @@ static void sub_81CA094(void)
s32 i, j; s32 i, j;
struct Pokenav2Struct * unk = GetSubstructPtr(2); struct Pokenav2Struct * unk = GetSubstructPtr(2);
for (i = 0; i < 6; i++) for (i = 0; i < MAX_POKENAV_MENUITEMS; i++)
{ {
for (j = 0; j < 4; j++) for (j = 0; j < 4; j++)
{ {
@ -799,8 +808,8 @@ static void sub_81CA094(void)
static void sub_81CA0C8(void) static void sub_81CA0C8(void)
{ {
s32 r0 = sub_81C9894(); s32 menuType = GetPokenavMenuType();
sub_81CA0EC(gUnknown_08620240[r0].unk4, gUnknown_08620240[r0].unk0, gUnknown_08620240[r0].unk2); sub_81CA0EC(gUnknown_08620240[menuType].unk4, gUnknown_08620240[menuType].unk0, gUnknown_08620240[menuType].unk2);
} }
static void sub_81CA0EC(const u16 *const *a0, s32 a1, s32 a2) static void sub_81CA0EC(const u16 *const *a0, s32 a1, s32 a2)
@ -809,7 +818,7 @@ static void sub_81CA0EC(const u16 *const *a0, s32 a1, s32 a2)
struct Pokenav2Struct * unk = GetSubstructPtr(2); struct Pokenav2Struct * unk = GetSubstructPtr(2);
s32 sp04 = GetSpriteTileStartByTag(3); s32 sp04 = GetSpriteTileStartByTag(3);
for (i = 0; i < 6; i++) for (i = 0; i < MAX_POKENAV_MENUITEMS; i++)
{ {
if (*a0 != NULL) if (*a0 != NULL)
{ {
@ -841,11 +850,11 @@ static void sub_81CA20C(void)
{ {
s32 i; s32 i;
struct Pokenav2Struct * unk = GetSubstructPtr(2); struct Pokenav2Struct * unk = GetSubstructPtr(2);
s32 r8 = sub_81C98A4(); s32 r8 = GetPokenavCursorPos();
s32 r7 = 0; s32 r7 = 0;
s32 r2; s32 r2;
for (i = 0; i < 6; i++) for (i = 0; i < MAX_POKENAV_MENUITEMS; i++)
{ {
if (unk->iconVisible[i]) if (unk->iconVisible[i])
{ {
@ -868,10 +877,10 @@ static void sub_81CA278(void)
{ {
s32 i; s32 i;
struct Pokenav2Struct * unk = GetSubstructPtr(2); struct Pokenav2Struct * unk = GetSubstructPtr(2);
s32 r3 = sub_81C98A4(); s32 r3 = GetPokenavCursorPos();
s32 r5; s32 r5;
for (i = 0, r5 = 0; i < 6; i++) for (i = 0, r5 = 0; i < MAX_POKENAV_MENUITEMS; i++)
{ {
if (unk->iconVisible[i]) if (unk->iconVisible[i])
{ {
@ -894,7 +903,7 @@ static void sub_81CA2DC(void)
s32 i; s32 i;
struct Pokenav2Struct * unk = GetSubstructPtr(2); struct Pokenav2Struct * unk = GetSubstructPtr(2);
for (i = 0; i < 6; i++) for (i = 0; i < MAX_POKENAV_MENUITEMS; i++)
{ {
if (unk->iconVisible[i]) if (unk->iconVisible[i])
{ {
@ -906,12 +915,12 @@ static void sub_81CA2DC(void)
} }
} }
static bool32 sub_81CA324(void) static bool32 AreMenuOptionSpritesMoving(void)
{ {
s32 i; s32 i;
struct Pokenav2Struct * unk = GetSubstructPtr(2); struct Pokenav2Struct * unk = GetSubstructPtr(2);
for (i = 0; i < 6; i++) for (i = 0; i < MAX_POKENAV_MENUITEMS; i++)
{ {
if (unk->iconSprites[i][0]->callback != SpriteCallbackDummy) if (unk->iconSprites[i][0]->callback != SpriteCallbackDummy)
return TRUE; return TRUE;
@ -1112,34 +1121,35 @@ static void sub_81CA6AC(struct Sprite * sprite)
} }
} }
static void sub_81CA6E0(void) static void AddOptionDescriptionWindow(void)
{ {
struct Pokenav2Struct * ptr = GetSubstructPtr(2); struct Pokenav2Struct * ptr = GetSubstructPtr(2);
ptr->optionDescriptionWindowId = AddWindow(&gUnknown_086202CC); ptr->optionDescWindowId = AddWindow(&sOptionDescWindowTemplate);
PutWindowTilemap(ptr->optionDescriptionWindowId); PutWindowTilemap(ptr->optionDescWindowId);
FillWindowPixelBuffer(ptr->optionDescriptionWindowId, PIXEL_FILL(6)); FillWindowPixelBuffer(ptr->optionDescWindowId, PIXEL_FILL(6));
CopyWindowToVram(ptr->optionDescriptionWindowId, 3); CopyWindowToVram(ptr->optionDescWindowId, 3);
} }
static void sub_81CA714(void) static void PrintCurrentOptionDescription(void)
{ {
struct Pokenav2Struct * ptr = GetSubstructPtr(2); struct Pokenav2Struct * ptr = GetSubstructPtr(2);
int i = sub_81C98B4(); int menuItem = GetCurrentMenuItemId();
const u8 * s = gUnknown_086202D4[i]; const u8 * s = sPageDescriptions[menuItem];
u32 width = GetStringWidth(1, s, -1); u32 width = GetStringWidth(1, s, -1);
FillWindowPixelBuffer(ptr->optionDescriptionWindowId, PIXEL_FILL(6)); FillWindowPixelBuffer(ptr->optionDescWindowId, PIXEL_FILL(6));
AddTextPrinterParameterized3(ptr->optionDescriptionWindowId, 1, (192 - width) / 2, 1, sOptionDescTextColors, 0, s); AddTextPrinterParameterized3(ptr->optionDescWindowId, 1, (192 - width) / 2, 1, sOptionDescTextColors, 0, s);
} }
// Printed when Ribbons is selected if no PC/party mons have ribbons
static void sub_81CA770(void) // Can occur by obtaining a mon with a ribbon and then releasing all ribbon winners
static void PrintNoRibbonWinners(void)
{ {
struct Pokenav2Struct * ptr = GetSubstructPtr(2); struct Pokenav2Struct * ptr = GetSubstructPtr(2);
const u8 * s = gText_NoRibbonWinners; const u8 * s = gText_NoRibbonWinners;
u32 width = GetStringWidth(1, s, -1); u32 width = GetStringWidth(1, s, -1);
FillWindowPixelBuffer(ptr->optionDescriptionWindowId, PIXEL_FILL(6)); FillWindowPixelBuffer(ptr->optionDescWindowId, PIXEL_FILL(6));
AddTextPrinterParameterized3(ptr->optionDescriptionWindowId, 1, (192 - width) / 2, 1, sOptionDescTextColors2, 0, s); AddTextPrinterParameterized3(ptr->optionDescWindowId, 1, (192 - width) / 2, 1, sOptionDescTextColors2, 0, s);
} }
static bool32 sub_81CA7C4(void) static bool32 sub_81CA7C4(void)
@ -1259,9 +1269,9 @@ static void sub_81CA9EC(u8 taskId)
static void sub_81CAA3C(void) static void sub_81CAA3C(void)
{ {
int i = sub_81C9894(); int menuType = GetPokenavMenuType();
int j = sub_81C98A4(); int cursorPos = GetPokenavCursorPos();
int r4 = gUnknown_08620240[i].unk2 * j + gUnknown_08620240[i].unk0 - 8; int r4 = gUnknown_08620240[menuType].unk2 * cursorPos + gUnknown_08620240[menuType].unk0 - 8;
CpuFill16(0, gScanlineEffectRegBuffers[0], 0x140); CpuFill16(0, gScanlineEffectRegBuffers[0], 0x140);
CpuFill16(0, gScanlineEffectRegBuffers[1], 0x140); CpuFill16(0, gScanlineEffectRegBuffers[1], 0x140);
CpuFill16(RGB(16, 23, 28), &gScanlineEffectRegBuffers[0][r4], 0x20); CpuFill16(RGB(16, 23, 28), &gScanlineEffectRegBuffers[0][r4], 0x20);

View File

@ -286,7 +286,7 @@ bool32 sub_81CB260(void)
return TRUE; return TRUE;
} }
void sub_81CB29C(s32 index) void CreateMatchCallLoopedTask(s32 index)
{ {
struct Pokenav4Struct *state = GetSubstructPtr(6); struct Pokenav4Struct *state = GetSubstructPtr(6);
state->unk4 = CreateLoopedTask(sMatchCallLoopTaskFuncs[index], 1); state->unk4 = CreateLoopedTask(sMatchCallLoopTaskFuncs[index], 1);

View File

@ -402,7 +402,7 @@ u8 *sub_81CD624(u8 *str, u16 id, bool8 arg3)
*(str_++) = 9; *(str_++) = 9;
*(str_++) = CHAR_SLASH; *(str_++) = CHAR_SLASH;
*(str_++) = CHAR_SPECIAL_F9; *(str_++) = CHAR_SPECIAL_F9;
*(str_++) = 5; *(str_++) = CHAR_LV_2;
txtPtr = str_; txtPtr = str_;
str_ = ConvertIntToDecimalStringN(str_, level, STR_CONV_MODE_LEFT_ALIGN, 3); str_ = ConvertIntToDecimalStringN(str_, level, STR_CONV_MODE_LEFT_ALIGN, 3);
lvlDigits = str_ - txtPtr; lvlDigits = str_ - txtPtr;

View File

@ -113,9 +113,9 @@ static const struct WindowTemplate gUnknown_086235B4 =
.baseBlock = 20 .baseBlock = 20
}; };
static const u8 gUnknown_086235BC[] = _("{COLOR_HIGHLIGHT_SHADOW}{LIGHT_RED}{WHITE}{GREEN}♂{COLOR_HIGHLIGHT_SHADOW}{DARK_GREY}{WHITE}{LIGHT_GREY}"); static const u8 sText_MaleSymbol[] = _("{COLOR_HIGHLIGHT_SHADOW}{LIGHT_RED}{WHITE}{GREEN}♂{COLOR_HIGHLIGHT_SHADOW}{DARK_GREY}{WHITE}{LIGHT_GREY}");
static const u8 gUnknown_086235C8[] = _("{COLOR_HIGHLIGHT_SHADOW}{LIGHT_GREEN}{WHITE}{BLUE}♀{COLOR_HIGHLIGHT_SHADOW}{DARK_GREY}{WHITE}{LIGHT_GREY}"); static const u8 sText_FemaleSymbol[] = _("{COLOR_HIGHLIGHT_SHADOW}{LIGHT_GREEN}{WHITE}{BLUE}♀{COLOR_HIGHLIGHT_SHADOW}{DARK_GREY}{WHITE}{LIGHT_GREY}");
static const u8 gUnknown_086235D4[] = _("{UNK_SPACER}"); static const u8 sText_NoGenderSymbol[] = _("{UNK_SPACER}");
bool32 PokenavCallback_Init_8(void) bool32 PokenavCallback_Init_8(void)
{ {
@ -130,7 +130,7 @@ bool32 PokenavCallback_Init_8(void)
structPtr->unk0 = sub_81CF010; structPtr->unk0 = sub_81CF010;
structPtr->loopedTaskId = CreateLoopedTask(sub_81CF11C, 1); structPtr->loopedTaskId = CreateLoopedTask(sub_81CF11C, 1);
structPtr->unk18 = 0; structPtr->unk18 = 0;
structPtr->unk14 = gUnknown_086233A0[sub_81C76AC()]; structPtr->unk14 = gUnknown_086233A0[GetSelectedConditionSearch()];
return TRUE; return TRUE;
} }
@ -143,7 +143,7 @@ bool32 PokenavCallback_Init_10(void)
structPtr->unkPtr = GetSubstructPtr(18); structPtr->unkPtr = GetSubstructPtr(18);
structPtr->unk0 = sub_81CF030; structPtr->unk0 = sub_81CF030;
structPtr->unk18 = 1; structPtr->unk18 = 1;
structPtr->unk14 = gUnknown_086233A0[sub_81C76AC()]; structPtr->unk14 = gUnknown_086233A0[GetSelectedConditionSearch()];
return TRUE; return TRUE;
} }
@ -443,7 +443,7 @@ static u32 sub_81CF418(s32 state)
HideBg(3); HideBg(3);
if (!unk->unkC) if (!unk->unkC)
{ {
u8 r4 = sub_81C76AC() + 8; u8 r4 = GetSelectedConditionSearch() + POKENAV_MENUITEM_CONDITION_SEARCH_COOL;
LoadLeftHeaderGfxForIndex(r4); LoadLeftHeaderGfxForIndex(r4);
sub_81C7FA0(r4, 1, 0); sub_81C7FA0(r4, 1, 0);
sub_81C7FA0(1, 1, 0); sub_81C7FA0(1, 1, 0);
@ -673,13 +673,16 @@ static void sub_81CF8E4(struct PokenavMonList * item, u8 * dest)
u8 level; u8 level;
u8 * s; u8 * s;
const u8 * genderStr; const u8 * genderStr;
if (item->boxId == 14)
// Mon is in party
if (item->boxId == TOTAL_BOXES_COUNT)
{ {
struct Pokemon * mon = &gPlayerParty[item->monId]; struct Pokemon * mon = &gPlayerParty[item->monId];
gender = GetMonGender(mon); gender = GetMonGender(mon);
level = GetLevelFromMonExp(mon); level = GetLevelFromMonExp(mon);
GetMonData(mon, MON_DATA_NICKNAME, gStringVar3); GetMonData(mon, MON_DATA_NICKNAME, gStringVar3);
} }
// Mon is in PC
else else
{ {
struct BoxPokemon * mon = GetBoxedMonPtr(item->boxId, item->monId); struct BoxPokemon * mon = GetBoxedMonPtr(item->boxId, item->monId);
@ -687,24 +690,25 @@ static void sub_81CF8E4(struct PokenavMonList * item, u8 * dest)
level = GetLevelFromBoxMonExp(mon); level = GetLevelFromBoxMonExp(mon);
GetBoxMonData(mon, MON_DATA_NICKNAME, gStringVar3); GetBoxMonData(mon, MON_DATA_NICKNAME, gStringVar3);
} }
StringGetEnd10(gStringVar3); StringGetEnd10(gStringVar3);
dest = sub_81DB494(dest, 1, gStringVar3, 60); dest = sub_81DB494(dest, 1, gStringVar3, 60);
switch (gender) switch (gender)
{ {
default: default:
genderStr = gUnknown_086235D4; genderStr = sText_NoGenderSymbol;
break; break;
case MON_MALE: case MON_MALE:
genderStr = gUnknown_086235BC; genderStr = sText_MaleSymbol;
break; break;
case MON_FEMALE: case MON_FEMALE:
genderStr = gUnknown_086235C8; genderStr = sText_FemaleSymbol;
break; break;
} }
s = StringCopy(gStringVar1, genderStr); s = StringCopy(gStringVar1, genderStr);
*s++ = CHAR_SLASH; *s++ = CHAR_SLASH;
*s++ = CHAR_SPECIAL_F9; *s++ = CHAR_SPECIAL_F9;
*s++ = 5; // LV *s++ = CHAR_LV_2;
ConvertIntToDecimalStringN(s, level, STR_CONV_MODE_LEFT_ALIGN, 3); ConvertIntToDecimalStringN(s, level, STR_CONV_MODE_LEFT_ALIGN, 3);
sub_81DB494(dest, 1, gStringVar1, 40); sub_81DB494(dest, 1, gStringVar1, 40);
} }

View File

@ -50,7 +50,7 @@ static void sub_81D02B0(s32 windowId, s32 val1, s32 val2);
static void sub_81D024C(struct PokenavSub10 *ptr); static void sub_81D024C(struct PokenavSub10 *ptr);
static void sub_81D0288(struct PokenavSub10 *ptr); static void sub_81D0288(struct PokenavSub10 *ptr);
static void sub_81D0304(void); static void sub_81D0304(void);
static void sub_81D035C(struct PokenavMonList *, u8 *); static void BufferRibbonMonInfoText(struct PokenavMonList *, u8 *);
static const LoopedTask gUnknown_086235D8[] = static const LoopedTask gUnknown_086235D8[] =
{ {
@ -107,9 +107,9 @@ static const struct WindowTemplate gUnknown_086237D4 =
.baseBlock = 20 .baseBlock = 20
}; };
static const u8 gUnknown_086237DC[] = _("{COLOR_HIGHLIGHT_SHADOW}{LIGHT_RED}{WHITE}{GREEN}♂{COLOR_HIGHLIGHT_SHADOW}{DARK_GREY}{WHITE}{LIGHT_GREY}"); static const u8 sText_MaleSymbol[] = _("{COLOR_HIGHLIGHT_SHADOW}{LIGHT_RED}{WHITE}{GREEN}♂{COLOR_HIGHLIGHT_SHADOW}{DARK_GREY}{WHITE}{LIGHT_GREY}");
static const u8 gUnknown_086237E8[] = _("{COLOR_HIGHLIGHT_SHADOW}{LIGHT_GREEN}{WHITE}{BLUE}♀{COLOR_HIGHLIGHT_SHADOW}{DARK_GREY}{WHITE}{LIGHT_GREY}"); static const u8 sText_FemaleSymbol[] = _("{COLOR_HIGHLIGHT_SHADOW}{LIGHT_GREEN}{WHITE}{BLUE}♀{COLOR_HIGHLIGHT_SHADOW}{DARK_GREY}{WHITE}{LIGHT_GREY}");
static const u8 gUnknown_086237F4[] = _("{UNK_SPACER}"); static const u8 sText_NoGenderSymbol[] = _("{UNK_SPACER}");
bool32 PokenavCallback_Init_12(void) bool32 PokenavCallback_Init_12(void)
{ {
@ -188,12 +188,12 @@ static u32 sub_81CFA88(struct PokenavSub9 *structPtr)
static u32 sub_81CFB08(struct PokenavSub9 *structPtr) static u32 sub_81CFB08(struct PokenavSub9 *structPtr)
{ {
return 100005; return POKENAV_MENU_5;
} }
static u32 sub_81CFB10(struct PokenavSub9 *structPtr) static u32 sub_81CFB10(struct PokenavSub9 *structPtr)
{ {
return 100013; return POKENAV_MENU_D;
} }
static u32 sub_81CFB18(void) static u32 sub_81CFB18(void)
@ -660,7 +660,7 @@ static void sub_81D02B0(s32 windowId, s32 val1, s32 val2)
*ptr++ = CHAR_SLASH; *ptr++ = CHAR_SLASH;
ConvertIntToDecimalStringN(ptr, val2, STR_CONV_MODE_RIGHT_ALIGN, 3); ConvertIntToDecimalStringN(ptr, val2, STR_CONV_MODE_RIGHT_ALIGN, 3);
x = GetStringCenterAlignXOffset(1, strbuf, 56); x = GetStringCenterAlignXOffset(1, strbuf, 56);
AddTextPrinterParameterized(windowId, 1, strbuf,x, 1, 0xFF, NULL); AddTextPrinterParameterized(windowId, 1, strbuf, x, 1, 0xFF, NULL);
} }
static void sub_81D0304(void) static void sub_81D0304(void)
@ -676,18 +676,21 @@ static void sub_81D0304(void)
template.unkC = 8; template.unkC = 8;
template.unkD = 2; template.unkD = 2;
template.unkE = 1; template.unkE = 1;
template.listFunc.unk10_1 = sub_81D035C; template.listFunc.unk10_1 = BufferRibbonMonInfoText;
template.unk14 = NULL; template.unk14 = NULL;
sub_81C81D4(&gUnknown_086237B0[1], &template, 0); sub_81C81D4(&gUnknown_086237B0[1], &template, 0);
} }
static void sub_81D035C(struct PokenavMonList * item0, u8 * dest) // Buffers the "Nickname gender/level" text for the ribbon mon list
static void BufferRibbonMonInfoText(struct PokenavMonList * item0, u8 * dest)
{ {
u8 gender; u8 gender;
u8 level; u8 level;
u8 * s; u8 * s;
const u8 * genderStr; const u8 * genderStr;
struct PokenavMonList * item = item0; struct PokenavMonList * item = item0;
// Mon is in party
if (item->boxId == TOTAL_BOXES_COUNT) if (item->boxId == TOTAL_BOXES_COUNT)
{ {
struct Pokemon * mon = &gPlayerParty[item->monId]; struct Pokemon * mon = &gPlayerParty[item->monId];
@ -695,6 +698,7 @@ static void sub_81D035C(struct PokenavMonList * item0, u8 * dest)
level = GetLevelFromMonExp(mon); level = GetLevelFromMonExp(mon);
GetMonData(mon, MON_DATA_NICKNAME, gStringVar3); GetMonData(mon, MON_DATA_NICKNAME, gStringVar3);
} }
// Mon is in PC
else else
{ {
struct BoxPokemon * mon = GetBoxedMonPtr(item->boxId, item->monId); struct BoxPokemon * mon = GetBoxedMonPtr(item->boxId, item->monId);
@ -702,24 +706,26 @@ static void sub_81D035C(struct PokenavMonList * item0, u8 * dest)
level = GetLevelFromBoxMonExp(mon); level = GetLevelFromBoxMonExp(mon);
GetBoxMonData(mon, MON_DATA_NICKNAME, gStringVar3); GetBoxMonData(mon, MON_DATA_NICKNAME, gStringVar3);
} }
StringGetEnd10(gStringVar3); StringGetEnd10(gStringVar3);
dest = sub_81DB494(dest, 1, gStringVar3, 60); dest = sub_81DB494(dest, 1, gStringVar3, 60);
switch (gender) switch (gender)
{ {
default: default:
genderStr = gUnknown_086237F4; genderStr = sText_NoGenderSymbol;
break; break;
case MON_MALE: case MON_MALE:
genderStr = gUnknown_086237DC; genderStr = sText_MaleSymbol;
break; break;
case MON_FEMALE: case MON_FEMALE:
genderStr = gUnknown_086237E8; genderStr = sText_FemaleSymbol;
break; break;
} }
s = StringCopy(gStringVar1, genderStr); s = StringCopy(gStringVar1, genderStr);
*s++ = CHAR_SLASH; *s++ = CHAR_SLASH;
*s++ = CHAR_SPECIAL_F9; *s++ = CHAR_SPECIAL_F9;
*s++ = 5; // LV *s++ = CHAR_LV_2;
ConvertIntToDecimalStringN(s, level, STR_CONV_MODE_LEFT_ALIGN, 3); ConvertIntToDecimalStringN(s, level, STR_CONV_MODE_LEFT_ALIGN, 3);
dest = sub_81DB494(dest, 1, gStringVar1, 54); dest = sub_81DB494(dest, 1, gStringVar1, 54);
ConvertIntToDecimalStringN(dest, item->data, STR_CONV_MODE_RIGHT_ALIGN, 2); ConvertIntToDecimalStringN(dest, item->data, STR_CONV_MODE_RIGHT_ALIGN, 2);