From 462acaa7dc343c0eb864bd9c451ed8a8690fcf33 Mon Sep 17 00:00:00 2001 From: PikalaxALT Date: Sat, 1 Feb 2020 12:04:51 -0500 Subject: sCombinedMoves --- src/pokemon.c | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) (limited to 'src') diff --git a/src/pokemon.c b/src/pokemon.c index 6dd09902d..040b342d2 100644 --- a/src/pokemon.c +++ b/src/pokemon.c @@ -73,7 +73,21 @@ EWRAM_DATA struct Unknown_806F160_Struct *gUnknown_020249B4[2] = {NULL}; // const rom data #include "data/battle_moves.h" -static const u8 sUnreferencedData[] = {0x34, 0x00, 0x10, 0x00, 0x01, 0x01, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00}; + +// Used in an unreferenced function in RS. +// Unreferenced here and in FRLG. +struct CombinedMove +{ + u16 move1; + u16 move2; + u16 newMove; +}; + +static const struct CombinedMove sCombinedMoves[2] = +{ + {MOVE_EMBER, MOVE_GUST, MOVE_HEAT_WAVE}, + {0xFFFF, 0xFFFF, 0xFFFF} +}; #define SPECIES_TO_HOENN(name) [SPECIES_##name - 1] = HOENN_DEX_##name #define SPECIES_TO_NATIONAL(name) [SPECIES_##name - 1] = NATIONAL_DEX_##name -- cgit v1.2.3 From 0bd9639478d25f6daa8d0b9bfd722d56059ab579 Mon Sep 17 00:00:00 2001 From: Sebastian Gabl Date: Tue, 4 Feb 2020 12:24:39 +0100 Subject: Name Wally struct and use bag macros --- src/item_menu.c | 34 +++++++++++++++++----------------- 1 file changed, 17 insertions(+), 17 deletions(-) (limited to 'src') diff --git a/src/item_menu.c b/src/item_menu.c index eef006545..0b62649c2 100755 --- a/src/item_menu.c +++ b/src/item_menu.c @@ -432,8 +432,8 @@ struct ListBuffer2 { }; struct TempWallyStruct { - struct ItemSlot bagPocket_Items[30]; - struct ItemSlot bagPocket_PokeBalls[16]; + struct ItemSlot bagPocket_Items[BAG_ITEMS_COUNT]; + struct ItemSlot bagPocket_PokeBalls[BAG_POKEBALLS_COUNT]; u16 cursorPosition[POCKETS_COUNT]; u16 scrollPosition[POCKETS_COUNT]; u8 filler[0x2]; @@ -445,7 +445,7 @@ EWRAM_DATA struct BagStruct gBagPositionStruct = {0}; static EWRAM_DATA struct ListBuffer1 *sListBuffer1 = 0; static EWRAM_DATA struct ListBuffer2 *sListBuffer2 = 0; EWRAM_DATA u16 gSpecialVar_ItemId = 0; -static EWRAM_DATA struct TempWallyStruct *gUnknown_0203CE80 = 0; +static EWRAM_DATA struct TempWallyStruct *gTempWallyBag = 0; extern u8 *const gPocketNamesStringsTable[]; extern u8* gReturnToXStringsTable[]; @@ -2130,17 +2130,17 @@ void PrepareBagForWallyTutorial(void) { u32 i; - gUnknown_0203CE80 = AllocZeroed(sizeof(struct TempWallyStruct)); - memcpy(gUnknown_0203CE80->bagPocket_Items, gSaveBlock1Ptr->bagPocket_Items, sizeof(gSaveBlock1Ptr->bagPocket_Items)); - memcpy(gUnknown_0203CE80->bagPocket_PokeBalls, gSaveBlock1Ptr->bagPocket_PokeBalls, sizeof(gSaveBlock1Ptr->bagPocket_PokeBalls)); - gUnknown_0203CE80->pocket = gBagPositionStruct.pocket; + gTempWallyBag = AllocZeroed(sizeof(struct TempWallyStruct)); + memcpy(gTempWallyBag->bagPocket_Items, gSaveBlock1Ptr->bagPocket_Items, sizeof(gSaveBlock1Ptr->bagPocket_Items)); + memcpy(gTempWallyBag->bagPocket_PokeBalls, gSaveBlock1Ptr->bagPocket_PokeBalls, sizeof(gSaveBlock1Ptr->bagPocket_PokeBalls)); + gTempWallyBag->pocket = gBagPositionStruct.pocket; for (i = 0; i <= 4; i++) { - gUnknown_0203CE80->cursorPosition[i] = gBagPositionStruct.cursorPosition[i]; - gUnknown_0203CE80->scrollPosition[i] = gBagPositionStruct.scrollPosition[i]; + gTempWallyBag->cursorPosition[i] = gBagPositionStruct.cursorPosition[i]; + gTempWallyBag->scrollPosition[i] = gBagPositionStruct.scrollPosition[i]; } - ClearItemSlots(gSaveBlock1Ptr->bagPocket_Items, 30); - ClearItemSlots(gSaveBlock1Ptr->bagPocket_PokeBalls, 16); + ClearItemSlots(gSaveBlock1Ptr->bagPocket_Items, BAG_ITEMS_COUNT); + ClearItemSlots(gSaveBlock1Ptr->bagPocket_PokeBalls, BAG_POKEBALLS_COUNT); ResetBagScrollPositions(); } @@ -2148,15 +2148,15 @@ void RestoreBagAfterWallyTutorial(void) { u32 i; - memcpy(gSaveBlock1Ptr->bagPocket_Items, gUnknown_0203CE80->bagPocket_Items, sizeof(gUnknown_0203CE80->bagPocket_Items)); - memcpy(gSaveBlock1Ptr->bagPocket_PokeBalls, gUnknown_0203CE80->bagPocket_PokeBalls, sizeof(gUnknown_0203CE80->bagPocket_PokeBalls)); - gBagPositionStruct.pocket = gUnknown_0203CE80->pocket; + memcpy(gSaveBlock1Ptr->bagPocket_Items, gTempWallyBag->bagPocket_Items, sizeof(gTempWallyBag->bagPocket_Items)); + memcpy(gSaveBlock1Ptr->bagPocket_PokeBalls, gTempWallyBag->bagPocket_PokeBalls, sizeof(gTempWallyBag->bagPocket_PokeBalls)); + gBagPositionStruct.pocket = gTempWallyBag->pocket; for (i = 0; i <= 4; i++) { - gBagPositionStruct.cursorPosition[i] = gUnknown_0203CE80->cursorPosition[i]; - gBagPositionStruct.scrollPosition[i] = gUnknown_0203CE80->scrollPosition[i]; + gBagPositionStruct.cursorPosition[i] = gTempWallyBag->cursorPosition[i]; + gBagPositionStruct.scrollPosition[i] = gTempWallyBag->scrollPosition[i]; } - Free(gUnknown_0203CE80); + Free(gTempWallyBag); } void DoWallyTutorialBagMenu(void) -- cgit v1.2.3 From 0cf84d13ef15b5f317e62bd33dd55c4cad1362ed Mon Sep 17 00:00:00 2001 From: Sebastian Gabl Date: Tue, 4 Feb 2020 12:42:25 +0100 Subject: Use correct prefix --- src/item_menu.c | 26 +++++++++++++------------- 1 file changed, 13 insertions(+), 13 deletions(-) (limited to 'src') diff --git a/src/item_menu.c b/src/item_menu.c index 0b62649c2..a195488c6 100755 --- a/src/item_menu.c +++ b/src/item_menu.c @@ -445,7 +445,7 @@ EWRAM_DATA struct BagStruct gBagPositionStruct = {0}; static EWRAM_DATA struct ListBuffer1 *sListBuffer1 = 0; static EWRAM_DATA struct ListBuffer2 *sListBuffer2 = 0; EWRAM_DATA u16 gSpecialVar_ItemId = 0; -static EWRAM_DATA struct TempWallyStruct *gTempWallyBag = 0; +static EWRAM_DATA struct TempWallyStruct *sTempWallyBag = 0; extern u8 *const gPocketNamesStringsTable[]; extern u8* gReturnToXStringsTable[]; @@ -2130,14 +2130,14 @@ void PrepareBagForWallyTutorial(void) { u32 i; - gTempWallyBag = AllocZeroed(sizeof(struct TempWallyStruct)); - memcpy(gTempWallyBag->bagPocket_Items, gSaveBlock1Ptr->bagPocket_Items, sizeof(gSaveBlock1Ptr->bagPocket_Items)); - memcpy(gTempWallyBag->bagPocket_PokeBalls, gSaveBlock1Ptr->bagPocket_PokeBalls, sizeof(gSaveBlock1Ptr->bagPocket_PokeBalls)); - gTempWallyBag->pocket = gBagPositionStruct.pocket; + sTempWallyBag = AllocZeroed(sizeof(struct TempWallyStruct)); + memcpy(sTempWallyBag->bagPocket_Items, gSaveBlock1Ptr->bagPocket_Items, sizeof(gSaveBlock1Ptr->bagPocket_Items)); + memcpy(sTempWallyBag->bagPocket_PokeBalls, gSaveBlock1Ptr->bagPocket_PokeBalls, sizeof(gSaveBlock1Ptr->bagPocket_PokeBalls)); + sTempWallyBag->pocket = gBagPositionStruct.pocket; for (i = 0; i <= 4; i++) { - gTempWallyBag->cursorPosition[i] = gBagPositionStruct.cursorPosition[i]; - gTempWallyBag->scrollPosition[i] = gBagPositionStruct.scrollPosition[i]; + sTempWallyBag->cursorPosition[i] = gBagPositionStruct.cursorPosition[i]; + sTempWallyBag->scrollPosition[i] = gBagPositionStruct.scrollPosition[i]; } ClearItemSlots(gSaveBlock1Ptr->bagPocket_Items, BAG_ITEMS_COUNT); ClearItemSlots(gSaveBlock1Ptr->bagPocket_PokeBalls, BAG_POKEBALLS_COUNT); @@ -2148,15 +2148,15 @@ void RestoreBagAfterWallyTutorial(void) { u32 i; - memcpy(gSaveBlock1Ptr->bagPocket_Items, gTempWallyBag->bagPocket_Items, sizeof(gTempWallyBag->bagPocket_Items)); - memcpy(gSaveBlock1Ptr->bagPocket_PokeBalls, gTempWallyBag->bagPocket_PokeBalls, sizeof(gTempWallyBag->bagPocket_PokeBalls)); - gBagPositionStruct.pocket = gTempWallyBag->pocket; + memcpy(gSaveBlock1Ptr->bagPocket_Items, sTempWallyBag->bagPocket_Items, sizeof(sTempWallyBag->bagPocket_Items)); + memcpy(gSaveBlock1Ptr->bagPocket_PokeBalls, sTempWallyBag->bagPocket_PokeBalls, sizeof(sTempWallyBag->bagPocket_PokeBalls)); + gBagPositionStruct.pocket = sTempWallyBag->pocket; for (i = 0; i <= 4; i++) { - gBagPositionStruct.cursorPosition[i] = gTempWallyBag->cursorPosition[i]; - gBagPositionStruct.scrollPosition[i] = gTempWallyBag->scrollPosition[i]; + gBagPositionStruct.cursorPosition[i] = sTempWallyBag->cursorPosition[i]; + gBagPositionStruct.scrollPosition[i] = sTempWallyBag->scrollPosition[i]; } - Free(gTempWallyBag); + Free(sTempWallyBag); } void DoWallyTutorialBagMenu(void) -- cgit v1.2.3 From be5d4172367a29450e252be9e38bd51a47b0305d Mon Sep 17 00:00:00 2001 From: GriffinR Date: Sat, 1 Feb 2020 00:25:50 -0500 Subject: Document some pokenav menu handlers --- src/battle_script_commands.c | 2 +- src/menu_specialized.c | 2 +- src/pokemon_storage_system.c | 2 +- src/pokenav.c | 30 ++-- src/pokenav_unk_1.c | 417 ++++++++++++++++++++++++------------------- src/pokenav_unk_10.c | 12 +- src/pokenav_unk_2.c | 280 +++++++++++++++-------------- src/pokenav_unk_4.c | 2 +- src/pokenav_unk_6.c | 2 +- src/pokenav_unk_8.c | 26 +-- src/pokenav_unk_9.c | 32 ++-- 11 files changed, 437 insertions(+), 370 deletions(-) (limited to 'src') diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index 8924c6729..b6dd292f8 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -6351,7 +6351,7 @@ static void PutLevelAndGenderOnLvlUpBox(void) txtPtr = gStringVar4; gStringVar4[0] = CHAR_SPECIAL_F9; txtPtr++; - txtPtr[0] = 5; + txtPtr[0] = CHAR_LV_2; txtPtr++; var = (u32)(txtPtr); diff --git a/src/menu_specialized.c b/src/menu_specialized.c index 252bb7604..d1b00f883 100644 --- a/src/menu_specialized.c +++ b/src/menu_specialized.c @@ -955,7 +955,7 @@ static u8 *sub_81D2CD0(u8 *dst, u16 boxId, u16 monId) *(str++) = 9; *(str++) = CHAR_SLASH; *(str++) = CHAR_SPECIAL_F9; - *(str++) = 5; + *(str++) = CHAR_LV_2; str = ConvertIntToDecimalStringN(str, level, STR_CONV_MODE_LEFT_ALIGN, 3); *(str++) = CHAR_SPACE; *str = EOS; diff --git a/src/pokemon_storage_system.c b/src/pokemon_storage_system.c index 4ccb39ce2..f5a013209 100644 --- a/src/pokemon_storage_system.c +++ b/src/pokemon_storage_system.c @@ -6898,7 +6898,7 @@ static void SetCursorMonData(void *pokemon, u8 mode) *(txtPtr++) = 3; *(txtPtr++) = 0; *(txtPtr++) = CHAR_SPECIAL_F9; - *(txtPtr++) = 5; + *(txtPtr++) = CHAR_LV_2; txtPtr = ConvertIntToDecimalStringN(txtPtr, sPSSData->cursorMonLevel, STR_CONV_MODE_LEFT_ALIGN, 3); txtPtr[0] = CHAR_SPACE; diff --git a/src/pokenav.c b/src/pokenav.c index a7b7c95a3..03b29ab0b 100644 --- a/src/pokenav.c +++ b/src/pokenav.c @@ -21,7 +21,7 @@ struct PokenavResources u32 (*currentMenuCb1)(void); u32 currentMenuIndex; u16 mode; - u16 fieldA; + u16 conditionSearchId; bool32 hasAnyRibbons; void *field10[SUBSTRUCT_COUNT]; }; @@ -57,7 +57,7 @@ const struct UnknownPokenavCallbackStruct PokenavMenuCallbacks[15] = .unk0 = PokenavCallback_Init_0, .unk4 = sub_81C941C, .unk8 = sub_81C9924, - .unkC = sub_81C9990, + .unkC = CreateMenuHandlerLoopedTask, .unk10 = sub_81C99C0, .unk14 = sub_81C9430, .unk18 = sub_81C99D4, @@ -66,7 +66,7 @@ const struct UnknownPokenavCallbackStruct PokenavMenuCallbacks[15] = .unk0 = PokenavCallback_Init_0, .unk4 = sub_81C941C, .unk8 = sub_81C9940, - .unkC = sub_81C9990, + .unkC = CreateMenuHandlerLoopedTask, .unk10 = sub_81C99C0, .unk14 = sub_81C9430, .unk18 = sub_81C99D4, @@ -75,7 +75,7 @@ const struct UnknownPokenavCallbackStruct PokenavMenuCallbacks[15] = .unk0 = PokenavCallback_Init_2, .unk4 = sub_81C941C, .unk8 = sub_81C9940, - .unkC = sub_81C9990, + .unkC = CreateMenuHandlerLoopedTask, .unk10 = sub_81C99C0, .unk14 = sub_81C9430, .unk18 = sub_81C99D4, @@ -84,7 +84,7 @@ const struct UnknownPokenavCallbackStruct PokenavMenuCallbacks[15] = .unk0 = PokenavCallback_Init_3, .unk4 = sub_81C941C, .unk8 = sub_81C9940, - .unkC = sub_81C9990, + .unkC = CreateMenuHandlerLoopedTask, .unk10 = sub_81C99C0, .unk14 = sub_81C9430, .unk18 = sub_81C99D4, @@ -93,7 +93,7 @@ const struct UnknownPokenavCallbackStruct PokenavMenuCallbacks[15] = .unk0 = PokenavCallback_Init_4, .unk4 = sub_81C941C, .unk8 = sub_81C9940, - .unkC = sub_81C9990, + .unkC = CreateMenuHandlerLoopedTask, .unk10 = sub_81C99C0, .unk14 = sub_81C9430, .unk18 = sub_81C99D4, @@ -102,7 +102,7 @@ const struct UnknownPokenavCallbackStruct PokenavMenuCallbacks[15] = .unk0 = PokenavCallback_Init_5, .unk4 = sub_81C941C, .unk8 = sub_81C9940, - .unkC = sub_81C9990, + .unkC = CreateMenuHandlerLoopedTask, .unk10 = sub_81C99C0, .unk14 = sub_81C9430, .unk18 = sub_81C99D4, @@ -156,7 +156,7 @@ const struct UnknownPokenavCallbackStruct PokenavMenuCallbacks[15] = .unk0 = PokenavCallback_Init_11, .unk4 = sub_81CAB24, .unk8 = sub_81CB260, - .unkC = sub_81CB29C, + .unkC = CreateMatchCallLoopedTask, .unk10 = sub_81CB2CC, .unk14 = sub_81CAB38, .unk18 = sub_81CB2E0, @@ -554,18 +554,18 @@ void SetPokenavMode(u16 mode) gPokenavResources->mode = mode; } -void sub_81C7694(u32 a0) +void SetSelectedConditionSearch(u32 cursorPos) { - u32 value = a0; + u32 searchId = cursorPos; - if (value > 4) - value = 0; - gPokenavResources->fieldA = value; + if (searchId > POKENAV_MENUITEM_CONDITION_SEARCH_TOUGH - POKENAV_MENUITEM_CONDITION_SEARCH_COOL) + searchId = 0; + gPokenavResources->conditionSearchId = searchId; } -u32 sub_81C76AC(void) +u32 GetSelectedConditionSearch(void) { - return gPokenavResources->fieldA; + return gPokenavResources->conditionSearchId; } bool32 CanViewRibbonsMenu(void) diff --git a/src/pokenav_unk_1.c b/src/pokenav_unk_1.c index 8bf3ebd2a..44176176d 100644 --- a/src/pokenav_unk_1.c +++ b/src/pokenav_unk_1.c @@ -9,50 +9,92 @@ struct Pokenav1Struct { u16 menuType; s16 cursorPos; - u16 descriptionId; + u16 currMenuItem; u16 helpBarIndex; u32 unk8; u32 (*callback)(struct Pokenav1Struct*); }; -static bool32 sub_81C9814(struct Pokenav1Struct *a0); -static void sub_81C97F8(struct Pokenav1Struct *a0); -static void sub_81C97C0(struct Pokenav1Struct *a0); -static u32 sub_81C97BC(struct Pokenav1Struct *a0); -static void sub_81C97B0(struct Pokenav1Struct *a0, u32 a1); -static u32 sub_81C97A4(struct Pokenav1Struct *a0); -static u32 sub_81C9798(struct Pokenav1Struct *a0); -static u32 sub_81C96FC(struct Pokenav1Struct *a0); -static u32 sub_81C963C(struct Pokenav1Struct *a0); -static u32 sub_81C9600(struct Pokenav1Struct *a0); -static u32 sub_81C9588(struct Pokenav1Struct *a0); -static u32 sub_81C9520(struct Pokenav1Struct *a0); -static u32 sub_81C943C(struct Pokenav1Struct *a0); -static u32 (*sub_81C93EC(void))(struct Pokenav1Struct*); -static void sub_81C939C(struct Pokenav1Struct *state); - -static const u8 sLastCursorPositions[] = {2, 3, 4, 2, 5}; - -static const u8 sDescriptionIds[][6] = +static bool32 UpdateMenuCursorPos(struct Pokenav1Struct *state); +static void ReturnToConditionMenu(struct Pokenav1Struct *state); +static void ReturnToMainMenu(struct Pokenav1Struct *state); +static u32 sub_81C97BC(struct Pokenav1Struct *state); +static void sub_81C97B0(struct Pokenav1Struct *state, u32 a1); +static u32 CB2_ReturnToConditionMenu(struct Pokenav1Struct *state); +static u32 CB2_ReturnToMainMenu(struct Pokenav1Struct *state); +static u32 HandleConditionSearchMenuInput(struct Pokenav1Struct *state); +static u32 HandleConditionMenuInput(struct Pokenav1Struct *state); +static u32 HandleCantOpenRibbonsInput(struct Pokenav1Struct *state); +static u32 HandleMainMenuInputEndTutorial(struct Pokenav1Struct *state); +static u32 HandleMainMenuInputTutorial(struct Pokenav1Struct *state); +static u32 HandleMainMenuInput(struct Pokenav1Struct *state); +static u32 (*GetMainMenuInputHandler(void))(struct Pokenav1Struct*); +static void SetMenuInputHandler(struct Pokenav1Struct *state); + +// Number of entries - 1 for that menu type +static const u8 sLastCursorPositions[] = { - { 0, 1, 4, 4, 4, 4 }, - { 0, 1, 2, 4, 4, 4 }, - { 0, 1, 2, 3, 4, 4 }, - { 5, 6, 7, 4, 4, 4 }, - { 8, 9, 10, 11, 12, 13 }, + [POKENAV_MENU_TYPE_DEFAULT] = 2, + [POKENAV_MENU_TYPE_UNLOCK_MC] = 3, + [POKENAV_MENU_TYPE_UNLOCK_MC_RIBBONS] = 4, + [POKENAV_MENU_TYPE_CONDITION] = 2, + [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) { - u8 retVal = 0; + u8 menuType = POKENAV_MENU_TYPE_DEFAULT; + if (FlagGet(FLAG_ADDED_MATCH_CALL_TO_POKENAV)) { - retVal = 1; + menuType = POKENAV_MENU_TYPE_UNLOCK_MC; + if (FlagGet(FLAG_SYS_RIBBON_GET)) - retVal = 2; + menuType = POKENAV_MENU_TYPE_UNLOCK_MC_RIBBONS; } - return retVal; + return menuType; } bool32 PokenavCallback_Init_0(void) @@ -63,9 +105,9 @@ bool32 PokenavCallback_Init_0(void) state->menuType = GetPokenavMainMenuType(); state->cursorPos = 0; - state->descriptionId = 0; + state->currMenuItem = POKENAV_MENUITEM_MAP; state->helpBarIndex = HELPBAR_NONE; - sub_81C939C(state); + SetMenuInputHandler(state); return TRUE; } @@ -77,9 +119,9 @@ bool32 PokenavCallback_Init_4(void) state->menuType = GetPokenavMainMenuType(); state->cursorPos = 2; - state->descriptionId = 2; + state->currMenuItem = POKENAV_MENUITEM_MATCH_CALL; state->helpBarIndex = HELPBAR_NONE; - sub_81C939C(state); + SetMenuInputHandler(state); return TRUE; } @@ -91,8 +133,8 @@ bool32 PokenavCallback_Init_5(void) state->menuType = GetPokenavMainMenuType(); state->cursorPos = 3; - state->descriptionId = 3; - sub_81C939C(state); + state->currMenuItem = POKENAV_MENUITEM_RIBBONS; + SetMenuInputHandler(state); return TRUE; } @@ -102,11 +144,11 @@ bool32 PokenavCallback_Init_2(void) if (!state) return FALSE; - state->menuType = 3; + state->menuType = POKENAV_MENU_TYPE_CONDITION; state->cursorPos = 0; - state->descriptionId = 5; + state->currMenuItem = POKENAV_MENUITEM_CONDITION_PARTY; state->helpBarIndex = HELPBAR_NONE; - sub_81C939C(state); + SetMenuInputHandler(state); return TRUE; } @@ -116,45 +158,45 @@ bool32 PokenavCallback_Init_3(void) if (!state) return FALSE; - state->menuType = 4; - state->cursorPos = sub_81C76AC(); - state->descriptionId = state->cursorPos + 8; + state->menuType = POKENAV_MENU_TYPE_CONDITION_SEARCH; + state->cursorPos = GetSelectedConditionSearch(); + state->currMenuItem = state->cursorPos + POKENAV_MENUITEM_CONDITION_SEARCH_COOL; state->helpBarIndex = HELPBAR_NONE; - sub_81C939C(state); + SetMenuInputHandler(state); return TRUE; } -static void sub_81C939C(struct Pokenav1Struct *state) +static void SetMenuInputHandler(struct Pokenav1Struct *state) { switch (state->menuType) { - case 0: + case POKENAV_MENU_TYPE_DEFAULT: SetPokenavMode(POKENAV_MODE_NORMAL); // fallthrough - case 1: - case 2: - state->callback = sub_81C93EC(); + case POKENAV_MENU_TYPE_UNLOCK_MC: + case POKENAV_MENU_TYPE_UNLOCK_MC_RIBBONS: + state->callback = GetMainMenuInputHandler(); break; - case 3: - state->callback = sub_81C963C; + case POKENAV_MENU_TYPE_CONDITION: + state->callback = HandleConditionMenuInput; break; - case 4: - state->callback = sub_81C96FC; + case POKENAV_MENU_TYPE_CONDITION_SEARCH: + state->callback = HandleConditionSearchMenuInput; break; } } -static u32 (*sub_81C93EC(void))(struct Pokenav1Struct*) +static u32 (*GetMainMenuInputHandler(void))(struct Pokenav1Struct*) { switch (GetPokenavMode()) { default: case POKENAV_MODE_NORMAL: - return sub_81C943C; + return HandleMainMenuInput; case POKENAV_MODE_FORCE_CALL_READY: - return sub_81C9520; + return HandleMainMenuInputTutorial; case POKENAV_MODE_FORCE_CALL_EXIT: - return sub_81C9588; + return HandleMainMenuInputEndTutorial; } } @@ -169,42 +211,42 @@ void sub_81C9430(void) FreePokenavSubstruct(1); } -static u32 sub_81C943C(struct Pokenav1Struct *a0) +static u32 HandleMainMenuInput(struct Pokenav1Struct *state) { - if (sub_81C9814(a0)) - return 1; + if (UpdateMenuCursorPos(state)) + return POKENAV_MENU_FUNC_MOVE_CURSOR; if (gMain.newKeys & A_BUTTON) { - switch (sDescriptionIds[a0->menuType][a0->cursorPos]) + switch (sMenuItems[state->menuType][state->cursorPos]) { - case 0: - a0->helpBarIndex = gSaveBlock2Ptr->regionMapZoom ? HELPBAR_MAP_ZOOMED_IN : HELPBAR_MAP_ZOOMED_OUT; - sub_81C97B0(a0, POKENAV_MENU_6); - return 8; - case 1: - a0->menuType = 3; - a0->cursorPos = 0; - a0->descriptionId = sDescriptionIds[3][0]; - a0->callback = sub_81C963C; - return 2; - case 2: - a0->helpBarIndex = HELPBAR_MC_TRAINER_LIST; - sub_81C97B0(a0, POKENAV_MENU_B); - return 8; - case 3: + case POKENAV_MENUITEM_MAP: + state->helpBarIndex = gSaveBlock2Ptr->regionMapZoom ? HELPBAR_MAP_ZOOMED_IN : HELPBAR_MAP_ZOOMED_OUT; + sub_81C97B0(state, POKENAV_MENU_6); + return POKENAV_MENU_FUNC_OPEN_FEATURE; + case POKENAV_MENUITEM_CONDITION: + state->menuType = POKENAV_MENU_TYPE_CONDITION; + state->cursorPos = 0; + state->currMenuItem = sMenuItems[POKENAV_MENU_TYPE_CONDITION][0]; + state->callback = HandleConditionMenuInput; + return POKENAV_MENU_FUNC_OPEN_CONDITION; + case POKENAV_MENUITEM_MATCH_CALL: + state->helpBarIndex = HELPBAR_MC_TRAINER_LIST; + sub_81C97B0(state, POKENAV_MENU_B); + return POKENAV_MENU_FUNC_OPEN_FEATURE; + case POKENAV_MENUITEM_RIBBONS: if (CanViewRibbonsMenu()) { - a0->helpBarIndex = HELPBAR_RIBBONS_MON_LIST; - sub_81C97B0(a0, POKENAV_MENU_C); - return 8; + state->helpBarIndex = HELPBAR_RIBBONS_MON_LIST; + sub_81C97B0(state, POKENAV_MENU_C); + return POKENAV_MENU_FUNC_OPEN_FEATURE; } else { - a0->callback = sub_81C9600; - return 6; + state->callback = HandleCantOpenRibbonsInput; + return POKENAV_MENU_FUNC_NO_RIBBON_WINNERS; } - case 4: + case POKENAV_MENUITEM_SWITCH_OFF: return -1; } } @@ -212,56 +254,58 @@ static u32 sub_81C943C(struct Pokenav1Struct *a0) if (gMain.newKeys & B_BUTTON) 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)) - return 1; + if (UpdateMenuCursorPos(state)) + return POKENAV_MENU_FUNC_MOVE_CURSOR; 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; - sub_81C97B0(a0, POKENAV_MENU_B); - return 8; + state->helpBarIndex = HELPBAR_MC_TRAINER_LIST; + sub_81C97B0(state, POKENAV_MENU_B); + return POKENAV_MENU_FUNC_OPEN_FEATURE; } else { PlaySE(SE_HAZURE); - return 0; + return POKENAV_MENU_FUNC_NONE; } } if (gMain.newKeys & B_BUTTON) { 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)) - return 1; + if (UpdateMenuCursorPos(state)) + return POKENAV_MENU_FUNC_MOVE_CURSOR; if (gMain.newKeys & A_BUTTON) { - u32 v0 = sDescriptionIds[a0->menuType][a0->cursorPos]; - if (v0 != 2 && v0 != 4) + u32 menuItem = sMenuItems[state->menuType][state->cursorPos]; + if (menuItem != POKENAV_MENUITEM_MATCH_CALL && menuItem != POKENAV_MENUITEM_SWITCH_OFF) { 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; - sub_81C97B0(a0, POKENAV_MENU_B); - return 8; + state->helpBarIndex = HELPBAR_MC_TRAINER_LIST; + sub_81C97B0(state, POKENAV_MENU_B); + return POKENAV_MENU_FUNC_OPEN_FEATURE; } else { @@ -272,167 +316,168 @@ static u32 sub_81C9588(struct Pokenav1Struct *a0) { 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(); - return 1; + state->callback = GetMainMenuInputHandler(); + return POKENAV_MENU_FUNC_MOVE_CURSOR; } if (gMain.newKeys & (A_BUTTON | B_BUTTON)) { - a0->callback = sub_81C93EC(); - return 7; + state->callback = GetMainMenuInputHandler(); + 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 (v0) - return 1; + if (UpdateMenuCursorPos(state)) + return POKENAV_MENU_FUNC_MOVE_CURSOR; if (gMain.newKeys & A_BUTTON) { - switch (sDescriptionIds[a0->menuType][a0->cursorPos]) + switch (sMenuItems[state->menuType][state->cursorPos]) { - case 6: - a0->menuType = 4; - a0->cursorPos = v0; - a0->descriptionId = sDescriptionIds[4][0]; - a0->callback = sub_81C96FC; - return 4; - case 5: - a0->helpBarIndex = v0; - sub_81C97B0(a0, POKENAV_MENU_7); - return 8; - case 7: + case POKENAV_MENUITEM_CONDITION_SEARCH: + state->menuType = POKENAV_MENU_TYPE_CONDITION_SEARCH; + state->cursorPos = 0; + state->currMenuItem = sMenuItems[POKENAV_MENU_TYPE_CONDITION_SEARCH][0]; + state->callback = HandleConditionSearchMenuInput; + return POKENAV_MENU_FUNC_OPEN_CONDITION_SEARCH; + case POKENAV_MENUITEM_CONDITION_PARTY: + state->helpBarIndex = 0; + sub_81C97B0(state, POKENAV_MENU_7); + return POKENAV_MENU_FUNC_OPEN_FEATURE; + case POKENAV_MENUITEM_CONDITION_CANCEL: PlaySE(SE_SELECT); - sub_81C97C0(a0); - return 3; + ReturnToMainMenu(state); + return POKENAV_MENU_FUNC_RETURN_TO_MAIN; } } if (gMain.newKeys & B_BUTTON) { - if (a0->cursorPos != sLastCursorPositions[a0->menuType]) + if (state->cursorPos != sLastCursorPositions[state->menuType]) { - a0->cursorPos = sLastCursorPositions[a0->menuType]; - a0->callback = sub_81C9798; - return 1; + state->cursorPos = sLastCursorPositions[state->menuType]; + state->callback = CB2_ReturnToMainMenu; + return POKENAV_MENU_FUNC_MOVE_CURSOR; } else { PlaySE(SE_SELECT); - sub_81C97C0(a0); - return 3; + ReturnToMainMenu(state); + 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)) - return 1; + if (UpdateMenuCursorPos(state)) + return POKENAV_MENU_FUNC_MOVE_CURSOR; if (gMain.newKeys & A_BUTTON) { - u8 v0 = sDescriptionIds[a0->menuType][a0->cursorPos]; - if (v0 != 13) + u8 menuItem = sMenuItems[state->menuType][state->cursorPos]; + if (menuItem != POKENAV_MENUITEM_CONDITION_SEARCH_CANCEL) { - sub_81C7694(v0 - 8); - sub_81C97B0(a0, POKENAV_MENU_8); - a0->helpBarIndex = HELPBAR_CONDITION_MON_LIST; - return 8; + SetSelectedConditionSearch(menuItem - POKENAV_MENUITEM_CONDITION_SEARCH_COOL); + sub_81C97B0(state, POKENAV_MENU_8); + state->helpBarIndex = HELPBAR_CONDITION_MON_LIST; + return POKENAV_MENU_FUNC_OPEN_FEATURE; } else { PlaySE(SE_SELECT); - sub_81C97F8(a0); - return 5; + ReturnToConditionMenu(state); + return POKENAV_MENU_FUNC_RETURN_TO_CONDITION; } } if (gMain.newKeys & B_BUTTON) { - if (a0->cursorPos != sLastCursorPositions[a0->menuType]) + if (state->cursorPos != sLastCursorPositions[state->menuType]) { - a0->cursorPos = sLastCursorPositions[a0->menuType]; - a0->callback = sub_81C97A4; - return 1; + state->cursorPos = sLastCursorPositions[state->menuType]; + state->callback = CB2_ReturnToConditionMenu; + return POKENAV_MENU_FUNC_MOVE_CURSOR; } else { PlaySE(SE_SELECT); - sub_81C97F8(a0); - return 5; + ReturnToConditionMenu(state); + 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); - return 3; + ReturnToMainMenu(state); + return POKENAV_MENU_FUNC_RETURN_TO_MAIN; } -static u32 sub_81C97A4(struct Pokenav1Struct *a0) +static u32 CB2_ReturnToConditionMenu(struct Pokenav1Struct *state) { - sub_81C97F8(a0); - return 5; + ReturnToConditionMenu(state); + 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; - a0->callback = sub_81C97BC; + state->unk8 = a1; + 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(); - a0->cursorPos = 1; - a0->descriptionId = sDescriptionIds[a0->menuType][a0->cursorPos]; - a0->callback = sub_81C943C; + state->menuType = GetPokenavMainMenuType(); + state->cursorPos = 1; + state->currMenuItem = sMenuItems[state->menuType][state->cursorPos]; + state->callback = HandleMainMenuInput; } -static void sub_81C97F8(struct Pokenav1Struct *a0) +static void ReturnToConditionMenu(struct Pokenav1Struct *state) { - a0->menuType = 3; - a0->cursorPos = 1; - a0->descriptionId = sDescriptionIds[3][1]; - a0->callback = sub_81C963C; + state->menuType = POKENAV_MENU_TYPE_CONDITION; + state->cursorPos = 1; + state->currMenuItem = sMenuItems[POKENAV_MENU_TYPE_CONDITION][1]; + state->callback = HandleConditionMenuInput; } -static bool32 sub_81C9814(struct Pokenav1Struct *a0) +static bool32 UpdateMenuCursorPos(struct Pokenav1Struct *state) { if (gMain.newKeys & DPAD_UP) { - if (--a0->cursorPos < 0) - a0->cursorPos = sLastCursorPositions[a0->menuType]; + if (--state->cursorPos < 0) + state->cursorPos = sLastCursorPositions[state->menuType]; - a0->descriptionId = sDescriptionIds[a0->menuType][a0->cursorPos]; + state->currMenuItem = sMenuItems[state->menuType][state->cursorPos]; return TRUE; } else if (gMain.newKeys & DPAD_DOWN) { - a0->cursorPos++; - if (a0->cursorPos > sLastCursorPositions[a0->menuType]) - a0->cursorPos = 0; + state->cursorPos++; + if (state->cursorPos > sLastCursorPositions[state->menuType]) + state->cursorPos = 0; - a0->descriptionId = sDescriptionIds[a0->menuType][a0->cursorPos]; + state->currMenuItem = sMenuItems[state->menuType][state->cursorPos]; return TRUE; } else @@ -441,22 +486,24 @@ static bool32 sub_81C9814(struct Pokenav1Struct *a0) } } -int sub_81C9894(void) +int GetPokenavMenuType(void) { struct Pokenav1Struct *state = GetSubstructPtr(1); 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); return state->cursorPos; } -int sub_81C98B4(void) +// ID of menu item the cursor is currently on +int GetCurrentMenuItemId(void) { struct Pokenav1Struct *state = GetSubstructPtr(1); - return state->descriptionId; + return state->currMenuItem; } u16 GetHelpBarTextId(void) diff --git a/src/pokenav_unk_10.c b/src/pokenav_unk_10.c index 099843f83..2789b1244 100644 --- a/src/pokenav_unk_10.c +++ b/src/pokenav_unk_10.c @@ -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_08624078[] = INCBIN_U16("graphics/pokenav/ribbons_icon5.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 gUnknown_08624280[] = INCBIN_U32("graphics/pokenav/ribbons_icon_big.4bpp.lz"); +static const u32 sRibbonIconsSmall_Gfx[] = INCBIN_U32("graphics/pokenav/ribbons_icon.4bpp.lz"); +static const u32 sRibbonIconsBig_Gfx[] = INCBIN_U32("graphics/pokenav/ribbons_icon_big.4bpp.lz"); static const struct BgTemplate gUnknown_08624B98[] = { @@ -235,7 +235,7 @@ u32 sub_81D0548(struct PokenavSub13 *structPtr) u32 sub_81D05D4(struct PokenavSub13 *structPtr) { - return 100014; + return POKENAV_MENU_E; } bool32 sub_81D05DC(struct PokenavSub13 *structPtr) @@ -527,7 +527,7 @@ u32 sub_81D0A6C(s32 state) if (!free_temp_tile_data_buffers_if_possible()) { 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]); FillBgTilemapBufferRect_Palette0(1, 0, 0, 0, 32, 20); CopyPaletteIntoBufferUnfaded(gUnknown_08623FF8, 0x20, 0xA0); @@ -837,7 +837,7 @@ void sub_81D0FF0(struct PokenavSub14 *structPtr) txtPtr = StringCopy(gStringVar1, genderTxt); *(txtPtr++) = CHAR_SLASH; *(txtPtr++) = CHAR_SPECIAL_F9; - *(txtPtr++) = 5; + *(txtPtr++) = CHAR_LV_2; ConvertIntToDecimalStringN(txtPtr, level, STR_CONV_MODE_LEFT_ALIGN, 3); AddTextPrinterParameterized(windowId, 1, gStringVar1, 60, 1, TEXT_SPEED_FF, NULL); CopyWindowToVram(windowId, 2); @@ -1041,7 +1041,7 @@ void sub_81D13BC(u16 *dst, u32 id) static const struct CompressedSpriteSheet gUnknown_08624C78 = { - gUnknown_08624280, 0x1800, 9 + sRibbonIconsBig_Gfx, 0x1800, 9 }; static const struct SpritePalette gUnknown_08624C80[] = diff --git a/src/pokenav_unk_2.c b/src/pokenav_unk_2.c index de962ccd6..94b816b6d 100644 --- a/src/pokenav_unk_2.c +++ b/src/pokenav_unk_2.c @@ -23,31 +23,31 @@ struct Pokenav2Struct { bool32 (*callback)(void); u32 loopedTaskId; - u16 optionDescriptionWindowId; + u16 optionDescWindowId; u8 bg3ScrollTaskId; u8 cursorPos; bool8 otherIconsInMotion; u8 field_00d; - bool32 iconVisible[6]; + bool32 iconVisible[MAX_POKENAV_MENUITEMS]; struct Sprite * field_028; - struct Sprite * iconSprites[6][4]; + struct Sprite * iconSprites[MAX_POKENAV_MENUITEMS][4]; u16 bg1TilemapBuffer[0x400]; }; static struct Pokenav2Struct * sub_81C9958(void); static bool32 sub_81C99FC(void); static u32 sub_81C9A10(s32 state); -static u32 sub_81C9C6C(s32 state); -static u32 sub_81C9CA8(s32 state); -static u32 sub_81C9D44(s32 state); -static u32 sub_81C9DD8(s32 state); -static u32 sub_81C9E58(s32 state); -static u32 sub_81C9EC8(s32 state); -static u32 sub_81C9EF8(s32 state); -static u32 sub_81C9F28(s32 state); +static u32 LoopedTask_MoveMenuCursor(s32 state); +static u32 LoopedTask_OpenConditionMenu(s32 state); +static u32 LoopedTask_ReturnToMainMenu(s32 state); +static u32 LoopedTask_OpenConditionSearchMenu(s32 state); +static u32 LoopedTask_ReturnToConditionMenu(s32 state); +static u32 LoopedTask_SelectRibbonsNoWinners(s32 state); +static u32 LoopedTask_ReShowDescription(s32 state); +static u32 LoopedTask_OpenPokenavFeature(s32 state); static void sub_81C9FC4(void); static void sub_81C9FEC(void); -static void sub_81CA02C(void); +static void CreateMenuOptionSprites(void); static void sub_81CA094(void); static void sub_81CA0C8(void); 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_81CA3B4(struct Sprite ** sprites); 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_81CA474(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_81CA6AC(struct Sprite * sprite); static void sub_81CA698(void); -static void sub_81CA6E0(void); -static void sub_81CA714(void); -static void sub_81CA770(void); +static void AddOptionDescriptionWindow(void); +static void PrintCurrentOptionDescription(void); +static void PrintNoRibbonWinners(void); static bool32 sub_81CA7C4(void); static void sub_81CA7D4(void); static void sub_81CA7F4(void); @@ -120,16 +120,16 @@ static const struct BgTemplate gUnknown_08620194[] = { } }; -static const LoopedTask gUnknown_086201A0[] = { - NULL, - sub_81C9C6C, - sub_81C9CA8, - sub_81C9D44, - sub_81C9DD8, - sub_81C9E58, - sub_81C9EC8, - sub_81C9EF8, - sub_81C9F28 +static const LoopedTask sMenuHandlerLoopTaskFuncs[] = { + [POKENAV_MENU_FUNC_NONE] = NULL, + [POKENAV_MENU_FUNC_MOVE_CURSOR] = LoopedTask_MoveMenuCursor, + [POKENAV_MENU_FUNC_OPEN_CONDITION] = LoopedTask_OpenConditionMenu, + [POKENAV_MENU_FUNC_RETURN_TO_MAIN] = LoopedTask_ReturnToMainMenu, + [POKENAV_MENU_FUNC_OPEN_CONDITION_SEARCH] = LoopedTask_OpenConditionSearchMenu, + [POKENAV_MENU_FUNC_RETURN_TO_CONDITION] = LoopedTask_ReturnToConditionMenu, + [POKENAV_MENU_FUNC_NO_RIBBON_WINNERS] = LoopedTask_SelectRibbonsNoWinners, + [POKENAV_MENU_FUNC_RESHOW_DESCRIPTION] = LoopedTask_ReShowDescription, + [POKENAV_MENU_FUNC_OPEN_FEATURE] = LoopedTask_OpenPokenavFeature }; static const struct CompressedSpriteSheet gUnknown_086201C4[] = @@ -175,39 +175,45 @@ struct UnkStruct_08620240 { u16 unk0; 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, - 0x14, - {gUnknown_0862020C, gUnknown_08620210, gUnknown_0862021C} + 0x14, + {gUnknown_0862020C, gUnknown_08620210, gUnknown_0862021C} }, + [POKENAV_MENU_TYPE_UNLOCK_MC] = { 0x2A, - 0x14, - {gUnknown_0862020C, gUnknown_08620210, gUnknown_08620214, gUnknown_0862021C} + 0x14, + {gUnknown_0862020C, gUnknown_08620210, gUnknown_08620214, gUnknown_0862021C} }, + [POKENAV_MENU_TYPE_UNLOCK_MC_RIBBONS] = { 0x2A, - 0x14, - {gUnknown_0862020C, gUnknown_08620210, gUnknown_08620214, gUnknown_08620218, gUnknown_0862021C} + 0x14, + {gUnknown_0862020C, gUnknown_08620210, gUnknown_08620214, gUnknown_08620218, gUnknown_0862021C} }, + [POKENAV_MENU_TYPE_CONDITION] = { 0x38, - 0x14, - {gUnknown_08620220, gUnknown_08620224, gUnknown_0862023C} + 0x14, + {gUnknown_08620220, gUnknown_08620224, gUnknown_0862023C} }, + [POKENAV_MENU_TYPE_CONDITION_SEARCH] = { 0x28, - 0x10, - {gUnknown_08620228, gUnknown_0862022C, gUnknown_08620230, gUnknown_08620234, gUnknown_08620238, gUnknown_0862023C} + 0x10, + {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, .tilemapLeft = 3, @@ -218,28 +224,28 @@ static const struct WindowTemplate gUnknown_086202CC = .baseBlock = 8 }; -static const u8 *const gUnknown_086202D4[] = -{ - gText_CheckMapOfHoenn, - gText_CheckPokemonInDetail, - gText_CallRegisteredTrainer, - gText_CheckObtainedRibbons, - gText_PutAwayPokenav, - gText_CheckPartyPokemonInDetail, - gText_CheckAllPokemonInDetail, - gText_ReturnToPokenavMenu, - gText_FindCoolPokemon, - gText_FindBeautifulPokemon, - gText_FindCutePokemon, - gText_FindSmartPokemon, - gText_FindToughPokemon, - gText_ReturnToConditionMenu +static const u8 *const sPageDescriptions[] = +{ + [POKENAV_MENUITEM_MAP] = gText_CheckMapOfHoenn, + [POKENAV_MENUITEM_CONDITION] = gText_CheckPokemonInDetail, + [POKENAV_MENUITEM_MATCH_CALL] = gText_CallRegisteredTrainer, + [POKENAV_MENUITEM_RIBBONS] = gText_CheckObtainedRibbons, + [POKENAV_MENUITEM_SWITCH_OFF] = gText_PutAwayPokenav, + [POKENAV_MENUITEM_CONDITION_PARTY] = gText_CheckPartyPokemonInDetail, + [POKENAV_MENUITEM_CONDITION_SEARCH] = gText_CheckAllPokemonInDetail, + [POKENAV_MENUITEM_CONDITION_CANCEL] = gText_ReturnToPokenavMenu, + [POKENAV_MENUITEM_CONDITION_SEARCH_COOL] = gText_FindCoolPokemon, + [POKENAV_MENUITEM_CONDITION_SEARCH_BEAUTY] = gText_FindBeautifulPokemon, + [POKENAV_MENUITEM_CONDITION_SEARCH_CUTE] = gText_FindCutePokemon, + [POKENAV_MENUITEM_CONDITION_SEARCH_SMART] = gText_FindSmartPokemon, + [POKENAV_MENUITEM_CONDITION_SEARCH_TOUGH] = gText_FindToughPokemon, + [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 struct OamData gUnknown_08620314 = +static const struct OamData sOamData_MenuOption = { .y = 0, .affineMode = ST_OAM_AFFINE_OFF, @@ -266,20 +272,20 @@ static const union AffineAnimCmd gUnknown_0862032C[] = AFFINEANIMCMD_END, }; -static const union AffineAnimCmd *const gUnknown_08620344[] = +static const union AffineAnimCmd *const sSpriteAnims_MenuOption[] = { gUnknown_0862031C, - gUnknown_0862032C + gUnknown_0862032C }; -static const struct SpriteTemplate gUnknown_0862034C = +static const struct SpriteTemplate sMenuOptionSpriteTemplate = { .tileTag = 3, .paletteTag = 4, - .oam = &gUnknown_08620314, + .oam = &sOamData_MenuOption, .anims = gDummySpriteAnimTable, .images = NULL, - .affineAnims = gUnknown_08620344, + .affineAnims = sSpriteAnims_MenuOption, .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); - unk->loopedTaskId = CreateLoopedTask(gUnknown_086201A0[ltIdx], 1); + unk->loopedTaskId = CreateLoopedTask(sMenuHandlerLoopTaskFuncs[ltIdx], 1); unk->callback = sub_81C99FC; } @@ -388,7 +394,7 @@ void sub_81C99D4(void) struct Pokenav2Struct * unk = GetSubstructPtr(2); sub_81CA7F4(); - RemoveWindow(unk->optionDescriptionWindowId); + RemoveWindow(unk->optionDescWindowId); sub_81C9FEC(); sub_81CA994(); 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_0861FCAC, 0, 0, 1); 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(); return LT_INC_AND_PAUSE; case 3: if (free_temp_tile_data_buffers_if_possible()) return LT_PAUSE; - sub_81CA6E0(); + AddOptionDescriptionWindow(); sub_81CA7D4(); return LT_INC_AND_CONTINUE; case 4: sub_81C9FC4(); return LT_INC_AND_CONTINUE; case 5: - sub_81CA714(); - sub_81CA02C(); + PrintCurrentOptionDescription(); + CreateMenuOptionSprites(); sub_81CA640(); sub_81CA0C8(); return LT_INC_AND_PAUSE; @@ -467,12 +473,12 @@ static u32 sub_81C9A10(s32 state) PlaySE(SE_PN_ON); sub_81C7AC0(3); } - switch (sub_81C9894()) + switch (GetPokenavMenuType()) { - case 4: + case POKENAV_MENU_TYPE_CONDITION_SEARCH: LoadLeftHeaderGfxForIndex(7); // fallthrough - case 3: + case POKENAV_MENU_TYPE_CONDITION: LoadLeftHeaderGfxForIndex(1); break; default: @@ -483,12 +489,12 @@ static u32 sub_81C9A10(s32 state) case 8: if (IsPaletteFadeActive()) return LT_PAUSE; - switch (sub_81C9894()) + switch (GetPokenavMenuType()) { - case 4: + case POKENAV_MENU_TYPE_CONDITION_SEARCH: sub_81C7FA0(7, FALSE, FALSE); // fallthrough - case 3: + case POKENAV_MENU_TYPE_CONDITION: sub_81C7FA0(1, FALSE, FALSE); break; default: @@ -499,7 +505,7 @@ static u32 sub_81C9A10(s32 state) sub_81CA92C(); return LT_INC_AND_CONTINUE; case 9: - if (sub_81CA324()) + if (AreMenuOptionSpritesMoving()) return LT_PAUSE; if (sub_81C8010()) return LT_PAUSE; @@ -508,18 +514,18 @@ static u32 sub_81C9A10(s32 state) return LT_FINISH; } -static u32 sub_81C9C6C(s32 state) +static u32 LoopedTask_MoveMenuCursor(s32 state) { switch (state) { case 0: sub_81CAA3C(); sub_81CA278(); - sub_81CA714(); + PrintCurrentOptionDescription(); PlaySE(SE_SELECT); return LT_INC_AND_PAUSE; case 1: - if (sub_81CA324()) + if (AreMenuOptionSpritesMoving()) return LT_PAUSE; if (sub_81CA7C4()) return LT_PAUSE; @@ -528,7 +534,7 @@ static u32 sub_81C9C6C(s32 state) return LT_FINISH; } -static u32 sub_81C9CA8(s32 state) +static u32 LoopedTask_OpenConditionMenu(s32 state) { switch (state) { @@ -539,7 +545,7 @@ static u32 sub_81C9CA8(s32 state) PlaySE(SE_SELECT); return LT_INC_AND_PAUSE; case 1: - if (sub_81CA324()) + if (AreMenuOptionSpritesMoving()) return LT_PAUSE; if (sub_81C8010()) return LT_PAUSE; @@ -550,10 +556,10 @@ static u32 sub_81C9CA8(s32 state) sub_81CA20C(); sub_81C7FA0(1, FALSE, FALSE); sub_81CA818(); - sub_81CA714(); + PrintCurrentOptionDescription(); return LT_INC_AND_PAUSE; case 3: - if (sub_81CA324()) + if (AreMenuOptionSpritesMoving()) return LT_PAUSE; if (sub_81C8010()) return LT_PAUSE; @@ -567,7 +573,7 @@ static u32 sub_81C9CA8(s32 state) return LT_FINISH; } -static u32 sub_81C9D44(s32 state) +static u32 LoopedTask_ReturnToMainMenu(s32 state) { switch (state) { @@ -577,7 +583,7 @@ static u32 sub_81C9D44(s32 state) sub_81C7FC4(1, 0); return LT_INC_AND_PAUSE; case 1: - if (sub_81CA324()) + if (AreMenuOptionSpritesMoving()) return LT_PAUSE; if (sub_81C8010()) return LT_PAUSE; @@ -588,10 +594,10 @@ static u32 sub_81C9D44(s32 state) sub_81CA20C(); sub_81C7FA0(0, FALSE, FALSE); sub_81CA864(); - sub_81CA714(); + PrintCurrentOptionDescription(); return LT_INC_AND_PAUSE; case 3: - if (sub_81CA324()) + if (AreMenuOptionSpritesMoving()) return LT_PAUSE; if (sub_81C8010()) return LT_PAUSE; @@ -605,7 +611,7 @@ static u32 sub_81C9D44(s32 state) return LT_FINISH; } -static u32 sub_81C9DD8(s32 state) +static u32 LoopedTask_OpenConditionSearchMenu(s32 state) { switch (state) { @@ -615,7 +621,7 @@ static u32 sub_81C9DD8(s32 state) PlaySE(SE_SELECT); return LT_INC_AND_PAUSE; case 1: - if (sub_81CA324()) + if (AreMenuOptionSpritesMoving()) return LT_PAUSE; LoadLeftHeaderGfxForIndex(7); sub_81CA0C8(); @@ -623,10 +629,10 @@ static u32 sub_81C9DD8(s32 state) case 2: sub_81CA20C(); sub_81C7FA0(7, FALSE, FALSE); - sub_81CA714(); + PrintCurrentOptionDescription(); return LT_INC_AND_PAUSE; case 3: - if (sub_81CA324()) + if (AreMenuOptionSpritesMoving()) return LT_PAUSE; if (sub_81C8010()) return LT_PAUSE; @@ -638,7 +644,7 @@ static u32 sub_81C9DD8(s32 state) return LT_FINISH; } -static u32 sub_81C9E58(s32 state) +static u32 LoopedTask_ReturnToConditionMenu(s32 state) { switch (state) { @@ -648,7 +654,7 @@ static u32 sub_81C9E58(s32 state) sub_81C7FC4(7, 0); return LT_INC_AND_PAUSE; case 1: - if (sub_81CA324()) + if (AreMenuOptionSpritesMoving()) return LT_PAUSE; if (sub_81C8010()) return LT_PAUSE; @@ -656,10 +662,10 @@ static u32 sub_81C9E58(s32 state) return LT_INC_AND_PAUSE; case 2: sub_81CA20C(); - sub_81CA714(); + PrintCurrentOptionDescription(); return LT_INC_AND_PAUSE; case 3: - if (sub_81CA324()) + if (AreMenuOptionSpritesMoving()) return LT_PAUSE; if (sub_81CA89C()) return LT_PAUSE; @@ -669,13 +675,13 @@ static u32 sub_81C9E58(s32 state) return LT_FINISH; } -static u32 sub_81C9EC8(s32 state) +static u32 LoopedTask_SelectRibbonsNoWinners(s32 state) { switch (state) { case 0: PlaySE(SE_HAZURE); - sub_81CA770(); + PrintNoRibbonWinners(); return LT_INC_AND_PAUSE; case 1: if (IsDma3ManagerBusyWithBgCopy()) @@ -685,13 +691,14 @@ static u32 sub_81C9EC8(s32 state) 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) { case 0: PlaySE(SE_SELECT); - sub_81CA714(); + PrintCurrentOptionDescription(); return LT_INC_AND_PAUSE; case 1: if (IsDma3ManagerBusyWithBgCopy()) @@ -701,7 +708,8 @@ static u32 sub_81C9EF8(s32 state) 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) { @@ -714,12 +722,12 @@ static u32 sub_81C9F28(s32 state) sub_81C7880(); sub_81CA9C8(); sub_81CA2DC(); - switch (sub_81C9894()) + switch (GetPokenavMenuType()) { - case 4: + case POKENAV_MENU_TYPE_CONDITION_SEARCH: sub_81C7FC4(7, FALSE); // fallthrough - case 3: + case POKENAV_MENU_TYPE_CONDITION: sub_81C7FC4(1, FALSE); break; default: @@ -729,7 +737,7 @@ static u32 sub_81C9F28(s32 state) PlaySE(SE_SELECT); return LT_INC_AND_PAUSE; case 2: - if (sub_81CA324()) + if (AreMenuOptionSpritesMoving()) return LT_PAUSE; if (sub_81C8010()) return LT_PAUSE; @@ -766,16 +774,17 @@ static void sub_81C9FEC(void) sub_81CA698(); } -static void sub_81CA02C(void) +static void CreateMenuOptionSprites(void) { s32 i, j; 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++) { - 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]; gSprites[spriteId].pos2.x = 32 * j; } @@ -787,7 +796,7 @@ static void sub_81CA094(void) s32 i, j; 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++) { @@ -799,8 +808,8 @@ static void sub_81CA094(void) static void sub_81CA0C8(void) { - s32 r0 = sub_81C9894(); - sub_81CA0EC(gUnknown_08620240[r0].unk4, gUnknown_08620240[r0].unk0, gUnknown_08620240[r0].unk2); + s32 menuType = GetPokenavMenuType(); + 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) @@ -809,7 +818,7 @@ static void sub_81CA0EC(const u16 *const *a0, s32 a1, s32 a2) struct Pokenav2Struct * unk = GetSubstructPtr(2); s32 sp04 = GetSpriteTileStartByTag(3); - for (i = 0; i < 6; i++) + for (i = 0; i < MAX_POKENAV_MENUITEMS; i++) { if (*a0 != NULL) { @@ -841,11 +850,11 @@ static void sub_81CA20C(void) { s32 i; struct Pokenav2Struct * unk = GetSubstructPtr(2); - s32 r8 = sub_81C98A4(); + s32 r8 = GetPokenavCursorPos(); s32 r7 = 0; s32 r2; - for (i = 0; i < 6; i++) + for (i = 0; i < MAX_POKENAV_MENUITEMS; i++) { if (unk->iconVisible[i]) { @@ -868,10 +877,10 @@ static void sub_81CA278(void) { s32 i; struct Pokenav2Struct * unk = GetSubstructPtr(2); - s32 r3 = sub_81C98A4(); + s32 r3 = GetPokenavCursorPos(); s32 r5; - for (i = 0, r5 = 0; i < 6; i++) + for (i = 0, r5 = 0; i < MAX_POKENAV_MENUITEMS; i++) { if (unk->iconVisible[i]) { @@ -894,7 +903,7 @@ static void sub_81CA2DC(void) s32 i; struct Pokenav2Struct * unk = GetSubstructPtr(2); - for (i = 0; i < 6; i++) + for (i = 0; i < MAX_POKENAV_MENUITEMS; 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; 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) 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); - ptr->optionDescriptionWindowId = AddWindow(&gUnknown_086202CC); - PutWindowTilemap(ptr->optionDescriptionWindowId); - FillWindowPixelBuffer(ptr->optionDescriptionWindowId, PIXEL_FILL(6)); - CopyWindowToVram(ptr->optionDescriptionWindowId, 3); + ptr->optionDescWindowId = AddWindow(&sOptionDescWindowTemplate); + PutWindowTilemap(ptr->optionDescWindowId); + FillWindowPixelBuffer(ptr->optionDescWindowId, PIXEL_FILL(6)); + CopyWindowToVram(ptr->optionDescWindowId, 3); } -static void sub_81CA714(void) +static void PrintCurrentOptionDescription(void) { struct Pokenav2Struct * ptr = GetSubstructPtr(2); - int i = sub_81C98B4(); - const u8 * s = gUnknown_086202D4[i]; + int menuItem = GetCurrentMenuItemId(); + const u8 * s = sPageDescriptions[menuItem]; u32 width = GetStringWidth(1, s, -1); - FillWindowPixelBuffer(ptr->optionDescriptionWindowId, PIXEL_FILL(6)); - AddTextPrinterParameterized3(ptr->optionDescriptionWindowId, 1, (192 - width) / 2, 1, sOptionDescTextColors, 0, s); + FillWindowPixelBuffer(ptr->optionDescWindowId, PIXEL_FILL(6)); + AddTextPrinterParameterized3(ptr->optionDescWindowId, 1, (192 - width) / 2, 1, sOptionDescTextColors, 0, s); } - -static void sub_81CA770(void) +// Printed when Ribbons is selected if no PC/party mons have ribbons +// Can occur by obtaining a mon with a ribbon and then releasing all ribbon winners +static void PrintNoRibbonWinners(void) { struct Pokenav2Struct * ptr = GetSubstructPtr(2); const u8 * s = gText_NoRibbonWinners; u32 width = GetStringWidth(1, s, -1); - FillWindowPixelBuffer(ptr->optionDescriptionWindowId, PIXEL_FILL(6)); - AddTextPrinterParameterized3(ptr->optionDescriptionWindowId, 1, (192 - width) / 2, 1, sOptionDescTextColors2, 0, s); + FillWindowPixelBuffer(ptr->optionDescWindowId, PIXEL_FILL(6)); + AddTextPrinterParameterized3(ptr->optionDescWindowId, 1, (192 - width) / 2, 1, sOptionDescTextColors2, 0, s); } static bool32 sub_81CA7C4(void) @@ -1259,9 +1269,9 @@ static void sub_81CA9EC(u8 taskId) static void sub_81CAA3C(void) { - int i = sub_81C9894(); - int j = sub_81C98A4(); - int r4 = gUnknown_08620240[i].unk2 * j + gUnknown_08620240[i].unk0 - 8; + int menuType = GetPokenavMenuType(); + int cursorPos = GetPokenavCursorPos(); + int r4 = gUnknown_08620240[menuType].unk2 * cursorPos + gUnknown_08620240[menuType].unk0 - 8; CpuFill16(0, gScanlineEffectRegBuffers[0], 0x140); CpuFill16(0, gScanlineEffectRegBuffers[1], 0x140); CpuFill16(RGB(16, 23, 28), &gScanlineEffectRegBuffers[0][r4], 0x20); diff --git a/src/pokenav_unk_4.c b/src/pokenav_unk_4.c index d8a1a0dfa..aaa1767aa 100755 --- a/src/pokenav_unk_4.c +++ b/src/pokenav_unk_4.c @@ -286,7 +286,7 @@ bool32 sub_81CB260(void) return TRUE; } -void sub_81CB29C(s32 index) +void CreateMatchCallLoopedTask(s32 index) { struct Pokenav4Struct *state = GetSubstructPtr(6); state->unk4 = CreateLoopedTask(sMatchCallLoopTaskFuncs[index], 1); diff --git a/src/pokenav_unk_6.c b/src/pokenav_unk_6.c index 4c93c0d41..b16aec16e 100644 --- a/src/pokenav_unk_6.c +++ b/src/pokenav_unk_6.c @@ -402,7 +402,7 @@ u8 *sub_81CD624(u8 *str, u16 id, bool8 arg3) *(str_++) = 9; *(str_++) = CHAR_SLASH; *(str_++) = CHAR_SPECIAL_F9; - *(str_++) = 5; + *(str_++) = CHAR_LV_2; txtPtr = str_; str_ = ConvertIntToDecimalStringN(str_, level, STR_CONV_MODE_LEFT_ALIGN, 3); lvlDigits = str_ - txtPtr; diff --git a/src/pokenav_unk_8.c b/src/pokenav_unk_8.c index 6c1460dd1..9b6ce432b 100644 --- a/src/pokenav_unk_8.c +++ b/src/pokenav_unk_8.c @@ -113,9 +113,9 @@ static const struct WindowTemplate gUnknown_086235B4 = .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 gUnknown_086235C8[] = _("{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_MaleSymbol[] = _("{COLOR_HIGHLIGHT_SHADOW}{LIGHT_RED}{WHITE}{GREEN}♂{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 sText_NoGenderSymbol[] = _("{UNK_SPACER}"); bool32 PokenavCallback_Init_8(void) { @@ -130,7 +130,7 @@ bool32 PokenavCallback_Init_8(void) structPtr->unk0 = sub_81CF010; structPtr->loopedTaskId = CreateLoopedTask(sub_81CF11C, 1); structPtr->unk18 = 0; - structPtr->unk14 = gUnknown_086233A0[sub_81C76AC()]; + structPtr->unk14 = gUnknown_086233A0[GetSelectedConditionSearch()]; return TRUE; } @@ -143,7 +143,7 @@ bool32 PokenavCallback_Init_10(void) structPtr->unkPtr = GetSubstructPtr(18); structPtr->unk0 = sub_81CF030; structPtr->unk18 = 1; - structPtr->unk14 = gUnknown_086233A0[sub_81C76AC()]; + structPtr->unk14 = gUnknown_086233A0[GetSelectedConditionSearch()]; return TRUE; } @@ -443,7 +443,7 @@ static u32 sub_81CF418(s32 state) HideBg(3); if (!unk->unkC) { - u8 r4 = sub_81C76AC() + 8; + u8 r4 = GetSelectedConditionSearch() + POKENAV_MENUITEM_CONDITION_SEARCH_COOL; LoadLeftHeaderGfxForIndex(r4); sub_81C7FA0(r4, 1, 0); sub_81C7FA0(1, 1, 0); @@ -673,13 +673,16 @@ static void sub_81CF8E4(struct PokenavMonList * item, u8 * dest) u8 level; u8 * s; const u8 * genderStr; - if (item->boxId == 14) + + // Mon is in party + if (item->boxId == TOTAL_BOXES_COUNT) { struct Pokemon * mon = &gPlayerParty[item->monId]; gender = GetMonGender(mon); level = GetLevelFromMonExp(mon); GetMonData(mon, MON_DATA_NICKNAME, gStringVar3); } + // Mon is in PC else { struct BoxPokemon * mon = GetBoxedMonPtr(item->boxId, item->monId); @@ -687,24 +690,25 @@ static void sub_81CF8E4(struct PokenavMonList * item, u8 * dest) level = GetLevelFromBoxMonExp(mon); GetBoxMonData(mon, MON_DATA_NICKNAME, gStringVar3); } + StringGetEnd10(gStringVar3); dest = sub_81DB494(dest, 1, gStringVar3, 60); switch (gender) { default: - genderStr = gUnknown_086235D4; + genderStr = sText_NoGenderSymbol; break; case MON_MALE: - genderStr = gUnknown_086235BC; + genderStr = sText_MaleSymbol; break; case MON_FEMALE: - genderStr = gUnknown_086235C8; + genderStr = sText_FemaleSymbol; break; } s = StringCopy(gStringVar1, genderStr); *s++ = CHAR_SLASH; *s++ = CHAR_SPECIAL_F9; - *s++ = 5; // LV + *s++ = CHAR_LV_2; ConvertIntToDecimalStringN(s, level, STR_CONV_MODE_LEFT_ALIGN, 3); sub_81DB494(dest, 1, gStringVar1, 40); } diff --git a/src/pokenav_unk_9.c b/src/pokenav_unk_9.c index b1a344de9..63b4adb30 100644 --- a/src/pokenav_unk_9.c +++ b/src/pokenav_unk_9.c @@ -50,7 +50,7 @@ static void sub_81D02B0(s32 windowId, s32 val1, s32 val2); static void sub_81D024C(struct PokenavSub10 *ptr); static void sub_81D0288(struct PokenavSub10 *ptr); static void sub_81D0304(void); -static void sub_81D035C(struct PokenavMonList *, u8 *); +static void BufferRibbonMonInfoText(struct PokenavMonList *, u8 *); static const LoopedTask gUnknown_086235D8[] = { @@ -107,9 +107,9 @@ static const struct WindowTemplate gUnknown_086237D4 = .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 gUnknown_086237E8[] = _("{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_MaleSymbol[] = _("{COLOR_HIGHLIGHT_SHADOW}{LIGHT_RED}{WHITE}{GREEN}♂{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 sText_NoGenderSymbol[] = _("{UNK_SPACER}"); bool32 PokenavCallback_Init_12(void) { @@ -188,12 +188,12 @@ static u32 sub_81CFA88(struct PokenavSub9 *structPtr) static u32 sub_81CFB08(struct PokenavSub9 *structPtr) { - return 100005; + return POKENAV_MENU_5; } static u32 sub_81CFB10(struct PokenavSub9 *structPtr) { - return 100013; + return POKENAV_MENU_D; } static u32 sub_81CFB18(void) @@ -660,7 +660,7 @@ static void sub_81D02B0(s32 windowId, s32 val1, s32 val2) *ptr++ = CHAR_SLASH; ConvertIntToDecimalStringN(ptr, val2, STR_CONV_MODE_RIGHT_ALIGN, 3); 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) @@ -676,18 +676,21 @@ static void sub_81D0304(void) template.unkC = 8; template.unkD = 2; template.unkE = 1; - template.listFunc.unk10_1 = sub_81D035C; + template.listFunc.unk10_1 = BufferRibbonMonInfoText; template.unk14 = NULL; 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 level; u8 * s; const u8 * genderStr; struct PokenavMonList * item = item0; + + // Mon is in party if (item->boxId == TOTAL_BOXES_COUNT) { struct Pokemon * mon = &gPlayerParty[item->monId]; @@ -695,6 +698,7 @@ static void sub_81D035C(struct PokenavMonList * item0, u8 * dest) level = GetLevelFromMonExp(mon); GetMonData(mon, MON_DATA_NICKNAME, gStringVar3); } + // Mon is in PC else { struct BoxPokemon * mon = GetBoxedMonPtr(item->boxId, item->monId); @@ -702,24 +706,26 @@ static void sub_81D035C(struct PokenavMonList * item0, u8 * dest) level = GetLevelFromBoxMonExp(mon); GetBoxMonData(mon, MON_DATA_NICKNAME, gStringVar3); } + StringGetEnd10(gStringVar3); dest = sub_81DB494(dest, 1, gStringVar3, 60); switch (gender) { default: - genderStr = gUnknown_086237F4; + genderStr = sText_NoGenderSymbol; break; case MON_MALE: - genderStr = gUnknown_086237DC; + genderStr = sText_MaleSymbol; break; case MON_FEMALE: - genderStr = gUnknown_086237E8; + genderStr = sText_FemaleSymbol; break; } + s = StringCopy(gStringVar1, genderStr); *s++ = CHAR_SLASH; *s++ = CHAR_SPECIAL_F9; - *s++ = 5; // LV + *s++ = CHAR_LV_2; ConvertIntToDecimalStringN(s, level, STR_CONV_MODE_LEFT_ALIGN, 3); dest = sub_81DB494(dest, 1, gStringVar1, 54); ConvertIntToDecimalStringN(dest, item->data, STR_CONV_MODE_RIGHT_ALIGN, 2); -- cgit v1.2.3 From 8a96aa9e976caef12144e7acfeea9794d3d145df Mon Sep 17 00:00:00 2001 From: GriffinR Date: Sat, 1 Feb 2020 21:19:04 -0500 Subject: Name pokenav files --- src/pokenav_conditions_1.c | 625 ++++++++++++++++++++ src/pokenav_conditions_2.c | 884 +++++++++++++++++++++++++++++ src/pokenav_conditions_3.c | 714 +++++++++++++++++++++++ src/pokenav_match_call_1.c | 516 +++++++++++++++++ src/pokenav_match_call_2.c | 1279 +++++++++++++++++++++++++++++++++++++++++ src/pokenav_menu_handler_1.c | 513 +++++++++++++++++ src/pokenav_menu_handler_2.c | 1284 ++++++++++++++++++++++++++++++++++++++++++ src/pokenav_region_map.c | 729 ++++++++++++++++++++++++ src/pokenav_ribbons_1.c | 732 ++++++++++++++++++++++++ src/pokenav_ribbons_2.c | 1163 ++++++++++++++++++++++++++++++++++++++ src/pokenav_unk_1.c | 513 ----------------- src/pokenav_unk_10.c | 1163 -------------------------------------- src/pokenav_unk_2.c | 1284 ------------------------------------------ src/pokenav_unk_3.c | 516 ----------------- src/pokenav_unk_4.c | 1279 ----------------------------------------- src/pokenav_unk_5.c | 729 ------------------------ src/pokenav_unk_6.c | 625 -------------------- src/pokenav_unk_7.c | 884 ----------------------------- src/pokenav_unk_8.c | 714 ----------------------- src/pokenav_unk_9.c | 732 ------------------------ 20 files changed, 8439 insertions(+), 8439 deletions(-) create mode 100644 src/pokenav_conditions_1.c create mode 100644 src/pokenav_conditions_2.c create mode 100644 src/pokenav_conditions_3.c create mode 100755 src/pokenav_match_call_1.c create mode 100755 src/pokenav_match_call_2.c create mode 100644 src/pokenav_menu_handler_1.c create mode 100644 src/pokenav_menu_handler_2.c create mode 100755 src/pokenav_region_map.c create mode 100644 src/pokenav_ribbons_1.c create mode 100644 src/pokenav_ribbons_2.c delete mode 100644 src/pokenav_unk_1.c delete mode 100644 src/pokenav_unk_10.c delete mode 100644 src/pokenav_unk_2.c delete mode 100755 src/pokenav_unk_3.c delete mode 100755 src/pokenav_unk_4.c delete mode 100755 src/pokenav_unk_5.c delete mode 100644 src/pokenav_unk_6.c delete mode 100644 src/pokenav_unk_7.c delete mode 100644 src/pokenav_unk_8.c delete mode 100644 src/pokenav_unk_9.c (limited to 'src') diff --git a/src/pokenav_conditions_1.c b/src/pokenav_conditions_1.c new file mode 100644 index 000000000..70c309992 --- /dev/null +++ b/src/pokenav_conditions_1.c @@ -0,0 +1,625 @@ +#include "global.h" +#include "data.h" +#include "decompress.h" +#include "main.h" +#include "menu_specialized.h" +#include "mon_markings.h" +#include "pokenav.h" +#include "pokemon.h" +#include "pokemon_storage_system.h" +#include "sound.h" +#include "string_util.h" +#include "strings.h" +#include "text.h" +#include "constants/songs.h" +#include "constants/species.h" + +struct PokenavSub11 +{ + u32 monPal[3][0x20]; + u8 fill[0x180]; + u32 monPicGfx[3][0x800]; + u8 unk6300; + s16 unk6302; + u32 (*unk6304)(struct PokenavSub11 *); + u8 fill2[0x6320 - 0x6308]; + u8 unk6320[3][24]; + u8 unk6368[3][64]; + struct UnknownStruct_81D1ED4 unk6428; + u8 unk6780[3]; + u8 unk6783[3]; + s8 unk6786; + s8 unk6787; + s8 unk6788; + s8 unk6789; + u8 unk678A; +}; + +void sub_81CD970(void); +void sub_81CD9F8(void); +u32 sub_81CD08C(struct PokenavSub11 *structPtr); +u32 sub_81CD19C(struct PokenavSub11 *structPtr); +u32 sub_81CD110(struct PokenavSub11 *structPtr); +u8 sub_81CD1E4(struct PokenavSub11 *structPtr); +u8 sub_81CD258(u8 arg0); +void sub_81CD824(s16 arg0, u8 arg1); +void sub_81CDA1C(s16 arg0, u8 arg1); +void sub_81CDB98(s16 arg0, u8 arg1); + +// code +bool32 PokenavCallback_Init_7(void) +{ + struct PokenavSub11 *structPtr = AllocSubstruct(11, sizeof(struct PokenavSub11)); + + if (structPtr == NULL) + return FALSE; + + sub_81D1ED4(&structPtr->unk6428); + sub_81CD970(); + gKeyRepeatStartDelay = 20; + structPtr->unk6304 = sub_81CD08C; + return TRUE; +} + +bool32 PokenavCallback_Init_9(void) +{ + struct PokenavSub11 *structPtr = AllocSubstruct(11, sizeof(struct PokenavSub11)); + + if (structPtr == NULL) + return FALSE; + + sub_81D1ED4(&structPtr->unk6428); + sub_81CD9F8(); + gKeyRepeatStartDelay = 20; + structPtr->unk6304 = sub_81CD08C; + return TRUE; +} + +u32 sub_81CD070(void) +{ + struct PokenavSub11 *structPtr = GetSubstructPtr(11); + + return structPtr->unk6304(structPtr); +} + +u32 sub_81CD08C(struct PokenavSub11 *structPtr) +{ + struct PokenavSub18 *unkPtr = GetSubstructPtr(18); + u32 ret = sub_81CD1E4(structPtr); + + if (ret == 0) + { + if (gMain.newKeys & B_BUTTON) + { + PlaySE(SE_SELECT); + structPtr->unk6304 = sub_81CD19C; + ret = 2; + } + else if (gMain.newKeys & A_BUTTON) + { + if (structPtr->unk6300 == 0) + { + if (unkPtr->unk2 == unkPtr->unk0 - 1) + { + PlaySE(SE_SELECT); + structPtr->unk6304 = sub_81CD19C; + ret = 2; + } + } + else + { + PlaySE(SE_SELECT); + ret = 5; + structPtr->unk6304 = sub_81CD110; + } + } + } + + return ret; +} + +u32 sub_81CD110(struct PokenavSub11 *structPtr) +{ + struct PokenavSub18 *unkPtr; + u8 markings; + u32 ret = 0, boxId, monId; + + if (!sub_811FBA4()) + { + structPtr->unk6783[structPtr->unk6786] = sub_81CEF14(); + unkPtr = GetSubstructPtr(18); + boxId = unkPtr->unk4[unkPtr->unk2].boxId; + monId = unkPtr->unk4[unkPtr->unk2].monId; + markings = structPtr->unk6783[structPtr->unk6786]; + + if (boxId == TOTAL_BOXES_COUNT) + SetMonData(&gPlayerParty[monId], MON_DATA_MARKINGS, &markings); + else + SetBoxMonDataAt(boxId, monId, MON_DATA_MARKINGS, &markings); + + structPtr->unk6304 = sub_81CD08C; + ret = 6; + } + + return ret; +} + +u32 sub_81CD19C(struct PokenavSub11 *structPtr) +{ + if (structPtr->unk6300 == 0) + return POKENAV_MENU_2; + else + return POKENAV_MENU_A; +} + +void sub_81CD1C0(void) +{ + struct PokenavSub11 *structPtr = GetSubstructPtr(11); + if (structPtr->unk6300 == 0) + FreePokenavSubstruct(18); + + FreePokenavSubstruct(11); +} + +u8 sub_81CD1E4(struct PokenavSub11 *structPtr) +{ + struct PokenavSub18 *unkPtr = GetSubstructPtr(18); + u8 ret = 0; + + if (gMain.heldKeys & DPAD_UP) + { + if (structPtr->unk6300 == 0 || unkPtr->unk2 != 0) + { + PlaySE(SE_SELECT); + ret = sub_81CD258(1); + } + } + else if (gMain.heldKeys & DPAD_DOWN) + { + if (structPtr->unk6300 == 0 || unkPtr->unk2 < unkPtr->unk0 - 1) + { + PlaySE(SE_SELECT); + ret = sub_81CD258(0); + } + } + + return ret; +} + +u8 sub_81CD258(u8 arg0) +{ + u16 r7; + bool8 r6, r0; + struct PokenavSub11 *structPtr = GetSubstructPtr(11); + struct PokenavSub18 *unkPtr = GetSubstructPtr(18); + + r7 = (arg0) ? structPtr->unk6788 : structPtr->unk6787; + sub_81D1F84(&structPtr->unk6428, structPtr->unk6428.unk14[structPtr->unk6786], structPtr->unk6428.unk14[r7]); + r6 = (unkPtr->unk2 != ((sub_81CDD5C() != 0) ? unkPtr->unk0 : unkPtr->unk0 - 1)); + if (arg0) + { + structPtr->unk6788 = structPtr->unk6787; + structPtr->unk6787 = structPtr->unk6786; + structPtr->unk6786 = r7; + structPtr->unk6789 = structPtr->unk6788; + + unkPtr->unk2 = (unkPtr->unk2 == 0) ? unkPtr->unk0 - 1 : unkPtr->unk2 - 1; + structPtr->unk6302 = (unkPtr->unk2 != 0) ? unkPtr->unk2 - 1 : unkPtr->unk0 - 1; + } + else + { + structPtr->unk6787 = structPtr->unk6788; + structPtr->unk6788 = structPtr->unk6786; + structPtr->unk6786 = r7; + structPtr->unk6789 = structPtr->unk6787; + + unkPtr->unk2 = (unkPtr->unk2 < unkPtr->unk0 - 1) ? unkPtr->unk2 + 1 : 0; + structPtr->unk6302 = (unkPtr->unk2 < unkPtr->unk0 - 1) ? unkPtr->unk2 + 1 : 0; + } + + r0 = (unkPtr->unk2 != ((sub_81CDD5C() != 0) ? unkPtr->unk0 : unkPtr->unk0 - 1)); + + if (!r6) + return 3; + else if (!r0) + return 4; + else + return 1; +} + +bool32 sub_81CD3C4(void) +{ + s32 var; + struct PokenavSub11 *structPtr = GetSubstructPtr(11); + struct PokenavSub18 *unkPtr = GetSubstructPtr(18); + + switch (structPtr->unk678A) + { + case 0: + sub_81CD824(unkPtr->unk2, 0); + break; + case 1: + sub_81CDA1C(unkPtr->unk2, 0); + break; + case 2: + sub_81CDB98(unkPtr->unk2, 0); + break; + case 3: + if (unkPtr->unk0 == 1) + { + structPtr->unk6786 = 0; + structPtr->unk6787 = 0; + structPtr->unk6788 = 0; + structPtr->unk678A = 0; + return TRUE; + } + else + { + structPtr->unk6786 = 0; + structPtr->unk6787 = 1; + structPtr->unk6788 = 2; + } + break; + // These were probably ternaries just like cases 7-9, but couldn't match it any other way. + case 4: + var = unkPtr->unk2 + 1; + if (var >= unkPtr->unk0) + var = 0; + sub_81CD824(var, 1); + break; + case 5: + var = unkPtr->unk2 + 1; + if (var >= unkPtr->unk0) + var = 0; + sub_81CDA1C(var, 1); + break; + case 6: + var = unkPtr->unk2 + 1; + if (var >= unkPtr->unk0) + var = 0; + sub_81CDB98(var, 1); + break; + case 7: + sub_81CD824((unkPtr->unk2 - 1 >= 0) ? unkPtr->unk2 - 1 : unkPtr->unk0 - 1, 2); + break; + case 8: + sub_81CDA1C((unkPtr->unk2 - 1 >= 0) ? unkPtr->unk2 - 1 : unkPtr->unk0 - 1, 2); + break; + case 9: + sub_81CDB98((unkPtr->unk2 - 1 >= 0) ? unkPtr->unk2 - 1 : unkPtr->unk0 - 1, 2); + structPtr->unk678A = 0; + return TRUE; + } + + structPtr->unk678A++; + return FALSE; +} + +bool32 sub_81CD548(u8 arg0) +{ + struct PokenavSub11 *structPtr = GetSubstructPtr(11); + + switch (arg0) + { + case 0: + sub_81CD824(structPtr->unk6302, structPtr->unk6789); + break; + case 1: + sub_81CDA1C(structPtr->unk6302, structPtr->unk6789); + break; + case 2: + sub_81CDB98(structPtr->unk6302, structPtr->unk6789); + return TRUE; + } + + return FALSE; +} + +u8 *sub_81CD5CC(u8 *dst, const u8 *src, s16 n) +{ + while (*src != EOS) + *dst++ = *src++, n--; + + while (n-- > 0) + *dst++ = CHAR_SPACE; + + *dst = EOS; + return dst; +} + +u8 *sub_81CD624(u8 *str, u16 id, bool8 arg3) +{ + u16 boxId, monId, gender, species, level, lvlDigits; + struct BoxPokemon *boxMon; + u8 *txtPtr, *str_; + struct PokenavSub18 *unkPtr = GetSubstructPtr(18); + + boxId = unkPtr->unk4[id].boxId; + monId = unkPtr->unk4[id].monId; + *(str++) = EXT_CTRL_CODE_BEGIN; + *(str++) = 4; + *(str++) = 8; + *(str++) = 0; + *(str++) = 9; + + if (GetBoxOrPartyMonData(boxId, monId, MON_DATA_IS_EGG, NULL)) + return StringCopyPadded(str, gText_EggNickname, CHAR_SPACE, 12); + + GetBoxOrPartyMonData(boxId, monId, MON_DATA_NICKNAME, str); + StringGetEnd10(str); + species = GetBoxOrPartyMonData(boxId, monId, MON_DATA_SPECIES, NULL); + if (boxId == TOTAL_BOXES_COUNT) + { + level = GetMonData(&gPlayerParty[monId], MON_DATA_LEVEL); + gender = GetMonGender(&gPlayerParty[monId]); + } + else + { + boxMon = GetBoxedMonPtr(boxId, monId); + gender = GetBoxMonGender(boxMon); + level = GetLevelFromBoxMonExp(boxMon); + } + + if ((species == SPECIES_NIDORAN_F || species == SPECIES_NIDORAN_M) && !StringCompare(str, gSpeciesNames[species])) + gender = MON_GENDERLESS; + + str_ = str; // For some reason, a variable is needed to match. + while (*str_ != EOS) + (str_++); + + *(str_++) = EXT_CTRL_CODE_BEGIN; + *(str_++) = 0x12; + *(str_++) = 0x3C; + switch (gender) + { + default: + *(str_++) = 0x77; + break; + case MON_MALE: + *(str_++) = EXT_CTRL_CODE_BEGIN; + *(str_++) = EXT_CTRL_CODE_COLOR; + *(str_++) = 4; + *(str_++) = EXT_CTRL_CODE_BEGIN; + *(str_++) = 3; + *(str_++) = 5; + *(str_++) = CHAR_MALE; + break; + case MON_FEMALE: + *(str_++) = EXT_CTRL_CODE_BEGIN; + *(str_++) = EXT_CTRL_CODE_COLOR; + *(str_++) = 6; + *(str_++) = EXT_CTRL_CODE_BEGIN; + *(str_++) = 3; + *(str_++) = 7; + *(str_++) = CHAR_FEMALE; + break; + } + + *(str_++) = EXT_CTRL_CODE_BEGIN; + *(str_++) = 4; + *(str_++) = 8; + *(str_++) = 0; + *(str_++) = 9; + *(str_++) = CHAR_SLASH; + *(str_++) = CHAR_SPECIAL_F9; + *(str_++) = CHAR_LV_2; + txtPtr = str_; + str_ = ConvertIntToDecimalStringN(str_, level, STR_CONV_MODE_LEFT_ALIGN, 3); + lvlDigits = str_ - txtPtr; + *(str_++) = CHAR_SPACE; + if (!arg3) + { + lvlDigits = 3 - lvlDigits; + while (lvlDigits-- != 0) + *(str_++) = CHAR_SPACE; + } + + *str_ = EOS; + return str_; +} + +void sub_81CD824(s16 arg0, u8 arg1) +{ + u16 boxId, i; + struct PokenavSub11 *structPtr = GetSubstructPtr(11); + struct PokenavSub18 *unkPtr = GetSubstructPtr(18); + + if (arg0 != (sub_81CDD5C() != 0 ? unkPtr->unk0 : unkPtr->unk0 - 1)) + { + sub_81CD624(structPtr->unk6368[arg1], arg0, FALSE); + boxId = unkPtr->unk4[arg0].boxId; + structPtr->unk6320[arg1][0] = EXT_CTRL_CODE_BEGIN; + structPtr->unk6320[arg1][1] = 4; + structPtr->unk6320[arg1][2] = 8; + structPtr->unk6320[arg1][3] = 0; + structPtr->unk6320[arg1][4] = 9; + if (boxId == TOTAL_BOXES_COUNT) + sub_81CD5CC(&structPtr->unk6320[arg1][5], gText_InParty, 8); + else + sub_81CD5CC(&structPtr->unk6320[arg1][5], GetBoxNamePtr(boxId), 8); + } + else + { + for (i = 0; i < 12; i++) + structPtr->unk6368[arg1][i] = CHAR_SPACE; + structPtr->unk6368[arg1][i] = EOS; + + for (i = 0; i < 8; i++) + structPtr->unk6320[arg1][i] = CHAR_SPACE; + structPtr->unk6320[arg1][i] = EOS; + } +} + +void sub_81CD970(void) +{ + u16 i, count; + struct PokenavSub11 *structPtr = GetSubstructPtr(11); + struct PokenavSub18 *unkPtr = AllocSubstruct(18, sizeof(struct PokenavSub18)); + + structPtr->unk6300 = 0; + for (i = 0, count = 0; i < CalculatePlayerPartyCount(); i++) + { + if (!GetMonData(&gPlayerParty[i], MON_DATA_IS_EGG)) + { + unkPtr->unk4[count].boxId = TOTAL_BOXES_COUNT; + unkPtr->unk4[count].monId = i; + unkPtr->unk4[count].data = 0; + count++; + } + } + + unkPtr->unk4[count].boxId = 0; + unkPtr->unk4[count].monId = 0; + unkPtr->unk4[count].data = 0; + unkPtr->unk2 = 0; + unkPtr->unk0 = count + 1; + structPtr->unk678A = 0; +} + +void sub_81CD9F8(void) +{ + struct PokenavSub11 *structPtr = GetSubstructPtr(11); + structPtr->unk6300 = 1; + structPtr->unk678A = 0; +} + +void sub_81CDA1C(s16 arg0, u8 arg1) +{ + u16 boxId, monId, i; + struct PokenavSub11 *structPtr = GetSubstructPtr(11); + struct PokenavSub18 *unkPtr = GetSubstructPtr(18); + + if (arg0 != (sub_81CDD5C() != 0 ? unkPtr->unk0 : unkPtr->unk0 - 1)) + { + boxId = unkPtr->unk4[arg0].boxId; + monId = unkPtr->unk4[arg0].monId; + structPtr->unk6428.unk0[arg1][0] = GetBoxOrPartyMonData(boxId, monId, MON_DATA_COOL, NULL); + structPtr->unk6428.unk0[arg1][1] = GetBoxOrPartyMonData(boxId, monId, MON_DATA_TOUGH, NULL); + structPtr->unk6428.unk0[arg1][2] = GetBoxOrPartyMonData(boxId, monId, MON_DATA_SMART, NULL); + structPtr->unk6428.unk0[arg1][3] = GetBoxOrPartyMonData(boxId, monId, MON_DATA_CUTE, NULL); + structPtr->unk6428.unk0[arg1][4] = GetBoxOrPartyMonData(boxId, monId, MON_DATA_BEAUTY, NULL); + structPtr->unk6780[arg1] = (GetBoxOrPartyMonData(boxId, monId, MON_DATA_SHEEN, NULL) != 255) + ? GetBoxOrPartyMonData(boxId, monId, MON_DATA_SHEEN, NULL) / 29u + : 9; + structPtr->unk6783[arg1] = GetBoxOrPartyMonData(boxId, monId, MON_DATA_MARKINGS, NULL); + sub_81D2754(structPtr->unk6428.unk0[arg1], structPtr->unk6428.unk14[arg1]); + } + else + { + for (i = 0; i < 5; i++) + { + structPtr->unk6428.unk0[arg1][i] = 0; + structPtr->unk6428.unk14[arg1][i].unk0 = 155; + structPtr->unk6428.unk14[arg1][i].unk2 = 91; + } + } +} + +void sub_81CDB98(s16 arg0, u8 arg1) +{ + u16 boxId, monId, species; + u32 personality, tid; + struct PokenavSub11 *structPtr = GetSubstructPtr(11); + struct PokenavSub18 *unkPtr = GetSubstructPtr(18); + + if (arg0 == (sub_81CDD5C() != 0 ? unkPtr->unk0 : unkPtr->unk0 - 1)) + return; + + boxId = unkPtr->unk4[arg0].boxId; + monId = unkPtr->unk4[arg0].monId; + species = GetBoxOrPartyMonData(boxId, monId, MON_DATA_SPECIES2, NULL); + tid = GetBoxOrPartyMonData(boxId, monId, MON_DATA_OT_ID, NULL); + personality = GetBoxOrPartyMonData(boxId, monId, MON_DATA_PERSONALITY, NULL); + LoadSpecialPokePic(&gMonFrontPicTable[species], structPtr->monPicGfx[arg1], species, personality, TRUE); + LZ77UnCompWram(GetMonSpritePalFromSpeciesAndPersonality(species, tid, personality), structPtr->monPal[arg1]); +} + +u16 sub_81CDC50(void) +{ + struct PokenavSub18 *unkPtr = GetSubstructPtr(18); + return unkPtr->unk0; +} + +u16 sub_81CDC60(void) +{ + struct PokenavSub18 *unkPtr = GetSubstructPtr(18); + return unkPtr->unk2; +} + +struct UnknownStruct_81D1ED4 *sub_81CDC70(void) +{ + struct PokenavSub11 *structPtr = GetSubstructPtr(11); + return &structPtr->unk6428; +} + +u8 sub_81CDC84(void) +{ + struct PokenavSub11 *structPtr = GetSubstructPtr(11); + return structPtr->unk6786; +} + +u8 sub_81CDC9C(void) +{ + struct PokenavSub11 *structPtr = GetSubstructPtr(11); + return structPtr->unk6302; +} + +void *sub_81CDCB4(u8 id) +{ + struct PokenavSub11 *structPtr = GetSubstructPtr(11); + return structPtr->monPicGfx[id]; +} + +void *sub_81CDCD4(u8 id) +{ + struct PokenavSub11 *structPtr = GetSubstructPtr(11); + return structPtr->monPal[id]; +} + +u8 sub_81CDCEC(void) +{ + struct PokenavSub11 *structPtr = GetSubstructPtr(11); + return structPtr->unk6789; +} + +u8 *sub_81CDD04(u8 id) +{ + struct PokenavSub11 *structPtr = GetSubstructPtr(11); + return structPtr->unk6368[id]; +} + +u8 *sub_81CDD24(u8 id) +{ + struct PokenavSub11 *structPtr = GetSubstructPtr(11); + return structPtr->unk6320[id]; +} + +u16 sub_81CDD48(void) +{ + struct PokenavSub18 *unkPtr = GetSubstructPtr(18); + return unkPtr->unk4[unkPtr->unk2].data; +} + +bool32 sub_81CDD5C(void) +{ + struct PokenavSub11 *structPtr = GetSubstructPtr(11); + if (structPtr->unk6300 == 1) + return TRUE; + else + return FALSE; +} + +u8 sub_81CDD7C(void) +{ + struct PokenavSub11 *structPtr = GetSubstructPtr(11); + if (structPtr->unk6300 == 1) + return structPtr->unk6783[structPtr->unk6786]; + else + return 0; +} + +u8 sub_81CDDB0(void) +{ + struct PokenavSub11 *structPtr = GetSubstructPtr(11); + return structPtr->unk6780[structPtr->unk6786]; +} diff --git a/src/pokenav_conditions_2.c b/src/pokenav_conditions_2.c new file mode 100644 index 000000000..11fdaa425 --- /dev/null +++ b/src/pokenav_conditions_2.c @@ -0,0 +1,884 @@ +#include "global.h" +#include "bg.h" +#include "window.h" +#include "pokenav.h" +#include "decompress.h" +#include "gpu_regs.h" +#include "graphics.h" +#include "menu.h" +#include "menu_specialized.h" +#include "mon_markings.h" +#include "palette.h" +#include "pokenav.h" +#include "scanline_effect.h" +#include "string_util.h" +#include "strings.h" +#include "text.h" + +u32 sub_81CE37C(s32); +u32 sub_81CE2D0(s32); +u32 sub_81CE4D8(s32); +u32 sub_81CE5E4(s32); +u32 sub_81CE6BC(s32); +u32 sub_81CE700(s32); + +BSS_DATA u8 gUnknown_030012BC; + +const u16 gUnknown_086231E8[] = INCBIN_U16("graphics/pokenav/86231E8.gbapal"); +const u16 gUnknown_08623208[] = INCBIN_U16("graphics/pokenav/8623208.gbapal"); +const u32 gUnknown_08623228[] = INCBIN_U32("graphics/pokenav/8623228.4bpp.lz"); +const u32 gUnknown_0862323C[] = INCBIN_U32("graphics/pokenav/862323C.bin.lz"); +const u16 gUnknown_08623338[] = INCBIN_U16("graphics/pokenav/8623338.gbapal"); + +const struct BgTemplate gUnknown_08623358[3] = +{ + { + .bg = 1, + .charBaseIndex = 1, + .mapBaseIndex = 0x1F, + .screenSize = 0, + .paletteMode = 0, + .priority = 1, + .baseTile = 0 + }, + { + .bg = 2, + .charBaseIndex = 3, + .mapBaseIndex = 0x1D, + .screenSize = 0, + .paletteMode = 0, + .priority = 2, + .baseTile = 0 + }, + { + .bg = 3, + .charBaseIndex = 2, + .mapBaseIndex = 0x1E, + .screenSize = 0, + .paletteMode = 0, + .priority = 3, + .baseTile = 0 + } +}; + +const struct WindowTemplate gUnknown_08623364 = +{ + .bg = 1, + .tilemapLeft = 13, + .tilemapTop = 1, + .width = 13, + .height = 4, + .paletteNum = 15, + .baseBlock = 2 +}; + +const struct WindowTemplate gUnknown_0862336C = +{ + .bg = 1, + .tilemapLeft = 1, + .tilemapTop = 6, + .width = 7, + .height = 2, + .paletteNum = 15, + .baseBlock = 0x36 +}; + +const struct WindowTemplate gUnknown_08623374 = +{ + .bg = 1, + .tilemapLeft = 1, + .tilemapTop = 0x1C, + .width = 5, + .height = 2, + .paletteNum = 15, + .baseBlock = 0x44 +}; + +const struct WindowTemplate gUnknown_0862337C = +{ + .bg = 1, + .tilemapLeft = 13, + .tilemapTop = 0x1C, + .width = 3, + .height = 2, + .paletteNum = 15, + .baseBlock = 0x44 +}; + +const LoopedTask gUnknown_08623384[] = +{ + NULL, + sub_81CE37C, + sub_81CE2D0, + sub_81CE4D8, + sub_81CE5E4, + sub_81CE6BC, + sub_81CE700 +}; + +struct Pokenav7Struct +{ + u32 loopedTaskId; + u8 tilemapBuffers[3][BG_SCREEN_SIZE]; + u8 filler[2]; + u8 unk1806[10]; + u32 (*unk1810)(void); + s16 unk1814; + u8 unk1816; + u16 unk1818; + u16 unk181A; + void *unk181C; + u8 unk1820; + u8 unk1821; + u8 unk1822; + u8 unk1823; + struct PokemonMarkMenu monMarks; + struct Sprite *unk28dc; + struct Sprite *unk28e0[10]; + u8 unk2908; + u8 filler2[0x38ac - 0x2909]; +}; + +extern s8 sub_81CDC84(void); // This function's declaration here is different than its definition in pokenav_unk_6. u8/s8 + +u32 sub_81CDE94(s32 state); +u32 sub_81CDE80(void); +void sub_81CED30(u8 var); +void sub_81CE9E4(void); +void sub_81CE934(void); +bool32 sub_81CE754(u8 a0, u16 a1, bool8 a2); +void sub_81CEE44(void); +void sub_81CEE90(void); +void sub_81CEEC8(void); +void sub_81CEE68(void); +void sub_81CEE74(bool8 showBg); + +// code +bool32 sub_81CDDD4(void) +{ + struct Pokenav7Struct *structPtr = AllocSubstruct(0xC, sizeof(struct Pokenav7Struct)); + + if (structPtr == NULL) + return FALSE; + + structPtr->unk1816 = 0xFF; + structPtr->loopedTaskId = CreateLoopedTask(sub_81CDE94, 1); + structPtr->unk1810 = sub_81CDE80; + structPtr->unk2908 = 0; + return TRUE; +} + +void sub_81CDE2C(s32 id) +{ + struct Pokenav7Struct *structPtr = GetSubstructPtr(0xC); + structPtr->loopedTaskId = CreateLoopedTask(gUnknown_08623384[id], 1); + structPtr->unk1810 = sub_81CDE80; +} + +u32 sub_81CDE64(void) +{ + struct Pokenav7Struct *structPtr = GetSubstructPtr(0xC); + return structPtr->unk1810(); +} + +u32 sub_81CDE80(void) +{ + struct Pokenav7Struct *structPtr = GetSubstructPtr(0xC); + return IsLoopedTaskActive(structPtr->loopedTaskId); +} + +u32 sub_81CDE94(s32 state) +{ + struct Pokenav7Struct *structPtr = GetSubstructPtr(0xC); + + switch (state) + { + case 0: + if (sub_81CD3C4() != TRUE) + return LT_PAUSE; + return LT_INC_AND_PAUSE; + case 1: + InitBgTemplates(gUnknown_08623358, ARRAY_COUNT(gUnknown_08623358)); + ChangeBgX(1, 0, 0); + ChangeBgY(1, 0, 0); + ChangeBgX(2, 0, 0); + ChangeBgY(2, 0, 0); + ChangeBgX(3, 0, 0); + ChangeBgY(3, 0, 0); + SetGpuReg(REG_OFFSET_DISPCNT, DISPCNT_WIN0_ON | DISPCNT_WIN1_ON | DISPCNT_OBJ_ON | DISPCNT_OBJ_1D_MAP | DISPCNT_BG0_ON | DISPCNT_BG3_ON); + SetGpuReg(REG_OFFSET_BLDCNT, BLDCNT_TGT1_BG2 | BLDCNT_EFFECT_BLEND | BLDCNT_TGT2_BG3); + SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(11, 4)); + decompress_and_copy_tile_data_to_vram(3, gPokenavCondition_Gfx, 0, 0, 0); + return LT_INC_AND_PAUSE; + case 2: + if (free_temp_tile_data_buffers_if_possible()) + return LT_PAUSE; + decompress_and_copy_tile_data_to_vram(2, gUnknown_08623228, 0, 0, 0); + return LT_INC_AND_PAUSE; + case 3: + if (free_temp_tile_data_buffers_if_possible()) + return LT_PAUSE; + + LZ77UnCompVram(gPokenavCondition_Tilemap, structPtr->tilemapBuffers[0]); + SetBgTilemapBuffer(3, structPtr->tilemapBuffers[0]); + if (sub_81CDD5C() == TRUE) + CopyToBgTilemapBufferRect(3, gPokenavOptions_Tilemap, 0, 5, 9, 4); + + CopyBgTilemapBufferToVram(3); + CopyPaletteIntoBufferUnfaded(gPokenavCondition_Pal, 0x10, 0x20); + CopyPaletteIntoBufferUnfaded(gUnknown_08623208, 0xF0, 0x20); + structPtr->unk1814 = -80; + return LT_INC_AND_PAUSE; + case 4: + if (free_temp_tile_data_buffers_if_possible()) + return LT_PAUSE; + + LZ77UnCompVram(gUnknown_0862323C, structPtr->tilemapBuffers[2]); + SetBgTilemapBuffer(2, structPtr->tilemapBuffers[2]); + CopyBgTilemapBufferToVram(2); + CopyPaletteIntoBufferUnfaded(gUnknown_086231E8, 0x30, 0x20); + sub_81D21DC(2); + return LT_INC_AND_PAUSE; + case 5: + sub_8199DF0(1, 0, 0, 1); + sub_8199DF0(1, 17, 1, 1); + CpuFill32(0, structPtr->tilemapBuffers[1], BG_SCREEN_SIZE); + SetBgTilemapBuffer(1, structPtr->tilemapBuffers[1]); + return LT_INC_AND_PAUSE; + case 6: + if (free_temp_tile_data_buffers_if_possible()) + return LT_PAUSE; + + structPtr->unk1820 = AddWindow(&gUnknown_08623364); + if (sub_81CDD5C() == TRUE) + { + structPtr->unk1821 = AddWindow(&gUnknown_0862336C); + structPtr->unk1822 = AddWindow(&gUnknown_08623374); + structPtr->unk1823 = AddWindow(&gUnknown_0862337C); + } + DeactivateAllTextPrinters(); + return LT_INC_AND_PAUSE; + case 7: + sub_81CED30(0); + return LT_INC_AND_PAUSE; + case 8: + sub_81CE9E4(); + return LT_INC_AND_PAUSE; + case 9: + if (sub_81CDD5C() == TRUE) + sub_81CE934(); + return LT_INC_AND_PAUSE; + case 10: + sub_81CE754(0, sub_81CDC84(), TRUE); + return LT_INC_AND_PAUSE; + case 11: + sub_81CE754(1, sub_81CDC84(), TRUE); + return LT_INC_AND_PAUSE; + case 12: + sub_81CE754(2, sub_81CDC84(), TRUE); + return LT_INC_AND_PAUSE; + case 13: + if (sub_81CE754(3, sub_81CDC84(), TRUE) != TRUE) + return LT_PAUSE; + PutWindowTilemap(structPtr->unk1820); + if (sub_81CDD5C() == TRUE) + { + PutWindowTilemap(structPtr->unk1821); + PutWindowTilemap(structPtr->unk1822); + PutWindowTilemap(structPtr->unk1823); + } + return LT_INC_AND_PAUSE; + case 14: + ShowBg(1); + HideBg(2); + ShowBg(3); + if (sub_81CDD5C() == TRUE) + PrintHelpBarText(HELPBAR_CONDITION_MON_STATUS); + return LT_INC_AND_PAUSE; + case 15: + sub_81C7AC0(1); + if (!sub_81CDD5C()) + { + LoadLeftHeaderGfxForIndex(6); + sub_81C7FA0(1, TRUE, 0); + sub_81C7FA0(6, TRUE, 0); + } + return LT_INC_AND_PAUSE; + case 16: + if (IsPaletteFadeActive()) + return LT_PAUSE; + if (!sub_81CDD5C() && sub_81C8010()) + return LT_PAUSE; + SetVBlankCallback_(sub_81CEE44); + return LT_INC_AND_PAUSE; + case 17: + sub_81CEE90(); + sub_81D20AC(sub_81CDC70()); + return LT_INC_AND_PAUSE; + case 18: + if (sub_81D20BC(sub_81CDC70())) + return LT_PAUSE; + return LT_INC_AND_PAUSE; + case 19: + sub_81CEE74(TRUE); + return LT_INC_AND_PAUSE; + case 20: + if (!sub_81D3178(sub_81CDC70(), &structPtr->unk1814)) + { + sub_81D3464(structPtr->unk28e0); + if (sub_81CDD5C() == TRUE || sub_81CDC60() != sub_81CDC50()) + sub_81D3480(structPtr->unk28e0, structPtr->unk1816, sub_81CDDB0()); + + return LT_FINISH; + } + return LT_PAUSE; + } + + return LT_FINISH; +} + +u32 sub_81CE2D0(s32 state) +{ + struct Pokenav7Struct *structPtr = GetSubstructPtr(0xC); + + switch (state) + { + case 0: + sub_81CEEC8(); + sub_81D3520(structPtr->unk28e0); + return 1; + case 1: + if (sub_81D31A4(sub_81CDC70(), &structPtr->unk1814)) + return 2; + sub_81CEE74(FALSE); + return 1; + case 2: + sub_81C7AC0(0); + if (!sub_81CDD5C()) + sub_81C78A0(); + return 0; + case 3: + if (IsPaletteFadeActive() || MainMenuLoopedTaskIsBusy()) + return 2; + sub_81D354C(structPtr->unk28e0); + HideBg(1); + HideBg(2); + HideBg(3); + return 1; + } + + return LT_FINISH; +} + +u32 sub_81CE37C(s32 state) +{ + struct Pokenav7Struct *structPtr = GetSubstructPtr(0xC); + struct UnknownStruct_81D1ED4 *unkPtr = sub_81CDC70(); + + switch (state) + { + case 0: + sub_81CD548(0); + return 1; + case 1: + sub_81CD548(1); + return 1; + case 2: + sub_81CD548(2); + sub_81D3520(structPtr->unk28e0); + return 1; + case 3: + sub_81D2074(unkPtr); + return 1; + case 4: + if (!sub_81D3150(&structPtr->unk1814)) + { + sub_81CED30(sub_81CDC84()); + return 1; + } + return 2; + case 5: + sub_81CE754(0, sub_81CDC84(), FALSE); + return 1; + case 6: + sub_81CE754(1, sub_81CDC84(), FALSE); + return 1; + case 7: + sub_81CE754(2, sub_81CDC84(), FALSE); + return 1; + case 8: + if (sub_81CE754(3, sub_81CDC84(), FALSE) == TRUE) + return 1; + return 2; + case 9: + unkPtr = sub_81CDC70(); + if (!sub_81D3178(unkPtr, &structPtr->unk1814)) + { + sub_81D3464(structPtr->unk28e0); + if (sub_81CDD5C() != TRUE && sub_81CDC60() == sub_81CDC50()) + return 1; + + sub_81D3480(structPtr->unk28e0, structPtr->unk1816, sub_81CDDB0()); + return 1; + } + return 2; + } + + return LT_FINISH; +} + +u32 sub_81CE4D8(s32 state) +{ + struct Pokenav7Struct *structPtr = GetSubstructPtr(0xC); + + switch (state) + { + case 0: + sub_81CD548(0); + return 1; + case 1: + sub_81CD548(1); + return 1; + case 2: + sub_81CD548(2); + return 1; + case 3: + sub_81CED30(sub_81CDC84()); + return 1; + case 4: + sub_81CE754(0, sub_81CDC84(), FALSE); + return 1; + case 5: + sub_81CE754(1, sub_81CDC84(), FALSE); + return 1; + case 6: + sub_81CE754(2, sub_81CDC84(), FALSE); + return 1; + case 7: + if (sub_81CE754(3, sub_81CDC84(), FALSE) == TRUE) + return 1; + return 2; + case 8: + if (!sub_81D3178(sub_81CDC70(), &structPtr->unk1814)) + { + sub_81D3464(structPtr->unk28e0); + sub_81D3480(structPtr->unk28e0, structPtr->unk1816, sub_81CDDB0()); + return 1; + } + return 2; + } + + return LT_FINISH; +} + +u32 sub_81CE5E4(s32 state) +{ + struct Pokenav7Struct *structPtr = GetSubstructPtr(0xC); + + switch (state) + { + case 0: + sub_81CD548(0); + return 1; + case 1: + sub_81CD548(1); + return 1; + case 2: + sub_81CD548(2); + sub_81D3520(structPtr->unk28e0); + return 1; + case 3: + if (!sub_81D31A4(sub_81CDC70(), &structPtr->unk1814)) + return 1; + return 2; + case 4: + sub_81CE754(0, sub_81CDC84(), FALSE); + return 1; + case 5: + sub_81CE754(1, sub_81CDC84(), FALSE); + return 1; + case 6: + sub_81CE754(2, sub_81CDC84(), FALSE); + return 1; + case 7: + if (sub_81CE754(3, sub_81CDC84(), FALSE) == TRUE) + return 1; + return 2; + } + + return LT_FINISH; +} + +u32 sub_81CE6BC(s32 state) +{ + switch (state) + { + case 0: + sub_811FAA4(sub_81CDD7C(), 176, 32); + return 1; + case 1: + PrintHelpBarText(HELPBAR_CONDITION_MARKINGS); + return 1; + case 2: + if (WaitForHelpBar() == TRUE) + return 2; + return 1; + } + + return LT_FINISH; +} + +u32 sub_81CE700(s32 state) +{ + switch (state) + { + case 0: + sub_811FAF8(); + return 1; + case 1: + PrintHelpBarText(HELPBAR_CONDITION_MON_STATUS); + return 1; + case 2: + if (WaitForHelpBar() == TRUE) + return 2; + return 1; + } + + return LT_FINISH; +} + +static u8 *UnusedPrintNumberString(u8 *dst, u16 num) +{ + u8 *txtPtr = ConvertIntToDecimalStringN(dst, num, STR_CONV_MODE_RIGHT_ALIGN, 4); + txtPtr = StringCopy(txtPtr, gText_Number2); + + return txtPtr; +} + +bool32 sub_81CE754(u8 a0, u16 a1, bool8 a2) +{ + u8 text[32]; + const u8 *str; + struct Pokenav7Struct *structPtr = GetSubstructPtr(0xC); + + switch (a0) + { + case 0: + FillWindowPixelBuffer(structPtr->unk1820, 0); + if (sub_81CDD5C() == TRUE) + FillWindowPixelBuffer(structPtr->unk1821, 0); + break; + case 1: + if (sub_81CDC60() != sub_81CDC50() - 1 || sub_81CDD5C() == TRUE) + { + str = sub_81CDD04(a1); + AddTextPrinterParameterized(structPtr->unk1820, 1, str, 0, 1, 0, NULL); + } + break; + case 2: + if (sub_81CDD5C() == TRUE) + { + str = sub_81CDD24(a1); + AddTextPrinterParameterized(structPtr->unk1820, 1, str, 0, 17, 0, NULL); + text[0] = EXT_CTRL_CODE_BEGIN; + text[1] = 4; + text[2] = 8; + text[3] = 0; + text[4] = 9; + StringCopy(text + 5, gText_Number2); + AddTextPrinterParameterized(structPtr->unk1821, 1, text, 4, 1, 0, NULL); + ConvertIntToDecimalStringN(text + 5, sub_81CDD48(), STR_CONV_MODE_RIGHT_ALIGN, 4); + AddTextPrinterParameterized(structPtr->unk1821, 1, text, 28, 1, 0, NULL); + } + break; + case 3: + switch (structPtr->unk2908) + { + case 0: + if (a2) + CopyWindowToVram(structPtr->unk1820, 3); + else + CopyWindowToVram(structPtr->unk1820, 2); + + if (sub_81CDD5C() == TRUE) + { + structPtr->unk2908++; + return FALSE; + } + else + { + structPtr->unk2908 = 0; + return TRUE; + } + case 1: + if (a2) + CopyWindowToVram(structPtr->unk1821, 3); + else + CopyWindowToVram(structPtr->unk1821, 2); + + structPtr->unk2908 = 0; + return TRUE; + } + } + + return FALSE; +} + +void sub_81CE934(void) +{ + struct Pokenav7Struct *structPtr = GetSubstructPtr(0xC); + + CopyWindowToVram(structPtr->unk1822, 3); + CopyWindowToVram(structPtr->unk1823, 3); +} + +void sub_81CE964(struct Sprite *sprite) +{ + if (sprite->data[0] == sub_81CDC60()) + StartSpriteAnim(sprite, 0); + else + StartSpriteAnim(sprite, 1); +} + +void sub_81CE990(struct Sprite *sprite) +{ + if (sub_81CDC60() == sub_81CDC50() - 1) + sprite->oam.paletteNum = IndexOfSpritePaletteTag(0x65); + else + sprite->oam.paletteNum = IndexOfSpritePaletteTag(0x66); +} + +void sub_81CE9C8(struct Sprite *sprite) +{ + StartSpriteAnim(sprite, sub_81CDD7C()); +} + +void sub_81CE9E4(void) +{ + struct SpriteSheet sprSheets[4]; + struct SpriteTemplate sprTemplate; + struct SpritePalette sprPals[3]; + struct SpriteSheet sprSheet; + struct Sprite *sprite; + u16 i, spriteId; + struct Pokenav7Struct *structPtr = GetSubstructPtr(0xC); + + sub_81D321C(sprSheets, &sprTemplate, sprPals); + if (sub_81CDD5C() == TRUE) + { + structPtr->monMarks.baseTileTag = 0x6A; + structPtr->monMarks.basePaletteTag = 0x6A; + sub_811F90C(&structPtr->monMarks); + sub_811FA90(); + sprite = sub_811FF94(0x69, 0x69, gUnknown_08623338); + sprite->oam.priority = 3; + sprite->pos1.x = 192; + sprite->pos1.y = 32; + sprite->callback = sub_81CE9C8; + structPtr->unk28dc = sprite; + sub_81C7990(IndexOfSpritePaletteTag(0x69), 0); + } + else + { + LoadSpriteSheets(sprSheets); + Pokenav_AllocAndLoadPalettes(sprPals); + for (i = 0; i < sub_81CDC50() - 1; i++) + { + spriteId = CreateSprite(&sprTemplate, 226, (i * 20) + 8, 0); + if (spriteId != MAX_SPRITES) + { + structPtr->unk1806[i] = spriteId; + gSprites[spriteId].data[0] = i; + gSprites[spriteId].callback = sub_81CE964; + } + else + { + structPtr->unk1806[i] = 0xFF; + } + } + + sprTemplate.tileTag = 0x67; + sprTemplate.callback = SpriteCallbackDummy; + for (; i < 6; i++) + { + spriteId = CreateSprite(&sprTemplate, 230, (i * 20) + 8, 0); + if (spriteId != MAX_SPRITES) + { + structPtr->unk1806[i] = spriteId; + gSprites[spriteId].oam.size = 0; + } + else + { + structPtr->unk1806[i] = 0xFF; + } + } + + sprTemplate.tileTag = 0x66; + sprTemplate.callback = sub_81CE990; + spriteId = CreateSprite(&sprTemplate, 222, (i * 20) + 8, 0); + if (spriteId != MAX_SPRITES) + { + structPtr->unk1806[i] = spriteId; + gSprites[spriteId].oam.shape = SPRITE_SHAPE(32x16); + gSprites[spriteId].oam.size = SPRITE_SIZE(32x16); + } + else + { + structPtr->unk1806[i] = 0xFF; + } + } + + sub_81D32B0(&sprSheet, &sprPals[0]); + LoadSpriteSheet(&sprSheet); + sprPals[1].data = NULL; + Pokenav_AllocAndLoadPalettes(sprPals); +} + +void sub_81CEBF4(struct Pokenav7Struct *structPtr) +{ + u8 i; + + if (sub_81CDD5C() == TRUE) + { + DestroySprite(structPtr->unk28dc); + FreeSpriteTilesByTag(0x6A); + FreeSpriteTilesByTag(0x69); + FreeSpritePaletteByTag(0x6A); + FreeSpritePaletteByTag(0x69); + } + else + { + for (i = 0; i < 7; i++) + DestroySprite(&gSprites[structPtr->unk1806[i]]); + + FreeSpriteTilesByTag(0x65); + FreeSpriteTilesByTag(0x66); + FreeSpriteTilesByTag(0x67); + FreeSpritePaletteByTag(0x65); + FreeSpritePaletteByTag(0x66); + } + + if (structPtr->unk1816 != 0xFF) + { + DestroySprite(&gSprites[structPtr->unk1816]); + FreeSpriteTilesByTag(0x64); + FreeSpritePaletteByTag(0x64); + } +} + +void sub_81CECA0(void) +{ + struct Pokenav7Struct *structPtr = GetSubstructPtr(0xC); + + RemoveWindow(structPtr->unk1820); + if (sub_81CDD5C() == TRUE) + { + RemoveWindow(structPtr->unk1821); + RemoveWindow(structPtr->unk1822); + RemoveWindow(structPtr->unk1823); + } + else + { + sub_81C7FDC(); + } + + SetGpuReg(REG_OFFSET_DISPCNT, DISPCNT_OBJ_ON | DISPCNT_BG0_ON | DISPCNT_OBJ_1D_MAP); + sub_81CEBF4(structPtr); + sub_81CEE68(); + FreePokenavSubstruct(0xC); +} + +void sub_81CED10(struct Sprite *sprite) +{ + struct Pokenav7Struct *structPtr = GetSubstructPtr(0xC); + sprite->pos1.x = structPtr->unk1814 + 38; +} + +void sub_81CED30(u8 var) +{ + struct SpriteTemplate sprTemplate; + struct SpriteSheet sprSheet; + struct SpritePalette sprPal; + u8 spriteId; + struct Pokenav7Struct *structPtr = GetSubstructPtr(0xC); + + if (structPtr->unk1816 == 0xFF) + { + sub_81D31D0(&sprSheet, &sprTemplate, &sprPal); + sprSheet.data = sub_81CDCB4(var); + sprPal.data = sub_81CDCD4(var); + structPtr->unk1818 = LoadSpritePalette(&sprPal); + structPtr->unk181A = LoadSpriteSheet(&sprSheet); + spriteId = CreateSprite(&sprTemplate, 38, 104, 0); + structPtr->unk1816 = spriteId; + if (spriteId == MAX_SPRITES) + { + FreeSpriteTilesByTag(0x64); + FreeSpritePaletteByTag(0x64); + structPtr->unk1816 = 0xFF; + } + else + { + structPtr->unk1816 = spriteId; + gSprites[structPtr->unk1816].callback = sub_81CED10; + structPtr->unk181C = (void*)(VRAM) + 0x10000 + (structPtr->unk181A * 32); + structPtr->unk1818 = (structPtr->unk1818 * 16) + 0x100; + } + } + else + { + DmaCopy16Defvars(3, sub_81CDCB4(var), structPtr->unk181C, 0x800); + LoadPalette(sub_81CDCD4(var), structPtr->unk1818, 0x20); + } +} + +void sub_81CEE44(void) +{ + struct UnknownStruct_81D1ED4 *unk = sub_81CDC70(); + LoadOam(); + ProcessSpriteCopyRequests(); + TransferPlttBuffer(); + sub_81D2108(unk); + ScanlineEffect_InitHBlankDmaTransfer(); +} + +void sub_81CEE68(void) +{ + SetPokenavVBlankCallback(); +} + +void sub_81CEE74(bool8 showBg) +{ + if (showBg) + ShowBg(2); + else + HideBg(2); +} + +void sub_81CEE90(void) +{ + struct UnknownStruct_81D1ED4 *unk = sub_81CDC70(); + u8 id = sub_81CDC84(); + + gUnknown_030012BC = id; + sub_81D1F84(unk, unk->unk14[3], unk->unk14[id]); + sub_81D2074(unk); +} + +void sub_81CEEC8(void) +{ + struct UnknownStruct_81D1ED4 *unk = sub_81CDC70(); + + if (sub_81CDD5C() || sub_81CDC60() != sub_81CDC50() - 1) + sub_81D1F84(unk, unk->unk14[sub_81CDC84()], unk->unk14[3]); +} + +u8 sub_81CEF14(void) +{ + struct Pokenav7Struct *structPtr = GetSubstructPtr(0xC); + + if (sub_81CDD5C() == 1) + return structPtr->monMarks.markings; + else + return 0; +} diff --git a/src/pokenav_conditions_3.c b/src/pokenav_conditions_3.c new file mode 100644 index 000000000..9b6ce432b --- /dev/null +++ b/src/pokenav_conditions_3.c @@ -0,0 +1,714 @@ +#include "global.h" +#include "pokenav.h" +#include "bg.h" +#include "menu.h" +#include "window.h" +#include "sound.h" +#include "dynamic_placeholder_text_util.h" +#include "strings.h" +#include "string_util.h" +#include "international_string_util.h" +#include "constants/songs.h" + +struct PokenavSub7 +{ + u32 (*unk0)(struct PokenavSub7 *); + u32 loopedTaskId; + u8 fill1[4]; + s32 unkC; + s32 unk10; + u32 unk14; + u32 unk18; + u32 unk1C; + struct PokenavSub18 *unkPtr; +}; + +struct PokenavSub8 +{ + bool32 (*callback)(void); + u32 ltid; + u16 winid; + bool32 unkC; + u8 buff[BG_SCREEN_SIZE]; +}; // size: 0x810 + +static u32 sub_81CF010(struct PokenavSub7 *structPtr); +static u32 sub_81CF030(struct PokenavSub7 *structPtr); +static u32 sub_81CF0B8(struct PokenavSub7 *structPtr); +static u32 sub_81CF0B0(struct PokenavSub7 *structPtr); +static u32 sub_81CF11C(s32 state); +static u32 sub_81CF134(s32 state); +static u32 sub_81CF1C4(s32 state); +static u32 sub_81CF1D8(s32 state); +static u32 sub_81CF278(s32 state); +static u32 sub_81CF578(s32 state); +static u32 sub_81CF5F0(s32 state); +static u32 sub_81CF668(s32 state); +static u32 sub_81CF6E0(s32 state); +static u32 sub_81CF758(s32 state); +static u32 sub_81CF798(s32 state); +static void sub_81CF2C4(struct PokenavSub7 *structPtr, struct PokenavMonList *item); +static bool32 sub_81CF3E4(void); +static u32 sub_81CF418(s32 state); +static void sub_81CF7C8(struct PokenavSub8 *); +static void sub_81CF7F4(struct PokenavSub8 *); +static void sub_81CF88C(void); +static void sub_81CF8E4(struct PokenavMonList *, u8 *); + +static const u32 gUnknown_086233A0[] = {0x16, 0x17, 0x18, 0x21, 0x2F}; + +static const LoopedTask gUnknown_086233B4[] = +{ + sub_81CF134, + sub_81CF1C4, + sub_81CF1D8, + sub_81CF278 +}; + +static const u16 gUnknown_086233C4[] = INCBIN_U16("graphics/pokenav/condition_search2.gbapal"); +static const u32 gUnknown_086233E4[] = INCBIN_U32("graphics/pokenav/condition_search2.4bpp.lz"); +static const u32 gUnknown_086234AC[] = INCBIN_U32("graphics/pokenav/condition_search2.bin.lz"); +static const u16 gUnknown_08623570[] = INCBIN_U16("graphics/pokenav/8623570.gbapal"); + +static const struct BgTemplate gUnknown_08623590[] = +{ + { + .bg = 1, + .charBaseIndex = 1, + .mapBaseIndex = 0x06, + .screenSize = 0, + .paletteMode = 0, + .priority = 2, + .baseTile = 0 + }, { + .bg = 2, + .charBaseIndex = 2, + .mapBaseIndex = 0x07, + .screenSize = 0, + .paletteMode = 0, + .priority = 3, + .baseTile = 0 + } +}; + +static const LoopedTask gUnknown_08623598[] = +{ + NULL, + sub_81CF578, + sub_81CF5F0, + sub_81CF668, + sub_81CF6E0, + sub_81CF758, + sub_81CF798 +}; + +static const struct WindowTemplate gUnknown_086235B4 = +{ + .bg = 1, + .tilemapLeft = 1, + .tilemapTop = 6, + .width = 7, + .height = 2, + .paletteNum = 1, + .baseBlock = 20 +}; + +static const u8 sText_MaleSymbol[] = _("{COLOR_HIGHLIGHT_SHADOW}{LIGHT_RED}{WHITE}{GREEN}♂{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 sText_NoGenderSymbol[] = _("{UNK_SPACER}"); + +bool32 PokenavCallback_Init_8(void) +{ + struct PokenavSub7 *structPtr = AllocSubstruct(7, sizeof(struct PokenavSub7)); + if (structPtr == NULL) + return FALSE; + + structPtr->unkPtr = AllocSubstruct(18, sizeof(struct PokenavSub18)); + if (structPtr->unkPtr == NULL) + return FALSE; + + structPtr->unk0 = sub_81CF010; + structPtr->loopedTaskId = CreateLoopedTask(sub_81CF11C, 1); + structPtr->unk18 = 0; + structPtr->unk14 = gUnknown_086233A0[GetSelectedConditionSearch()]; + return TRUE; +} + +bool32 PokenavCallback_Init_10(void) +{ + struct PokenavSub7 *structPtr = AllocSubstruct(7, sizeof(struct PokenavSub7)); + if (structPtr == NULL) + return FALSE; + + structPtr->unkPtr = GetSubstructPtr(18); + structPtr->unk0 = sub_81CF030; + structPtr->unk18 = 1; + structPtr->unk14 = gUnknown_086233A0[GetSelectedConditionSearch()]; + return TRUE; +} + +u32 sub_81CEFDC(void) +{ + struct PokenavSub7 *structPtr = GetSubstructPtr(7); + return structPtr->unk0(structPtr); +} + +void sub_81CEFF0(void) +{ + struct PokenavSub7 *structPtr = GetSubstructPtr(7); + if (structPtr->unk1C == 0) + FreePokenavSubstruct(18); + FreePokenavSubstruct(7); +} + +static bool32 sub_81CF010(struct PokenavSub7 *structPtr) +{ + if (!IsLoopedTaskActive(structPtr->loopedTaskId)) + structPtr->unk0 = sub_81CF030; + return FALSE; +} + +static u32 sub_81CF030(struct PokenavSub7 *structPtr) +{ + if (gMain.newAndRepeatedKeys & DPAD_UP) + return 1; + else if (gMain.newAndRepeatedKeys & DPAD_DOWN) + return 2; + else if (gMain.newKeys & DPAD_LEFT) + return 3; + else if (gMain.newKeys & DPAD_RIGHT) + return 4; + else if (gMain.newKeys & B_BUTTON) + { + structPtr->unk1C = 0; + structPtr->unk0 = sub_81CF0B0; + return 5; + } + else if (gMain.newKeys & A_BUTTON) + { + structPtr->unkPtr->unk2 = GetSelectedMatchCall(); + structPtr->unk1C = 1; + structPtr->unk0 = sub_81CF0B8; + return 6; + } + else + return 0; +} + +static u32 sub_81CF0B0(struct PokenavSub7 *structPtr) +{ + return 100003; +} + +static u32 sub_81CF0B8(struct PokenavSub7 *structPtr) +{ + return 100009; +} + +static u32 sub_81CF0C0(void) +{ + struct PokenavSub7 *structPtr = GetSubstructPtr(7); + return structPtr->unk18; +} + +static struct PokenavMonList * sub_81CF0D0(void) +{ + struct PokenavSub7 * ptr = GetSubstructPtr(7); + return ptr->unkPtr->unk4; +} + +static u16 sub_81CF0E0(void) +{ + struct PokenavSub7 * ptr = GetSubstructPtr(7); + return ptr->unkPtr->unk0; +} + +static s32 sub_81CF0F0(void) +{ + struct PokenavSub7 * ptr = GetSubstructPtr(7); + s32 i = GetSelectedMatchCall(); + return ptr->unkPtr->unk4[i].data; +} + +static u16 sub_81CF10C(void) +{ + struct PokenavSub7 * ptr = GetSubstructPtr(7); + return ptr->unkPtr->unk2; +} + +static u32 sub_81CF11C(s32 state) +{ + return gUnknown_086233B4[state](state); +} + +static u32 sub_81CF134(s32 state) +{ + s32 i; + struct PokenavMonList item; + struct PokenavSub7 * ptr = GetSubstructPtr(7); + + ptr->unkPtr->unk0 = 0; + ptr->unkPtr->unk2 = 0; + item.boxId = 14; + for (i = 0; i < PARTY_SIZE; i++) + { + struct Pokemon * pokemon = &gPlayerParty[i]; + if (!GetMonData(pokemon, MON_DATA_SANITY_HAS_SPECIES)) + return LT_INC_AND_CONTINUE; + if (!GetMonData(pokemon, MON_DATA_SANITY_IS_EGG)) + { + item.monId = i; + item.data = GetMonData(pokemon, ptr->unk14); + sub_81CF2C4(ptr, &item); + } + } + + return LT_INC_AND_CONTINUE; +} + +static u32 sub_81CF1C4(s32 state) +{ + struct PokenavSub7 * ptr = GetSubstructPtr(7); + ptr->unk10 = 0; + ptr->unkC = 0; + return LT_INC_AND_CONTINUE; +} + +static u32 sub_81CF1D8(s32 state) +{ + struct PokenavSub7 * ptr = GetSubstructPtr(7); + s32 boxId = ptr->unkC; + s32 monId = ptr->unk10; + s32 boxCount = 0; + struct PokenavMonList item; + + while (boxId < TOTAL_BOXES_COUNT) + { + while (monId < IN_BOX_COUNT) + { + if (CheckBoxMonSanityAt(boxId, monId)) + { + item.boxId = boxId; + item.monId = monId; + item.data = GetBoxMonDataAt(boxId, monId, ptr->unk14); + sub_81CF2C4(ptr, &item); + } + boxCount++; + monId++; + if (boxCount > 14) + { + ptr->unkC = boxId; + ptr->unk10 = monId; + return LT_CONTINUE; + } + } + monId = 0; + boxId++; + } + + return LT_INC_AND_CONTINUE; +} + +static u32 sub_81CF278(s32 state) +{ + struct PokenavSub7 * ptr = GetSubstructPtr(7); + s32 r6 = ptr->unkPtr->unk0; + s32 r4 = ptr->unkPtr->unk4[0].data; + s32 i; + ptr->unkPtr->unk4[0].data = 1; + for (i = 1; i < r6; i++) + { + if (ptr->unkPtr->unk4[i].data == r4) + { + ptr->unkPtr->unk4[i].data = ptr->unkPtr->unk4[i - 1].data; + } + else + { + r4 = ptr->unkPtr->unk4[i].data; + ptr->unkPtr->unk4[i].data = i + 1; + } + } + ptr->unk18 = 1; + return LT_FINISH; +} + +static void sub_81CF2C4(struct PokenavSub7 *structPtr, struct PokenavMonList *item) +{ + u32 left = 0; + u32 right = structPtr->unkPtr->unk0; + u32 insertionIdx = left + (right - left) / 2; + + while (right != insertionIdx) + { + if (item->data > structPtr->unkPtr->unk4[insertionIdx].data) + right = insertionIdx; + else + left = insertionIdx + 1; + insertionIdx = left + (right - left) / 2; + } + for (right = structPtr->unkPtr->unk0; right > insertionIdx; right--) + structPtr->unkPtr->unk4[right] = structPtr->unkPtr->unk4[right - 1]; + structPtr->unkPtr->unk4[insertionIdx] = *item; + structPtr->unkPtr->unk0++; +} + +bool32 sub_81CF330(void) +{ + struct PokenavSub8 * unk = AllocSubstruct(8, sizeof(struct PokenavSub8)); + if (unk == NULL) + return FALSE; + unk->ltid = CreateLoopedTask(sub_81CF418, 1); + unk->callback = sub_81CF3E4; + unk->unkC = FALSE; + return TRUE; +} + +bool32 sub_81CF368(void) +{ + struct PokenavSub8 * unk = AllocSubstruct(8, sizeof(struct PokenavSub8)); + if (unk == NULL) + return FALSE; + unk->ltid = CreateLoopedTask(sub_81CF418, 1); + unk->callback = sub_81CF3E4; + unk->unkC = TRUE; + return TRUE; +} + +void sub_81CF3A0(s32 idx) +{ + struct PokenavSub8 * unk = GetSubstructPtr(8); + unk->ltid = CreateLoopedTask(gUnknown_08623598[idx], 1); + unk->callback = sub_81CF3E4; +} + +bool32 sub_81CF3D0(void) +{ + struct PokenavSub8 * unk = GetSubstructPtr(8); + return unk->callback(); +} + +bool32 sub_81CF3E4(void) +{ + struct PokenavSub8 * unk = GetSubstructPtr(8); + return IsLoopedTaskActive(unk->ltid); +} + +void sub_81CF3F8(void) +{ + struct PokenavSub8 * unk = GetSubstructPtr(8); + sub_81C8234(); + RemoveWindow(unk->winid); + FreePokenavSubstruct(8); +} + +static u32 sub_81CF418(s32 state) +{ + struct PokenavSub8 * unk = GetSubstructPtr(8); + switch (state) + { + case 0: + InitBgTemplates(gUnknown_08623590, NELEMS(gUnknown_08623590)); + decompress_and_copy_tile_data_to_vram(1, gUnknown_086233E4, 0, 0, 0); + SetBgTilemapBuffer(1, unk->buff); + CopyToBgTilemapBuffer(1, gUnknown_086234AC, 0, 0); + CopyBgTilemapBufferToVram(1); + CopyPaletteIntoBufferUnfaded(gUnknown_086233C4, 0x10, 0x20); + CopyBgTilemapBufferToVram(1); + return LT_INC_AND_PAUSE; + case 1: + if (free_temp_tile_data_buffers_if_possible()) + return LT_PAUSE; + if (!sub_81CF0C0()) + return LT_PAUSE; + return LT_INC_AND_PAUSE; + case 2: + if (free_temp_tile_data_buffers_if_possible()) + return LT_PAUSE; + CopyPaletteIntoBufferUnfaded(gUnknown_08623570, 0x20, 0x20); + sub_81CF88C(); + return LT_INC_AND_PAUSE; + case 3: + if (sub_81C8224()) + return LT_PAUSE; + sub_81CF7C8(unk); + PrintHelpBarText(HELPBAR_CONDITION_MON_LIST); + return LT_INC_AND_PAUSE; + case 4: + if (free_temp_tile_data_buffers_if_possible()) + return LT_PAUSE; + ChangeBgX(1, 0, 0); + ChangeBgY(1, 0, 0); + ShowBg(1); + ShowBg(2); + HideBg(3); + if (!unk->unkC) + { + u8 r4 = GetSelectedConditionSearch() + POKENAV_MENUITEM_CONDITION_SEARCH_COOL; + LoadLeftHeaderGfxForIndex(r4); + sub_81C7FA0(r4, 1, 0); + sub_81C7FA0(1, 1, 0); + } + sub_81C7AC0(1); + return LT_INC_AND_PAUSE; + case 5: + if (IsPaletteFadeActive()) + return LT_PAUSE; + if (sub_81C8010()) + return LT_PAUSE; + break; + } + return LT_FINISH; +} + +static u32 sub_81CF578(s32 state) +{ + struct PokenavSub8 * unk = GetSubstructPtr(8); + switch (state) + { + case 0: + switch (MatchCall_MoveCursorUp()) + { + case 0: + return LT_FINISH; + case 1: + PlaySE(SE_SELECT); + return LT_SET_STATE(2); + case 2: + PlaySE(SE_SELECT); + break; + } + return LT_INC_AND_PAUSE; + case 1: + if (sub_81C8630()) + return LT_PAUSE; + // fallthrough + case 2: + sub_81CF7F4(unk); + return LT_INC_AND_PAUSE; + case 3: + if (IsDma3ManagerBusyWithBgCopy()) + return LT_PAUSE; + break; + } + return LT_FINISH; +} + +static u32 sub_81CF5F0(s32 state) +{ + struct PokenavSub8 * unk = GetSubstructPtr(8); + switch (state) + { + case 0: + switch (MatchCall_MoveCursorDown()) + { + case 0: + return LT_FINISH; + case 1: + PlaySE(SE_SELECT); + return LT_SET_STATE(2); + case 2: + PlaySE(SE_SELECT); + break; + } + return LT_INC_AND_PAUSE; + case 1: + if (sub_81C8630()) + return LT_PAUSE; + // fallthrough + case 2: + sub_81CF7F4(unk); + return LT_INC_AND_PAUSE; + case 3: + if (IsDma3ManagerBusyWithBgCopy()) + return LT_PAUSE; + break; + } + return LT_FINISH; +} + +static u32 sub_81CF668(s32 state) +{ + struct PokenavSub8 * unk = GetSubstructPtr(8); + switch (state) + { + case 0: + switch (MatchCall_PageUp()) + { + case 0: + return LT_FINISH; + case 1: + PlaySE(SE_SELECT); + return LT_SET_STATE(2); + case 2: + PlaySE(SE_SELECT); + break; + } + return LT_INC_AND_PAUSE; + case 1: + if (sub_81C8630()) + return LT_PAUSE; + // fallthrough + case 2: + sub_81CF7F4(unk); + return LT_INC_AND_PAUSE; + case 3: + if (IsDma3ManagerBusyWithBgCopy()) + return LT_PAUSE; + break; + } + return LT_FINISH; +} + +static u32 sub_81CF6E0(s32 state) +{ + struct PokenavSub8 * unk = GetSubstructPtr(8); + switch (state) + { + case 0: + switch (MatchCall_PageDown()) + { + case 0: + return LT_FINISH; + case 1: + PlaySE(SE_SELECT); + return LT_SET_STATE(2); + case 2: + PlaySE(SE_SELECT); + break; + } + return LT_INC_AND_PAUSE; + case 1: + if (sub_81C8630()) + return LT_PAUSE; + // fallthrough + case 2: + sub_81CF7F4(unk); + return LT_INC_AND_PAUSE; + case 3: + if (IsDma3ManagerBusyWithBgCopy()) + return LT_PAUSE; + break; + } + return LT_FINISH; +} + +static u32 sub_81CF758(s32 state) +{ + switch (state) + { + case 0: + PlaySE(SE_SELECT); + sub_81C7AC0(0); + sub_81C78A0(); + return LT_INC_AND_PAUSE; + case 1: + if (IsPaletteFadeActive()) + return LT_PAUSE; + if (MainMenuLoopedTaskIsBusy()) + return LT_PAUSE; + sub_81C7FDC(); + break; + } + return LT_FINISH; +} + +static u32 sub_81CF798(s32 state) +{ + switch (state) + { + case 0: + PlaySE(SE_SELECT); + sub_81C7AC0(0); + return LT_INC_AND_PAUSE; + case 1: + if (IsPaletteFadeActive()) + return LT_PAUSE; + break; + } + return LT_FINISH; +} + +static void sub_81CF7C8(struct PokenavSub8 * ptr) +{ + ptr->winid = AddWindow(&gUnknown_086235B4); + PutWindowTilemap(ptr->winid); + CopyWindowToVram(ptr->winid, 1); + sub_81CF7F4(ptr); +} + +static void sub_81CF7F4(struct PokenavSub8 * ptr) +{ + s32 r7 = sub_81CF0F0(); + DynamicPlaceholderTextUtil_Reset(); + DynamicPlaceholderTextUtil_SetPlaceholderPtr(0, gStringVar1); + *gStringVar1 = EOS; + DynamicPlaceholderTextUtil_ExpandPlaceholders(gStringVar2, gText_NumberF700); + AddTextPrinterParameterized(ptr->winid, 1, gStringVar2, 4, 1, 0xFF, NULL); + ConvertIntToDecimalStringN(gStringVar1, r7, STR_CONV_MODE_RIGHT_ALIGN, 3); + AddTextPrinterParameterized(ptr->winid, 1, gStringVar1, 34, 1, 0xFF, NULL); + CopyWindowToVram(ptr->winid, 2); +} + +static void sub_81CF88C(void) +{ + struct PokenavListTemplate template; + template.list.monList = sub_81CF0D0(); + template.unk4 = sub_81CF0E0(); + template.unk8 = 4; + template.unk6 = sub_81CF10C(); + template.unk9 = 13; + template.unkA = 17; + template.unkB = 1; + template.unkC = 8; + template.unkD = 2; + template.unkE = 1; + template.listFunc.unk10_1 = sub_81CF8E4; + template.unk14 = NULL; + sub_81C81D4(&gUnknown_08623590[1], &template, 0); +} + +static void sub_81CF8E4(struct PokenavMonList * item, u8 * dest) +{ + u8 gender; + u8 level; + u8 * s; + const u8 * genderStr; + + // Mon is in party + if (item->boxId == TOTAL_BOXES_COUNT) + { + struct Pokemon * mon = &gPlayerParty[item->monId]; + gender = GetMonGender(mon); + level = GetLevelFromMonExp(mon); + GetMonData(mon, MON_DATA_NICKNAME, gStringVar3); + } + // Mon is in PC + else + { + struct BoxPokemon * mon = GetBoxedMonPtr(item->boxId, item->monId); + gender = GetBoxMonGender(mon); + level = GetLevelFromBoxMonExp(mon); + GetBoxMonData(mon, MON_DATA_NICKNAME, gStringVar3); + } + + StringGetEnd10(gStringVar3); + dest = sub_81DB494(dest, 1, gStringVar3, 60); + switch (gender) + { + default: + genderStr = sText_NoGenderSymbol; + break; + case MON_MALE: + genderStr = sText_MaleSymbol; + break; + case MON_FEMALE: + genderStr = sText_FemaleSymbol; + break; + } + s = StringCopy(gStringVar1, genderStr); + *s++ = CHAR_SLASH; + *s++ = CHAR_SPECIAL_F9; + *s++ = CHAR_LV_2; + ConvertIntToDecimalStringN(s, level, STR_CONV_MODE_LEFT_ALIGN, 3); + sub_81DB494(dest, 1, gStringVar1, 40); +} diff --git a/src/pokenav_match_call_1.c b/src/pokenav_match_call_1.c new file mode 100755 index 000000000..28e84b50b --- /dev/null +++ b/src/pokenav_match_call_1.c @@ -0,0 +1,516 @@ +#include "global.h" +#include "battle_setup.h" +#include "data.h" +#include "event_data.h" +#include "gym_leader_rematch.h" +#include "international_string_util.h" +#include "main.h" +#include "match_call.h" +#include "overworld.h" +#include "pokemon.h" +#include "pokenav.h" +#include "sound.h" +#include "string_util.h" +#include "strings.h" +#include "constants/flags.h" +#include "constants/songs.h" + +struct Pokenav3Struct +{ + u16 optionCursorPos; + u16 maxOptionId; + const u8 *matchCallOptions; + u16 headerId; + u16 numRegistered; + u16 unkC; + u32 unk10; + u32 unk14; + u32 (*callback)(struct Pokenav3Struct*); + struct PokenavMatchCallEntries matchCallEntries[MAX_REMATCH_ENTRIES - 1]; +}; + +static u32 CB2_HandleMatchCallInput(struct Pokenav3Struct *); +static u32 sub_81CABFC(struct Pokenav3Struct *); +static u32 CB2_HandleMatchCallOptionsInput(struct Pokenav3Struct *); +static u32 CB2_HandleCheckPageInput(struct Pokenav3Struct *); +static u32 CB2_HandleCallInput(struct Pokenav3Struct *); +static u32 sub_81CAD20(s32); +static bool32 sub_81CB1D0(void); + +#include "data/text/match_call_messages.h" + +static const u8 sMatchCallOptionsNoCheckPage[] = +{ + MATCH_CALL_OPTION_CALL, + MATCH_CALL_OPTION_CANCEL +}; + +static const u8 sMatchCallOptionsHasCheckPage[] = +{ + MATCH_CALL_OPTION_CALL, + MATCH_CALL_OPTION_CHECK, + MATCH_CALL_OPTION_CANCEL +}; + +bool32 PokenavCallback_Init_11(void) +{ + struct Pokenav3Struct *state = AllocSubstruct(5, sizeof(struct Pokenav3Struct)); + if (!state) + return FALSE; + + state->callback = CB2_HandleMatchCallInput; + state->headerId = 0; + state->unk10 = 0; + state->unk14 = CreateLoopedTask(sub_81CAD20, 1); + return TRUE; +} + +u32 sub_81CAB24(void) +{ + struct Pokenav3Struct *state = GetSubstructPtr(5); + return state->callback(state); +} + +void sub_81CAB38(void) +{ + FreePokenavSubstruct(5); +} + +static u32 CB2_HandleMatchCallInput(struct Pokenav3Struct *state) +{ + int selection; + + if (gMain.newAndRepeatedKeys & DPAD_UP) + return POKENAV_MC_FUNC_UP; + if (gMain.newAndRepeatedKeys & DPAD_DOWN) + return POKENAV_MC_FUNC_DOWN; + if (gMain.newAndRepeatedKeys & DPAD_LEFT) + return POKENAV_MC_FUNC_PG_UP; + if (gMain.newAndRepeatedKeys & DPAD_RIGHT) + return POKENAV_MC_FUNC_PG_DOWN; + + if (gMain.newKeys & A_BUTTON) + { + state->callback = CB2_HandleMatchCallOptionsInput; + state->optionCursorPos = 0; + selection = GetSelectedMatchCall(); + + if (!state->matchCallEntries[selection].isSpecialTrainer || MatchCall_HasCheckPage(state->matchCallEntries[selection].headerId)) + { + state->matchCallOptions = sMatchCallOptionsHasCheckPage; + state->maxOptionId = ARRAY_COUNT(sMatchCallOptionsHasCheckPage) - 1; + } + else + { + state->matchCallOptions = sMatchCallOptionsNoCheckPage; + state->maxOptionId = ARRAY_COUNT(sMatchCallOptionsNoCheckPage) - 1; + } + + return POKENAV_MC_FUNC_SELECT; + } + + if (gMain.newKeys & B_BUTTON) + { + if (GetPokenavMode() != POKENAV_MODE_FORCE_CALL_READY) + { + state->callback = sub_81CABFC; + return POKENAV_MC_FUNC_EXIT; + } + else + { + // Cant exit Match Call menu before calling Mr Stone during tutorial + PlaySE(SE_HAZURE); + } + } + + return POKENAV_MC_FUNC_NONE; +} + +static u32 sub_81CABFC(struct Pokenav3Struct *state) +{ + return POKENAV_MENU_4; +} + +static u32 CB2_HandleMatchCallOptionsInput(struct Pokenav3Struct *state) +{ + if ((gMain.newKeys & DPAD_UP) && state->optionCursorPos) + { + state->optionCursorPos--; + return POKENAV_MC_FUNC_MOVE_OPTIONS_CURSOR; + } + + if ((gMain.newKeys & DPAD_DOWN) && state->optionCursorPos < state->maxOptionId) + { + state->optionCursorPos++; + return POKENAV_MC_FUNC_MOVE_OPTIONS_CURSOR; + } + + if (gMain.newKeys & A_BUTTON) + { + switch (state->matchCallOptions[state->optionCursorPos]) + { + case MATCH_CALL_OPTION_CANCEL: + state->callback = CB2_HandleMatchCallInput; + return POKENAV_MC_FUNC_CANCEL; + case MATCH_CALL_OPTION_CALL: + if (GetPokenavMode() == POKENAV_MODE_FORCE_CALL_READY) + SetPokenavMode(POKENAV_MODE_FORCE_CALL_EXIT); + + state->callback = CB2_HandleCallInput; + if (sub_81CB1D0()) + return POKENAV_MC_FUNC_NEARBY_MSG; + + return POKENAV_MC_FUNC_CALL_MSG; + case MATCH_CALL_OPTION_CHECK: + state->callback = CB2_HandleCheckPageInput; + return POKENAV_MC_FUNC_SHOW_CHECK_PAGE; + } + } + + if (gMain.newKeys & B_BUTTON) + { + state->callback = CB2_HandleMatchCallInput; + return POKENAV_MC_FUNC_CANCEL; + } + + return POKENAV_MC_FUNC_NONE; +} + +static u32 CB2_HandleCheckPageInput(struct Pokenav3Struct *state) +{ + if (gMain.newAndRepeatedKeys & DPAD_UP) + return POKENAV_MC_FUNC_CHECK_PAGE_UP; + if (gMain.newAndRepeatedKeys & DPAD_DOWN) + return POKENAV_MC_FUNC_CHECK_PAGE_DOWN; + + if (gMain.newKeys & B_BUTTON) + { + state->callback = CB2_HandleMatchCallInput; + return POKENAV_MC_FUNC_EXIT_CHECK_PAGE; + } + + return POKENAV_MC_FUNC_NONE; +} + +static u32 CB2_HandleCallInput(struct Pokenav3Struct *state) +{ + if (gMain.newKeys & (A_BUTTON | B_BUTTON)) + { + state->callback = CB2_HandleMatchCallInput; + return POKENAV_MC_FUNC_10; + } + + return POKENAV_MC_FUNC_NONE; +} + +static u32 sub_81CAD20(s32 taskState) +{ + int i, j; + struct Pokenav3Struct *state = GetSubstructPtr(5); + switch (taskState) + { + case 0: + state->headerId = 0; + state->numRegistered = 0; + return LT_INC_AND_CONTINUE; + case 1: + for (i = 0, j = state->headerId; i < 30; i++, j++) + { + if (MatchCall_GetEnabled(j)) + { + state->matchCallEntries[state->numRegistered].headerId = j; + state->matchCallEntries[state->numRegistered].isSpecialTrainer = TRUE; + state->matchCallEntries[state->numRegistered].mapSec = MatchCall_GetMapSec(j); + state->numRegistered++; + } + + if (++state->headerId >= MC_HEADER_COUNT) + { + state->unkC = state->headerId; + state->headerId = 0; + return LT_INC_AND_CONTINUE; + } + } + + return LT_CONTINUE; + case 2: + for (i = 0, j = state->headerId; i < 30; i++, j++) + { + if (!MatchCall_HasRematchId(state->headerId) && IsRematchEntryRegistered(state->headerId)) + { + state->matchCallEntries[state->numRegistered].headerId = state->headerId; + state->matchCallEntries[state->numRegistered].isSpecialTrainer = FALSE; + state->matchCallEntries[state->numRegistered].mapSec = sub_81CB0C8(j); + state->numRegistered++; + } + + if (++state->headerId > REMATCH_TABLE_ENTRIES - 1) + return LT_INC_AND_CONTINUE; + } + + return LT_CONTINUE; + case 3: + state->unk10 = 1; + break; + } + + return LT_FINISH; +} + +bool32 IsRematchEntryRegistered(int rematchIndex) +{ + if (rematchIndex < REMATCH_TABLE_ENTRIES) + return FlagGet(FLAG_MATCH_CALL_REGISTERED + rematchIndex); + + return FALSE; +} + +int sub_81CAE28(void) +{ + struct Pokenav3Struct *state = GetSubstructPtr(5); + return state->unk10; +} + +int GetNumberRegistered(void) +{ + struct Pokenav3Struct *state = GetSubstructPtr(5); + return state->numRegistered; +} + +int sub_81CAE48(void) +{ + struct Pokenav3Struct *state = GetSubstructPtr(5); + return state->unkC; +} + +int unref_sub_81CAE58(void) +{ + struct Pokenav3Struct *state = GetSubstructPtr(5); + return state->numRegistered - state->unkC; +} + +int unref_sub_81CAE6C(int arg0) +{ + struct Pokenav3Struct *state = GetSubstructPtr(5); + arg0 += state->unkC; + if (arg0 >= state->numRegistered) + return REMATCH_TABLE_ENTRIES; + + return state->matchCallEntries[arg0].headerId; +} + +struct PokenavMatchCallEntries *sub_81CAE94(void) +{ + struct Pokenav3Struct *state = GetSubstructPtr(5); + return state->matchCallEntries; +} + +u16 GetMatchCallMapSec(int index) +{ + struct Pokenav3Struct *state = GetSubstructPtr(5); + return state->matchCallEntries[index].mapSec; +} + +bool32 ShouldDrawRematchPokeballIcon(int index) +{ + struct Pokenav3Struct *state = GetSubstructPtr(5); + if (!state->matchCallEntries[index].isSpecialTrainer) + index = state->matchCallEntries[index].headerId; + else + index = MatchCall_GetRematchTableIdx(state->matchCallEntries[index].headerId); + + if (index == REMATCH_TABLE_ENTRIES) + return FALSE; + + return gSaveBlock1Ptr->trainerRematches[index] != 0; +} + +int GetMatchCallTrainerPic(int index) +{ + int headerId; + struct Pokenav3Struct *state = GetSubstructPtr(5); + if (!state->matchCallEntries[index].isSpecialTrainer) + { + index = GetTrainerIdxByRematchIdx(state->matchCallEntries[index].headerId); + return gTrainers[index].trainerPic; + } + + headerId = state->matchCallEntries[index].headerId; + index = MatchCall_GetRematchTableIdx(headerId); + if (index != REMATCH_TABLE_ENTRIES) + { + index = GetTrainerIdxByRematchIdx(index); + return gTrainers[index].trainerPic; + } + + index = MatchCall_GetOverrideFacilityClass(headerId); + return gFacilityClassToPicIndex[index]; +} + +const u8 *GetMatchCallMessageText(int index, u8 *arg1) +{ + struct Pokenav3Struct *state = GetSubstructPtr(5); + *arg1 = 0; + if (!Overworld_MapTypeAllowsTeleportAndFly(gMapHeader.mapType)) + return gText_CallCantBeMadeHere; + + if (!state->matchCallEntries[index].isSpecialTrainer) + *arg1 = SelectMatchCallMessage(GetTrainerIdxByRematchIdx(state->matchCallEntries[index].headerId), gStringVar4); + else + MatchCall_GetMessage(state->matchCallEntries[index].headerId, gStringVar4); + + return gStringVar4; +} + +const u8 *GetMatchCallFlavorText(int index, int checkPageEntry) +{ + int rematchId; + struct Pokenav3Struct *state = GetSubstructPtr(5); + if (state->matchCallEntries[index].isSpecialTrainer) + { + rematchId = MatchCall_GetRematchTableIdx(state->matchCallEntries[index].headerId); + if (rematchId == REMATCH_TABLE_ENTRIES) + return MatchCall_GetOverrideFlavorText(state->matchCallEntries[index].headerId, checkPageEntry); + } + else + { + rematchId = state->matchCallEntries[index].headerId; + } + + return gMatchCallFlavorTexts[rematchId][checkPageEntry]; +} + +u16 GetMatchCallOptionCursorPos(void) +{ + struct Pokenav3Struct *state = GetSubstructPtr(5); + return state->optionCursorPos; +} + +u16 GetMatchCallOptionId(int optionId) +{ + struct Pokenav3Struct *state = GetSubstructPtr(5); + if (state->maxOptionId < optionId) + return MATCH_CALL_OPTION_COUNT; + + return state->matchCallOptions[optionId]; +} + +void BufferMatchCallNameAndDesc(struct PokenavMatchCallEntries *matchCallEntry, u8 *str) +{ + const u8 *trainerName; + const u8 *className; + if (!matchCallEntry->isSpecialTrainer) + { + int index = GetTrainerIdxByRematchIdx(matchCallEntry->headerId); + const struct Trainer *trainer = &gTrainers[index]; + int class = trainer->trainerClass; + className = gTrainerClassNames[class]; + trainerName = trainer->trainerName; + } + else + { + MatchCall_GetNameAndDesc(matchCallEntry->headerId, &className, &trainerName); + } + + if (className && trainerName) + { + u8 *str2 = sub_81DB494(str, 7, className, 69); + sub_81DB494(str2, 7, trainerName, 51); + } + else + { + sub_81DB494(str, 7, NULL, 120); + } +} + +u8 sub_81CB0C8(int rematchIndex) +{ + int mapGroup = gRematchTable[rematchIndex].mapGroup; + int mapNum = gRematchTable[rematchIndex].mapNum; + return Overworld_GetMapHeaderByGroupAndId(mapGroup, mapNum)->regionMapSectionId; +} + +int GetIndexDeltaOfNextCheckPageDown(int index) +{ + struct Pokenav3Struct *state = GetSubstructPtr(5); + int count = 1; + while (++index < state->numRegistered) + { + if (!state->matchCallEntries[index].isSpecialTrainer) + return count; + if (MatchCall_HasCheckPage(state->matchCallEntries[index].headerId)) + return count; + + count++; + } + + return 0; +} + +int GetIndexDeltaOfNextCheckPageUp(int index) +{ + struct Pokenav3Struct *state = GetSubstructPtr(5); + int count = -1; + while (--index >= 0) + { + if (!state->matchCallEntries[index].isSpecialTrainer) + return count; + if (MatchCall_HasCheckPage(state->matchCallEntries[index].headerId)) + return count; + + count--; + } + + return 0; +} + +bool32 unref_sub_81CB16C(void) +{ + int i; + + for (i = 0; i < REMATCH_TABLE_ENTRIES; i++) + { + if (IsRematchEntryRegistered(i) && gSaveBlock1Ptr->trainerRematches[i]) + return TRUE; + } + + for (i = 0; i < MC_HEADER_COUNT; i++) + { + if (MatchCall_GetEnabled(i)) + { + int index = MatchCall_GetRematchTableIdx(i); + if (gSaveBlock1Ptr->trainerRematches[index]) + return TRUE; + } + } + + return FALSE; +} + +static bool32 sub_81CB1D0(void) +{ + struct Pokenav3Struct *state = GetSubstructPtr(5); + int selection = GetSelectedMatchCall(); + if (!state->matchCallEntries[selection].isSpecialTrainer) + { + if (GetMatchCallMapSec(selection) == gMapHeader.regionMapSectionId) + { + if (!gSaveBlock1Ptr->trainerRematches[state->matchCallEntries[selection].headerId]) + return TRUE; + } + } + else + { + if (state->matchCallEntries[selection].headerId == MC_HEADER_WATTSON) + { + if (GetMatchCallMapSec(selection) == gMapHeader.regionMapSectionId + && FlagGet(FLAG_BADGE05_GET) == TRUE) + { + if (!FlagGet(FLAG_WATTSON_REMATCH_AVAILABLE)) + return TRUE; + } + } + } + + return FALSE; +} diff --git a/src/pokenav_match_call_2.c b/src/pokenav_match_call_2.c new file mode 100755 index 000000000..aaa1767aa --- /dev/null +++ b/src/pokenav_match_call_2.c @@ -0,0 +1,1279 @@ +#include "global.h" +#include "bg.h" +#include "data.h" +#include "decompress.h" +#include "dma3.h" +#include "international_string_util.h" +#include "main.h" +#include "match_call.h" +#include "menu.h" +#include "overworld.h" +#include "palette.h" +#include "pokenav.h" +#include "region_map.h" +#include "sound.h" +#include "sprite.h" +#include "string_util.h" +#include "strings.h" +#include "task.h" +#include "text.h" +#include "text_window.h" +#include "trig.h" +#include "window.h" +#include "constants/game_stat.h" +#include "constants/region_map_sections.h" +#include "constants/songs.h" +#include "constants/species.h" + +struct Pokenav4Struct +{ + bool32 (*unk0)(void); + u32 unk4; + u8 filler8[0x6]; + u8 unkE; + u8 unkF; + u16 locWindowId; + u16 infoBoxWindowId; + u16 msgBoxWindowId; + s16 unk16; + u8 unused18; + u8 unk19; + u16 unk1A; + struct Sprite *optionsCursorSprite; + struct Sprite *trainerPicSprite; + u8 unk24[0x800]; + u8 unk824[0x800]; + u8 unk1024[0x800]; + u8 *unk1824; + u8 unk1828[0x800]; + u8 unk2028[0x20]; +}; + +static bool32 sub_81CB310(void); +static u32 sub_81CB324(s32); +static void sub_81CBBB8(void); +static void sub_81CBC1C(void); +static void sub_81CC2B4(void); +static void sub_81CC034(struct Pokenav4Struct *); +static void DrawMatchCallLeftColumnWindows(struct Pokenav4Struct *); +static void UpdateMatchCallInfoBox(struct Pokenav4Struct *); +static void PrintMatchCallLocation(struct Pokenav4Struct *, int); +static void sub_81CC214(void); +static void sub_81CBC38(int); +static void PrintMatchCallSelectionOptions(struct Pokenav4Struct *); +static bool32 sub_81CBFC4(struct Pokenav4Struct *); +static void UpdateCursorGfxPos(struct Pokenav4Struct *, int); +static bool32 IsDma3ManagerBusyWithBgCopy1(struct Pokenav4Struct *); +static void UpdateWindowsReturnToTrainerList(struct Pokenav4Struct *); +static void DrawMsgBoxForMatchCallMsg(struct Pokenav4Struct *); +static bool32 IsDma3ManagerBusyWithBgCopy2(struct Pokenav4Struct *); +static void PrintCallingDots(struct Pokenav4Struct *); +static bool32 WaitForCallingDotsText(struct Pokenav4Struct *); +static void PrintMatchCallMessage(struct Pokenav4Struct *); +static bool32 WaitForMatchCallMessageText(struct Pokenav4Struct *); +static void DrawMsgBoxForCloseByMsg(struct Pokenav4Struct *); +static void PrintTrainerIsCloseBy(struct Pokenav4Struct *); +static bool32 WaitForTrainerIsCloseByText(struct Pokenav4Struct *); +static void DrawSpinningPokenavForCall(struct Pokenav4Struct *); +static bool32 WaitForSpinningPokenav(struct Pokenav4Struct *); +static void UpdateWindowsToShowCheckPage(struct Pokenav4Struct *); +static void LoadCheckPageTrainerPic(struct Pokenav4Struct *); +static bool32 WaitForTrainerPic(struct Pokenav4Struct *); +static void TrainerPicSlideOffscreen(struct Pokenav4Struct *); +static void sub_81CBC64(u8 taskId); +static void TryDrawRematchPokeballIcon(u16 windowId, u32, u32); +static void PrintNumberRegisteredLabel(u16 windowId); +static void PrintNumberRegistered(u16 windowId); +static void PrintNumberOfBattlesLabel(u16 windowId); +static void PrintNumberOfBattles(u16 windowId); +static void PrintMatchCallInfoLabel(u16 windowId, const u8 *str, int top); +static void PrintMatchCallInfoNumber(u16 windowId, const u8 *str, int top); +static void sub_81CC2F0(struct Pokenav4Struct *, int); +static void CloseMatchCallSelectOptionsWindow(struct Pokenav4Struct *); +static struct Sprite *CreateTrainerPicSprite(void); +static void SpriteCB_TrainerPicSlideOnscreen(struct Sprite *sprite); +static void SpriteCB_TrainerPicSlideOffscreen(struct Sprite *sprite); +void SpriteCB_OptionsCursor(struct Sprite *sprite); +u32 MatchCallListCursorDown(s32); +u32 MatchCallListCursorUp(s32); +u32 MatchCallListPageDown(s32); +u32 MatchCallListPageUp(s32); +u32 SelectMatchCallEntry(s32); +u32 MoveMatchCallOptionsCursor(s32); +static u32 CancelMatchCallSelection(s32); +u32 DoMatchCallMessage(s32); +u32 DoTrainerCloseByMessage(s32); +u32 sub_81CB888(s32); +u32 ShowCheckPage(s32); +u32 ShowCheckPageUp(s32); +u32 ShowCheckPageDown(s32); +u32 ExitCheckPage(s32); +u32 ExitMatchCall(s32); + +static const u16 sMatchCallUI_Pal[] = INCBIN_U16("graphics/pokenav/ui_matchcall.gbapal"); +static const u32 sMatchCallUI_Gfx[] = INCBIN_U32("graphics/pokenav/ui_matchcall.4bpp.lz"); +static const u32 sMatchCallUI_Tilemap[] = INCBIN_U32("graphics/pokenav/ui_matchcall.bin.lz"); +static const u16 gUnknown_08622698[] = INCBIN_U16("graphics/pokenav/arrow2.gbapal"); +static const u32 gUnknown_086226B8[] = INCBIN_U32("graphics/pokenav/arrow2.4bpp.lz"); +static const u16 gUnknown_086226E0[] = INCBIN_U16("graphics/pokenav/86226E0.gbapal"); +static const u16 gUnknown_08622700[] = INCBIN_U16("graphics/pokenav/8622700.gbapal"); +static const u16 gUnknown_08622720[] = INCBIN_U16("graphics/pokenav/pokeball_matchcall.gbapal"); +static const u32 gUnknown_08622760[] = INCBIN_U32("graphics/pokenav/pokeball_matchcall.4bpp.lz"); + +const struct BgTemplate gUnknown_0862278C[3] = +{ + { + .bg = 1, + .charBaseIndex = 3, + .mapBaseIndex = 0x1F, + .screenSize = 0, + .paletteMode = 0, + .priority = 1, + .baseTile = 0 + }, + { + .bg = 2, + .charBaseIndex = 2, + .mapBaseIndex = 0x06, + .screenSize = 0, + .paletteMode = 0, + .priority = 2, + .baseTile = 0x80 + }, + { + .bg = 3, + .charBaseIndex = 1, + .mapBaseIndex = 0x07, + .screenSize = 0, + .paletteMode = 0, + .priority = 3, + .baseTile = 0 + } +}; + +static const LoopedTask sMatchCallLoopTaskFuncs[] = +{ + [POKENAV_MC_FUNC_NONE] = NULL, + [POKENAV_MC_FUNC_DOWN] = MatchCallListCursorDown, + [POKENAV_MC_FUNC_UP] = MatchCallListCursorUp, + [POKENAV_MC_FUNC_PG_DOWN] = MatchCallListPageDown, + [POKENAV_MC_FUNC_PG_UP] = MatchCallListPageUp, + [POKENAV_MC_FUNC_SELECT] = SelectMatchCallEntry, + [POKENAV_MC_FUNC_MOVE_OPTIONS_CURSOR] = MoveMatchCallOptionsCursor, + [POKENAV_MC_FUNC_CANCEL] = CancelMatchCallSelection, + [POKENAV_MC_FUNC_CALL_MSG] = DoMatchCallMessage, + [POKENAV_MC_FUNC_NEARBY_MSG] = DoTrainerCloseByMessage, + [POKENAV_MC_FUNC_10] = sub_81CB888, + [POKENAV_MC_FUNC_SHOW_CHECK_PAGE] = ShowCheckPage, + [POKENAV_MC_FUNC_CHECK_PAGE_UP] = ShowCheckPageUp, + [POKENAV_MC_FUNC_CHECK_PAGE_DOWN] = ShowCheckPageDown, + [POKENAV_MC_FUNC_EXIT_CHECK_PAGE] = ExitCheckPage, + [POKENAV_MC_FUNC_EXIT] = ExitMatchCall +}; + +static const struct WindowTemplate sMatchCallLocationWindowTemplate = +{ + .bg = 2, + .tilemapLeft = 0, + .tilemapTop = 5, + .width = 11, + .height = 2, + .paletteNum = 2, + .baseBlock = 16 +}; + +static const struct WindowTemplate sMatchCallInfoBoxWindowTemplate = +{ + .bg = 2, + .tilemapLeft = 0, + .tilemapTop = 9, + .width = 11, + .height = 8, + .paletteNum = 2, + .baseBlock = 38 +}; + +static const u8 *const sMatchCallOptionTexts[MATCH_CALL_OPTION_COUNT] = +{ + [MATCH_CALL_OPTION_CALL] = gText_Call, + [MATCH_CALL_OPTION_CHECK] = gText_Check, + [MATCH_CALL_OPTION_CANCEL] = gText_Cancel6 +}; + +// The series of 5 dots that appear when someone is called with Match Call +static const u8 sText_CallingDots[] = _("·{PAUSE 0x04}·{PAUSE 0x04}·{PAUSE 0x04}·{PAUSE 0x04}·\p"); + +static const struct WindowTemplate sCallMsgBoxWindowTemplate = +{ + .bg = 1, + .tilemapLeft = 1, + .tilemapTop = 12, + .width = 0x1C, + .height = 0x04, + .paletteNum = 1, + .baseBlock = 10 +}; + +const struct CompressedSpriteSheet gUnknown_08622810[1] = +{ + {gUnknown_086226B8, 0x40, 7} +}; + +const struct SpritePalette gUnknown_08622818[2] = +{ + {gUnknown_08622698, 12} +}; + +static const struct OamData sOptionsCursorOamData = +{ + .y = 0, + .affineMode = ST_OAM_AFFINE_OFF, + .objMode = ST_OAM_OBJ_NORMAL, + .bpp = ST_OAM_4BPP, + .shape = SPRITE_SHAPE(8x16), + .x = 0, + .size = SPRITE_SIZE(8x16), + .tileNum = 0, + .priority = 1, + .paletteNum = 0, +}; + +static const struct SpriteTemplate sOptionsCursorSpriteTemplate = +{ + .tileTag = 7, + .paletteTag = 12, + .oam = &sOptionsCursorOamData, + .anims = gDummySpriteAnimTable, + .images = NULL, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = SpriteCB_OptionsCursor, +}; + +static const struct OamData sTrainerPicOamData = +{ + .y = 0, + .affineMode = ST_OAM_AFFINE_OFF, + .objMode = ST_OAM_OBJ_NORMAL, + .bpp = ST_OAM_4BPP, + .shape = SPRITE_SHAPE(64x64), + .x = 0, + .size = SPRITE_SIZE(64x64), + .tileNum = 0, + .priority = 1, + .paletteNum = 0, +}; + +static const struct SpriteTemplate sTrainerPicSpriteTemplate = +{ + .tileTag = 8, + .paletteTag = 13, + .oam = &sTrainerPicOamData, + .anims = gDummySpriteAnimTable, + .images = NULL, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = SpriteCallbackDummy, +}; + +bool32 sub_81CB260(void) +{ + struct Pokenav4Struct *state = AllocSubstruct(6, sizeof(struct Pokenav4Struct)); + if (!state) + return FALSE; + + state->unk19 = 0; + state->unk4 = CreateLoopedTask(sub_81CB324, 1); + state->unk0 = sub_81CB310; + return TRUE; +} + +void CreateMatchCallLoopedTask(s32 index) +{ + struct Pokenav4Struct *state = GetSubstructPtr(6); + state->unk4 = CreateLoopedTask(sMatchCallLoopTaskFuncs[index], 1); + state->unk0 = sub_81CB310; +} + +u32 sub_81CB2CC(void) +{ + struct Pokenav4Struct *state = GetSubstructPtr(6); + return state->unk0(); +} + +void sub_81CB2E0(void) +{ + struct Pokenav4Struct *state = GetSubstructPtr(6); + sub_81CC2B4(); + sub_81CBC1C(); + RemoveWindow(state->infoBoxWindowId); + RemoveWindow(state->locWindowId); + RemoveWindow(state->msgBoxWindowId); + FreePokenavSubstruct(6); +} + +static bool32 sub_81CB310(void) +{ + struct Pokenav4Struct *state = GetSubstructPtr(6); + return IsLoopedTaskActive(state->unk4); +} + +static u32 sub_81CB324(s32 taskState) +{ + struct Pokenav4Struct *state = GetSubstructPtr(6); + switch (taskState) + { + case 0: + InitBgTemplates(gUnknown_0862278C, ARRAY_COUNT(gUnknown_0862278C)); + ChangeBgX(2, 0, 0); + ChangeBgY(2, 0, 0); + decompress_and_copy_tile_data_to_vram(2, sMatchCallUI_Gfx, 0, 0, 0); + SetBgTilemapBuffer(2, state->unk1024); + CopyToBgTilemapBuffer(2, sMatchCallUI_Tilemap, 0, 0); + CopyBgTilemapBufferToVram(2); + CopyPaletteIntoBufferUnfaded(sMatchCallUI_Pal, 0x20, 0x20); + CopyBgTilemapBufferToVram(2); + return LT_INC_AND_PAUSE; + case 1: + if (free_temp_tile_data_buffers_if_possible()) + return LT_PAUSE; + + sub_8199DF0(1, 0, 0, 1); + SetBgTilemapBuffer(1, state->unk24); + FillBgTilemapBufferRect_Palette0(1, 0x1000, 0, 0, 32, 20); + CopyPaletteIntoBufferUnfaded(gUnknown_086226E0, 0x10, 0x20); + CopyBgTilemapBufferToVram(1); + return LT_INC_AND_PAUSE; + case 2: + if (free_temp_tile_data_buffers_if_possible()) + return LT_PAUSE; + + sub_81CC034(state); + decompress_and_copy_tile_data_to_vram(3, gUnknown_08622760, 0, 0, 0); + CopyPaletteIntoBufferUnfaded(gUnknown_08622700, 0x30, 0x20); + CopyPaletteIntoBufferUnfaded(gUnknown_08622720, 0x50, 0x20); + return LT_INC_AND_PAUSE; + case 3: + if (free_temp_tile_data_buffers_if_possible() || !sub_81CAE28()) + return LT_PAUSE; + + sub_81CBBB8(); + return LT_INC_AND_PAUSE; + case 4: + if (sub_81C8224()) + return LT_PAUSE; + + DrawMatchCallLeftColumnWindows(state); + return LT_INC_AND_PAUSE; + case 5: + UpdateMatchCallInfoBox(state); + PrintMatchCallLocation(state, 0); + return LT_INC_AND_PAUSE; + case 6: + ChangeBgX(1, 0, 0); + ChangeBgY(1, 0, 0); + ShowBg(2); + ShowBg(3); + ShowBg(1); + sub_81CC214(); + LoadLeftHeaderGfxForIndex(3); + sub_81C7FA0(3, 1, 0); + sub_81C7AC0(1); + return LT_INC_AND_PAUSE; + case 7: + if (IsPaletteFadeActive() || sub_81C8010()) + return LT_PAUSE; + + sub_81CBC38(1); + return LT_FINISH; + default: + return LT_FINISH; + } +} + +u32 MatchCallListCursorDown(s32 taskState) +{ + struct Pokenav4Struct *state = GetSubstructPtr(6); + switch (taskState) + { + case 0: + switch (MatchCall_MoveCursorDown()) + { + case 0: + break; + case 1: + PlaySE(SE_SELECT); + return 7; + case 2: + PlaySE(SE_SELECT); + // fall through + default: + return LT_INC_AND_PAUSE; + } + break; + case 1: + if (sub_81C8630()) + return LT_PAUSE; + + PrintMatchCallLocation(state, 0); + return LT_INC_AND_PAUSE; + case 2: + PrintMatchCallLocation(state, 0); + return LT_INC_AND_PAUSE; + case 3: + if (IsDma3ManagerBusyWithBgCopy()) + return LT_PAUSE; + break; + } + return LT_FINISH; +} + +u32 MatchCallListCursorUp(s32 taskState) +{ + struct Pokenav4Struct *state = GetSubstructPtr(6); + switch (taskState) + { + case 0: + switch (MatchCall_MoveCursorUp()) + { + case 0: + break; + case 1: + PlaySE(SE_SELECT); + return 7; + case 2: + PlaySE(SE_SELECT); + // fall through + default: + return LT_INC_AND_PAUSE; + } + break; + case 1: + if (sub_81C8630()) + return LT_PAUSE; + + PrintMatchCallLocation(state, 0); + return LT_INC_AND_PAUSE; + case 2: + PrintMatchCallLocation(state, 0); + return LT_INC_AND_PAUSE; + case 3: + if (IsDma3ManagerBusyWithBgCopy()) + return LT_PAUSE; + break; + } + return LT_FINISH; +} + +u32 MatchCallListPageDown(s32 taskState) +{ + struct Pokenav4Struct *state = GetSubstructPtr(6); + switch (taskState) + { + case 0: + switch (MatchCall_PageDown()) + { + case 0: + break; + case 1: + PlaySE(SE_SELECT); + return 7; + case 2: + PlaySE(SE_SELECT); + // fall through + default: + return LT_INC_AND_PAUSE; + } + break; + case 1: + if (sub_81C8630()) + return LT_PAUSE; + + PrintMatchCallLocation(state, 0); + return LT_INC_AND_PAUSE; + case 2: + PrintMatchCallLocation(state, 0); + return LT_INC_AND_PAUSE; + case 3: + if (IsDma3ManagerBusyWithBgCopy()) + return LT_PAUSE; + break; + } + return LT_FINISH; +} + +u32 MatchCallListPageUp(s32 taskState) +{ + struct Pokenav4Struct *state = GetSubstructPtr(6); + switch (taskState) + { + case 0: + switch (MatchCall_PageUp()) + { + case 0: + break; + case 1: + PlaySE(SE_SELECT); + return 7; + case 2: + PlaySE(SE_SELECT); + // fall through + default: + return LT_INC_AND_PAUSE; + } + break; + case 1: + if (sub_81C8630()) + return LT_PAUSE; + + PrintMatchCallLocation(state, 0); + return LT_INC_AND_PAUSE; + case 2: + PrintMatchCallLocation(state, 0); + return LT_INC_AND_PAUSE; + case 3: + if (IsDma3ManagerBusyWithBgCopy()) + return LT_PAUSE; + break; + } + return LT_FINISH; +} + +u32 SelectMatchCallEntry(s32 taskState) +{ + struct Pokenav4Struct *state = GetSubstructPtr(6); + switch (taskState) + { + case 0: + PlaySE(SE_SELECT); + PrintMatchCallSelectionOptions(state); + PrintHelpBarText(HELPBAR_MC_CALL_MENU); + return LT_INC_AND_PAUSE; + case 1: + if (sub_81CBFC4(state)) + return LT_PAUSE; + break; + } + + return LT_FINISH; +} + +u32 MoveMatchCallOptionsCursor(s32 taskState) +{ + struct Pokenav4Struct *state; + u16 cursorPos; + + PlaySE(SE_SELECT); + state = GetSubstructPtr(6); + cursorPos = GetMatchCallOptionCursorPos(); + UpdateCursorGfxPos(state, cursorPos); + return LT_FINISH; +} + +u32 CancelMatchCallSelection(s32 taskState) +{ + struct Pokenav4Struct *state = GetSubstructPtr(6); + switch (taskState) + { + case 0: + PlaySE(SE_SELECT); + UpdateWindowsReturnToTrainerList(state); + PrintHelpBarText(HELPBAR_MC_TRAINER_LIST); + return LT_INC_AND_PAUSE; + case 1: + if (IsDma3ManagerBusyWithBgCopy1(state)) + return LT_PAUSE; + break; + } + + return LT_FINISH; +} + +u32 DoMatchCallMessage(s32 taskState) +{ + struct Pokenav4Struct *state = GetSubstructPtr(6); + switch (taskState) + { + case 0: + ToggleMatchCallVerticalArrows(TRUE); + DrawMsgBoxForMatchCallMsg(state); + return LT_INC_AND_PAUSE; + case 1: + if (IsDma3ManagerBusyWithBgCopy2(state)) + return LT_PAUSE; + + PrintCallingDots(state); + PlaySE(SE_TOREEYE); + state->unkE = 0; + return LT_INC_AND_PAUSE; + case 2: + if (WaitForCallingDotsText(state)) + return LT_PAUSE; + + PrintMatchCallMessage(state); + return LT_INC_AND_PAUSE; + case 3: + if (WaitForMatchCallMessageText(state)) + return LT_PAUSE; + break; + } + + return LT_FINISH; +} + +u32 DoTrainerCloseByMessage(s32 taskState) +{ + struct Pokenav4Struct *state = GetSubstructPtr(6); + switch (taskState) + { + case 0: + PlaySE(SE_SELECT); + DrawMsgBoxForCloseByMsg(state); + ToggleMatchCallVerticalArrows(TRUE); + state->unkE = 1; + return LT_INC_AND_PAUSE; + case 1: + if (IsDma3ManagerBusyWithBgCopy2(state)) + return LT_PAUSE; + + PrintTrainerIsCloseBy(state); + return LT_INC_AND_PAUSE; + case 2: + if (WaitForTrainerIsCloseByText(state)) + return LT_PAUSE; + break; + } + + return LT_FINISH; +} + +u32 sub_81CB888(s32 taskState) +{ + struct Pokenav4Struct *state = GetSubstructPtr(6); + u32 result = LT_INC_AND_PAUSE; + + switch (taskState) + { + case 0: + if (!state->unkE) + PlaySE(SE_TOREOFF); + + PlaySE(SE_SELECT); + break; + case 1: + DrawSpinningPokenavForCall(state); + break; + case 2: + if (WaitForSpinningPokenav(state)) + result = LT_PAUSE; + break; + case 3: + UpdateWindowsReturnToTrainerList(state); + break; + case 4: + if (IsDma3ManagerBusyWithBgCopy1(state)) + result = LT_PAUSE; + + PrintHelpBarText(HELPBAR_MC_TRAINER_LIST); + break; + case 5: + if (WaitForHelpBar()) + { + result = LT_PAUSE; + } + else + { + if (state->unkF) + { + sub_81C8838(); + result = LT_INC_AND_CONTINUE; + } + else + { + ToggleMatchCallVerticalArrows(FALSE); + result = LT_FINISH; + } + } + break; + case 6: + if (IsDma3ManagerBusyWithBgCopy()) + { + result = LT_PAUSE; + } + else + { + ToggleMatchCallVerticalArrows(FALSE); + result = LT_FINISH; + } + break; + } + + return result; +} + +u32 ShowCheckPage(s32 taskState) +{ + struct Pokenav4Struct *state = GetSubstructPtr(6); + switch (taskState) + { + case 0: + PlaySE(SE_SELECT); + sub_81C877C(); + UpdateWindowsToShowCheckPage(state); + return LT_INC_AND_PAUSE; + case 1: + if (sub_81C8820() || IsDma3ManagerBusyWithBgCopy1(state)) + return LT_PAUSE; + + PrintHelpBarText(HELPBAR_MC_CHECK_PAGE); + return LT_INC_AND_PAUSE; + case 2: + PrintCheckPageInfo(0); + LoadCheckPageTrainerPic(state); + return LT_INC_AND_PAUSE; + case 3: + if (sub_81C8820() || WaitForTrainerPic(state) || WaitForHelpBar()) + return LT_PAUSE; + break; + } + + return LT_FINISH; +} + +u32 ShowCheckPageDown(s32 taskState) +{ + int topId; + int delta; + struct Pokenav4Struct *state = GetSubstructPtr(6); + switch (taskState) + { + case 0: + topId = GetMatchCallListTopIndex(); + delta = GetIndexDeltaOfNextCheckPageDown(topId); + if (delta) + { + PlaySE(SE_SELECT); + state->unk16 = delta; + TrainerPicSlideOffscreen(state); + return LT_INC_AND_PAUSE; + } + break; + case 1: + if (WaitForTrainerPic(state)) + return LT_PAUSE; + + PrintMatchCallLocation(state, state->unk16); + return LT_INC_AND_PAUSE; + case 2: + PrintCheckPageInfo(state->unk16); + return LT_INC_AND_PAUSE; + case 3: + LoadCheckPageTrainerPic(state); + return LT_INC_AND_PAUSE; + case 4: + if (sub_81C8820() || WaitForTrainerPic(state)) + return LT_PAUSE; + break; + } + + return LT_FINISH; +} + +u32 ExitCheckPage(s32 taskState) +{ + struct Pokenav4Struct *state = GetSubstructPtr(6); + switch (taskState) + { + case 0: + PlaySE(SE_SELECT); + TrainerPicSlideOffscreen(state); + sub_81C87F0(); + return LT_INC_AND_PAUSE; + case 1: + if (sub_81C8820() || WaitForTrainerPic(state)) + return LT_PAUSE; + + PrintHelpBarText(HELPBAR_MC_TRAINER_LIST); + UpdateMatchCallInfoBox(state); + return LT_INC_AND_PAUSE; + case 2: + if (IsDma3ManagerBusyWithBgCopy()) + return LT_PAUSE; + break; + } + + return LT_FINISH; +} + +u32 ShowCheckPageUp(s32 taskState) +{ + int topId; + int delta; + struct Pokenav4Struct *state = GetSubstructPtr(6); + switch (taskState) + { + case 0: + topId = GetMatchCallListTopIndex(); + delta = GetIndexDeltaOfNextCheckPageUp(topId); + if (delta) + { + PlaySE(SE_SELECT); + state->unk16 = delta; + TrainerPicSlideOffscreen(state); + return LT_INC_AND_PAUSE; + } + break; + case 1: + if (WaitForTrainerPic(state)) + return LT_PAUSE; + + PrintMatchCallLocation(state, state->unk16); + return LT_INC_AND_PAUSE; + case 2: + PrintCheckPageInfo(state->unk16); + return LT_INC_AND_PAUSE; + case 3: + LoadCheckPageTrainerPic(state); + return LT_INC_AND_PAUSE; + case 4: + if (sub_81C8820() || WaitForTrainerPic(state)) + return LT_PAUSE; + break; + } + + return LT_FINISH; +} + +u32 ExitMatchCall(s32 taskState) +{ + switch (taskState) + { + case 0: + PlaySE(SE_SELECT); + sub_81CBC38(0); + sub_81C7AC0(0); + sub_81C78A0(); + return LT_INC_AND_PAUSE; + case 1: + if (IsPaletteFadeActive() || MainMenuLoopedTaskIsBusy()) + return LT_PAUSE; + + sub_81C7FDC(); + break; + } + + return LT_FINISH; +} + +static void sub_81CBBB8(void) +{ + struct PokenavListTemplate template; + template.list.matchCallEntries = sub_81CAE94(); + template.unk4 = GetNumberRegistered(); + template.unk8 = 4; + template.unk6 = 0; + template.unk9 = 13; + template.unkA = 16; + template.unkB = 1; + template.unkC = 8; + template.unkD = 3; + template.unkE = 7; + template.listFunc.unk10_2 = BufferMatchCallNameAndDesc; + template.unk14 = TryDrawRematchPokeballIcon; + sub_81C81D4(&gUnknown_0862278C[2], &template, 2); + CreateTask(sub_81CBC64, 7); +} + +static void sub_81CBC1C(void) +{ + sub_81C8234(); + DestroyTask(FindTaskIdByFunc(sub_81CBC64)); +} + +static void sub_81CBC38(int arg0) +{ + u8 taskId = FindTaskIdByFunc(sub_81CBC64); + if (taskId != 0xFF) + gTasks[taskId].data[15] = arg0; +} + +static void sub_81CBC64(u8 taskId) +{ + s16 *taskData = gTasks[taskId].data; + if (taskData[15]) + { + taskData[0] += 4; + taskData[0] &= 0x7F; + taskData[1] = gSineTable[taskData[0]] >> 4; + sub_81C79BC(gUnknown_08622720, gUnknown_08622720 + 0x10, 0x10, 0x10, taskData[1], gPlttBufferUnfaded + 0x50); + if (!gPaletteFade.active) + CpuCopy32(gPlttBufferUnfaded + 0x50, gPlttBufferFaded + 0x50, 0x20); + } +} + +static void TryDrawRematchPokeballIcon(u16 windowId, u32 rematchId, u32 arg2) +{ + u8 bg = GetWindowAttribute(windowId, WINDOW_BG); + u16 *tilemap = GetBgTilemapBuffer(bg); + tilemap += arg2 * 0x40 + 0x1D; + if (ShouldDrawRematchPokeballIcon(rematchId)) + { + tilemap[0] = 0x5000; + tilemap[0x20] = 0x5001; + } + else + { + tilemap[0] = 0x5002; + tilemap[0x20] = 0x5002; + } +} + +void ClearRematchPokeballIcon(u16 windowId, u32 arg0) +{ + u8 bg = GetWindowAttribute(windowId, WINDOW_BG); + u16 *tilemap = GetBgTilemapBuffer(bg); + tilemap += arg0 * 0x40 + 0x1D; + tilemap[0] = 0x5002; + tilemap[0x20] = 0x5002; +} + +static void DrawMatchCallLeftColumnWindows(struct Pokenav4Struct *state) +{ + state->locWindowId = AddWindow(&sMatchCallLocationWindowTemplate); + state->infoBoxWindowId = AddWindow(&sMatchCallInfoBoxWindowTemplate); + FillWindowPixelBuffer(state->locWindowId, PIXEL_FILL(1)); + PutWindowTilemap(state->locWindowId); + FillWindowPixelBuffer(state->infoBoxWindowId, PIXEL_FILL(1)); + PutWindowTilemap(state->infoBoxWindowId); + CopyWindowToVram(state->locWindowId, 1); +} + +static void UpdateMatchCallInfoBox(struct Pokenav4Struct *state) +{ + FillWindowPixelBuffer(state->infoBoxWindowId, PIXEL_FILL(1)); + PrintNumberRegisteredLabel(state->infoBoxWindowId); + PrintNumberRegistered(state->infoBoxWindowId); + PrintNumberOfBattlesLabel(state->infoBoxWindowId); + PrintNumberOfBattles(state->infoBoxWindowId); + CopyWindowToVram(state->infoBoxWindowId, 2); +} + +static void PrintNumberRegisteredLabel(u16 windowId) +{ + PrintMatchCallInfoLabel(windowId, gText_NumberRegistered, 0); +} + +static void PrintNumberRegistered(u16 windowId) +{ + u8 str[3]; + ConvertIntToDecimalStringN(str, GetNumberRegistered(), STR_CONV_MODE_LEFT_ALIGN, 3); + PrintMatchCallInfoNumber(windowId, str, 1); +} + +static void PrintNumberOfBattlesLabel(u16 windowId) +{ + PrintMatchCallInfoLabel(windowId, gText_NumberOfBattles, 2); +} + +static void PrintNumberOfBattles(u16 windowId) +{ + u8 str[5]; + int numTrainerBattles = GetGameStat(GAME_STAT_TRAINER_BATTLES); + if (numTrainerBattles > 99999) + numTrainerBattles = 99999; + + ConvertIntToDecimalStringN(str, numTrainerBattles, STR_CONV_MODE_LEFT_ALIGN, 5); + PrintMatchCallInfoNumber(windowId, str, 3); +} + +static void PrintMatchCallInfoLabel(u16 windowId, const u8 *str, int top) +{ + int y = top * 16 + 1; + AddTextPrinterParameterized(windowId, 7, str, 2, y, TEXT_SPEED_FF, NULL); +} + +static void PrintMatchCallInfoNumber(u16 windowId, const u8 *str, int top) +{ + int x = GetStringRightAlignXOffset(7, str, 86); + int y = top * 16 + 1; + AddTextPrinterParameterized(windowId, 7, str, x, y, TEXT_SPEED_FF, NULL); +} + +static void PrintMatchCallLocation(struct Pokenav4Struct *state, int arg1) +{ + u8 mapName[32]; + int x; + int index = GetSelectedMatchCall() + arg1; + int mapSec = GetMatchCallMapSec(index); + if (mapSec != MAPSEC_NONE) + GetMapName(mapName, mapSec, 0); + else + StringCopy(mapName, gText_Unknown); + + x = GetStringCenterAlignXOffset(7, mapName, 88); + FillWindowPixelBuffer(state->locWindowId, PIXEL_FILL(1)); + AddTextPrinterParameterized(state->locWindowId, 7, mapName, x, 1, 0, NULL); +} + +static void PrintMatchCallSelectionOptions(struct Pokenav4Struct *state) +{ + u32 i; + + FillWindowPixelBuffer(state->infoBoxWindowId, PIXEL_FILL(1)); + for (i = 0; i < MATCH_CALL_OPTION_COUNT; i++) + { + int optionText = GetMatchCallOptionId(i); + if (optionText == MATCH_CALL_OPTION_COUNT) + break; + + AddTextPrinterParameterized(state->infoBoxWindowId, 7, sMatchCallOptionTexts[optionText], 16, i * 16 + 1, TEXT_SPEED_FF, NULL); + } + + CopyWindowToVram(state->infoBoxWindowId, 2); +} + +static bool32 sub_81CBFC4(struct Pokenav4Struct *state) +{ + if (!IsDma3ManagerBusyWithBgCopy()) + { + sub_81CC2F0(state, GetMatchCallOptionCursorPos()); + return FALSE; + } + + return TRUE; +} + +static void UpdateWindowsReturnToTrainerList(struct Pokenav4Struct *state) +{ + CloseMatchCallSelectOptionsWindow(state); + UpdateMatchCallInfoBox(state); +} + +static bool32 IsDma3ManagerBusyWithBgCopy1(struct Pokenav4Struct *state) +{ + return IsDma3ManagerBusyWithBgCopy(); +} + +static void UpdateWindowsToShowCheckPage(struct Pokenav4Struct *state) +{ + CloseMatchCallSelectOptionsWindow(state); + FillWindowPixelBuffer(state->infoBoxWindowId, PIXEL_FILL(1)); + CopyWindowToVram(state->infoBoxWindowId, 2); +} + +static void sub_81CC034(struct Pokenav4Struct *state) +{ + state->msgBoxWindowId = AddWindow(&sCallMsgBoxWindowTemplate); + sub_8197184(state->msgBoxWindowId, 1, 4); + sub_81C7B40(); +} + +static void DrawMsgBoxForMatchCallMsg(struct Pokenav4Struct *state) +{ + struct Sprite *sprite; + sub_8197184(state->msgBoxWindowId, 1, 4); + sub_81971C4(state->msgBoxWindowId, 1, 4); + FillWindowPixelBuffer(state->msgBoxWindowId, PIXEL_FILL(1)); + PutWindowTilemap(state->msgBoxWindowId); + CopyWindowToVram(state->msgBoxWindowId, 3); + sprite = PauseSpinningPokenavSprite(); + sprite->pos1.x = 24; + sprite->pos1.y = 112; + sprite->pos2.y = 0; +} + +static void DrawMsgBoxForCloseByMsg(struct Pokenav4Struct *state) +{ + LoadUserWindowBorderGfx(state->msgBoxWindowId, 1, 0x40); + DrawTextBorderOuter(state->msgBoxWindowId, 1, 4); + FillWindowPixelBuffer(state->msgBoxWindowId, PIXEL_FILL(1)); + PutWindowTilemap(state->msgBoxWindowId); + CopyWindowToVram(state->msgBoxWindowId, 3); +} + +static bool32 IsDma3ManagerBusyWithBgCopy2(struct Pokenav4Struct *state) +{ + return IsDma3ManagerBusyWithBgCopy(); +} + +static void PrintCallingDots(struct Pokenav4Struct *state) +{ + AddTextPrinterParameterized(state->msgBoxWindowId, 1, sText_CallingDots, 32, 1, 1, NULL); +} + +static bool32 WaitForCallingDotsText(struct Pokenav4Struct *state) +{ + RunTextPrinters(); + return IsTextPrinterActive(state->msgBoxWindowId); +} + +static void PrintTrainerIsCloseBy(struct Pokenav4Struct *state) +{ + AddTextPrinterParameterized(state->msgBoxWindowId, 1, gText_TrainerCloseBy, 0, 1, 1, NULL); +} + +static bool32 WaitForTrainerIsCloseByText(struct Pokenav4Struct *state) +{ + RunTextPrinters(); + return IsTextPrinterActive(state->msgBoxWindowId); +} + +static void PrintMatchCallMessage(struct Pokenav4Struct *state) +{ + int index = GetSelectedMatchCall(); + const u8 *str = GetMatchCallMessageText(index, &state->unkF); + u8 speed = GetPlayerTextSpeedDelay(); + AddTextPrinterParameterized(state->msgBoxWindowId, 1, str, 32, 1, speed, NULL); +} + +static bool32 WaitForMatchCallMessageText(struct Pokenav4Struct *state) +{ + if (gMain.heldKeys & A_BUTTON) + gTextFlags.canABSpeedUpPrint = 1; + else + gTextFlags.canABSpeedUpPrint = 0; + + RunTextPrinters(); + return IsTextPrinterActive(state->msgBoxWindowId); +} + +static void DrawSpinningPokenavForCall(struct Pokenav4Struct *state) +{ + ResumeSpinningPokenavSprite(); + FillBgTilemapBufferRect_Palette0(1, 0, 0, 0, 32, 20); + CopyBgTilemapBufferToVram(1); +} + +static bool32 WaitForSpinningPokenav(struct Pokenav4Struct *state) +{ + return IsDma3ManagerBusyWithBgCopy(); +} + +static void sub_81CC214(void) +{ + int i; + u8 paletteNum; + struct SpriteSheet spriteSheet; + struct Pokenav4Struct *state = GetSubstructPtr(6); + + for (i = 0; i < ARRAY_COUNT(gUnknown_08622810); i++) + LoadCompressedSpriteSheet(&gUnknown_08622810[i]); + + Pokenav_AllocAndLoadPalettes(gUnknown_08622818); + state->optionsCursorSprite = NULL; + spriteSheet.data = state->unk1828; + spriteSheet.size = 0x800; + spriteSheet.tag = 8; + state->unk1824 = (u8 *)OBJ_VRAM0 + LoadSpriteSheet(&spriteSheet) * 0x20; + paletteNum = AllocSpritePalette(13); + state->unk1A = 0x100 + paletteNum * 0x10; + state->trainerPicSprite = CreateTrainerPicSprite(); + state->trainerPicSprite->invisible = TRUE; +} + +static void sub_81CC2B4(void) +{ + struct Pokenav4Struct *state = GetSubstructPtr(6); + if (state->optionsCursorSprite) + DestroySprite(state->optionsCursorSprite); + if (state->trainerPicSprite) + DestroySprite(state->trainerPicSprite); + + FreeSpriteTilesByTag(8); + FreeSpriteTilesByTag(7); + FreeSpritePaletteByTag(12); + FreeSpritePaletteByTag(13); +} + +static void sub_81CC2F0(struct Pokenav4Struct *state, int top) +{ + if (!state->optionsCursorSprite) + { + u8 spriteId = CreateSprite(&sOptionsCursorSpriteTemplate, 4, 80, 5); + state->optionsCursorSprite = &gSprites[spriteId]; + UpdateCursorGfxPos(state, top); + } +} + +static void CloseMatchCallSelectOptionsWindow(struct Pokenav4Struct *state) +{ + DestroySprite(state->optionsCursorSprite); + state->optionsCursorSprite = NULL; +} + +static void UpdateCursorGfxPos(struct Pokenav4Struct *state, int top) +{ + state->optionsCursorSprite->pos2.y = top * 16; +} + +void SpriteCB_OptionsCursor(struct Sprite *sprite) +{ + if (++sprite->data[0] > 3) + { + sprite->data[0] = 0; + sprite->pos2.x = (sprite->pos2.x + 1) & 0x7; + } +} + +static struct Sprite *CreateTrainerPicSprite(void) +{ + u8 spriteId = CreateSprite(&sTrainerPicSpriteTemplate, 44, 104, 6); + return &gSprites[spriteId]; +} + +static void LoadCheckPageTrainerPic(struct Pokenav4Struct *state) +{ + u16 cursor; + int trainerPic = GetMatchCallTrainerPic(GetSelectedMatchCall()); + if (trainerPic >= 0) + { + DecompressPicFromTable(&gTrainerFrontPicTable[trainerPic], state->unk1828, SPECIES_NONE); + LZ77UnCompWram(gTrainerFrontPicPaletteTable[trainerPic].data, state->unk2028); + cursor = RequestDma3Copy(state->unk1828, state->unk1824, 0x800, 1); + LoadPalette(state->unk2028, state->unk1A, 0x20); + state->trainerPicSprite->data[0] = 0; + state->trainerPicSprite->data[7] = cursor; + state->trainerPicSprite->callback = SpriteCB_TrainerPicSlideOnscreen; + } +} + +static void TrainerPicSlideOffscreen(struct Pokenav4Struct *state) +{ + state->trainerPicSprite->callback = SpriteCB_TrainerPicSlideOffscreen; +} + +static bool32 WaitForTrainerPic(struct Pokenav4Struct *state) +{ + return state->trainerPicSprite->callback != SpriteCallbackDummy; +} + +static void SpriteCB_TrainerPicSlideOnscreen(struct Sprite *sprite) +{ + switch (sprite->data[0]) + { + case 0: + if (CheckForSpaceForDma3Request(sprite->data[7]) != -1) + { + sprite->pos2.x = -80; + sprite->invisible = FALSE; + sprite->data[0]++; + } + break; + case 1: + sprite->pos2.x += 8; + if (sprite->pos2.x >= 0) + { + sprite->pos2.x = 0; + sprite->callback = SpriteCallbackDummy; + } + break; + } +} + +static void SpriteCB_TrainerPicSlideOffscreen(struct Sprite *sprite) +{ + sprite->pos2.x -= 8; + if (sprite->pos2.x <= -80) + { + sprite->invisible = TRUE; + sprite->callback = SpriteCallbackDummy; + } +} diff --git a/src/pokenav_menu_handler_1.c b/src/pokenav_menu_handler_1.c new file mode 100644 index 000000000..44176176d --- /dev/null +++ b/src/pokenav_menu_handler_1.c @@ -0,0 +1,513 @@ +#include "global.h" +#include "pokenav.h" +#include "event_data.h" +#include "main.h" +#include "sound.h" +#include "constants/songs.h" + +struct Pokenav1Struct +{ + u16 menuType; + s16 cursorPos; + u16 currMenuItem; + u16 helpBarIndex; + u32 unk8; + u32 (*callback)(struct Pokenav1Struct*); +}; + +static bool32 UpdateMenuCursorPos(struct Pokenav1Struct *state); +static void ReturnToConditionMenu(struct Pokenav1Struct *state); +static void ReturnToMainMenu(struct Pokenav1Struct *state); +static u32 sub_81C97BC(struct Pokenav1Struct *state); +static void sub_81C97B0(struct Pokenav1Struct *state, u32 a1); +static u32 CB2_ReturnToConditionMenu(struct Pokenav1Struct *state); +static u32 CB2_ReturnToMainMenu(struct Pokenav1Struct *state); +static u32 HandleConditionSearchMenuInput(struct Pokenav1Struct *state); +static u32 HandleConditionMenuInput(struct Pokenav1Struct *state); +static u32 HandleCantOpenRibbonsInput(struct Pokenav1Struct *state); +static u32 HandleMainMenuInputEndTutorial(struct Pokenav1Struct *state); +static u32 HandleMainMenuInputTutorial(struct Pokenav1Struct *state); +static u32 HandleMainMenuInput(struct Pokenav1Struct *state); +static u32 (*GetMainMenuInputHandler(void))(struct Pokenav1Struct*); +static void SetMenuInputHandler(struct Pokenav1Struct *state); + +// Number of entries - 1 for that menu type +static const u8 sLastCursorPositions[] = +{ + [POKENAV_MENU_TYPE_DEFAULT] = 2, + [POKENAV_MENU_TYPE_UNLOCK_MC] = 3, + [POKENAV_MENU_TYPE_UNLOCK_MC_RIBBONS] = 4, + [POKENAV_MENU_TYPE_CONDITION] = 2, + [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) +{ + u8 menuType = POKENAV_MENU_TYPE_DEFAULT; + + if (FlagGet(FLAG_ADDED_MATCH_CALL_TO_POKENAV)) + { + menuType = POKENAV_MENU_TYPE_UNLOCK_MC; + + if (FlagGet(FLAG_SYS_RIBBON_GET)) + menuType = POKENAV_MENU_TYPE_UNLOCK_MC_RIBBONS; + } + + return menuType; +} + +bool32 PokenavCallback_Init_0(void) +{ + struct Pokenav1Struct *state = AllocSubstruct(1, sizeof(struct Pokenav1Struct)); + if (!state) + return FALSE; + + state->menuType = GetPokenavMainMenuType(); + state->cursorPos = 0; + state->currMenuItem = POKENAV_MENUITEM_MAP; + state->helpBarIndex = HELPBAR_NONE; + SetMenuInputHandler(state); + return TRUE; +} + +bool32 PokenavCallback_Init_4(void) +{ + struct Pokenav1Struct *state = AllocSubstruct(1, sizeof(struct Pokenav1Struct)); + if (!state) + return FALSE; + + state->menuType = GetPokenavMainMenuType(); + state->cursorPos = 2; + state->currMenuItem = POKENAV_MENUITEM_MATCH_CALL; + state->helpBarIndex = HELPBAR_NONE; + SetMenuInputHandler(state); + return TRUE; +} + +bool32 PokenavCallback_Init_5(void) +{ + struct Pokenav1Struct *state = AllocSubstruct(1, sizeof(struct Pokenav1Struct)); + if (!state) + return FALSE; + + state->menuType = GetPokenavMainMenuType(); + state->cursorPos = 3; + state->currMenuItem = POKENAV_MENUITEM_RIBBONS; + SetMenuInputHandler(state); + return TRUE; +} + +bool32 PokenavCallback_Init_2(void) +{ + struct Pokenav1Struct *state = AllocSubstruct(1, sizeof(struct Pokenav1Struct)); + if (!state) + return FALSE; + + state->menuType = POKENAV_MENU_TYPE_CONDITION; + state->cursorPos = 0; + state->currMenuItem = POKENAV_MENUITEM_CONDITION_PARTY; + state->helpBarIndex = HELPBAR_NONE; + SetMenuInputHandler(state); + return TRUE; +} + +bool32 PokenavCallback_Init_3(void) +{ + struct Pokenav1Struct *state = AllocSubstruct(1, sizeof(struct Pokenav1Struct)); + if (!state) + return FALSE; + + state->menuType = POKENAV_MENU_TYPE_CONDITION_SEARCH; + state->cursorPos = GetSelectedConditionSearch(); + state->currMenuItem = state->cursorPos + POKENAV_MENUITEM_CONDITION_SEARCH_COOL; + state->helpBarIndex = HELPBAR_NONE; + SetMenuInputHandler(state); + return TRUE; +} + +static void SetMenuInputHandler(struct Pokenav1Struct *state) +{ + switch (state->menuType) + { + case POKENAV_MENU_TYPE_DEFAULT: + SetPokenavMode(POKENAV_MODE_NORMAL); + // fallthrough + case POKENAV_MENU_TYPE_UNLOCK_MC: + case POKENAV_MENU_TYPE_UNLOCK_MC_RIBBONS: + state->callback = GetMainMenuInputHandler(); + break; + case POKENAV_MENU_TYPE_CONDITION: + state->callback = HandleConditionMenuInput; + break; + case POKENAV_MENU_TYPE_CONDITION_SEARCH: + state->callback = HandleConditionSearchMenuInput; + break; + } +} + +static u32 (*GetMainMenuInputHandler(void))(struct Pokenav1Struct*) +{ + switch (GetPokenavMode()) + { + default: + case POKENAV_MODE_NORMAL: + return HandleMainMenuInput; + case POKENAV_MODE_FORCE_CALL_READY: + return HandleMainMenuInputTutorial; + case POKENAV_MODE_FORCE_CALL_EXIT: + return HandleMainMenuInputEndTutorial; + } +} + +u32 sub_81C941C(void) +{ + struct Pokenav1Struct *state = GetSubstructPtr(1); + return state->callback(state); +} + +void sub_81C9430(void) +{ + FreePokenavSubstruct(1); +} + +static u32 HandleMainMenuInput(struct Pokenav1Struct *state) +{ + if (UpdateMenuCursorPos(state)) + return POKENAV_MENU_FUNC_MOVE_CURSOR; + + if (gMain.newKeys & A_BUTTON) + { + switch (sMenuItems[state->menuType][state->cursorPos]) + { + case POKENAV_MENUITEM_MAP: + state->helpBarIndex = gSaveBlock2Ptr->regionMapZoom ? HELPBAR_MAP_ZOOMED_IN : HELPBAR_MAP_ZOOMED_OUT; + sub_81C97B0(state, POKENAV_MENU_6); + return POKENAV_MENU_FUNC_OPEN_FEATURE; + case POKENAV_MENUITEM_CONDITION: + state->menuType = POKENAV_MENU_TYPE_CONDITION; + state->cursorPos = 0; + state->currMenuItem = sMenuItems[POKENAV_MENU_TYPE_CONDITION][0]; + state->callback = HandleConditionMenuInput; + return POKENAV_MENU_FUNC_OPEN_CONDITION; + case POKENAV_MENUITEM_MATCH_CALL: + state->helpBarIndex = HELPBAR_MC_TRAINER_LIST; + sub_81C97B0(state, POKENAV_MENU_B); + return POKENAV_MENU_FUNC_OPEN_FEATURE; + case POKENAV_MENUITEM_RIBBONS: + if (CanViewRibbonsMenu()) + { + state->helpBarIndex = HELPBAR_RIBBONS_MON_LIST; + sub_81C97B0(state, POKENAV_MENU_C); + return POKENAV_MENU_FUNC_OPEN_FEATURE; + } + else + { + state->callback = HandleCantOpenRibbonsInput; + return POKENAV_MENU_FUNC_NO_RIBBON_WINNERS; + } + case POKENAV_MENUITEM_SWITCH_OFF: + return -1; + } + } + + if (gMain.newKeys & B_BUTTON) + return -1; + + return POKENAV_MENU_FUNC_NONE; +} + +// Force the player to select Match Call during the call Mr. Stone pokenav tutorial +static u32 HandleMainMenuInputTutorial(struct Pokenav1Struct *state) +{ + if (UpdateMenuCursorPos(state)) + return POKENAV_MENU_FUNC_MOVE_CURSOR; + + if (gMain.newKeys & A_BUTTON) + { + if (sMenuItems[state->menuType][state->cursorPos] == POKENAV_MENUITEM_MATCH_CALL) + { + state->helpBarIndex = HELPBAR_MC_TRAINER_LIST; + sub_81C97B0(state, POKENAV_MENU_B); + return POKENAV_MENU_FUNC_OPEN_FEATURE; + } + else + { + PlaySE(SE_HAZURE); + return POKENAV_MENU_FUNC_NONE; + } + } + + if (gMain.newKeys & B_BUTTON) + { + PlaySE(SE_HAZURE); + return POKENAV_MENU_FUNC_NONE; + } + + return POKENAV_MENU_FUNC_NONE; +} + +// After calling Mr. Stone during the pokenav tutorial, force player to exit or use Match Call again +static u32 HandleMainMenuInputEndTutorial(struct Pokenav1Struct *state) +{ + if (UpdateMenuCursorPos(state)) + return POKENAV_MENU_FUNC_MOVE_CURSOR; + + if (gMain.newKeys & A_BUTTON) + { + u32 menuItem = sMenuItems[state->menuType][state->cursorPos]; + if (menuItem != POKENAV_MENUITEM_MATCH_CALL && menuItem != POKENAV_MENUITEM_SWITCH_OFF) + { + PlaySE(SE_HAZURE); + return POKENAV_MENU_FUNC_NONE; + } + else if (menuItem == POKENAV_MENUITEM_MATCH_CALL) + { + state->helpBarIndex = HELPBAR_MC_TRAINER_LIST; + sub_81C97B0(state, POKENAV_MENU_B); + return POKENAV_MENU_FUNC_OPEN_FEATURE; + } + else + { + return -1; + } + } + else if (gMain.newKeys & B_BUTTON) + { + return -1; + } + return POKENAV_MENU_FUNC_NONE; +} + +// 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 (UpdateMenuCursorPos(state)) + { + state->callback = GetMainMenuInputHandler(); + return POKENAV_MENU_FUNC_MOVE_CURSOR; + } + + if (gMain.newKeys & (A_BUTTON | B_BUTTON)) + { + state->callback = GetMainMenuInputHandler(); + return POKENAV_MENU_FUNC_RESHOW_DESCRIPTION; + } + + return POKENAV_MENU_FUNC_NONE; +} + +static u32 HandleConditionMenuInput(struct Pokenav1Struct *state) +{ + if (UpdateMenuCursorPos(state)) + return POKENAV_MENU_FUNC_MOVE_CURSOR; + + if (gMain.newKeys & A_BUTTON) + { + switch (sMenuItems[state->menuType][state->cursorPos]) + { + case POKENAV_MENUITEM_CONDITION_SEARCH: + state->menuType = POKENAV_MENU_TYPE_CONDITION_SEARCH; + state->cursorPos = 0; + state->currMenuItem = sMenuItems[POKENAV_MENU_TYPE_CONDITION_SEARCH][0]; + state->callback = HandleConditionSearchMenuInput; + return POKENAV_MENU_FUNC_OPEN_CONDITION_SEARCH; + case POKENAV_MENUITEM_CONDITION_PARTY: + state->helpBarIndex = 0; + sub_81C97B0(state, POKENAV_MENU_7); + return POKENAV_MENU_FUNC_OPEN_FEATURE; + case POKENAV_MENUITEM_CONDITION_CANCEL: + PlaySE(SE_SELECT); + ReturnToMainMenu(state); + return POKENAV_MENU_FUNC_RETURN_TO_MAIN; + } + } + if (gMain.newKeys & B_BUTTON) + { + if (state->cursorPos != sLastCursorPositions[state->menuType]) + { + state->cursorPos = sLastCursorPositions[state->menuType]; + state->callback = CB2_ReturnToMainMenu; + return POKENAV_MENU_FUNC_MOVE_CURSOR; + } + else + { + PlaySE(SE_SELECT); + ReturnToMainMenu(state); + return POKENAV_MENU_FUNC_RETURN_TO_MAIN; + } + } + + return POKENAV_MENU_FUNC_NONE; +} + +static u32 HandleConditionSearchMenuInput(struct Pokenav1Struct *state) +{ + if (UpdateMenuCursorPos(state)) + return POKENAV_MENU_FUNC_MOVE_CURSOR; + + if (gMain.newKeys & A_BUTTON) + { + u8 menuItem = sMenuItems[state->menuType][state->cursorPos]; + if (menuItem != POKENAV_MENUITEM_CONDITION_SEARCH_CANCEL) + { + SetSelectedConditionSearch(menuItem - POKENAV_MENUITEM_CONDITION_SEARCH_COOL); + sub_81C97B0(state, POKENAV_MENU_8); + state->helpBarIndex = HELPBAR_CONDITION_MON_LIST; + return POKENAV_MENU_FUNC_OPEN_FEATURE; + } + else + { + PlaySE(SE_SELECT); + ReturnToConditionMenu(state); + return POKENAV_MENU_FUNC_RETURN_TO_CONDITION; + } + } + if (gMain.newKeys & B_BUTTON) + { + if (state->cursorPos != sLastCursorPositions[state->menuType]) + { + state->cursorPos = sLastCursorPositions[state->menuType]; + state->callback = CB2_ReturnToConditionMenu; + return POKENAV_MENU_FUNC_MOVE_CURSOR; + } + else + { + PlaySE(SE_SELECT); + ReturnToConditionMenu(state); + return POKENAV_MENU_FUNC_RETURN_TO_CONDITION; + } + } + return POKENAV_MENU_FUNC_NONE; +} + +static u32 CB2_ReturnToMainMenu(struct Pokenav1Struct *state) +{ + ReturnToMainMenu(state); + return POKENAV_MENU_FUNC_RETURN_TO_MAIN; +} + +static u32 CB2_ReturnToConditionMenu(struct Pokenav1Struct *state) +{ + ReturnToConditionMenu(state); + return POKENAV_MENU_FUNC_RETURN_TO_CONDITION; +} + +static void sub_81C97B0(struct Pokenav1Struct *state, u32 a1) +{ + state->unk8 = a1; + state->callback = sub_81C97BC; +} + +static u32 sub_81C97BC(struct Pokenav1Struct *state) +{ + return state->unk8; +} + +static void ReturnToMainMenu(struct Pokenav1Struct *state) +{ + state->menuType = GetPokenavMainMenuType(); + state->cursorPos = 1; + state->currMenuItem = sMenuItems[state->menuType][state->cursorPos]; + state->callback = HandleMainMenuInput; +} + +static void ReturnToConditionMenu(struct Pokenav1Struct *state) +{ + state->menuType = POKENAV_MENU_TYPE_CONDITION; + state->cursorPos = 1; + state->currMenuItem = sMenuItems[POKENAV_MENU_TYPE_CONDITION][1]; + state->callback = HandleConditionMenuInput; +} + +static bool32 UpdateMenuCursorPos(struct Pokenav1Struct *state) +{ + if (gMain.newKeys & DPAD_UP) + { + if (--state->cursorPos < 0) + state->cursorPos = sLastCursorPositions[state->menuType]; + + state->currMenuItem = sMenuItems[state->menuType][state->cursorPos]; + return TRUE; + } + else if (gMain.newKeys & DPAD_DOWN) + { + state->cursorPos++; + if (state->cursorPos > sLastCursorPositions[state->menuType]) + state->cursorPos = 0; + + state->currMenuItem = sMenuItems[state->menuType][state->cursorPos]; + return TRUE; + } + else + { + return FALSE; + } +} + +int GetPokenavMenuType(void) +{ + struct Pokenav1Struct *state = GetSubstructPtr(1); + return state->menuType; +} + +// Position of cursor relative to number of current menu options +int GetPokenavCursorPos(void) +{ + struct Pokenav1Struct *state = GetSubstructPtr(1); + return state->cursorPos; +} + +// ID of menu item the cursor is currently on +int GetCurrentMenuItemId(void) +{ + struct Pokenav1Struct *state = GetSubstructPtr(1); + return state->currMenuItem; +} + +u16 GetHelpBarTextId(void) +{ + struct Pokenav1Struct *state = GetSubstructPtr(1); + return state->helpBarIndex; +} diff --git a/src/pokenav_menu_handler_2.c b/src/pokenav_menu_handler_2.c new file mode 100644 index 000000000..94b816b6d --- /dev/null +++ b/src/pokenav_menu_handler_2.c @@ -0,0 +1,1284 @@ +#include "global.h" +#include "malloc.h" +#include "decompress.h" +#include "bg.h" +#include "palette.h" +#include "trig.h" +#include "gpu_regs.h" +#include "menu.h" +#include "window.h" +#include "pokenav.h" +#include "graphics.h" +#include "sound.h" +#include "gym_leader_rematch.h" +#include "window.h" +#include "strings.h" +#include "scanline_effect.h" +#include "constants/songs.h" +#include "constants/rgb.h" + +// Top Menu + +struct Pokenav2Struct +{ + bool32 (*callback)(void); + u32 loopedTaskId; + u16 optionDescWindowId; + u8 bg3ScrollTaskId; + u8 cursorPos; + bool8 otherIconsInMotion; + u8 field_00d; + bool32 iconVisible[MAX_POKENAV_MENUITEMS]; + struct Sprite * field_028; + struct Sprite * iconSprites[MAX_POKENAV_MENUITEMS][4]; + u16 bg1TilemapBuffer[0x400]; +}; + +static struct Pokenav2Struct * sub_81C9958(void); +static bool32 sub_81C99FC(void); +static u32 sub_81C9A10(s32 state); +static u32 LoopedTask_MoveMenuCursor(s32 state); +static u32 LoopedTask_OpenConditionMenu(s32 state); +static u32 LoopedTask_ReturnToMainMenu(s32 state); +static u32 LoopedTask_OpenConditionSearchMenu(s32 state); +static u32 LoopedTask_ReturnToConditionMenu(s32 state); +static u32 LoopedTask_SelectRibbonsNoWinners(s32 state); +static u32 LoopedTask_ReShowDescription(s32 state); +static u32 LoopedTask_OpenPokenavFeature(s32 state); +static void sub_81C9FC4(void); +static void sub_81C9FEC(void); +static void CreateMenuOptionSprites(void); +static void sub_81CA094(void); +static void sub_81CA0C8(void); +static void sub_81CA0EC(const u16 *const * a0, s32 a1, s32 a2); +static void sub_81CA20C(void); +static void sub_81CA278(void); +static void sub_81CA35C(struct Sprite ** sprites, s32 a1, s32 a2, s32 a3); +static void sub_81CA3B4(struct Sprite ** sprites); +static void sub_81CA2DC(void); +static bool32 AreMenuOptionSpritesMoving(void); +static void sub_81CA448(struct Sprite ** sprites, bool32 a1); +static void sub_81CA474(struct Sprite * sprite); +static void sub_81CA4AC(struct Sprite * sprite); +static void sub_81CA580(u8 taskId); +static void sub_81CA640(void); +static void sub_81CA6AC(struct Sprite * sprite); +static void sub_81CA698(void); +static void AddOptionDescriptionWindow(void); +static void PrintCurrentOptionDescription(void); +static void PrintNoRibbonWinners(void); +static bool32 sub_81CA7C4(void); +static void sub_81CA7D4(void); +static void sub_81CA7F4(void); +static void sub_81CA808(u8 taskId); +static void sub_81CA818(void); +static void sub_81CA850(void); +static void sub_81CA864(void); +static bool32 sub_81CA89C(void); +static void sub_81CA8B0(u8 taskId); +static void sub_81CA92C(void); +static void sub_81CA994(void); +static void sub_81CA9C8(void); +static void sub_81CA9D8(void); +static void sub_81CA9EC(u8 taskId); +static void sub_81CAA3C(void); + +static const u16 gUnknown_0861FC78[] = INCBIN_U16("graphics/pokenav/bg.gbapal"); +static const u32 gUnknown_0861FC98[] = INCBIN_U32("graphics/pokenav/bg.4bpp.lz"); +static const u32 gUnknown_0861FCAC[] = INCBIN_U32("graphics/pokenav/bg.bin.lz"); +static const u16 gUnknown_0861FD4C[] = INCBIN_U16("graphics/pokenav/outline.gbapal"); +static const u32 gUnknown_0861FD6C[] = INCBIN_U32("graphics/pokenav/outline.4bpp.lz"); +static const u32 gUnknown_0861FFF4[] = INCBIN_U32("graphics/pokenav/outline_map.bin.lz"); +static const u16 gUnknown_08620104[] = INCBIN_U16("graphics/pokenav/blue_light.gbapal"); +static const u32 gUnknown_08620124[] = INCBIN_U32("graphics/pokenav/blue_light.4bpp.lz"); + +static const struct BgTemplate gUnknown_08620194[] = { + { + .bg = 1, + .charBaseIndex = 1, + .mapBaseIndex = 15, + .screenSize = 0, + .paletteMode = 0, + .priority = 1, + .baseTile = 0x000 + }, { + .bg = 2, + .charBaseIndex = 2, + .mapBaseIndex = 23, + .screenSize = 0, + .paletteMode = 0, + .priority = 2, + .baseTile = 0x000 + }, { + .bg = 3, + .charBaseIndex = 3, + .mapBaseIndex = 31, + .screenSize = 0, + .paletteMode = 0, + .priority = 3, + .baseTile = 0x000 + } +}; + +static const LoopedTask sMenuHandlerLoopTaskFuncs[] = { + [POKENAV_MENU_FUNC_NONE] = NULL, + [POKENAV_MENU_FUNC_MOVE_CURSOR] = LoopedTask_MoveMenuCursor, + [POKENAV_MENU_FUNC_OPEN_CONDITION] = LoopedTask_OpenConditionMenu, + [POKENAV_MENU_FUNC_RETURN_TO_MAIN] = LoopedTask_ReturnToMainMenu, + [POKENAV_MENU_FUNC_OPEN_CONDITION_SEARCH] = LoopedTask_OpenConditionSearchMenu, + [POKENAV_MENU_FUNC_RETURN_TO_CONDITION] = LoopedTask_ReturnToConditionMenu, + [POKENAV_MENU_FUNC_NO_RIBBON_WINNERS] = LoopedTask_SelectRibbonsNoWinners, + [POKENAV_MENU_FUNC_RESHOW_DESCRIPTION] = LoopedTask_ReShowDescription, + [POKENAV_MENU_FUNC_OPEN_FEATURE] = LoopedTask_OpenPokenavFeature +}; + +static const struct CompressedSpriteSheet gUnknown_086201C4[] = +{ + { + .data = gPokenavOptions_Gfx, + .size = 0x3400, + .tag = 0x0003 + }, + { + .data = gUnknown_08620124, + .size = 0x0100, + .tag = 0x0001 + } +}; + +static const struct SpritePalette gUnknown_086201D4[] = +{ + {gPokenavOptions_Pal + 0x00, 4}, + {gPokenavOptions_Pal + 0x10, 5}, + {gPokenavOptions_Pal + 0x20, 6}, + {gPokenavOptions_Pal + 0x30, 7}, + {gPokenavOptions_Pal + 0x40, 8}, + {gUnknown_08620104, 3}, + {} +}; + +static const u16 gUnknown_0862020C[] = {0, 0}; +static const u16 gUnknown_08620210[] = {0x20, 1}; +static const u16 gUnknown_08620214[] = {0x40, 4}; +static const u16 gUnknown_08620218[] = {0x60, 2}; +static const u16 gUnknown_0862021C[] = {0x80, 3}; +static const u16 gUnknown_08620220[] = {0xA0, 1}; +static const u16 gUnknown_08620224[] = {0xC0, 1}; +static const u16 gUnknown_08620228[] = {0xE0, 4}; +static const u16 gUnknown_0862022C[] = {0x100, 1}; +static const u16 gUnknown_08620230[] = {0x120, 2}; +static const u16 gUnknown_08620234[] = {0x140, 0}; +static const u16 gUnknown_08620238[] = {0x160, 0}; +static const u16 gUnknown_0862023C[] = {0x180, 3}; + +struct UnkStruct_08620240 +{ + u16 unk0; + u16 unk2; + const u16 *unk4[MAX_POKENAV_MENUITEMS]; +}; + +// TODO +static const struct UnkStruct_08620240 gUnknown_08620240[POKENAV_MENU_TYPE_COUNT] = +{ + [POKENAV_MENU_TYPE_DEFAULT] = + { + 0x2A, + 0x14, + {gUnknown_0862020C, gUnknown_08620210, gUnknown_0862021C} + }, + [POKENAV_MENU_TYPE_UNLOCK_MC] = + { + 0x2A, + 0x14, + {gUnknown_0862020C, gUnknown_08620210, gUnknown_08620214, gUnknown_0862021C} + }, + [POKENAV_MENU_TYPE_UNLOCK_MC_RIBBONS] = + { + 0x2A, + 0x14, + {gUnknown_0862020C, gUnknown_08620210, gUnknown_08620214, gUnknown_08620218, gUnknown_0862021C} + }, + [POKENAV_MENU_TYPE_CONDITION] = + { + 0x38, + 0x14, + {gUnknown_08620220, gUnknown_08620224, gUnknown_0862023C} + }, + [POKENAV_MENU_TYPE_CONDITION_SEARCH] = + { + 0x28, + 0x10, + {gUnknown_08620228, gUnknown_0862022C, gUnknown_08620230, gUnknown_08620234, gUnknown_08620238, gUnknown_0862023C} + }, +}; + +static const struct WindowTemplate sOptionDescWindowTemplate = +{ + .bg = 1, + .tilemapLeft = 3, + .tilemapTop = 17, + .width = 0x18, + .height = 0x2, + .paletteNum = 1, + .baseBlock = 8 +}; + +static const u8 *const sPageDescriptions[] = +{ + [POKENAV_MENUITEM_MAP] = gText_CheckMapOfHoenn, + [POKENAV_MENUITEM_CONDITION] = gText_CheckPokemonInDetail, + [POKENAV_MENUITEM_MATCH_CALL] = gText_CallRegisteredTrainer, + [POKENAV_MENUITEM_RIBBONS] = gText_CheckObtainedRibbons, + [POKENAV_MENUITEM_SWITCH_OFF] = gText_PutAwayPokenav, + [POKENAV_MENUITEM_CONDITION_PARTY] = gText_CheckPartyPokemonInDetail, + [POKENAV_MENUITEM_CONDITION_SEARCH] = gText_CheckAllPokemonInDetail, + [POKENAV_MENUITEM_CONDITION_CANCEL] = gText_ReturnToPokenavMenu, + [POKENAV_MENUITEM_CONDITION_SEARCH_COOL] = gText_FindCoolPokemon, + [POKENAV_MENUITEM_CONDITION_SEARCH_BEAUTY] = gText_FindBeautifulPokemon, + [POKENAV_MENUITEM_CONDITION_SEARCH_CUTE] = gText_FindCutePokemon, + [POKENAV_MENUITEM_CONDITION_SEARCH_SMART] = gText_FindSmartPokemon, + [POKENAV_MENUITEM_CONDITION_SEARCH_TOUGH] = gText_FindToughPokemon, + [POKENAV_MENUITEM_CONDITION_SEARCH_CANCEL] = gText_ReturnToConditionMenu +}; + +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 struct OamData sOamData_MenuOption = +{ + .y = 0, + .affineMode = ST_OAM_AFFINE_OFF, + .objMode = ST_OAM_OBJ_NORMAL, + .bpp = ST_OAM_4BPP, + .shape = SPRITE_SHAPE(32x16), + .x = 0, + .size = SPRITE_SIZE(32x16), + .tileNum = 0, + .priority = 2, + .paletteNum = 0, +}; + +static const union AffineAnimCmd gUnknown_0862031C[] = +{ + AFFINEANIMCMD_FRAME(0x100, 0x100, 0, 0), + AFFINEANIMCMD_END, +}; + +static const union AffineAnimCmd gUnknown_0862032C[] = +{ + AFFINEANIMCMD_FRAME(0x100, 0x100, 0, 0), + AFFINEANIMCMD_FRAME(0x10, 0x10, 0, 0x12), + AFFINEANIMCMD_END, +}; + +static const union AffineAnimCmd *const sSpriteAnims_MenuOption[] = +{ + gUnknown_0862031C, + gUnknown_0862032C +}; + +static const struct SpriteTemplate sMenuOptionSpriteTemplate = +{ + .tileTag = 3, + .paletteTag = 4, + .oam = &sOamData_MenuOption, + .anims = gDummySpriteAnimTable, + .images = NULL, + .affineAnims = sSpriteAnims_MenuOption, + .callback = SpriteCallbackDummy, +}; + +static const struct OamData gUnknown_08620364 = +{ + .y = 0, + .affineMode = ST_OAM_AFFINE_OFF, + .objMode = ST_OAM_OBJ_NORMAL, + .bpp = ST_OAM_4BPP, + .shape = SPRITE_SHAPE(32x16), + .x = 0, + .size = SPRITE_SIZE(32x16), + .tileNum = 0, + .priority = 2, + .paletteNum = 0, +}; + +static const struct SpriteTemplate gUnknown_0862036C = +{ + .tileTag = 1, + .paletteTag = 3, + .oam = &gUnknown_08620364, + .anims = gDummySpriteAnimTable, + .images = NULL, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = SpriteCallbackDummy, +}; + +static const struct ScanlineEffectParams gUnknown_08620384 = +{ + (void *)REG_ADDR_WIN0H, + ((DMA_ENABLE | DMA_START_HBLANK | DMA_REPEAT | DMA_DEST_RELOAD) << 16) | 1, + 1, + 0 +}; + +static bool32 sub_81C98D4(void) +{ + s32 i; + + for (i = 0; i < REMATCH_TABLE_ENTRIES; i++) + { + if (sub_81CB0C8(i) == gMapHeader.regionMapSectionId + && IsRematchEntryRegistered(i) + && gSaveBlock1Ptr->trainerRematches[i]) + return TRUE; + } + + return FALSE; +} + +bool32 sub_81C9924(void) +{ + struct Pokenav2Struct * unk = sub_81C9958(); + + if (unk == NULL) + return FALSE; + + unk->field_00d = 0; + return TRUE; +} + +bool32 sub_81C9940(void) +{ + struct Pokenav2Struct * unk = sub_81C9958(); + + if (unk == NULL) + return FALSE; + + unk->field_00d = 1; + return TRUE; +} + +static struct Pokenav2Struct * sub_81C9958(void) +{ + struct Pokenav2Struct * unk = AllocSubstruct(2, sizeof(struct Pokenav2Struct)); + + if (unk != NULL) + { + unk->otherIconsInMotion = FALSE; + unk->loopedTaskId = CreateLoopedTask(sub_81C9A10, 1); + unk->callback = sub_81C99FC; + } + + return unk; +} + + +void CreateMenuHandlerLoopedTask(s32 ltIdx) +{ + struct Pokenav2Struct * unk = GetSubstructPtr(2); + + unk->loopedTaskId = CreateLoopedTask(sMenuHandlerLoopTaskFuncs[ltIdx], 1); + unk->callback = sub_81C99FC; +} + +bool32 sub_81C99C0(void) +{ + struct Pokenav2Struct * unk = GetSubstructPtr(2); + + return unk->callback(); +} + +void sub_81C99D4(void) +{ + struct Pokenav2Struct * unk = GetSubstructPtr(2); + + sub_81CA7F4(); + RemoveWindow(unk->optionDescWindowId); + sub_81C9FEC(); + sub_81CA994(); + FreePokenavSubstruct(2); +} + +static bool32 sub_81C99FC(void) +{ + struct Pokenav2Struct * unk = GetSubstructPtr(2); + + return IsLoopedTaskActive(unk->loopedTaskId); +} + +static u32 sub_81C9A10(s32 state) +{ + struct Pokenav2Struct * unk = GetSubstructPtr(2); + + switch (state) + { + case 0: + InitBgTemplates(gUnknown_08620194, ARRAY_COUNT(gUnknown_08620194)); + decompress_and_copy_tile_data_to_vram(1, gPokenavMessageBox_Gfx, 0, 0, 0); + SetBgTilemapBuffer(1, unk->bg1TilemapBuffer); + CopyToBgTilemapBuffer(1, gPokenavMessageBox_Tilemap, 0, 0); + CopyBgTilemapBufferToVram(1); + CopyPaletteIntoBufferUnfaded(gPokenavMessageBox_Pal, 0x10, 0x20); + ChangeBgX(1, 0, 0); + ChangeBgY(1, 0, 0); + ChangeBgX(2, 0, 0); + ChangeBgY(2, 0, 0); + ChangeBgX(3, 0, 0); + ChangeBgY(3, 0, 0); + return LT_INC_AND_PAUSE; + case 1: + if (free_temp_tile_data_buffers_if_possible()) + return LT_PAUSE; + decompress_and_copy_tile_data_to_vram(2, gUnknown_0861FD6C, 0, 0, 0); + decompress_and_copy_tile_data_to_vram(2, gUnknown_0861FFF4, 0, 0, 1); + CopyPaletteIntoBufferUnfaded(gUnknown_0861FD4C, 0x20, 0x20); + return LT_INC_AND_PAUSE; + case 2: + if (free_temp_tile_data_buffers_if_possible()) + return LT_PAUSE; + 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); + CopyPaletteIntoBufferUnfaded(gUnknown_0861FC78, 0x30, 0x20); + if (GetPokenavMenuType() == POKENAV_MENU_TYPE_CONDITION || GetPokenavMenuType() == POKENAV_MENU_TYPE_CONDITION_SEARCH) + sub_81CA850(); + return LT_INC_AND_PAUSE; + case 3: + if (free_temp_tile_data_buffers_if_possible()) + return LT_PAUSE; + AddOptionDescriptionWindow(); + sub_81CA7D4(); + return LT_INC_AND_CONTINUE; + case 4: + sub_81C9FC4(); + return LT_INC_AND_CONTINUE; + case 5: + PrintCurrentOptionDescription(); + CreateMenuOptionSprites(); + sub_81CA640(); + sub_81CA0C8(); + return LT_INC_AND_PAUSE; + case 6: + if (sub_81CA7C4()) + return LT_PAUSE; + return LT_INC_AND_CONTINUE; + case 7: + ShowBg(1); + ShowBg(2); + ShowBg(3); + if (unk->field_00d) + sub_81C7AC0(1); + else + { + PlaySE(SE_PN_ON); + sub_81C7AC0(3); + } + switch (GetPokenavMenuType()) + { + case POKENAV_MENU_TYPE_CONDITION_SEARCH: + LoadLeftHeaderGfxForIndex(7); + // fallthrough + case POKENAV_MENU_TYPE_CONDITION: + LoadLeftHeaderGfxForIndex(1); + break; + default: + LoadLeftHeaderGfxForIndex(0); + break; + } + return LT_INC_AND_PAUSE; + case 8: + if (IsPaletteFadeActive()) + return LT_PAUSE; + switch (GetPokenavMenuType()) + { + case POKENAV_MENU_TYPE_CONDITION_SEARCH: + sub_81C7FA0(7, FALSE, FALSE); + // fallthrough + case POKENAV_MENU_TYPE_CONDITION: + sub_81C7FA0(1, FALSE, FALSE); + break; + default: + sub_81C7FA0(0, FALSE, FALSE); + break; + } + sub_81CA20C(); + sub_81CA92C(); + return LT_INC_AND_CONTINUE; + case 9: + if (AreMenuOptionSpritesMoving()) + return LT_PAUSE; + if (sub_81C8010()) + return LT_PAUSE; + break; + } + return LT_FINISH; +} + +static u32 LoopedTask_MoveMenuCursor(s32 state) +{ + switch (state) + { + case 0: + sub_81CAA3C(); + sub_81CA278(); + PrintCurrentOptionDescription(); + PlaySE(SE_SELECT); + return LT_INC_AND_PAUSE; + case 1: + if (AreMenuOptionSpritesMoving()) + return LT_PAUSE; + if (sub_81CA7C4()) + return LT_PAUSE; + break; + } + return LT_FINISH; +} + +static u32 LoopedTask_OpenConditionMenu(s32 state) +{ + switch (state) + { + case 0: + sub_81CA9C8(); + sub_81CA2DC(); + sub_81C7FC4(0, 0); + PlaySE(SE_SELECT); + return LT_INC_AND_PAUSE; + case 1: + if (AreMenuOptionSpritesMoving()) + return LT_PAUSE; + if (sub_81C8010()) + return LT_PAUSE; + sub_81CA0C8(); + LoadLeftHeaderGfxForIndex(1); + return LT_INC_AND_PAUSE; + case 2: + sub_81CA20C(); + sub_81C7FA0(1, FALSE, FALSE); + sub_81CA818(); + PrintCurrentOptionDescription(); + return LT_INC_AND_PAUSE; + case 3: + if (AreMenuOptionSpritesMoving()) + return LT_PAUSE; + if (sub_81C8010()) + return LT_PAUSE; + if (sub_81CA89C()) + return LT_PAUSE; + if (sub_81CA7C4()) + return LT_PAUSE; + sub_81CA9D8(); + break; + } + return LT_FINISH; +} + +static u32 LoopedTask_ReturnToMainMenu(s32 state) +{ + switch (state) + { + case 0: + sub_81CA9C8(); + sub_81CA2DC(); + sub_81C7FC4(1, 0); + return LT_INC_AND_PAUSE; + case 1: + if (AreMenuOptionSpritesMoving()) + return LT_PAUSE; + if (sub_81C8010()) + return LT_PAUSE; + sub_81CA0C8(); + LoadLeftHeaderGfxForIndex(0); + return LT_INC_AND_PAUSE; + case 2: + sub_81CA20C(); + sub_81C7FA0(0, FALSE, FALSE); + sub_81CA864(); + PrintCurrentOptionDescription(); + return LT_INC_AND_PAUSE; + case 3: + if (AreMenuOptionSpritesMoving()) + return LT_PAUSE; + if (sub_81C8010()) + return LT_PAUSE; + if (sub_81CA89C()) + return LT_PAUSE; + if (sub_81CA7C4()) + return LT_PAUSE; + sub_81CA9D8(); + break; + } + return LT_FINISH; +} + +static u32 LoopedTask_OpenConditionSearchMenu(s32 state) +{ + switch (state) + { + case 0: + sub_81CA9C8(); + sub_81CA2DC(); + PlaySE(SE_SELECT); + return LT_INC_AND_PAUSE; + case 1: + if (AreMenuOptionSpritesMoving()) + return LT_PAUSE; + LoadLeftHeaderGfxForIndex(7); + sub_81CA0C8(); + return LT_INC_AND_PAUSE; + case 2: + sub_81CA20C(); + sub_81C7FA0(7, FALSE, FALSE); + PrintCurrentOptionDescription(); + return LT_INC_AND_PAUSE; + case 3: + if (AreMenuOptionSpritesMoving()) + return LT_PAUSE; + if (sub_81C8010()) + return LT_PAUSE; + if (sub_81CA89C()) + return LT_PAUSE; + sub_81CA9D8(); + break; + } + return LT_FINISH; +} + +static u32 LoopedTask_ReturnToConditionMenu(s32 state) +{ + switch (state) + { + case 0: + sub_81CA9C8(); + sub_81CA2DC(); + sub_81C7FC4(7, 0); + return LT_INC_AND_PAUSE; + case 1: + if (AreMenuOptionSpritesMoving()) + return LT_PAUSE; + if (sub_81C8010()) + return LT_PAUSE; + sub_81CA0C8(); + return LT_INC_AND_PAUSE; + case 2: + sub_81CA20C(); + PrintCurrentOptionDescription(); + return LT_INC_AND_PAUSE; + case 3: + if (AreMenuOptionSpritesMoving()) + return LT_PAUSE; + if (sub_81CA89C()) + return LT_PAUSE; + sub_81CA9D8(); + break; + } + return LT_FINISH; +} + +static u32 LoopedTask_SelectRibbonsNoWinners(s32 state) +{ + switch (state) + { + case 0: + PlaySE(SE_HAZURE); + PrintNoRibbonWinners(); + return LT_INC_AND_PAUSE; + case 1: + if (IsDma3ManagerBusyWithBgCopy()) + return LT_PAUSE; + break; + } + return LT_FINISH; +} + +// For redisplaying the Ribbons description to replace the No Ribbon Winners message +static u32 LoopedTask_ReShowDescription(s32 state) +{ + switch (state) + { + case 0: + PlaySE(SE_SELECT); + PrintCurrentOptionDescription(); + return LT_INC_AND_PAUSE; + case 1: + if (IsDma3ManagerBusyWithBgCopy()) + return LT_PAUSE; + break; + } + return LT_FINISH; +} + +// 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) + { + case 0: + PrintHelpBarText(GetHelpBarTextId()); + return LT_INC_AND_PAUSE; + case 1: + if (WaitForHelpBar()) + return LT_PAUSE; + sub_81C7880(); + sub_81CA9C8(); + sub_81CA2DC(); + switch (GetPokenavMenuType()) + { + case POKENAV_MENU_TYPE_CONDITION_SEARCH: + sub_81C7FC4(7, FALSE); + // fallthrough + case POKENAV_MENU_TYPE_CONDITION: + sub_81C7FC4(1, FALSE); + break; + default: + sub_81C7FC4(0, FALSE); + break; + } + PlaySE(SE_SELECT); + return LT_INC_AND_PAUSE; + case 2: + if (AreMenuOptionSpritesMoving()) + return LT_PAUSE; + if (sub_81C8010()) + return LT_PAUSE; + sub_81C7AC0(0); + return LT_INC_AND_PAUSE; + case 3: + if (IsPaletteFadeActive()) + return LT_PAUSE; + break; + } + return LT_FINISH; +} + +static void sub_81C9FC4(void) +{ + s32 i; + + for (i = 0; i < NELEMS(gUnknown_086201C4); i++) + LoadCompressedSpriteSheet(&gUnknown_086201C4[i]); + Pokenav_AllocAndLoadPalettes(gUnknown_086201D4); +} + +static void sub_81C9FEC(void) +{ + FreeSpriteTilesByTag(3); + FreeSpriteTilesByTag(1); + FreeSpritePaletteByTag(4); + FreeSpritePaletteByTag(5); + FreeSpritePaletteByTag(6); + FreeSpritePaletteByTag(7); + FreeSpritePaletteByTag(8); + FreeSpritePaletteByTag(3); + sub_81CA094(); + sub_81CA698(); +} + +static void CreateMenuOptionSprites(void) +{ + s32 i, j; + struct Pokenav2Struct * unk = GetSubstructPtr(2); + + for (i = 0; i < MAX_POKENAV_MENUITEMS; i++) + { + // Each menu option is 4 subsprites + for (j = 0; j < 4; j++) + { + u8 spriteId = CreateSprite(&sMenuOptionSpriteTemplate, 0x8c, 20 * i + 40, 3); + unk->iconSprites[i][j] = &gSprites[spriteId]; + gSprites[spriteId].pos2.x = 32 * j; + } + } +} + +static void sub_81CA094(void) +{ + s32 i, j; + struct Pokenav2Struct * unk = GetSubstructPtr(2); + + for (i = 0; i < MAX_POKENAV_MENUITEMS; i++) + { + for (j = 0; j < 4; j++) + { + FreeSpriteOamMatrix(unk->iconSprites[i][j]); + DestroySprite(unk->iconSprites[i][j]); + } + } +} + +static void sub_81CA0C8(void) +{ + s32 menuType = GetPokenavMenuType(); + 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) +{ + s32 i, j; + struct Pokenav2Struct * unk = GetSubstructPtr(2); + s32 sp04 = GetSpriteTileStartByTag(3); + + for (i = 0; i < MAX_POKENAV_MENUITEMS; i++) + { + if (*a0 != NULL) + { + for (j = 0; j < 4; j++) + { + unk->iconSprites[i][j]->oam.tileNum = (*a0)[0] + sp04 + 8 * j; + unk->iconSprites[i][j]->oam.paletteNum = IndexOfSpritePaletteTag((*a0)[1] + 4); + unk->iconSprites[i][j]->invisible = TRUE; + unk->iconSprites[i][j]->pos1.y = a1; + unk->iconSprites[i][j]->pos1.x = 0x8c; + unk->iconSprites[i][j]->pos2.x = 32 * j; + } + unk->iconVisible[i] = TRUE; + } + else + { + for (j = 0; j < 4; j++) + { + unk->iconSprites[i][j]->invisible = TRUE; + } + unk->iconVisible[i] = FALSE; + } + a0++; + a1 += a2; + } +} + +static void sub_81CA20C(void) +{ + s32 i; + struct Pokenav2Struct * unk = GetSubstructPtr(2); + s32 r8 = GetPokenavCursorPos(); + s32 r7 = 0; + s32 r2; + + for (i = 0; i < MAX_POKENAV_MENUITEMS; i++) + { + if (unk->iconVisible[i]) + { + if (r7++ == r8) + { + r2 = 0x82; + unk->cursorPos = i; + } + else + r2 = 0x8c; + sub_81CA35C(unk->iconSprites[i], 0x100, r2, 0xC); + sub_81CA448(unk->iconSprites[i], FALSE); + } + else + sub_81CA448(unk->iconSprites[i], TRUE); + } +} + +static void sub_81CA278(void) +{ + s32 i; + struct Pokenav2Struct * unk = GetSubstructPtr(2); + s32 r3 = GetPokenavCursorPos(); + s32 r5; + + for (i = 0, r5 = 0; i < MAX_POKENAV_MENUITEMS; i++) + { + if (unk->iconVisible[i]) + { + if (r5 == r3) + { + r5 = i; + break; + } + r5++; + } + } + + sub_81CA35C(unk->iconSprites[unk->cursorPos], 0x82, 0x8c, 0x4); + sub_81CA35C(unk->iconSprites[r5], 0x8c, 0x82, 0x4); + unk->cursorPos = r5; +} + +static void sub_81CA2DC(void) +{ + s32 i; + struct Pokenav2Struct * unk = GetSubstructPtr(2); + + for (i = 0; i < MAX_POKENAV_MENUITEMS; i++) + { + if (unk->iconVisible[i]) + { + if (unk->cursorPos != i) + sub_81CA35C(unk->iconSprites[i], 0x8C, 0x100, 0x8); + else + sub_81CA3B4(unk->iconSprites[i]); + } + } +} + +static bool32 AreMenuOptionSpritesMoving(void) +{ + s32 i; + struct Pokenav2Struct * unk = GetSubstructPtr(2); + + for (i = 0; i < MAX_POKENAV_MENUITEMS; i++) + { + if (unk->iconSprites[i][0]->callback != SpriteCallbackDummy) + return TRUE; + } + + if (unk->otherIconsInMotion) + return TRUE; + + return FALSE; +} + +static void sub_81CA35C(struct Sprite ** sprites, s32 a1, s32 a2, s32 a3) +{ + s32 i; + + for (i = 0; i < 4; i++) + { + (*sprites)->pos1.x = a1; + (*sprites)->data[0] = a3; + (*sprites)->data[1] = 16 * (a2 - a1) / a3; + (*sprites)->data[2] = 16 * a1; + (*sprites)->data[7] = a2; + (*sprites)->callback = sub_81CA474; + sprites++; + } +} + +static void sub_81CA3B4(struct Sprite ** sprites) +{ + s32 i; + struct Pokenav2Struct * unk = GetSubstructPtr(2); + u8 taskId; + + for (i = 0; i < 4; i++) + { + (*sprites)->oam.objMode = ST_OAM_OBJ_BLEND; + (*sprites)->oam.affineMode = ST_OAM_AFFINE_DOUBLE; + (*sprites)->callback = sub_81CA4AC; + (*sprites)->data[0] = 8; + (*sprites)->data[1] = 0; + (*sprites)->data[7] = i; + InitSpriteAffineAnim(sprites[0]); + StartSpriteAffineAnim(sprites[0], 0); + sprites++; + } + + SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(0x10, 0x00)); + taskId = CreateTask(sub_81CA580, 3); + gTasks[taskId].data[0] = 8; + unk->otherIconsInMotion++; +} + +static void sub_81CA448(struct Sprite ** sprites, bool32 a1) +{ + s32 i; + + for (i = 0; i < 4; i++) + { + (*sprites)->invisible = a1; + sprites++; + } +} + +static void sub_81CA474(struct Sprite * sprite) +{ + sprite->data[0]--; + if (sprite->data[0] != -1) + { + sprite->data[2] += sprite->data[1]; + sprite->pos1.x = sprite->data[2] >> 4; + } + else + { + sprite->pos1.x = sprite->data[7]; + sprite->callback = SpriteCallbackDummy; + } +} + +static void sub_81CA4AC(struct Sprite * sprite) +{ + s32 r0; + s32 r1; + if (sprite->data[0] == 0) + { + if (sprite->data[1] == 0) + { + StartSpriteAffineAnim(sprite, 1); + sprite->data[1]++; + sprite->data[2] = 0x100; + sprite->pos1.x += sprite->pos2.x; + sprite->pos2.x = 0; + } + else + { + sprite->data[2] += 16; + r0 = sprite->data[2]; + r1 = r0 >> 3; + r1 = (r1 - 32) / 2; + switch (sprite->data[7]) + { + case 0: + sprite->pos2.x = -r1 * 3; + break; + case 1: + sprite->pos2.x = -r1; + break; + case 2: + sprite->pos2.x = r1; + break; + case 3: + sprite->pos2.x = r1 * 3; + break; + } + if (sprite->affineAnimEnded) + { + sprite->invisible = TRUE; + FreeOamMatrix(sprite->oam.matrixNum); + CalcCenterToCornerVec(sprite, sprite->oam.shape, sprite->oam.size, ST_OAM_AFFINE_OFF); + sprite->oam.affineMode = ST_OAM_AFFINE_OFF; + sprite->oam.objMode = ST_OAM_OBJ_NORMAL; + sprite->callback = SpriteCallbackDummy; + } + } + } + else + { + sprite->data[0]--; + } +} + +static void sub_81CA580(u8 taskId) +{ + s16 * data = gTasks[taskId].data; + + if (data[0] == 0) + { + switch (data[1]) + { + case 0: + data[2] = 16; + data[3] = 0; + SetGpuReg(REG_OFFSET_BLDCNT, BLDCNT_EFFECT_NONE | BLDCNT_TGT2_ALL); + SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(0x10, 0x00)); + data[1]++; + break; + case 1: + if (data[4] & 1) + { + data[2] -= 3; + if (data[2] < 0) + data[2] = 0; + } + else + { + data[3] += 3; + if (data[3] > 16) + data[3] = 16; + } + SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(data[2], data[3])); + data[4]++; + if (data[4] == 12) + { + ((struct Pokenav2Struct *)GetSubstructPtr(2))->otherIconsInMotion--; + SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(0x00, 0x10)); + DestroyTask(taskId); + } + break; + } + } + else + data[0]--; +} + +static void sub_81CA640(void) +{ + struct Pokenav2Struct * ptr = GetSubstructPtr(2); + u8 spriteId = CreateSprite(&gUnknown_0862036C, 0x10, 0x60, 4); + ptr->field_028 = &gSprites[spriteId]; + if (sub_81C98D4()) + ptr->field_028->callback = sub_81CA6AC; + else + ptr->field_028->invisible = TRUE; +} + +static void sub_81CA698(void) +{ + struct Pokenav2Struct * ptr = GetSubstructPtr(2); + DestroySprite(ptr->field_028); +} + +static void sub_81CA6AC(struct Sprite * sprite) +{ + sprite->data[0]++; + if (sprite->data[0] > 8) + { + sprite->data[0] = 0; + sprite->invisible ^= 1; + } +} + +static void AddOptionDescriptionWindow(void) +{ + struct Pokenav2Struct * ptr = GetSubstructPtr(2); + + ptr->optionDescWindowId = AddWindow(&sOptionDescWindowTemplate); + PutWindowTilemap(ptr->optionDescWindowId); + FillWindowPixelBuffer(ptr->optionDescWindowId, PIXEL_FILL(6)); + CopyWindowToVram(ptr->optionDescWindowId, 3); +} + +static void PrintCurrentOptionDescription(void) +{ + struct Pokenav2Struct * ptr = GetSubstructPtr(2); + int menuItem = GetCurrentMenuItemId(); + const u8 * s = sPageDescriptions[menuItem]; + u32 width = GetStringWidth(1, s, -1); + FillWindowPixelBuffer(ptr->optionDescWindowId, PIXEL_FILL(6)); + AddTextPrinterParameterized3(ptr->optionDescWindowId, 1, (192 - width) / 2, 1, sOptionDescTextColors, 0, s); +} + +// Printed when Ribbons is selected if no PC/party mons have ribbons +// Can occur by obtaining a mon with a ribbon and then releasing all ribbon winners +static void PrintNoRibbonWinners(void) +{ + struct Pokenav2Struct * ptr = GetSubstructPtr(2); + const u8 * s = gText_NoRibbonWinners; + u32 width = GetStringWidth(1, s, -1); + FillWindowPixelBuffer(ptr->optionDescWindowId, PIXEL_FILL(6)); + AddTextPrinterParameterized3(ptr->optionDescWindowId, 1, (192 - width) / 2, 1, sOptionDescTextColors2, 0, s); +} + +static bool32 sub_81CA7C4(void) +{ + return IsDma3ManagerBusyWithBgCopy(); +} + +static void sub_81CA7D4(void) +{ + struct Pokenav2Struct * ptr = GetSubstructPtr(2); + ptr->bg3ScrollTaskId = CreateTask(sub_81CA808, 2); +} + +static void sub_81CA7F4(void) +{ + struct Pokenav2Struct * ptr = GetSubstructPtr(2); + DestroyTask(ptr->bg3ScrollTaskId); +} + +static void sub_81CA808(u8 taskId) +{ + ChangeBgX(3, 0x80, 1); +} + +static void sub_81CA818(void) +{ + u8 taskId = CreateTask(sub_81CA8B0, 3); + SetWordTaskArg(taskId, 1, (uintptr_t)(gUnknown_0861FC78 + 1)); + SetWordTaskArg(taskId, 3, (uintptr_t)(gUnknown_0861FC78 + 7)); +} + +static void sub_81CA850(void) +{ + CopyPaletteIntoBufferUnfaded(gUnknown_0861FC78 + 7, 0x31, 4); +} + +static void sub_81CA864(void) +{ + u8 taskId = CreateTask(sub_81CA8B0, 3); + SetWordTaskArg(taskId, 1, (uintptr_t)(gUnknown_0861FC78 + 7)); + SetWordTaskArg(taskId, 3, (uintptr_t)(gUnknown_0861FC78 + 1)); +} + +static bool32 sub_81CA89C(void) +{ + return FuncIsActiveTask(sub_81CA8B0); +} + +static void sub_81CA8B0(u8 taskId) +{ + u16 sp8[2]; + s16 * data = gTasks[taskId].data; + const u16 * pal1 = (const u16 *)GetWordTaskArg(taskId, 1); + const u16 * pal2 = (const u16 *)GetWordTaskArg(taskId, 3); + + sub_81C79BC(pal1, pal2, 2, 12, ++data[0], sp8); + LoadPalette(sp8, 0x31, 4); + if (data[0] == 12) + DestroyTask(taskId); +} + +static void sub_81CA914(void) +{ + TransferPlttBuffer(); + LoadOam(); + ProcessSpriteCopyRequests(); + ScanlineEffect_InitHBlankDmaTransfer(); +} + +static void sub_81CA92C(void) +{ + SetGpuReg(REG_OFFSET_BLDCNT, BLDCNT_TGT1_OBJ | BLDCNT_EFFECT_LIGHTEN); + SetGpuReg(REG_OFFSET_BLDY, 0); + SetGpuRegBits(REG_OFFSET_DISPCNT, DISPCNT_WIN0_ON); + SetGpuRegBits(REG_OFFSET_WININ, 0x3F); + SetGpuRegBits(REG_OFFSET_WINOUT, 0x1F); + SetGpuRegBits(REG_OFFSET_WIN0V, 0xA0); + ScanlineEffect_Stop(); + sub_81CAA3C(); + ScanlineEffect_SetParams(gUnknown_08620384); + SetVBlankCallback_(sub_81CA914); + CreateTask(sub_81CA9EC, 3); +} + +static void sub_81CA994(void) +{ + SetGpuReg(REG_OFFSET_BLDCNT, 0); + ClearGpuRegBits(REG_OFFSET_DISPCNT, DISPCNT_WIN0_ON); + ScanlineEffect_Stop(); + DestroyTask(FindTaskIdByFunc(sub_81CA9EC)); + SetPokenavVBlankCallback(); +} + +static void sub_81CA9C8(void) +{ + SetGpuReg(REG_OFFSET_BLDCNT, 0); +} + +static void sub_81CA9D8(void) +{ + sub_81CAA3C(); + SetGpuReg(REG_OFFSET_BLDCNT, BLDCNT_TGT1_OBJ | BLDCNT_EFFECT_LIGHTEN); +} + +static void sub_81CA9EC(u8 taskId) +{ + s16 * data = gTasks[taskId].data; + data[0]++; + if (data[0] > 0) + { + data[0] = 0; + data[1] += 3; + data[1] &= 0x7F; + SetGpuReg(REG_OFFSET_BLDY, gSineTable[data[1]] >> 5); + } +} + +static void sub_81CAA3C(void) +{ + int menuType = GetPokenavMenuType(); + int cursorPos = GetPokenavCursorPos(); + int r4 = gUnknown_08620240[menuType].unk2 * cursorPos + gUnknown_08620240[menuType].unk0 - 8; + CpuFill16(0, gScanlineEffectRegBuffers[0], 0x140); + CpuFill16(0, gScanlineEffectRegBuffers[1], 0x140); + CpuFill16(RGB(16, 23, 28), &gScanlineEffectRegBuffers[0][r4], 0x20); + CpuFill16(RGB(16, 23, 28), &gScanlineEffectRegBuffers[1][r4], 0x20); +} + +void sub_81CAADC(void) +{ + sub_81CA9C8(); +} diff --git a/src/pokenav_region_map.c b/src/pokenav_region_map.c new file mode 100755 index 000000000..be30ca94d --- /dev/null +++ b/src/pokenav_region_map.c @@ -0,0 +1,729 @@ +#include "global.h" +#include "bg.h" +#include "decompress.h" +#include "landmark.h" +#include "main.h" +#include "menu.h" +#include "palette.h" +#include "pokenav.h" +#include "region_map.h" +#include "sound.h" +#include "sprite.h" +#include "string_util.h" +#include "task.h" +#include "text_window.h" +#include "window.h" +#include "constants/songs.h" + +struct Pokenav5Struct +{ + u8 filler0[0xC]; + bool32 unkC; + u32 (*unk10)(struct Pokenav5Struct *); +}; + +struct Pokenav5Struct_2 +{ + bool32 (*unk0)(void); + u32 unk4; + u16 unk8; + struct Sprite *cityFeatureTextSprites[3]; + u8 unk18[0x800]; + u8 cityZoomPics[22][0xC8]; +}; + +struct CityMapEntry +{ + u16 mapSecId; + u16 index; + const u32 *tilemap; +}; + +static u32 sub_81CC568(struct Pokenav5Struct *); +static u32 sub_81CC5B4(struct Pokenav5Struct *); +static u32 sub_81CC5DC(struct Pokenav5Struct *); +static u32 sub_81CC6F4(s32); +static u32 sub_81CCD34(s32); +static bool32 sub_81CC6BC(void); +static void sub_81CC9EC(void); +static void sub_81CC9C0(void); +static void sub_81CCD10(void); +static bool32 sub_81CCD24(void); +static void sub_81CCA1C(struct Pokenav5Struct_2 *); +static bool32 sub_81CCAFC(void); +static void sub_81CCB0C(struct Pokenav5Struct_2 *); +static bool32 sub_81CCC4C(struct Pokenav5Struct_2 *); +static void sub_81CCC5C(int); +static bool32 sub_81CCC88(void); +static void sub_81CCE58(void); +static void sub_81CCD70(struct Pokenav5Struct_2 *, int, int); +static void sub_81CCDE8(struct Pokenav5Struct_2 *, int, int); +static void sub_81CCFA4(int); +static void sub_81CCC9C(u8 taskId); +static void sub_81CCF78(void); +void sub_81CCEF4(struct Sprite *sprite); +u32 sub_81CC848(s32); +u32 sub_81CC878(s32); +u32 sub_81CC8D8(s32); +u32 sub_81CC95C(s32); + +extern const u16 gHoennMapZoomIcons_Pal[]; +extern const struct SpriteTemplate gUnknown_086231D0; +extern const u32 gHoennMapZoomIcons_Gfx[]; + +const u16 gUnknown_08622868[] = INCBIN_U16("graphics/pokenav/8622868.gbapal"); +const u32 gUnknown_08622888[] = INCBIN_U32("graphics/pokenav/zoom_tiles.4bpp.lz"); + +#include "data/region_map/city_map_tilemaps.h" + + +const struct BgTemplate gUnknown_086230D8[3] = +{ + { + .bg = 1, + .charBaseIndex = 1, + .mapBaseIndex = 0x1F, + .screenSize = 0, + .paletteMode = 0, + .priority = 1, + .baseTile = 0 + }, + { + .bg = 2, + .charBaseIndex = 2, + .mapBaseIndex = 0x06, + .screenSize = 0, + .paletteMode = 0, + .priority = 2, + .baseTile = 0 + }, + { + .bg = 2, + .charBaseIndex = 0, + .mapBaseIndex = 0x00, + .screenSize = 2, + .paletteMode = 0, + .priority = 3, + .baseTile = 0 + }, +}; + +const LoopedTask gUnknown_086230E4[] = +{ + NULL, + sub_81CC848, + sub_81CC878, + sub_81CC8D8, + sub_81CC95C +}; + +const struct CompressedSpriteSheet gUnknown_086230F8[1] = +{ + {gHoennMapZoomIcons_Gfx, 0x800, 6} +}; + +const struct SpritePalette gUnknown_08623100[] = +{ + {gHoennMapZoomIcons_Pal, 11}, + {} +}; + +const struct WindowTemplate gUnknown_08623110 = +{ + .bg = 1, + .tilemapLeft = 17, + .tilemapTop = 4, + .width = 12, + .height = 13, + .paletteNum = 1, + .baseBlock = 0x4C +}; + +#include "data/region_map/city_map_entries.h" + +const struct OamData gUnknown_086231C8 = +{ + .y = 0, + .affineMode = ST_OAM_AFFINE_OFF, + .objMode = ST_OAM_OBJ_NORMAL, + .bpp = ST_OAM_4BPP, + .shape = SPRITE_SHAPE(32x8), + .x = 0, + .size = SPRITE_SIZE(32x8), + .tileNum = 0, + .priority = 1, + .paletteNum = 0, +}; + +const struct SpriteTemplate gUnknown_086231D0 = +{ + .tileTag = 6, + .paletteTag = 11, + .oam = &gUnknown_086231C8, + .anims = gDummySpriteAnimTable, + .images = NULL, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = sub_81CCEF4, +}; + +u32 PokenavCallback_Init_6(void) +{ + struct Pokenav5Struct *state = AllocSubstruct(3, sizeof(struct Pokenav5Struct)); + if (!state) + return FALSE; + + if (!AllocSubstruct(16, sizeof(struct RegionMap))) + return FALSE; + + state->unkC = sub_8124668(gMapHeader.regionMapSectionId); + if (!state->unkC) + state->unk10 = sub_81CC568; + else + state->unk10 = sub_81CC5B4; + + return TRUE; +} + +void sub_81CC524(void) +{ + gSaveBlock2Ptr->regionMapZoom = sub_8124658(); + FreePokenavSubstruct(16); + FreePokenavSubstruct(3); +} + +u32 sub_81CC554(void) +{ + struct Pokenav5Struct *state = GetSubstructPtr(3); + return state->unk10(state); +} + +static u32 sub_81CC568(struct Pokenav5Struct *state) +{ + switch (sub_81230AC()) + { + case 3: + return 1; + case 4: + if (!sub_8124658()) + return 3; + return 2; + case 5: + state->unk10 = sub_81CC5DC; + return 4; + } + + return 0; +} + +static u32 sub_81CC5B4(struct Pokenav5Struct *state) +{ + if (gMain.newKeys & B_BUTTON) + { + state->unk10 = sub_81CC5DC; + return 4; + } + + return 0; +} + +static u32 sub_81CC5DC(struct Pokenav5Struct *state) +{ + return POKENAV_MENU_1; +} + +bool32 sub_81CC5E4(void) +{ + struct Pokenav5Struct *state = GetSubstructPtr(3); + return state->unkC; +} + +bool32 sub_81CC5F4(void) +{ + struct Pokenav5Struct_2 *state = AllocSubstruct(4, sizeof(struct Pokenav5Struct_2)); + if (!state) + return FALSE; + + state->unk4 = CreateLoopedTask(sub_81CC6F4, 1); + state->unk0 = sub_81CC6BC; + return TRUE; +} + +void sub_81CC62C(s32 index) +{ + struct Pokenav5Struct_2 *state = GetSubstructPtr(4); + state->unk4 = CreateLoopedTask(gUnknown_086230E4[index], 1); + state->unk0 = sub_81CC6BC; +} + +u32 sub_81CC65C(void) +{ + struct Pokenav5Struct_2 *state = GetSubstructPtr(4); + return state->unk0(); +} + +void sub_81CC670(void) +{ + struct Pokenav5Struct_2 *state = GetSubstructPtr(4); + FreeRegionMapIconResources(); + sub_81CC9EC(); + RemoveWindow(state->unk8); + FreePokenavSubstruct(16); + FreePokenavSubstruct(4); + SetPokenavVBlankCallback(); + SetBgMode(0); +} + +static void sub_81CC6A4(void) +{ + TransferPlttBuffer(); + LoadOam(); + ProcessSpriteCopyRequests(); + UpdateRegionMapVideoRegs(); +} + +static bool32 sub_81CC6BC(void) +{ + struct Pokenav5Struct_2 *state = GetSubstructPtr(4); + return IsLoopedTaskActive(state->unk4); +} + +static bool8 sub_81CC6D0(void) +{ + if (sub_81CC5E4()) + return FALSE; + + return gSaveBlock2Ptr->regionMapZoom == 1; +} + +static u32 sub_81CC6F4(s32 taskState) +{ + int var0; + struct RegionMap *regionMap; + struct Pokenav5Struct_2 *state = GetSubstructPtr(4); + switch (taskState) + { + case 0: + SetVBlankCallback_(NULL); + HideBg(1); + HideBg(2); + HideBg(3); + SetBgMode(1); + InitBgTemplates(gUnknown_086230D8, ARRAY_COUNT(gUnknown_086230D8) - 1); + regionMap = GetSubstructPtr(16); + sub_8122CF8(regionMap, &gUnknown_086230D8[1], sub_81CC6D0()); + sub_81CC9C0(); + return 0; + case 1: + if (sub_8122DB0()) + return 2; + + if (!sub_81CC5E4()) + { + CreateRegionMapPlayerIcon(4, 9); + CreateRegionMapCursor(5, 10); + sub_812454C(); + } + else + { + sub_8123030(0, 6); + } + return 0; + case 2: + sub_81CCD10(); + return 1; + case 3: + if (sub_81CCD24()) + return 2; + + sub_81CCA1C(state); + return 1; + case 4: + if (sub_81CCAFC()) + return 2; + + sub_81CCB0C(state); + sub_81C7B40(); + return 0; + case 5: + if (sub_81CCC4C(state)) + return 2; + + ShowBg(1); + ShowBg(2); + SetVBlankCallback_(sub_81CC6A4); + return 0; + case 6: + if (!sub_81CC6D0()) + var0 = 4; + else + var0 = 5; + + LoadLeftHeaderGfxForIndex(var0); + sub_81C7FA0(var0, 1, 1); + sub_81C7AC0(1); + return 0; + case 7: + if (IsPaletteFadeActive() || sub_81C8010()) + return 2; + return 1; + default: + return 4; + } +} + +u32 sub_81CC848(s32 taskState) +{ + struct Pokenav5Struct_2 *state = GetSubstructPtr(4); + switch (taskState) + { + case 0: + sub_81CCB0C(state); + return 0; + case 1: + if (sub_81CCC4C(state)) + return 2; + break; + } + + return 4; +} + +u32 sub_81CC878(s32 taskState) +{ + switch (taskState) + { + case 0: + PlaySE(SE_SELECT); + sub_81CCC5C(0); + sub_8123418(); + return 0; + case 1: + if (sub_8123514() || sub_81CCC88()) + return 2; + + PrintHelpBarText(HELPBAR_MAP_ZOOMED_OUT); + return 0; + case 2: + if (WaitForHelpBar()) + return 2; + + sub_81C7E14(4); + break; + } + + return 4; +} + +u32 sub_81CC8D8(s32 taskState) +{ + struct Pokenav5Struct_2 *state = GetSubstructPtr(4); + switch (taskState) + { + case 0: + PlaySE(SE_SELECT); + sub_81CCB0C(state); + return 0; + case 1: + if (sub_81CCC4C(state)) + return 2; + + sub_81CCC5C(1); + sub_8123418(); + return 0; + case 2: + if (sub_8123514() || sub_81CCC88()) + return 2; + + PrintHelpBarText(HELPBAR_MAP_ZOOMED_IN); + return 0; + case 3: + if (WaitForHelpBar()) + return 2; + + sub_81C7E14(5); + break; + } + + return 4; +} + +u32 sub_81CC95C(s32 taskState) +{ + switch (taskState) + { + case 0: + PlaySE(SE_SELECT); + sub_81C7AC0(0); + return 0; + case 1: + if (IsPaletteFadeActive()) + return 2; + + sub_81C7FDC(); + sub_81C78A0(); + return 0; + case 2: + if (MainMenuLoopedTaskIsBusy()) + return 2; + + HideBg(1); + HideBg(2); + HideBg(3); + return 0; + } + + return 4; +} + +static void sub_81CC9C0(void) +{ + int i; + for (i = 0; i < ARRAY_COUNT(gUnknown_086230F8); i++) + LoadCompressedSpriteSheet(&gUnknown_086230F8[i]); + + Pokenav_AllocAndLoadPalettes(gUnknown_08623100); + sub_81CCE58(); +} + +static void sub_81CC9EC(void) +{ + int i; + struct Pokenav5Struct_2 *state = GetSubstructPtr(4); + FreeSpriteTilesByTag(6); + FreeSpritePaletteByTag(11); + for (i = 0; i < 3; i++) + DestroySprite(state->cityFeatureTextSprites[i]); +} + +static void sub_81CCA1C(struct Pokenav5Struct_2 *state) +{ + sub_8199DF0(1, PIXEL_FILL(0), 0x40, 1); + sub_8199DF0(1, PIXEL_FILL(1), 0x41, 1); + CpuFill16(0x1040, state->unk18, 0x800); + SetBgTilemapBuffer(1, state->unk18); + state->unk8 = AddWindow(&gUnknown_08623110); + LoadUserWindowBorderGfx_(state->unk8, 0x42, 0x40); + DrawTextBorderOuter(state->unk8, 0x42, 4); + decompress_and_copy_tile_data_to_vram(1, gUnknown_08622888, 0, 0, 0); + FillWindowPixelBuffer(state->unk8, PIXEL_FILL(1)); + PutWindowTilemap(state->unk8); + CopyWindowToVram(state->unk8, 3); + CopyPaletteIntoBufferUnfaded(gUnknown_08622868, 0x10, 0x20); + CopyPaletteIntoBufferUnfaded(gHoennMapZoomIcons_Pal, 0x30, 0x20); + if (!sub_8124658()) + ChangeBgY(1, -0x6000, 0); + else + ChangeBgY(1, 0, 0); + + ChangeBgX(1, 0, 0); +} + +static bool32 sub_81CCAFC(void) +{ + return free_temp_tile_data_buffers_if_possible(); +} + +static void sub_81CCB0C(struct Pokenav5Struct_2 *state) +{ + struct RegionMap *regionMap = GetSubstructPtr(16); + switch (regionMap->iconDrawType) + { + case MAPSECTYPE_CITY_CANFLY: + FillWindowPixelBuffer(state->unk8, PIXEL_FILL(1)); + PutWindowRectTilemap(state->unk8, 0, 0, 12, 2); + AddTextPrinterParameterized(state->unk8, 7, regionMap->mapSecName, 0, 1, TEXT_SPEED_FF, NULL); + sub_81CCD70(state, regionMap->mapSecId, regionMap->posWithinMapSec); + CopyWindowToVram(state->unk8, 3); + sub_81CCFA4(0); + break; + case MAPSECTYPE_CITY_CANTFLY: + FillWindowPixelBuffer(state->unk8, PIXEL_FILL(1)); + PutWindowRectTilemap(state->unk8, 0, 0, 12, 2); + AddTextPrinterParameterized(state->unk8, 7, regionMap->mapSecName, 0, 1, TEXT_SPEED_FF, NULL); + FillBgTilemapBufferRect(1, 0x1041, 17, 6, 12, 11, 17); + CopyWindowToVram(state->unk8, 3); + sub_81CCFA4(1); + break; + case MAPSECTYPE_PLAIN: + case MAPSECTYPE_BATTLE_FRONTIER: + FillWindowPixelBuffer(state->unk8, PIXEL_FILL(1)); + PutWindowTilemap(state->unk8); + AddTextPrinterParameterized(state->unk8, 7, regionMap->mapSecName, 0, 1, TEXT_SPEED_FF, NULL); + sub_81CCDE8(state, regionMap->mapSecId, regionMap->posWithinMapSec); + CopyWindowToVram(state->unk8, 3); + sub_81CCFA4(1); + break; + case MAPSECTYPE_NONE: + FillBgTilemapBufferRect(1, 0x1041, 17, 4, 12, 13, 17); + CopyBgTilemapBufferToVram(1); + sub_81CCFA4(1); + break; + } +} + +static bool32 sub_81CCC4C(struct Pokenav5Struct_2 *state) +{ + return IsDma3ManagerBusyWithBgCopy(); +} + +static void sub_81CCC5C(int arg0) +{ + u8 taskId = CreateTask(sub_81CCC9C, 3); + gTasks[taskId].data[0] = arg0; +} + +static bool32 sub_81CCC88(void) +{ + return FuncIsActiveTask(sub_81CCC9C); +} + +static void sub_81CCC9C(u8 taskId) +{ + if (gTasks[taskId].data[0]) + { + if (ChangeBgY(1, 0x480, 1) >= 0) + { + ChangeBgY(1, 0, 0); + DestroyTask(taskId); + } + + sub_81CCF78(); + } + else + { + if (ChangeBgY(1, 0x480, 2) <= -0x6000) + { + ChangeBgY(1, -0x6000, 0); + DestroyTask(taskId); + } + + sub_81CCF78(); + } +} + +static void sub_81CCD10(void) +{ + CreateLoopedTask(sub_81CCD34, 1); +} + +static bool32 sub_81CCD24(void) +{ + return FuncIsActiveLoopedTask(sub_81CCD34); +} + +static u32 sub_81CCD34(s32 taskState) +{ + struct Pokenav5Struct_2 *state = GetSubstructPtr(4); + if (taskState < (int)ARRAY_COUNT(gPokenavCityMaps)) + { + LZ77UnCompWram(gPokenavCityMaps[taskState].tilemap, state->cityZoomPics[taskState]); + return 1; + } + + return 4; +} + +static void sub_81CCD70(struct Pokenav5Struct_2 *state, int mapSecId, int pos) +{ + int i; + for (i = 0; i < (int)ARRAY_COUNT(gPokenavCityMaps) && (gPokenavCityMaps[i].mapSecId != mapSecId || gPokenavCityMaps[i].index != pos); i++) + ; + + if (i == ARRAY_COUNT(gPokenavCityMaps)) + return; + + FillBgTilemapBufferRect_Palette0(1, 0x1041, 17, 6, 12, 11); + CopyToBgTilemapBufferRect(1, state->cityZoomPics[i], 18, 6, 10, 10); +} + +static void sub_81CCDE8(struct Pokenav5Struct_2 *state, int mapSecId, int pos) +{ + int i = 0; + while (1) + { + const u8 *landmarkName = GetLandmarkName(mapSecId, pos, i); + if (!landmarkName) + break; + + StringCopyPadded(gStringVar1, landmarkName, CHAR_SPACE, 12); + AddTextPrinterParameterized(state->unk8, 7, gStringVar1, 0, i * 16 + 17, TEXT_SPEED_FF, NULL); + i++; + } +} + +static void sub_81CCE58(void) +{ + int i; + int y; + struct Sprite *sprite; + struct Pokenav5Struct_2 *state = GetSubstructPtr(4); + + if (!sub_8124658()) + y = 228; + else + y = 132; + + for (i = 0; i < 3; i++) + { + u8 spriteId = CreateSprite(&gUnknown_086231D0, 152 + i * 32, y, 8); + sprite = &gSprites[spriteId]; + sprite->data[0] = 0; + sprite->data[1] = i * 4; + sprite->data[2] = sprite->oam.tileNum; + sprite->data[3] = 150; + sprite->data[4] = i * 4; + sprite->oam.tileNum += i * 4; + state->cityFeatureTextSprites[i] = sprite; + } +} + +void sub_81CCEF4(struct Sprite *sprite) +{ + if (sprite->data[3]) + { + sprite->data[3]--; + return; + } + + if (++sprite->data[0] > 11) + sprite->data[0] = 0; + + if (++sprite->data[1] > 60) + sprite->data[1] = 0; + + sprite->oam.tileNum = sprite->data[2] + sprite->data[1]; + if (sprite->data[5] < 4) + { + if (sprite->data[0] == 0) + { + sprite->data[5]++; + sprite->data[3] = 120; + } + } + else + { + if (sprite->data[1] == sprite->data[4]) + { + sprite->data[5] = 0; + sprite->data[0] = 0; + sprite->data[3] = 120; + } + } +} + +static void sub_81CCF78(void) +{ + int i; + struct Pokenav5Struct_2 *state = GetSubstructPtr(4); + int y = 132 - (GetBgY(1) >> 8); + for (i = 0; i < 3; i++) + state->cityFeatureTextSprites[i]->pos1.y = y; +} + +static void sub_81CCFA4(int invisible) +{ + int i; + struct Pokenav5Struct_2 *state = GetSubstructPtr(4); + for (i = 0; i < 3; i++) + state->cityFeatureTextSprites[i]->invisible = invisible; +} diff --git a/src/pokenav_ribbons_1.c b/src/pokenav_ribbons_1.c new file mode 100644 index 000000000..63b4adb30 --- /dev/null +++ b/src/pokenav_ribbons_1.c @@ -0,0 +1,732 @@ +#include "global.h" +#include "pokenav.h" +#include "bg.h" +#include "menu.h" +#include "window.h" +#include "sound.h" +#include "string_util.h" +#include "international_string_util.h" +#include "constants/songs.h" + +struct PokenavSub9 +{ + u32 (*unk0)(struct PokenavSub9*); + u32 loopedTaskId; + u16 winid; + s32 unkC; + s32 unk10; + u32 unk14; + u32 unk18; + struct PokenavSub18 *unk1C; +}; + +struct PokenavSub10 +{ + bool32 (*callback)(void); + u32 ltid; + u16 winid; + bool32 unkC; + u8 buff[BG_SCREEN_SIZE]; +}; + +static u32 sub_81CFA68(struct PokenavSub9 *structPtr); +static u32 sub_81CFA88(struct PokenavSub9 *structPtr); +static u32 sub_81CFB08(struct PokenavSub9 *structPtr); +static u32 sub_81CFB10(struct PokenavSub9 *structPtr); +static u32 sub_81CFB8C(s32 state); +static u32 sub_81CFC2C(s32 state); +static u32 sub_81CFC40(s32 state); +static u32 sub_81CFB74(s32 state); +static void sub_81CFCEC(struct PokenavSub9 *structPtr, struct PokenavMonList *item); +static u32 sub_81CFEB8(s32 state); +static bool32 sub_81CFE84(void); +static u32 sub_81CFFFC(s32 state); +static u32 sub_81D0074(s32 state); +static u32 sub_81D00EC(s32 state); +static u32 sub_81D0164(s32 state); +static u32 sub_81D01DC(s32 state); +static u32 sub_81D021C(s32 state); +static void sub_81D02B0(s32 windowId, s32 val1, s32 val2); +static void sub_81D024C(struct PokenavSub10 *ptr); +static void sub_81D0288(struct PokenavSub10 *ptr); +static void sub_81D0304(void); +static void BufferRibbonMonInfoText(struct PokenavMonList *, u8 *); + +static const LoopedTask gUnknown_086235D8[] = +{ + sub_81CFB8C, + sub_81CFC2C, + sub_81CFC40 +}; + +static const u16 gUnknown_086235E4[] = INCBIN_U16("graphics/pokenav/ui_ribbons.gbapal"); +static const u32 gUnknown_08623604[] = INCBIN_U32("graphics/pokenav/ui_ribbons.4bpp.lz"); +static const u32 gUnknown_086236CC[] = INCBIN_U32("graphics/pokenav/ui_ribbons.bin.lz"); +static const u16 gUnknown_08623790[] = INCBIN_U16("graphics/pokenav/8623790.gbapal"); + +static const struct BgTemplate gUnknown_086237B0[] = +{ + { + .bg = 1, + .charBaseIndex = 1, + .mapBaseIndex = 0x06, + .screenSize = 0, + .paletteMode = 0, + .priority = 2, + .baseTile = 0 + }, { + .bg = 2, + .charBaseIndex = 2, + .mapBaseIndex = 0x07, + .screenSize = 0, + .paletteMode = 0, + .priority = 3, + .baseTile = 0 + } +}; + +static const LoopedTask gUnknown_086237B8[] = +{ + NULL, + sub_81CFFFC, + sub_81D0074, + sub_81D00EC, + sub_81D0164, + sub_81D01DC, + sub_81D021C +}; + +static const struct WindowTemplate gUnknown_086237D4 = +{ + .bg = 1, + .tilemapLeft = 1, + .tilemapTop = 6, + .width = 7, + .height = 2, + .paletteNum = 1, + .baseBlock = 20 +}; + +static const u8 sText_MaleSymbol[] = _("{COLOR_HIGHLIGHT_SHADOW}{LIGHT_RED}{WHITE}{GREEN}♂{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 sText_NoGenderSymbol[] = _("{UNK_SPACER}"); + +bool32 PokenavCallback_Init_12(void) +{ + struct PokenavSub9 *structPtr = AllocSubstruct(9, sizeof(struct PokenavSub9)); + if (structPtr == NULL) + return FALSE; + + structPtr->unk1C = AllocSubstruct(18, sizeof(struct PokenavSub18)); + if (structPtr->unk1C == NULL) + return FALSE; + + structPtr->unk0 = sub_81CFA68; + structPtr->loopedTaskId = CreateLoopedTask(sub_81CFB74, 1); + structPtr->unk14 = 0; + return TRUE; +} + +bool32 PokenavCallback_Init_14(void) +{ + struct PokenavSub9 *structPtr = AllocSubstruct(9, sizeof(struct PokenavSub9)); + if (structPtr == NULL) + return FALSE; + + structPtr->unk1C = GetSubstructPtr(18); + structPtr->unk0 = sub_81CFA88; + structPtr->unk14 = 1; + return TRUE; +} + +u32 sub_81CFA34(void) +{ + struct PokenavSub9 *structPtr = GetSubstructPtr(9); + return structPtr->unk0(structPtr); +} + +void sub_81CFA48(void) +{ + struct PokenavSub9 *structPtr = GetSubstructPtr(9); + if (!structPtr->unk18) + FreePokenavSubstruct(18); + FreePokenavSubstruct(9); +} + +static u32 sub_81CFA68(struct PokenavSub9 *structPtr) +{ + if (!IsLoopedTaskActive(structPtr->loopedTaskId)) + structPtr->unk0 = sub_81CFA88; + return 0; +} + +static u32 sub_81CFA88(struct PokenavSub9 *structPtr) +{ + if (gMain.newAndRepeatedKeys & DPAD_UP) + return 1; + if (gMain.newAndRepeatedKeys & DPAD_DOWN) + return 2; + if (gMain.newKeys & DPAD_LEFT) + return 3; + if (gMain.newKeys & DPAD_RIGHT) + return 4; + if (gMain.newKeys & B_BUTTON) + { + structPtr->unk18 = 0; + structPtr->unk0 = sub_81CFB08; + return 5; + } + if (gMain.newKeys & A_BUTTON) + { + structPtr->unk1C->unk2 = GetSelectedMatchCall(); + structPtr->unk18 = 1; + structPtr->unk0 = sub_81CFB10; + return 6; + } + return 0; +} + +static u32 sub_81CFB08(struct PokenavSub9 *structPtr) +{ + return POKENAV_MENU_5; +} + +static u32 sub_81CFB10(struct PokenavSub9 *structPtr) +{ + return POKENAV_MENU_D; +} + +static u32 sub_81CFB18(void) +{ + struct PokenavSub9 *structPtr = GetSubstructPtr(9); + return structPtr->unk14; +} + +static struct PokenavMonList * sub_81CFB28(void) +{ + struct PokenavSub9 * ptr = GetSubstructPtr(9); + return ptr->unk1C->unk4; +} + +static s32 sub_81CFB38(void) +{ + struct PokenavSub9 * ptr = GetSubstructPtr(9); + return ptr->unk1C->unk0; +} + +static s32 sub_81CFB48(void) +{ + struct PokenavSub9 * ptr = GetSubstructPtr(9); + s32 idx = GetSelectedMatchCall(); + return ptr->unk1C->unk4[idx].data; +} + +static s32 sub_81CFB64(void) +{ + struct PokenavSub9 * ptr = GetSubstructPtr(9); + return ptr->unk1C->unk2; +} + +static u32 sub_81CFB74(s32 state) +{ + return gUnknown_086235D8[state](state); +} + +static u32 sub_81CFB8C(s32 state) +{ + s32 i; + struct PokenavMonList item; + struct PokenavSub9 * ptr = GetSubstructPtr(9); + + ptr->unk1C->unk0 = 0; + ptr->unk1C->unk2 = 0; + item.boxId = TOTAL_BOXES_COUNT; + for (i = 0; i < PARTY_SIZE; i++) + { + struct Pokemon * pokemon = &gPlayerParty[i]; + if (!GetMonData(pokemon, MON_DATA_SANITY_HAS_SPECIES)) + return LT_INC_AND_CONTINUE; + if (!GetMonData(pokemon, MON_DATA_SANITY_IS_EGG) && !GetMonData(pokemon, MON_DATA_SANITY_IS_BAD_EGG)) + { + u32 ribbonCount = GetMonData(pokemon, MON_DATA_RIBBON_COUNT); + if (ribbonCount != 0) + { + item.monId = i; + item.data = ribbonCount; + sub_81CFCEC(ptr, &item); + } + } + } + + return LT_INC_AND_CONTINUE; +} + +static u32 sub_81CFC2C(s32 state) +{ + struct PokenavSub9 * ptr = GetSubstructPtr(9); + ptr->unk10 = 0; + ptr->unkC = 0; + return LT_INC_AND_CONTINUE; +} + +static u32 sub_81CFC40(s32 state) +{ + struct PokenavSub9 * ptr = GetSubstructPtr(9); + s32 boxId = ptr->unkC; + s32 monId = ptr->unk10; + s32 boxCount = 0; + struct PokenavMonList item; + + while (boxId < TOTAL_BOXES_COUNT) + { + while (monId < IN_BOX_COUNT) + { + if (CheckBoxMonSanityAt(boxId, monId)) + { + u32 ribbonCount = GetBoxMonDataAt(boxId, monId, MON_DATA_RIBBON_COUNT); + if (ribbonCount != 0) + { + item.boxId = boxId; + item.monId = monId; + item.data = ribbonCount; + sub_81CFCEC(ptr, &item); + } + } + boxCount++; + monId++; + if (boxCount > TOTAL_BOXES_COUNT) + { + ptr->unkC = boxId; + ptr->unk10 = monId; + return LT_CONTINUE; + } + } + monId = 0; + boxId++; + } + + ptr->unk14 = 1; + return LT_FINISH; +} + +static void sub_81CFCEC(struct PokenavSub9 *structPtr, struct PokenavMonList *item) +{ + u32 left = 0; + u32 right = structPtr->unk1C->unk0; + u32 insertionIdx = left + (right - left) / 2; + + while (right != insertionIdx) + { + if (item->data > structPtr->unk1C->unk4[insertionIdx].data) + right = insertionIdx; + else + left = insertionIdx + 1; + insertionIdx = left + (right - left) / 2; + } + for (right = structPtr->unk1C->unk0; right > insertionIdx; right--) + structPtr->unk1C->unk4[right] = structPtr->unk1C->unk4[right - 1]; + structPtr->unk1C->unk4[insertionIdx] = *item; + structPtr->unk1C->unk0++; +} + +static bool32 sub_81CFD58(void) +{ + s32 i, j; + + for (i = 0; i < PARTY_SIZE; i++) + { + struct Pokemon * mon = &gPlayerParty[i]; + if (!GetMonData(mon, MON_DATA_SANITY_HAS_SPECIES)) + continue; + if (GetMonData(mon, MON_DATA_SANITY_IS_EGG)) + continue; + if (GetMonData(mon, MON_DATA_RIBBONS)) + return TRUE; + } + + for (i = 0; i < TOTAL_BOXES_COUNT; i++) + { + for (j = 0; j < IN_BOX_COUNT; j++) + { + if (!CheckBoxMonSanityAt(i, j)) + continue; + if (GetBoxMonDataAt(i, j, MON_DATA_RIBBONS)) + return TRUE; + } + } + + return FALSE; +} + +bool32 sub_81CFDD0(void) +{ + struct PokenavSub10 * ptr = AllocSubstruct(10, sizeof(struct PokenavSub10)); + if (ptr == NULL) + return FALSE; + ptr->ltid = CreateLoopedTask(sub_81CFEB8, 1); + ptr->callback = sub_81CFE84; + ptr->unkC = FALSE; + return TRUE; +} + +bool32 sub_81CFE08(void) +{ + struct PokenavSub10 * ptr = AllocSubstruct(10, sizeof(struct PokenavSub10)); + if (ptr == NULL) + return FALSE; + ptr->ltid = CreateLoopedTask(sub_81CFEB8, 1); + ptr->callback = sub_81CFE84; + ptr->unkC = TRUE; + return TRUE; +} + +void sub_81CFE40(s32 idx) +{ + struct PokenavSub10 * ptr = GetSubstructPtr(10); + ptr->ltid = CreateLoopedTask(gUnknown_086237B8[idx], 1); + ptr->callback = sub_81CFE84; +} + +bool32 sub_81CFE70(void) +{ + struct PokenavSub10 * ptr = GetSubstructPtr(10); + return ptr->callback(); +} + +bool32 sub_81CFE84(void) +{ + struct PokenavSub10 * ptr = GetSubstructPtr(10); + return IsLoopedTaskActive(ptr->ltid); +} + +void sub_81CFE98(void) +{ + struct PokenavSub10 * ptr = GetSubstructPtr(10); + sub_81C8234(); + RemoveWindow(ptr->winid); + FreePokenavSubstruct(10); +} + +static u32 sub_81CFEB8(s32 state) +{ + struct PokenavSub10 * unk = GetSubstructPtr(10); + switch (state) + { + case 0: + InitBgTemplates(gUnknown_086237B0, NELEMS(gUnknown_086237B0)); + decompress_and_copy_tile_data_to_vram(1, gUnknown_08623604, 0, 0, 0); + SetBgTilemapBuffer(1, unk->buff); + CopyToBgTilemapBuffer(1, gUnknown_086236CC, 0, 0); + CopyPaletteIntoBufferUnfaded(gUnknown_086235E4, 0x10, 0x20); + CopyBgTilemapBufferToVram(1); + return LT_INC_AND_PAUSE; + case 1: + if (free_temp_tile_data_buffers_if_possible()) + return LT_PAUSE; + if (!sub_81CFB18()) + return LT_PAUSE; + ChangeBgX(1, 0, 0); + ChangeBgY(1, 0, 0); + ShowBg(1); + return LT_INC_AND_PAUSE; + case 2: + if (free_temp_tile_data_buffers_if_possible()) + return LT_PAUSE; + CopyPaletteIntoBufferUnfaded(gUnknown_08623790, 0x20, 0x20); + sub_81D0304(); + return LT_INC_AND_PAUSE; + case 3: + if (sub_81C8224()) + return LT_PAUSE; + sub_81D024C(unk); + return LT_INC_AND_PAUSE; + case 4: + if (free_temp_tile_data_buffers_if_possible()) + return LT_PAUSE; + ShowBg(2); + HideBg(3); + PrintHelpBarText(HELPBAR_RIBBONS_MON_LIST); + sub_81C7AC0(1); + if (!unk->unkC) + { + LoadLeftHeaderGfxForIndex(2); + sub_81C7FA0(2, 1, 0); + } + return LT_INC_AND_PAUSE; + case 5: + if (IsPaletteFadeActive()) + return LT_PAUSE; + if (sub_81C8010()) + return LT_PAUSE; + break; + } + return LT_FINISH; +} + +static u32 sub_81CFFFC(s32 state) +{ + struct PokenavSub10 * unk = GetSubstructPtr(10); + switch (state) + { + case 0: + switch (MatchCall_MoveCursorUp()) + { + case 0: + return LT_FINISH; + case 1: + PlaySE(SE_SELECT); + return LT_SET_STATE(2); + case 2: + PlaySE(SE_SELECT); + break; + } + return LT_INC_AND_PAUSE; + case 1: + if (sub_81C8630()) + return LT_PAUSE; + // fallthrough + case 2: + sub_81D0288(unk); + return LT_INC_AND_PAUSE; + case 3: + if (IsDma3ManagerBusyWithBgCopy()) + return LT_PAUSE; + break; + } + return LT_FINISH; +} + +static u32 sub_81D0074(s32 state) +{ + struct PokenavSub10 * unk = GetSubstructPtr(10); + switch (state) + { + case 0: + switch (MatchCall_MoveCursorDown()) + { + case 0: + return LT_FINISH; + case 1: + PlaySE(SE_SELECT); + return LT_SET_STATE(2); + case 2: + PlaySE(SE_SELECT); + break; + } + return LT_INC_AND_PAUSE; + case 1: + if (sub_81C8630()) + return LT_PAUSE; + // fallthrough + case 2: + sub_81D0288(unk); + return LT_INC_AND_PAUSE; + case 3: + if (IsDma3ManagerBusyWithBgCopy()) + return LT_PAUSE; + break; + } + return LT_FINISH; +} + +static u32 sub_81D00EC(s32 state) +{ + struct PokenavSub10 * unk = GetSubstructPtr(10); + switch (state) + { + case 0: + switch (MatchCall_PageUp()) + { + case 0: + return LT_FINISH; + case 1: + PlaySE(SE_SELECT); + return LT_SET_STATE(2); + case 2: + PlaySE(SE_SELECT); + break; + } + return LT_INC_AND_PAUSE; + case 1: + if (sub_81C8630()) + return LT_PAUSE; + // fallthrough + case 2: + sub_81D0288(unk); + return LT_INC_AND_PAUSE; + case 3: + if (IsDma3ManagerBusyWithBgCopy()) + return LT_PAUSE; + break; + } + return LT_FINISH; +} + +static u32 sub_81D0164(s32 state) +{ + struct PokenavSub10 * unk = GetSubstructPtr(10); + switch (state) + { + case 0: + switch (MatchCall_PageDown()) + { + case 0: + return LT_FINISH; + case 1: + PlaySE(SE_SELECT); + return LT_SET_STATE(2); + case 2: + PlaySE(SE_SELECT); + break; + } + return LT_INC_AND_PAUSE; + case 1: + if (sub_81C8630()) + return LT_PAUSE; + // fallthrough + case 2: + sub_81D0288(unk); + return LT_INC_AND_PAUSE; + case 3: + if (IsDma3ManagerBusyWithBgCopy()) + return LT_PAUSE; + break; + } + return LT_FINISH; +} + +static u32 sub_81D01DC(s32 state) +{ + switch (state) + { + case 0: + PlaySE(SE_SELECT); + sub_81C7AC0(0); + sub_81C78A0(); + return LT_INC_AND_PAUSE; + case 1: + if (IsPaletteFadeActive()) + return LT_PAUSE; + if (MainMenuLoopedTaskIsBusy()) + return LT_PAUSE; + sub_81C7FDC(); + break; + } + return LT_FINISH; +} + +static u32 sub_81D021C(s32 state) +{ + switch (state) + { + case 0: + PlaySE(SE_SELECT); + sub_81C7AC0(0); + return LT_INC_AND_PAUSE; + case 1: + if (IsPaletteFadeActive()) + return LT_PAUSE; + break; + } + return LT_FINISH; +} + +static void sub_81D024C(struct PokenavSub10 * ptr) +{ + s32 r2; + ptr->winid = AddWindow(&gUnknown_086237D4); + PutWindowTilemap(ptr->winid); + r2 = sub_81CFB38(); + sub_81D02B0(ptr->winid, 0, r2); + CopyWindowToVram(ptr->winid, 1); + sub_81D0288(ptr); +} + +static void sub_81D0288(struct PokenavSub10 * ptr) +{ + s32 r4 = GetSelectedMatchCall(); + s32 r2 = sub_81CFB38(); + sub_81D02B0(ptr->winid, r4 + 1, r2); + CopyWindowToVram(ptr->winid, 2); +} + +static void sub_81D02B0(s32 windowId, s32 val1, s32 val2) +{ + u8 strbuf[16]; + u32 x; + + u8 * ptr = strbuf; + ptr = ConvertIntToDecimalStringN(ptr, val1, STR_CONV_MODE_RIGHT_ALIGN, 3); + *ptr++ = CHAR_SLASH; + ConvertIntToDecimalStringN(ptr, val2, STR_CONV_MODE_RIGHT_ALIGN, 3); + x = GetStringCenterAlignXOffset(1, strbuf, 56); + AddTextPrinterParameterized(windowId, 1, strbuf, x, 1, 0xFF, NULL); +} + +static void sub_81D0304(void) +{ + struct PokenavListTemplate template; + template.list.monList = sub_81CFB28(); + template.unk4 = sub_81CFB38(); + template.unk8 = 4; + template.unk6 = sub_81CFB64(); + template.unk9 = 13; + template.unkA = 17; + template.unkB = 1; + template.unkC = 8; + template.unkD = 2; + template.unkE = 1; + template.listFunc.unk10_1 = BufferRibbonMonInfoText; + template.unk14 = NULL; + sub_81C81D4(&gUnknown_086237B0[1], &template, 0); +} + +// Buffers the "Nickname gender/level" text for the ribbon mon list +static void BufferRibbonMonInfoText(struct PokenavMonList * item0, u8 * dest) +{ + u8 gender; + u8 level; + u8 * s; + const u8 * genderStr; + struct PokenavMonList * item = item0; + + // Mon is in party + if (item->boxId == TOTAL_BOXES_COUNT) + { + struct Pokemon * mon = &gPlayerParty[item->monId]; + gender = GetMonGender(mon); + level = GetLevelFromMonExp(mon); + GetMonData(mon, MON_DATA_NICKNAME, gStringVar3); + } + // Mon is in PC + else + { + struct BoxPokemon * mon = GetBoxedMonPtr(item->boxId, item->monId); + gender = GetBoxMonGender(mon); + level = GetLevelFromBoxMonExp(mon); + GetBoxMonData(mon, MON_DATA_NICKNAME, gStringVar3); + } + + StringGetEnd10(gStringVar3); + dest = sub_81DB494(dest, 1, gStringVar3, 60); + switch (gender) + { + default: + genderStr = sText_NoGenderSymbol; + break; + case MON_MALE: + genderStr = sText_MaleSymbol; + break; + case MON_FEMALE: + genderStr = sText_FemaleSymbol; + break; + } + + s = StringCopy(gStringVar1, genderStr); + *s++ = CHAR_SLASH; + *s++ = CHAR_SPECIAL_F9; + *s++ = CHAR_LV_2; + ConvertIntToDecimalStringN(s, level, STR_CONV_MODE_LEFT_ALIGN, 3); + dest = sub_81DB494(dest, 1, gStringVar1, 54); + ConvertIntToDecimalStringN(dest, item->data, STR_CONV_MODE_RIGHT_ALIGN, 2); +} diff --git a/src/pokenav_ribbons_2.c b/src/pokenav_ribbons_2.c new file mode 100644 index 000000000..2789b1244 --- /dev/null +++ b/src/pokenav_ribbons_2.c @@ -0,0 +1,1163 @@ +#include "global.h" +#include "decompress.h" +#include "dynamic_placeholder_text_util.h" +#include "graphics.h" +#include "international_string_util.h" +#include "pokenav.h" +#include "sound.h" +#include "sprite.h" +#include "string_util.h" +#include "strings.h" +#include "text.h" +#include "trainer_pokemon_sprites.h" +#include "window.h" +#include "constants/songs.h" + +struct PokenavSub13 +{ + u8 filler0[0x8]; + struct PokenavSub18 *field_8; + u16 field_C; + u16 field_E; + u16 field_10; + u16 field_12; + u32 field_14[25]; + u32 field_78[8]; + u32 (*field_98)(struct PokenavSub13 *structPtr); +}; + +struct PokenavSub14 +{ + u32 (*field_0)(void); + u32 loopedTaskId; + u16 field_8; + u16 field_A; + u16 field_C; + u16 field_E; + u16 field_10; + struct Sprite *field_14; + u32 filler; + u8 tilemapBuffers[2][BG_SCREEN_SIZE]; +}; + +static u32 gUnknown_030012C0; +static u32 gUnknown_030012C4; + +void sub_81D0E84(struct PokenavSub14 *structPtr); +void sub_81D0FF0(struct PokenavSub14 *structPtr); +void sub_81D10D0(struct PokenavSub14 *structPtr); +void sub_81D1500(struct PokenavSub14 *structPtr); +void sub_81D0EFC(struct PokenavSub14 *structPtr); +void sub_81D1148(struct PokenavSub14 *structPtr); +void sub_81D10A4(struct PokenavSub14 *structPtr); +void sub_81D1178(struct PokenavSub14 *structPtr); +void sub_81D11D8(struct PokenavSub14 *structPtr); +void sub_81D11FC(struct PokenavSub14 *structPtr); +void sub_81D0E60(struct PokenavSub14 *structPtr); +void sub_81D1448(struct PokenavSub14 *structPtr); +void sub_81D13FC(struct PokenavSub14 *structPtr); +void sub_81D0FCC(struct PokenavSub14 *structPtr); +void sub_81D12D8(struct PokenavSub14 *structPtr); +bool32 sub_81D1524(struct PokenavSub14 *structPtr); +bool32 sub_81D1234(struct PokenavSub14 *structPtr); +void sub_81D0814(struct PokenavSub13 *structPtr); +u32 sub_81D0548(struct PokenavSub13 *structPtr); +u32 sub_81D04C4(struct PokenavSub13 *structPtr); +u32 sub_81D05D4(struct PokenavSub13 *structPtr); +bool32 sub_81D05DC(struct PokenavSub13 *structPtr); +bool32 sub_81D0688(struct PokenavSub13 *structPtr); +bool32 sub_81D0664(struct PokenavSub13 *structPtr); +bool32 sub_81D061C(struct PokenavSub13 *structPtr); +bool32 sub_81D0688(struct PokenavSub13 *structPtr); +bool32 sub_81D0A58(void); +u32 sub_81D06C4(void); +u32 sub_81D06D4(void); +u16 sub_81D1184(s32 unused0, s32 unused1); +void sub_81D1258(struct Sprite *sprite, s32 arg1, s32 arg2, s32 arg3); +void sub_81D1284(struct Sprite *sprite); +void sub_81D1350(void); +void sub_81D13BC(u16 *dst, u32 id); +void sub_81D1370(u32 arg0, u32 id); +void sub_81D1538(struct Sprite *sprite); +u32 sub_81D0A6C(s32 state); +u32 sub_81D0C84(s32 state); +u32 sub_81D0D2C(s32 state); +u32 sub_81D0D8C(s32 state); +u32 sub_81D0E00(s32 state); +u32 sub_81D0C54(s32 state); + +struct +{ + u8 unk0; + u8 unk1; + u8 unk2; + u8 unk3; +} static const gUnknown_086237F8[] = +{ + {1, 1, 0, 0}, + {3, 4, 1, 0}, + {3, 4, 5, 0}, + {3, 4, 9, 0}, + {3, 4, 13, 0}, + {3, 4, 17, 0}, + {1, 1, 21, 0}, + {1, 1, 22, 0}, + {1, 1, 23, 0}, + {1, 1, 24, 0}, + {1, 1, 25, 1}, + {1, 1, 26, 1}, + {1, 1, 27, 1}, + {1, 1, 28, 1}, + {1, 1, 29, 1}, + {1, 1, 30, 1}, + {1, 1, 31, 1} +}; + +#include "data/text/ribbon_descriptions.h" +#include "data/text/gift_ribbon_descriptions.h" + +static const u16 gUnknown_08623FF8[] = INCBIN_U16("graphics/pokenav/ribbons_icon1.gbapal"); +static const u16 gUnknown_08624018[] = INCBIN_U16("graphics/pokenav/ribbons_icon2.gbapal"); +static const u16 gUnknown_08624038[] = INCBIN_U16("graphics/pokenav/ribbons_icon3.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_08624098[] = INCBIN_U16("graphics/pokenav/8624098.gbapal"); +static const u32 sRibbonIconsSmall_Gfx[] = INCBIN_U32("graphics/pokenav/ribbons_icon.4bpp.lz"); +static const u32 sRibbonIconsBig_Gfx[] = INCBIN_U32("graphics/pokenav/ribbons_icon_big.4bpp.lz"); + +static const struct BgTemplate gUnknown_08624B98[] = +{ + { + .bg = 1, + .charBaseIndex = 3, + .mapBaseIndex = 0x07, + .screenSize = 0, + .paletteMode = 0, + .priority = 1, + .baseTile = 0 + }, + { + .bg = 2, + .charBaseIndex = 1, + .mapBaseIndex = 0x06, + .screenSize = 0, + .paletteMode = 0, + .priority = 2, + .baseTile = 0 + } +}; + +static const LoopedTask gUnknown_08624BA0[] = +{ + NULL, + sub_81D0C84, + sub_81D0D2C, + sub_81D0D8C, + sub_81D0E00, + sub_81D0C54 +}; + +// code +bool32 PokenavCallback_Init_13(void) +{ + struct PokenavSub13 *structPtr = AllocSubstruct(13, sizeof(struct PokenavSub13)); + if (structPtr == NULL) + return FALSE; + + structPtr->field_8 = GetSubstructPtr(18); + if (structPtr->field_8 == NULL) + return FALSE; + + sub_81D0814(structPtr); + structPtr->field_98 = sub_81D04C4; + gKeyRepeatContinueDelay = 3; + gKeyRepeatStartDelay = 10; + return TRUE; +} + +u32 sub_81D04A0(void) +{ + struct PokenavSub13 *structPtr = GetSubstructPtr(13); + return structPtr->field_98(structPtr); +} + +void sub_81D04B8(void) +{ + FreePokenavSubstruct(13); +} + +u32 sub_81D04C4(struct PokenavSub13 *structPtr) +{ + if (gMain.newAndRepeatedKeys & DPAD_UP && structPtr->field_8->unk2 != 0) + { + structPtr->field_8->unk2--; + structPtr->field_C = 0; + sub_81D0814(structPtr); + return 1; + } + else if (gMain.newAndRepeatedKeys & DPAD_DOWN && structPtr->field_8->unk2 < structPtr->field_8->unk0 - 1) + { + structPtr->field_8->unk2++; + structPtr->field_C = 0; + sub_81D0814(structPtr); + return 1; + } + else if (gMain.newKeys & A_BUTTON) + { + structPtr->field_98 = sub_81D0548; + return 2; + } + else if (gMain.newKeys & B_BUTTON) + { + structPtr->field_98 = sub_81D05D4; + return 5; + } + return 0; +} + +u32 sub_81D0548(struct PokenavSub13 *structPtr) +{ + if (gMain.newAndRepeatedKeys & DPAD_UP && sub_81D05DC(structPtr)) + return 3; + else if (gMain.newAndRepeatedKeys & DPAD_DOWN && sub_81D061C(structPtr)) + return 3; + else if (gMain.newAndRepeatedKeys & DPAD_LEFT && sub_81D0664(structPtr)) + return 3; + else if (gMain.newAndRepeatedKeys & DPAD_RIGHT && sub_81D0688(structPtr)) + return 3; + else if (gMain.newKeys & B_BUTTON) + { + structPtr->field_98 = sub_81D04C4; + return 4; + } + return 0; +} + +u32 sub_81D05D4(struct PokenavSub13 *structPtr) +{ + return POKENAV_MENU_E; +} + +bool32 sub_81D05DC(struct PokenavSub13 *structPtr) +{ + if (structPtr->field_C < 25) + { + if (structPtr->field_C <= 8) + return FALSE; + + structPtr->field_C -= 9; + return TRUE; + } + if (structPtr->field_10 != 0) + { + u32 var = structPtr->field_C - 27; + structPtr->field_C = var + structPtr->field_E; + if (structPtr->field_C >= structPtr->field_10) + structPtr->field_C = structPtr->field_10 - 1; + return TRUE; + } + return FALSE; +} + +bool32 sub_81D061C(struct PokenavSub13 *structPtr) +{ + if (structPtr->field_C >= 25) + return FALSE; + if (structPtr->field_C < structPtr->field_E) + { + structPtr->field_C += 9; + if (structPtr->field_C >= structPtr->field_10) + structPtr->field_C = structPtr->field_10 - 1; + return TRUE; + } + if (structPtr->field_12 != 0) + { + int var = structPtr->field_C - structPtr->field_E; + if (var >= structPtr->field_12) + var = structPtr->field_12 - 1; + + structPtr->field_C = var + 27; + return TRUE; + } + return FALSE; +} + +bool32 sub_81D0664(struct PokenavSub13 *structPtr) +{ + u16 var = structPtr->field_C % 9; + if (var != 0) + { + structPtr->field_C--; + return TRUE; + } + + return FALSE; +} + +bool32 sub_81D0688(struct PokenavSub13 *structPtr) +{ + int r1 = structPtr->field_C % 9; + + if (r1 >= 8) + return FALSE; + + if (structPtr->field_C <= 26) + { + if (structPtr->field_C < structPtr->field_10 - 1) + { + structPtr->field_C++; + return TRUE; + } + } + else + { + if (r1 < structPtr->field_12 - 1) + { + structPtr->field_C++; + return TRUE; + } + } + return FALSE; +} + +u32 sub_81D06C4(void) +{ + struct PokenavSub13 *structPtr = GetSubstructPtr(13); + return structPtr->field_8->unk2; +} + +u32 sub_81D06D4(void) +{ + struct PokenavSub13 *structPtr = GetSubstructPtr(13); + return structPtr->field_8->unk0; +} + +static void GetCurrMonInfo1(u8 *nick, u8 *level, u8 *gender) +{ + struct PokenavSub13 *structPtr = GetSubstructPtr(13); + struct PokenavSub18 *mons = structPtr->field_8; + struct PokenavMonList *monInfo = &mons->unk4[mons->unk2]; + + if (monInfo->boxId == TOTAL_BOXES_COUNT) + { + struct Pokemon *mon = &gPlayerParty[monInfo->monId]; + GetMonData(mon, MON_DATA_NICKNAME, nick); + *level = GetLevelFromMonExp(mon); + *gender = GetMonGender(mon); + } + else + { + struct BoxPokemon *boxMon = GetBoxedMonPtr(monInfo->boxId, monInfo->monId); + *gender = GetBoxMonGender(boxMon); + *level = GetLevelFromBoxMonExp(boxMon); + GetBoxMonData(boxMon, MON_DATA_NICKNAME, nick); + } + StringGetEnd10(nick); +} + +static void GetCurrMonInfo2(u16 *species, u32 *personality, u32 *otId) +{ + struct PokenavSub13 *structPtr = GetSubstructPtr(13); + struct PokenavSub18 *mons = structPtr->field_8; + struct PokenavMonList *monInfo = &mons->unk4[mons->unk2]; + + if (monInfo->boxId == TOTAL_BOXES_COUNT) + { + struct Pokemon *mon = &gPlayerParty[monInfo->monId]; + *species = GetMonData(mon, MON_DATA_SPECIES); + *personality = GetMonData(mon, MON_DATA_PERSONALITY); + *otId = GetMonData(mon, MON_DATA_OT_ID); + } + else + { + struct BoxPokemon *boxMon = GetBoxedMonPtr(monInfo->boxId, monInfo->monId); + *species = GetBoxMonData(boxMon, MON_DATA_SPECIES); + *personality = GetBoxMonData(boxMon, MON_DATA_PERSONALITY); + *otId = GetBoxMonData(boxMon, MON_DATA_OT_ID); + } +} + +static u32 GetCurrMonRibbonCount(void) +{ + struct PokenavSub13 *structPtr = GetSubstructPtr(13); + struct PokenavSub18 *mons = structPtr->field_8; + struct PokenavMonList *monInfo = &mons->unk4[mons->unk2]; + + if (monInfo->boxId == TOTAL_BOXES_COUNT) + return GetMonData(&gPlayerParty[monInfo->monId], MON_DATA_RIBBON_COUNT); + else + return GetBoxMonDataAt(monInfo->boxId, monInfo->monId, MON_DATA_RIBBON_COUNT); +} + +void sub_81D0814(struct PokenavSub13 *structPtr) +{ + u32 ribbons; + s32 i, j; + struct PokenavSub18 *mons = structPtr->field_8; + struct PokenavMonList *monInfo = &mons->unk4[mons->unk2]; + + if (monInfo->boxId == TOTAL_BOXES_COUNT) + ribbons = GetMonData(&gPlayerParty[monInfo->monId], MON_DATA_RIBBONS); + else + ribbons = GetBoxMonDataAt(monInfo->boxId, monInfo->monId, MON_DATA_RIBBONS); + + structPtr->field_10 = 0; + structPtr->field_12 = 0; + for (i = 0; i < ARRAY_COUNT(gUnknown_086237F8); i++) + { + s32 r4 = ((1 << gUnknown_086237F8[i].unk0) - 1) & ribbons; + if (gUnknown_086237F8[i].unk3 == 0) + { + for (j = 0; j < r4; j++) + structPtr->field_14[structPtr->field_10++] = gUnknown_086237F8[i].unk2 + j; + } + else + { + for (j = 0; j < r4; j++) + structPtr->field_78[structPtr->field_12++] = gUnknown_086237F8[i].unk2 + j; + } + ribbons >>= gUnknown_086237F8[i].unk0; + } + + if (structPtr->field_10 != 0) + { + structPtr->field_E = ((structPtr->field_10 - 1) / 9) * 9; + structPtr->field_C = 0; + } + else + { + structPtr->field_E = 0; + structPtr->field_C = 27; + } +} + +u32 *sub_81D0914(u32 *arg0) +{ + struct PokenavSub13 *structPtr = GetSubstructPtr(13); + *arg0 = structPtr->field_10; + return structPtr->field_14; +} + +u32 *sub_81D092C(u32 *arg0) +{ + struct PokenavSub13 *structPtr = GetSubstructPtr(13); + *arg0 = structPtr->field_12; + return structPtr->field_78; +} + +u16 sub_81D0944(void) +{ + struct PokenavSub13 *structPtr = GetSubstructPtr(13); + return structPtr->field_C; +} + +u32 sub_81D0954(void) +{ + struct PokenavSub13 *structPtr = GetSubstructPtr(13); + int var = structPtr->field_C; + if (var <= 24) + return structPtr->field_14[var]; + else + return structPtr->field_78[var - 27]; +} + +bool32 sub_81D0978(void) +{ + struct PokenavSub14 *structPtr = AllocSubstruct(14, sizeof(struct PokenavSub14)); + if (structPtr == NULL) + return FALSE; + + structPtr->loopedTaskId = CreateLoopedTask(sub_81D0A6C, 1); + structPtr->field_0 = sub_81D0A58; + return TRUE; +} + +void sub_81D09B0(s32 id) +{ + struct PokenavSub14 *structPtr = GetSubstructPtr(14); + structPtr->loopedTaskId = CreateLoopedTask(gUnknown_08624BA0[id], 1); + structPtr->field_0 = sub_81D0A58; +} + +u32 sub_81D09E0(void) +{ + struct PokenavSub14 *structPtr = GetSubstructPtr(14); + return structPtr->field_0(); +} + +void sub_81D09F4(void) +{ + struct PokenavSub14 *structPtr = GetSubstructPtr(14); + RemoveWindow(structPtr->field_A); + RemoveWindow(structPtr->field_8); + RemoveWindow(structPtr->field_C); + RemoveWindow(structPtr->field_E); + sub_81D1178(structPtr); + FreeSpriteTilesByTag(9); + FreeSpritePaletteByTag(0xF); + FreeSpritePaletteByTag(0x10); + FreeSpritePaletteByTag(0x11); + FreeSpritePaletteByTag(0x12); + FreeSpritePaletteByTag(0x13); + FreeSpriteOamMatrix(structPtr->field_14); + DestroySprite(structPtr->field_14); + FreePokenavSubstruct(14); +} + +bool32 sub_81D0A58(void) +{ + struct PokenavSub14 *structPtr = GetSubstructPtr(14); + return IsLoopedTaskActive(structPtr->loopedTaskId); +} + +u32 sub_81D0A6C(s32 state) +{ + struct PokenavSub14 *structPtr = GetSubstructPtr(14); + switch (state) + { + case 0: + InitBgTemplates(gUnknown_08624B98, ARRAY_COUNT(gUnknown_08624B98)); + decompress_and_copy_tile_data_to_vram(2, gUnknown_08DDE030, 0, 0, 0); + SetBgTilemapBuffer(2, structPtr->tilemapBuffers[0]); + CopyToBgTilemapBuffer(2, gUnknown_08DDE12C, 0, 0); + CopyPaletteIntoBufferUnfaded(gUnknown_08DDE010, 0x10, 0x20); + CopyBgTilemapBufferToVram(2); + return LT_INC_AND_PAUSE; + case 1: + if (!free_temp_tile_data_buffers_if_possible()) + { + sub_8199DF0(1, 0, 0, 1); + decompress_and_copy_tile_data_to_vram(1, sRibbonIconsSmall_Gfx, 0, 1, 0); + SetBgTilemapBuffer(1, structPtr->tilemapBuffers[1]); + FillBgTilemapBufferRect_Palette0(1, 0, 0, 0, 32, 20); + CopyPaletteIntoBufferUnfaded(gUnknown_08623FF8, 0x20, 0xA0); + CopyPaletteIntoBufferUnfaded(gUnknown_08624098, 0xA0, 0x20); + CopyBgTilemapBufferToVram(1); + return LT_INC_AND_PAUSE; + } + return LT_PAUSE; + case 2: + if (!free_temp_tile_data_buffers_if_possible()) + { + sub_81D0E60(structPtr); + return LT_INC_AND_PAUSE; + } + return LT_PAUSE; + case 3: + if (!free_temp_tile_data_buffers_if_possible()) + { + sub_81D0FCC(structPtr); + return LT_INC_AND_PAUSE; + } + return LT_PAUSE; + case 4: + if (!free_temp_tile_data_buffers_if_possible()) + { + sub_81D10A4(structPtr); + return LT_INC_AND_PAUSE; + } + return LT_PAUSE; + case 5: + if (!IsDma3ManagerBusyWithBgCopy()) + { + CopyBgTilemapBufferToVram(2); + return LT_INC_AND_PAUSE; + } + return LT_PAUSE; + case 6: + if (!IsDma3ManagerBusyWithBgCopy()) + { + sub_81D1148(structPtr); + return LT_INC_AND_CONTINUE; + } + return LT_PAUSE; + case 7: + sub_81D12D8(structPtr); + PrintHelpBarText(HELPBAR_RIBBONS_LIST); + return LT_INC_AND_PAUSE; + case 8: + if (!IsDma3ManagerBusyWithBgCopy()) + { + sub_81D13FC(structPtr); + ChangeBgX(1, 0, 0); + ChangeBgY(1, 0, 0); + ChangeBgX(2, 0, 0); + ChangeBgY(2, 0, 0); + ShowBg(1); + ShowBg(2); + HideBg(3); + sub_81C7AC0(1); + return LT_INC_AND_PAUSE; + } + return LT_PAUSE; + case 9: + if (IsPaletteFadeActive()) + return LT_PAUSE; + return LT_FINISH; + } + return LT_FINISH; +} + +u32 sub_81D0C54(s32 state) +{ + switch (state) + { + case 0: + PlaySE(SE_SELECT); + sub_81C7AC0(0); + return LT_INC_AND_PAUSE; + case 1: + if (IsPaletteFadeActive()) + return LT_PAUSE; + return LT_FINISH; + } + return LT_FINISH; +} + +u32 sub_81D0C84(s32 state) +{ + struct PokenavSub14 *structPtr = GetSubstructPtr(14); + switch (state) + { + case 0: + PlaySE(SE_SELECT); + sub_81D11D8(structPtr); + return LT_INC_AND_PAUSE; + case 1: + if (!sub_81D1234(structPtr)) + { + sub_81D0FF0(structPtr); + return LT_INC_AND_CONTINUE; + } + return LT_PAUSE; + case 2: + sub_81D12D8(structPtr); + return LT_INC_AND_CONTINUE; + case 3: + sub_81D10D0(structPtr); + return LT_INC_AND_CONTINUE; + case 4: + sub_81D0E84(structPtr); + return LT_INC_AND_CONTINUE; + case 5: + if (!IsDma3ManagerBusyWithBgCopy()) + { + sub_81D11FC(structPtr); + return LT_INC_AND_PAUSE; + } + return LT_PAUSE; + case 6: + if (sub_81D1234(structPtr)) + return LT_PAUSE; + return LT_FINISH; + } + return LT_FINISH; +} + +u32 sub_81D0D2C(s32 state) +{ + struct PokenavSub14 *structPtr = GetSubstructPtr(14); + switch (state) + { + case 0: + PlaySE(SE_SELECT); + sub_81D1448(structPtr); + return LT_INC_AND_PAUSE; + case 1: + if (!sub_81D1524(structPtr)) + { + sub_81D0EFC(structPtr); + PrintHelpBarText(HELPBAR_RIBBONS_CHECK); + return LT_INC_AND_PAUSE; + } + return LT_PAUSE; + case 2: + if (IsDma3ManagerBusyWithBgCopy()) + return LT_PAUSE; + } + return LT_FINISH; +} + +u32 sub_81D0D8C(s32 state) +{ + struct PokenavSub14 *structPtr = GetSubstructPtr(14); + switch (state) + { + case 0: + PlaySE(SE_SELECT); + sub_81D1500(structPtr); + return LT_INC_AND_PAUSE; + case 1: + if (!sub_81D1524(structPtr)) + { + sub_81D1448(structPtr); + return LT_INC_AND_PAUSE; + } + return LT_PAUSE; + case 2: + if (!sub_81D1524(structPtr)) + { + sub_81D0EFC(structPtr); + return LT_INC_AND_PAUSE; + } + return LT_PAUSE; + case 3: + if (IsDma3ManagerBusyWithBgCopy()) + return LT_PAUSE; + } + return LT_FINISH; +} + +u32 sub_81D0E00(s32 state) +{ + struct PokenavSub14 *structPtr = GetSubstructPtr(14); + switch (state) + { + case 0: + PlaySE(SE_SELECT); + sub_81D1500(structPtr); + return LT_INC_AND_PAUSE; + case 1: + if (!sub_81D1524(structPtr)) + { + sub_81D0E84(structPtr); + PrintHelpBarText(HELPBAR_RIBBONS_LIST); + return LT_INC_AND_PAUSE; + } + return LT_PAUSE; + case 2: + if (IsDma3ManagerBusyWithBgCopy()) + return LT_PAUSE; + } + return LT_FINISH; +} + +static const struct WindowTemplate gUnknown_08624BB8 = +{ + .bg = 2, + .tilemapLeft = 12, + .tilemapTop = 13, + .width = 16, + .height = 4, + .paletteNum = 1, + .baseBlock = 0x14, +}; + +void sub_81D0E60(struct PokenavSub14 *structPtr) +{ + structPtr->field_A = AddWindow(&gUnknown_08624BB8); + PutWindowTilemap(structPtr->field_A); + sub_81D0E84(structPtr); +} + +void sub_81D0E84(struct PokenavSub14 *structPtr) +{ + u8 color[] = {TEXT_COLOR_RED, TEXT_COLOR_DARK_GREY, TEXT_COLOR_LIGHT_GREY}; + + ConvertIntToDecimalStringN(gStringVar1, GetCurrMonRibbonCount(), STR_CONV_MODE_LEFT_ALIGN, 2); + DynamicPlaceholderTextUtil_Reset(); + DynamicPlaceholderTextUtil_SetPlaceholderPtr(0, gStringVar1); + DynamicPlaceholderTextUtil_ExpandPlaceholders(gStringVar4, gText_RibbonsF700); + FillWindowPixelBuffer(structPtr->field_A, PIXEL_FILL(4)); + AddTextPrinterParameterized3(structPtr->field_A, 1, 0, 1, color, -1, gStringVar4); + CopyWindowToVram(structPtr->field_A, 2); +} + +void sub_81D0EFC(struct PokenavSub14 *structPtr) +{ + s32 i; + u32 ribbonId = sub_81D0954(); + u8 color[] = {TEXT_COLOR_RED, TEXT_COLOR_DARK_GREY, TEXT_COLOR_LIGHT_GREY}; + + FillWindowPixelBuffer(structPtr->field_A, PIXEL_FILL(4)); + if (ribbonId < 25) + { + for (i = 0; i < 2; i++) + AddTextPrinterParameterized3(structPtr->field_A, 1, 0, (i * 16) + 1, color, -1, gRibbonDescriptionPointers[ribbonId][i]); + } + else + { + ribbonId = gSaveBlock1Ptr->giftRibbons[ribbonId - 25]; + if (ribbonId == 0) + return; + + ribbonId--; + for (i = 0; i < 2; i++) + AddTextPrinterParameterized3(structPtr->field_A, 1, 0, (i * 16) + 1, color, -1, gGiftRibbonDescriptionPointers[ribbonId][i]); + } + + CopyWindowToVram(structPtr->field_A, 2); +} + +static const struct WindowTemplate gUnknown_08624BC4 = +{ + .bg = 2, + .tilemapLeft = 14, + .tilemapTop = 1, + .width = 13, + .height = 2, + .paletteNum = 10, + .baseBlock = 0x54, +}; + +void sub_81D0FCC(struct PokenavSub14 *structPtr) +{ + structPtr->field_8 = AddWindow(&gUnknown_08624BC4); + PutWindowTilemap(structPtr->field_8); + sub_81D0FF0(structPtr); +} + +static const u8 sMaleIconString[] = _("{COLOR_HIGHLIGHT_SHADOW}{LIGHT_RED}{WHITE}{GREEN}♂{COLOR_HIGHLIGHT_SHADOW}{DARK_GREY}{WHITE}{LIGHT_GREY}"); +static const u8 sFemaleIconString[] = _("{COLOR_HIGHLIGHT_SHADOW}{LIGHT_GREEN}{WHITE}{BLUE}♀{COLOR_HIGHLIGHT_SHADOW}{DARK_GREY}{WHITE}{LIGHT_GREY}"); +static const u8 sGenderlessIconString[] = _("{UNK_SPACER}"); + +void sub_81D0FF0(struct PokenavSub14 *structPtr) +{ + const u8 *genderTxt; + u8 *txtPtr; + u8 level, gender; + u16 windowId = structPtr->field_8; + + FillWindowPixelBuffer(windowId, PIXEL_FILL(1)); + GetCurrMonInfo1(gStringVar3, &level, &gender); + AddTextPrinterParameterized(windowId, 1, gStringVar3, 0, 1, TEXT_SPEED_FF, NULL); + switch (gender) + { + case MON_MALE: + genderTxt = sMaleIconString; + break; + case MON_FEMALE: + genderTxt = sFemaleIconString; + break; + default: + genderTxt = sGenderlessIconString; + break; + } + + txtPtr = StringCopy(gStringVar1, genderTxt); + *(txtPtr++) = CHAR_SLASH; + *(txtPtr++) = CHAR_SPECIAL_F9; + *(txtPtr++) = CHAR_LV_2; + ConvertIntToDecimalStringN(txtPtr, level, STR_CONV_MODE_LEFT_ALIGN, 3); + AddTextPrinterParameterized(windowId, 1, gStringVar1, 60, 1, TEXT_SPEED_FF, NULL); + CopyWindowToVram(windowId, 2); +} + +static const struct WindowTemplate gUnknown_08624BE8[] = +{ + { + .bg = 2, + .tilemapLeft = 1, + .tilemapTop = 5, + .width = 7, + .height = 2, + .paletteNum = 1, + .baseBlock = 0x6E, + }, + {}, +}; + +void sub_81D10A4(struct PokenavSub14 *structPtr) +{ + structPtr->field_C = AddWindow(gUnknown_08624BE8); + FillWindowPixelBuffer(structPtr->field_C, PIXEL_FILL(1)); + PutWindowTilemap(structPtr->field_C); + sub_81D10D0(structPtr); +} + +void sub_81D10D0(struct PokenavSub14 *structPtr) +{ + s32 x; + u8 *txtPtr; + u32 id = sub_81D06C4() + 1; + u32 count = sub_81D06D4(); + + txtPtr = ConvertIntToDecimalStringN(gStringVar1, id, STR_CONV_MODE_RIGHT_ALIGN, 3); + *(txtPtr++) = CHAR_SLASH; + ConvertIntToDecimalStringN(txtPtr, count, STR_CONV_MODE_RIGHT_ALIGN, 3); + x = GetStringCenterAlignXOffset(1, gStringVar1, 56); + AddTextPrinterParameterized(structPtr->field_C, 1, gStringVar1, x, 1, TEXT_SPEED_FF, NULL); + CopyWindowToVram(structPtr->field_C, 2); +} + +void sub_81D1148(struct PokenavSub14 *structPtr) +{ + u16 species; + u32 personality, otId; + + GetCurrMonInfo2(&species, &personality, &otId); + ResetAllPicSprites(); + structPtr->field_10 = sub_81D1184(40, 104); + sub_81C7990(15, 0); +} + +void sub_81D1178(struct PokenavSub14 *structPtr) +{ + FreeAndDestroyMonPicSprite(structPtr->field_10); +} + +u16 sub_81D1184(s32 unused0, s32 unused1) +{ + u16 species, spriteId; + u32 personality, otId; + + GetCurrMonInfo2(&species, &personality, &otId); + spriteId = CreateMonPicSprite_HandleDeoxys(species, otId, personality, TRUE, 40, 104, 15, 0xFFFF); + gSprites[spriteId].oam.priority = 0; + return spriteId; +} + +void sub_81D11D8(struct PokenavSub14 *structPtr) +{ + sub_81D1258(&gSprites[structPtr->field_10], 40, -32, 6); +} + +void sub_81D11FC(struct PokenavSub14 *structPtr) +{ + FreeAndDestroyMonPicSprite(structPtr->field_10); + structPtr->field_10 = sub_81D1184(-32, 104); + sub_81D1258(&gSprites[structPtr->field_10], -32, 40, 6); +} + +bool32 sub_81D1234(struct PokenavSub14 *structPtr) +{ + return (gSprites[structPtr->field_10].callback != SpriteCallbackDummy); +} + +void sub_81D1258(struct Sprite *sprite, s32 arg1, s32 arg2, s32 arg3) +{ + u32 var = arg2 - arg1; + + sprite->pos1.x = arg1; + sprite->data[0] = arg1 << 4; + sprite->data[1] = (var << 4) / arg3; + sprite->data[2] = arg3; + sprite->data[3] = arg2; + + sprite->callback = sub_81D1284; +} + +void sub_81D1284(struct Sprite *sprite) +{ + if (sprite->data[2] != 0) + { + sprite->data[2]--; + sprite->data[0] += sprite->data[1]; + sprite->pos1.x = sprite->data[0] >> 4; + if (sprite->pos1.x <= -32) + sprite->invisible = TRUE; + else + sprite->invisible = FALSE; + } + else + { + sprite->pos1.x = sprite->data[3]; + sprite->callback = SpriteCallbackDummy; + } +} + +void sub_81D12D8(struct PokenavSub14 *structPtr) +{ + u32 *ptr; + + sub_81D1350(); + + ptr = sub_81D0914(&gUnknown_030012C0); + for (gUnknown_030012C4 = 0; gUnknown_030012C4 < gUnknown_030012C0; gUnknown_030012C4++) + sub_81D1370(gUnknown_030012C4, *(ptr++)); + + ptr = sub_81D092C(&gUnknown_030012C0); + for (gUnknown_030012C4 = 0; gUnknown_030012C4 < gUnknown_030012C0; gUnknown_030012C4++) + sub_81D1370(gUnknown_030012C4 + 27, *(ptr++)); + + CopyBgTilemapBufferToVram(1); +} + +void sub_81D1350(void) +{ + FillBgTilemapBufferRect_Palette0(1, 0, 0, 0, 32, 20); +} + +void sub_81D1370(u32 arg0, u32 id) +{ + u16 bgData[4]; + u32 destX = (arg0 % 9) * 2 + 11; + u32 destY = (arg0 / 9) * 2 + 4; + + sub_81D13BC(bgData, id); + CopyToBgTilemapBufferRect(1, bgData, destX, destY, 2, 2); +} + +struct +{ + u16 var0; + u16 var2; +} static const gUnknown_08624BF8[] = +{ + {0, 0}, + {1, 0}, + {2, 0}, + {3, 0}, + {4, 0}, + {1, 1}, + {2, 1}, + {3, 1}, + {4, 1}, + {1, 2}, + {2, 2}, + {3, 2}, + {4, 2}, + {1, 3}, + {2, 3}, + {3, 3}, + {4, 3}, + {1, 4}, + {2, 4}, + {3, 4}, + {4, 4}, + {5, 0}, + {6, 0}, + {7, 1}, + {8, 2}, + {9, 1}, + {9, 3}, + {9, 4}, + {10, 3}, + {10, 4}, + {11, 0}, + {11, 1}, +}; + +void sub_81D13BC(u16 *dst, u32 id) +{ + u16 r3 = gUnknown_08624BF8[id].var2 + 2; + u16 r1 = (gUnknown_08624BF8[id].var0 * 2) + 1; + + dst[0] = r1 | (r3 << 12); + dst[1] = r1 | (r3 << 12) |0x400; + dst[2] = (r1 + 1) | (r3 << 12); + dst[3] = (r1 + 1) | (r3 << 12) | 0x400; +} + +static const struct CompressedSpriteSheet gUnknown_08624C78 = +{ + sRibbonIconsBig_Gfx, 0x1800, 9 +}; + +static const struct SpritePalette gUnknown_08624C80[] = +{ + {gUnknown_08623FF8, 15}, + {gUnknown_08624018, 16}, + {gUnknown_08624038, 17}, + {gUnknown_08624058, 18}, + {gUnknown_08624078, 19}, + {}, +}; + +static const struct OamData sOamData_8624CB0 = +{ + .y = 0, + .affineMode = ST_OAM_AFFINE_NORMAL, + .objMode = ST_OAM_OBJ_NORMAL, + .mosaic = 0, + .bpp = ST_OAM_4BPP, + .shape = SPRITE_SHAPE(32x32), + .x = 0, + .matrixNum = 0, + .size = SPRITE_SIZE(32x32), + .tileNum = 0, + .priority = 1, + .paletteNum = 0, + .affineParam = 0 +}; + +static const union AffineAnimCmd sSpriteAffineAnim_8624CB8[] = +{ + AFFINEANIMCMD_FRAME(128, 128, 0, 0), + AFFINEANIMCMD_END +}; + +static const union AffineAnimCmd sSpriteAffineAnim_8624CC8[] = +{ + AFFINEANIMCMD_FRAME(128, 128, 0, 0), + AFFINEANIMCMD_FRAME(32, 32, 0, 4), + AFFINEANIMCMD_END +}; + +static const union AffineAnimCmd sSpriteAffineAnim_8624CE0[] = +{ + AFFINEANIMCMD_FRAME(256, 256, 0, 0), + AFFINEANIMCMD_FRAME(-32, -32, 0, 4), + AFFINEANIMCMD_END +}; + +static const union AffineAnimCmd *const sSpriteAffineAnimTable_8624CF8[] = +{ + sSpriteAffineAnim_8624CB8, + sSpriteAffineAnim_8624CC8, + sSpriteAffineAnim_8624CE0 +}; + +static const struct SpriteTemplate gUnknown_08624D04 = +{ + .tileTag = 9, + .paletteTag = 15, + .oam = &sOamData_8624CB0, + .anims = gDummySpriteAnimTable, + .images = NULL, + .affineAnims = sSpriteAffineAnimTable_8624CF8, + .callback = SpriteCallbackDummy, +}; + +void sub_81D13FC(struct PokenavSub14 *structPtr) +{ + u8 spriteId; + + LoadCompressedSpriteSheet(&gUnknown_08624C78); + Pokenav_AllocAndLoadPalettes(gUnknown_08624C80); + + spriteId = CreateSprite(&gUnknown_08624D04, 0, 0, 0); + structPtr->field_14 = &gSprites[spriteId]; + structPtr->field_14->invisible = TRUE; +} + +void sub_81D1448(struct PokenavSub14 *structPtr) +{ + u32 ribbonId; + s32 r4 = sub_81D0944(); + s32 r5 = (r4 % 9) * 16 + 96; + s32 r0 = (r4 / 9) * 16 + 40; + + structPtr->field_14->pos1.x = r5; + structPtr->field_14->pos1.y = r0; + + ribbonId = sub_81D0954(); + structPtr->field_14->oam.tileNum = (gUnknown_08624BF8[ribbonId].var0 * 16) + GetSpriteTileStartByTag(9); + structPtr->field_14->oam.paletteNum = IndexOfSpritePaletteTag(gUnknown_08624BF8[ribbonId].var2 + 15); + + StartSpriteAffineAnim(structPtr->field_14, 1); + structPtr->field_14->invisible = FALSE; + structPtr->field_14->data[0] = 0; + structPtr->field_14->callback = sub_81D1538; +} + +void sub_81D1500(struct PokenavSub14 *structPtr) +{ + structPtr->field_14->data[0] = 1; + StartSpriteAffineAnim(structPtr->field_14, 2); + structPtr->field_14->callback = sub_81D1538; +} + +bool32 sub_81D1524(struct PokenavSub14 *structPtr) +{ + return (structPtr->field_14->callback != SpriteCallbackDummy); +} + +void sub_81D1538(struct Sprite *sprite) +{ + if (sprite->affineAnimEnded) + { + sprite->invisible = sprite->data[0]; + sprite->callback = SpriteCallbackDummy; + } +} diff --git a/src/pokenav_unk_1.c b/src/pokenav_unk_1.c deleted file mode 100644 index 44176176d..000000000 --- a/src/pokenav_unk_1.c +++ /dev/null @@ -1,513 +0,0 @@ -#include "global.h" -#include "pokenav.h" -#include "event_data.h" -#include "main.h" -#include "sound.h" -#include "constants/songs.h" - -struct Pokenav1Struct -{ - u16 menuType; - s16 cursorPos; - u16 currMenuItem; - u16 helpBarIndex; - u32 unk8; - u32 (*callback)(struct Pokenav1Struct*); -}; - -static bool32 UpdateMenuCursorPos(struct Pokenav1Struct *state); -static void ReturnToConditionMenu(struct Pokenav1Struct *state); -static void ReturnToMainMenu(struct Pokenav1Struct *state); -static u32 sub_81C97BC(struct Pokenav1Struct *state); -static void sub_81C97B0(struct Pokenav1Struct *state, u32 a1); -static u32 CB2_ReturnToConditionMenu(struct Pokenav1Struct *state); -static u32 CB2_ReturnToMainMenu(struct Pokenav1Struct *state); -static u32 HandleConditionSearchMenuInput(struct Pokenav1Struct *state); -static u32 HandleConditionMenuInput(struct Pokenav1Struct *state); -static u32 HandleCantOpenRibbonsInput(struct Pokenav1Struct *state); -static u32 HandleMainMenuInputEndTutorial(struct Pokenav1Struct *state); -static u32 HandleMainMenuInputTutorial(struct Pokenav1Struct *state); -static u32 HandleMainMenuInput(struct Pokenav1Struct *state); -static u32 (*GetMainMenuInputHandler(void))(struct Pokenav1Struct*); -static void SetMenuInputHandler(struct Pokenav1Struct *state); - -// Number of entries - 1 for that menu type -static const u8 sLastCursorPositions[] = -{ - [POKENAV_MENU_TYPE_DEFAULT] = 2, - [POKENAV_MENU_TYPE_UNLOCK_MC] = 3, - [POKENAV_MENU_TYPE_UNLOCK_MC_RIBBONS] = 4, - [POKENAV_MENU_TYPE_CONDITION] = 2, - [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) -{ - u8 menuType = POKENAV_MENU_TYPE_DEFAULT; - - if (FlagGet(FLAG_ADDED_MATCH_CALL_TO_POKENAV)) - { - menuType = POKENAV_MENU_TYPE_UNLOCK_MC; - - if (FlagGet(FLAG_SYS_RIBBON_GET)) - menuType = POKENAV_MENU_TYPE_UNLOCK_MC_RIBBONS; - } - - return menuType; -} - -bool32 PokenavCallback_Init_0(void) -{ - struct Pokenav1Struct *state = AllocSubstruct(1, sizeof(struct Pokenav1Struct)); - if (!state) - return FALSE; - - state->menuType = GetPokenavMainMenuType(); - state->cursorPos = 0; - state->currMenuItem = POKENAV_MENUITEM_MAP; - state->helpBarIndex = HELPBAR_NONE; - SetMenuInputHandler(state); - return TRUE; -} - -bool32 PokenavCallback_Init_4(void) -{ - struct Pokenav1Struct *state = AllocSubstruct(1, sizeof(struct Pokenav1Struct)); - if (!state) - return FALSE; - - state->menuType = GetPokenavMainMenuType(); - state->cursorPos = 2; - state->currMenuItem = POKENAV_MENUITEM_MATCH_CALL; - state->helpBarIndex = HELPBAR_NONE; - SetMenuInputHandler(state); - return TRUE; -} - -bool32 PokenavCallback_Init_5(void) -{ - struct Pokenav1Struct *state = AllocSubstruct(1, sizeof(struct Pokenav1Struct)); - if (!state) - return FALSE; - - state->menuType = GetPokenavMainMenuType(); - state->cursorPos = 3; - state->currMenuItem = POKENAV_MENUITEM_RIBBONS; - SetMenuInputHandler(state); - return TRUE; -} - -bool32 PokenavCallback_Init_2(void) -{ - struct Pokenav1Struct *state = AllocSubstruct(1, sizeof(struct Pokenav1Struct)); - if (!state) - return FALSE; - - state->menuType = POKENAV_MENU_TYPE_CONDITION; - state->cursorPos = 0; - state->currMenuItem = POKENAV_MENUITEM_CONDITION_PARTY; - state->helpBarIndex = HELPBAR_NONE; - SetMenuInputHandler(state); - return TRUE; -} - -bool32 PokenavCallback_Init_3(void) -{ - struct Pokenav1Struct *state = AllocSubstruct(1, sizeof(struct Pokenav1Struct)); - if (!state) - return FALSE; - - state->menuType = POKENAV_MENU_TYPE_CONDITION_SEARCH; - state->cursorPos = GetSelectedConditionSearch(); - state->currMenuItem = state->cursorPos + POKENAV_MENUITEM_CONDITION_SEARCH_COOL; - state->helpBarIndex = HELPBAR_NONE; - SetMenuInputHandler(state); - return TRUE; -} - -static void SetMenuInputHandler(struct Pokenav1Struct *state) -{ - switch (state->menuType) - { - case POKENAV_MENU_TYPE_DEFAULT: - SetPokenavMode(POKENAV_MODE_NORMAL); - // fallthrough - case POKENAV_MENU_TYPE_UNLOCK_MC: - case POKENAV_MENU_TYPE_UNLOCK_MC_RIBBONS: - state->callback = GetMainMenuInputHandler(); - break; - case POKENAV_MENU_TYPE_CONDITION: - state->callback = HandleConditionMenuInput; - break; - case POKENAV_MENU_TYPE_CONDITION_SEARCH: - state->callback = HandleConditionSearchMenuInput; - break; - } -} - -static u32 (*GetMainMenuInputHandler(void))(struct Pokenav1Struct*) -{ - switch (GetPokenavMode()) - { - default: - case POKENAV_MODE_NORMAL: - return HandleMainMenuInput; - case POKENAV_MODE_FORCE_CALL_READY: - return HandleMainMenuInputTutorial; - case POKENAV_MODE_FORCE_CALL_EXIT: - return HandleMainMenuInputEndTutorial; - } -} - -u32 sub_81C941C(void) -{ - struct Pokenav1Struct *state = GetSubstructPtr(1); - return state->callback(state); -} - -void sub_81C9430(void) -{ - FreePokenavSubstruct(1); -} - -static u32 HandleMainMenuInput(struct Pokenav1Struct *state) -{ - if (UpdateMenuCursorPos(state)) - return POKENAV_MENU_FUNC_MOVE_CURSOR; - - if (gMain.newKeys & A_BUTTON) - { - switch (sMenuItems[state->menuType][state->cursorPos]) - { - case POKENAV_MENUITEM_MAP: - state->helpBarIndex = gSaveBlock2Ptr->regionMapZoom ? HELPBAR_MAP_ZOOMED_IN : HELPBAR_MAP_ZOOMED_OUT; - sub_81C97B0(state, POKENAV_MENU_6); - return POKENAV_MENU_FUNC_OPEN_FEATURE; - case POKENAV_MENUITEM_CONDITION: - state->menuType = POKENAV_MENU_TYPE_CONDITION; - state->cursorPos = 0; - state->currMenuItem = sMenuItems[POKENAV_MENU_TYPE_CONDITION][0]; - state->callback = HandleConditionMenuInput; - return POKENAV_MENU_FUNC_OPEN_CONDITION; - case POKENAV_MENUITEM_MATCH_CALL: - state->helpBarIndex = HELPBAR_MC_TRAINER_LIST; - sub_81C97B0(state, POKENAV_MENU_B); - return POKENAV_MENU_FUNC_OPEN_FEATURE; - case POKENAV_MENUITEM_RIBBONS: - if (CanViewRibbonsMenu()) - { - state->helpBarIndex = HELPBAR_RIBBONS_MON_LIST; - sub_81C97B0(state, POKENAV_MENU_C); - return POKENAV_MENU_FUNC_OPEN_FEATURE; - } - else - { - state->callback = HandleCantOpenRibbonsInput; - return POKENAV_MENU_FUNC_NO_RIBBON_WINNERS; - } - case POKENAV_MENUITEM_SWITCH_OFF: - return -1; - } - } - - if (gMain.newKeys & B_BUTTON) - return -1; - - return POKENAV_MENU_FUNC_NONE; -} - -// Force the player to select Match Call during the call Mr. Stone pokenav tutorial -static u32 HandleMainMenuInputTutorial(struct Pokenav1Struct *state) -{ - if (UpdateMenuCursorPos(state)) - return POKENAV_MENU_FUNC_MOVE_CURSOR; - - if (gMain.newKeys & A_BUTTON) - { - if (sMenuItems[state->menuType][state->cursorPos] == POKENAV_MENUITEM_MATCH_CALL) - { - state->helpBarIndex = HELPBAR_MC_TRAINER_LIST; - sub_81C97B0(state, POKENAV_MENU_B); - return POKENAV_MENU_FUNC_OPEN_FEATURE; - } - else - { - PlaySE(SE_HAZURE); - return POKENAV_MENU_FUNC_NONE; - } - } - - if (gMain.newKeys & B_BUTTON) - { - PlaySE(SE_HAZURE); - return POKENAV_MENU_FUNC_NONE; - } - - return POKENAV_MENU_FUNC_NONE; -} - -// After calling Mr. Stone during the pokenav tutorial, force player to exit or use Match Call again -static u32 HandleMainMenuInputEndTutorial(struct Pokenav1Struct *state) -{ - if (UpdateMenuCursorPos(state)) - return POKENAV_MENU_FUNC_MOVE_CURSOR; - - if (gMain.newKeys & A_BUTTON) - { - u32 menuItem = sMenuItems[state->menuType][state->cursorPos]; - if (menuItem != POKENAV_MENUITEM_MATCH_CALL && menuItem != POKENAV_MENUITEM_SWITCH_OFF) - { - PlaySE(SE_HAZURE); - return POKENAV_MENU_FUNC_NONE; - } - else if (menuItem == POKENAV_MENUITEM_MATCH_CALL) - { - state->helpBarIndex = HELPBAR_MC_TRAINER_LIST; - sub_81C97B0(state, POKENAV_MENU_B); - return POKENAV_MENU_FUNC_OPEN_FEATURE; - } - else - { - return -1; - } - } - else if (gMain.newKeys & B_BUTTON) - { - return -1; - } - return POKENAV_MENU_FUNC_NONE; -} - -// 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 (UpdateMenuCursorPos(state)) - { - state->callback = GetMainMenuInputHandler(); - return POKENAV_MENU_FUNC_MOVE_CURSOR; - } - - if (gMain.newKeys & (A_BUTTON | B_BUTTON)) - { - state->callback = GetMainMenuInputHandler(); - return POKENAV_MENU_FUNC_RESHOW_DESCRIPTION; - } - - return POKENAV_MENU_FUNC_NONE; -} - -static u32 HandleConditionMenuInput(struct Pokenav1Struct *state) -{ - if (UpdateMenuCursorPos(state)) - return POKENAV_MENU_FUNC_MOVE_CURSOR; - - if (gMain.newKeys & A_BUTTON) - { - switch (sMenuItems[state->menuType][state->cursorPos]) - { - case POKENAV_MENUITEM_CONDITION_SEARCH: - state->menuType = POKENAV_MENU_TYPE_CONDITION_SEARCH; - state->cursorPos = 0; - state->currMenuItem = sMenuItems[POKENAV_MENU_TYPE_CONDITION_SEARCH][0]; - state->callback = HandleConditionSearchMenuInput; - return POKENAV_MENU_FUNC_OPEN_CONDITION_SEARCH; - case POKENAV_MENUITEM_CONDITION_PARTY: - state->helpBarIndex = 0; - sub_81C97B0(state, POKENAV_MENU_7); - return POKENAV_MENU_FUNC_OPEN_FEATURE; - case POKENAV_MENUITEM_CONDITION_CANCEL: - PlaySE(SE_SELECT); - ReturnToMainMenu(state); - return POKENAV_MENU_FUNC_RETURN_TO_MAIN; - } - } - if (gMain.newKeys & B_BUTTON) - { - if (state->cursorPos != sLastCursorPositions[state->menuType]) - { - state->cursorPos = sLastCursorPositions[state->menuType]; - state->callback = CB2_ReturnToMainMenu; - return POKENAV_MENU_FUNC_MOVE_CURSOR; - } - else - { - PlaySE(SE_SELECT); - ReturnToMainMenu(state); - return POKENAV_MENU_FUNC_RETURN_TO_MAIN; - } - } - - return POKENAV_MENU_FUNC_NONE; -} - -static u32 HandleConditionSearchMenuInput(struct Pokenav1Struct *state) -{ - if (UpdateMenuCursorPos(state)) - return POKENAV_MENU_FUNC_MOVE_CURSOR; - - if (gMain.newKeys & A_BUTTON) - { - u8 menuItem = sMenuItems[state->menuType][state->cursorPos]; - if (menuItem != POKENAV_MENUITEM_CONDITION_SEARCH_CANCEL) - { - SetSelectedConditionSearch(menuItem - POKENAV_MENUITEM_CONDITION_SEARCH_COOL); - sub_81C97B0(state, POKENAV_MENU_8); - state->helpBarIndex = HELPBAR_CONDITION_MON_LIST; - return POKENAV_MENU_FUNC_OPEN_FEATURE; - } - else - { - PlaySE(SE_SELECT); - ReturnToConditionMenu(state); - return POKENAV_MENU_FUNC_RETURN_TO_CONDITION; - } - } - if (gMain.newKeys & B_BUTTON) - { - if (state->cursorPos != sLastCursorPositions[state->menuType]) - { - state->cursorPos = sLastCursorPositions[state->menuType]; - state->callback = CB2_ReturnToConditionMenu; - return POKENAV_MENU_FUNC_MOVE_CURSOR; - } - else - { - PlaySE(SE_SELECT); - ReturnToConditionMenu(state); - return POKENAV_MENU_FUNC_RETURN_TO_CONDITION; - } - } - return POKENAV_MENU_FUNC_NONE; -} - -static u32 CB2_ReturnToMainMenu(struct Pokenav1Struct *state) -{ - ReturnToMainMenu(state); - return POKENAV_MENU_FUNC_RETURN_TO_MAIN; -} - -static u32 CB2_ReturnToConditionMenu(struct Pokenav1Struct *state) -{ - ReturnToConditionMenu(state); - return POKENAV_MENU_FUNC_RETURN_TO_CONDITION; -} - -static void sub_81C97B0(struct Pokenav1Struct *state, u32 a1) -{ - state->unk8 = a1; - state->callback = sub_81C97BC; -} - -static u32 sub_81C97BC(struct Pokenav1Struct *state) -{ - return state->unk8; -} - -static void ReturnToMainMenu(struct Pokenav1Struct *state) -{ - state->menuType = GetPokenavMainMenuType(); - state->cursorPos = 1; - state->currMenuItem = sMenuItems[state->menuType][state->cursorPos]; - state->callback = HandleMainMenuInput; -} - -static void ReturnToConditionMenu(struct Pokenav1Struct *state) -{ - state->menuType = POKENAV_MENU_TYPE_CONDITION; - state->cursorPos = 1; - state->currMenuItem = sMenuItems[POKENAV_MENU_TYPE_CONDITION][1]; - state->callback = HandleConditionMenuInput; -} - -static bool32 UpdateMenuCursorPos(struct Pokenav1Struct *state) -{ - if (gMain.newKeys & DPAD_UP) - { - if (--state->cursorPos < 0) - state->cursorPos = sLastCursorPositions[state->menuType]; - - state->currMenuItem = sMenuItems[state->menuType][state->cursorPos]; - return TRUE; - } - else if (gMain.newKeys & DPAD_DOWN) - { - state->cursorPos++; - if (state->cursorPos > sLastCursorPositions[state->menuType]) - state->cursorPos = 0; - - state->currMenuItem = sMenuItems[state->menuType][state->cursorPos]; - return TRUE; - } - else - { - return FALSE; - } -} - -int GetPokenavMenuType(void) -{ - struct Pokenav1Struct *state = GetSubstructPtr(1); - return state->menuType; -} - -// Position of cursor relative to number of current menu options -int GetPokenavCursorPos(void) -{ - struct Pokenav1Struct *state = GetSubstructPtr(1); - return state->cursorPos; -} - -// ID of menu item the cursor is currently on -int GetCurrentMenuItemId(void) -{ - struct Pokenav1Struct *state = GetSubstructPtr(1); - return state->currMenuItem; -} - -u16 GetHelpBarTextId(void) -{ - struct Pokenav1Struct *state = GetSubstructPtr(1); - return state->helpBarIndex; -} diff --git a/src/pokenav_unk_10.c b/src/pokenav_unk_10.c deleted file mode 100644 index 2789b1244..000000000 --- a/src/pokenav_unk_10.c +++ /dev/null @@ -1,1163 +0,0 @@ -#include "global.h" -#include "decompress.h" -#include "dynamic_placeholder_text_util.h" -#include "graphics.h" -#include "international_string_util.h" -#include "pokenav.h" -#include "sound.h" -#include "sprite.h" -#include "string_util.h" -#include "strings.h" -#include "text.h" -#include "trainer_pokemon_sprites.h" -#include "window.h" -#include "constants/songs.h" - -struct PokenavSub13 -{ - u8 filler0[0x8]; - struct PokenavSub18 *field_8; - u16 field_C; - u16 field_E; - u16 field_10; - u16 field_12; - u32 field_14[25]; - u32 field_78[8]; - u32 (*field_98)(struct PokenavSub13 *structPtr); -}; - -struct PokenavSub14 -{ - u32 (*field_0)(void); - u32 loopedTaskId; - u16 field_8; - u16 field_A; - u16 field_C; - u16 field_E; - u16 field_10; - struct Sprite *field_14; - u32 filler; - u8 tilemapBuffers[2][BG_SCREEN_SIZE]; -}; - -static u32 gUnknown_030012C0; -static u32 gUnknown_030012C4; - -void sub_81D0E84(struct PokenavSub14 *structPtr); -void sub_81D0FF0(struct PokenavSub14 *structPtr); -void sub_81D10D0(struct PokenavSub14 *structPtr); -void sub_81D1500(struct PokenavSub14 *structPtr); -void sub_81D0EFC(struct PokenavSub14 *structPtr); -void sub_81D1148(struct PokenavSub14 *structPtr); -void sub_81D10A4(struct PokenavSub14 *structPtr); -void sub_81D1178(struct PokenavSub14 *structPtr); -void sub_81D11D8(struct PokenavSub14 *structPtr); -void sub_81D11FC(struct PokenavSub14 *structPtr); -void sub_81D0E60(struct PokenavSub14 *structPtr); -void sub_81D1448(struct PokenavSub14 *structPtr); -void sub_81D13FC(struct PokenavSub14 *structPtr); -void sub_81D0FCC(struct PokenavSub14 *structPtr); -void sub_81D12D8(struct PokenavSub14 *structPtr); -bool32 sub_81D1524(struct PokenavSub14 *structPtr); -bool32 sub_81D1234(struct PokenavSub14 *structPtr); -void sub_81D0814(struct PokenavSub13 *structPtr); -u32 sub_81D0548(struct PokenavSub13 *structPtr); -u32 sub_81D04C4(struct PokenavSub13 *structPtr); -u32 sub_81D05D4(struct PokenavSub13 *structPtr); -bool32 sub_81D05DC(struct PokenavSub13 *structPtr); -bool32 sub_81D0688(struct PokenavSub13 *structPtr); -bool32 sub_81D0664(struct PokenavSub13 *structPtr); -bool32 sub_81D061C(struct PokenavSub13 *structPtr); -bool32 sub_81D0688(struct PokenavSub13 *structPtr); -bool32 sub_81D0A58(void); -u32 sub_81D06C4(void); -u32 sub_81D06D4(void); -u16 sub_81D1184(s32 unused0, s32 unused1); -void sub_81D1258(struct Sprite *sprite, s32 arg1, s32 arg2, s32 arg3); -void sub_81D1284(struct Sprite *sprite); -void sub_81D1350(void); -void sub_81D13BC(u16 *dst, u32 id); -void sub_81D1370(u32 arg0, u32 id); -void sub_81D1538(struct Sprite *sprite); -u32 sub_81D0A6C(s32 state); -u32 sub_81D0C84(s32 state); -u32 sub_81D0D2C(s32 state); -u32 sub_81D0D8C(s32 state); -u32 sub_81D0E00(s32 state); -u32 sub_81D0C54(s32 state); - -struct -{ - u8 unk0; - u8 unk1; - u8 unk2; - u8 unk3; -} static const gUnknown_086237F8[] = -{ - {1, 1, 0, 0}, - {3, 4, 1, 0}, - {3, 4, 5, 0}, - {3, 4, 9, 0}, - {3, 4, 13, 0}, - {3, 4, 17, 0}, - {1, 1, 21, 0}, - {1, 1, 22, 0}, - {1, 1, 23, 0}, - {1, 1, 24, 0}, - {1, 1, 25, 1}, - {1, 1, 26, 1}, - {1, 1, 27, 1}, - {1, 1, 28, 1}, - {1, 1, 29, 1}, - {1, 1, 30, 1}, - {1, 1, 31, 1} -}; - -#include "data/text/ribbon_descriptions.h" -#include "data/text/gift_ribbon_descriptions.h" - -static const u16 gUnknown_08623FF8[] = INCBIN_U16("graphics/pokenav/ribbons_icon1.gbapal"); -static const u16 gUnknown_08624018[] = INCBIN_U16("graphics/pokenav/ribbons_icon2.gbapal"); -static const u16 gUnknown_08624038[] = INCBIN_U16("graphics/pokenav/ribbons_icon3.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_08624098[] = INCBIN_U16("graphics/pokenav/8624098.gbapal"); -static const u32 sRibbonIconsSmall_Gfx[] = INCBIN_U32("graphics/pokenav/ribbons_icon.4bpp.lz"); -static const u32 sRibbonIconsBig_Gfx[] = INCBIN_U32("graphics/pokenav/ribbons_icon_big.4bpp.lz"); - -static const struct BgTemplate gUnknown_08624B98[] = -{ - { - .bg = 1, - .charBaseIndex = 3, - .mapBaseIndex = 0x07, - .screenSize = 0, - .paletteMode = 0, - .priority = 1, - .baseTile = 0 - }, - { - .bg = 2, - .charBaseIndex = 1, - .mapBaseIndex = 0x06, - .screenSize = 0, - .paletteMode = 0, - .priority = 2, - .baseTile = 0 - } -}; - -static const LoopedTask gUnknown_08624BA0[] = -{ - NULL, - sub_81D0C84, - sub_81D0D2C, - sub_81D0D8C, - sub_81D0E00, - sub_81D0C54 -}; - -// code -bool32 PokenavCallback_Init_13(void) -{ - struct PokenavSub13 *structPtr = AllocSubstruct(13, sizeof(struct PokenavSub13)); - if (structPtr == NULL) - return FALSE; - - structPtr->field_8 = GetSubstructPtr(18); - if (structPtr->field_8 == NULL) - return FALSE; - - sub_81D0814(structPtr); - structPtr->field_98 = sub_81D04C4; - gKeyRepeatContinueDelay = 3; - gKeyRepeatStartDelay = 10; - return TRUE; -} - -u32 sub_81D04A0(void) -{ - struct PokenavSub13 *structPtr = GetSubstructPtr(13); - return structPtr->field_98(structPtr); -} - -void sub_81D04B8(void) -{ - FreePokenavSubstruct(13); -} - -u32 sub_81D04C4(struct PokenavSub13 *structPtr) -{ - if (gMain.newAndRepeatedKeys & DPAD_UP && structPtr->field_8->unk2 != 0) - { - structPtr->field_8->unk2--; - structPtr->field_C = 0; - sub_81D0814(structPtr); - return 1; - } - else if (gMain.newAndRepeatedKeys & DPAD_DOWN && structPtr->field_8->unk2 < structPtr->field_8->unk0 - 1) - { - structPtr->field_8->unk2++; - structPtr->field_C = 0; - sub_81D0814(structPtr); - return 1; - } - else if (gMain.newKeys & A_BUTTON) - { - structPtr->field_98 = sub_81D0548; - return 2; - } - else if (gMain.newKeys & B_BUTTON) - { - structPtr->field_98 = sub_81D05D4; - return 5; - } - return 0; -} - -u32 sub_81D0548(struct PokenavSub13 *structPtr) -{ - if (gMain.newAndRepeatedKeys & DPAD_UP && sub_81D05DC(structPtr)) - return 3; - else if (gMain.newAndRepeatedKeys & DPAD_DOWN && sub_81D061C(structPtr)) - return 3; - else if (gMain.newAndRepeatedKeys & DPAD_LEFT && sub_81D0664(structPtr)) - return 3; - else if (gMain.newAndRepeatedKeys & DPAD_RIGHT && sub_81D0688(structPtr)) - return 3; - else if (gMain.newKeys & B_BUTTON) - { - structPtr->field_98 = sub_81D04C4; - return 4; - } - return 0; -} - -u32 sub_81D05D4(struct PokenavSub13 *structPtr) -{ - return POKENAV_MENU_E; -} - -bool32 sub_81D05DC(struct PokenavSub13 *structPtr) -{ - if (structPtr->field_C < 25) - { - if (structPtr->field_C <= 8) - return FALSE; - - structPtr->field_C -= 9; - return TRUE; - } - if (structPtr->field_10 != 0) - { - u32 var = structPtr->field_C - 27; - structPtr->field_C = var + structPtr->field_E; - if (structPtr->field_C >= structPtr->field_10) - structPtr->field_C = structPtr->field_10 - 1; - return TRUE; - } - return FALSE; -} - -bool32 sub_81D061C(struct PokenavSub13 *structPtr) -{ - if (structPtr->field_C >= 25) - return FALSE; - if (structPtr->field_C < structPtr->field_E) - { - structPtr->field_C += 9; - if (structPtr->field_C >= structPtr->field_10) - structPtr->field_C = structPtr->field_10 - 1; - return TRUE; - } - if (structPtr->field_12 != 0) - { - int var = structPtr->field_C - structPtr->field_E; - if (var >= structPtr->field_12) - var = structPtr->field_12 - 1; - - structPtr->field_C = var + 27; - return TRUE; - } - return FALSE; -} - -bool32 sub_81D0664(struct PokenavSub13 *structPtr) -{ - u16 var = structPtr->field_C % 9; - if (var != 0) - { - structPtr->field_C--; - return TRUE; - } - - return FALSE; -} - -bool32 sub_81D0688(struct PokenavSub13 *structPtr) -{ - int r1 = structPtr->field_C % 9; - - if (r1 >= 8) - return FALSE; - - if (structPtr->field_C <= 26) - { - if (structPtr->field_C < structPtr->field_10 - 1) - { - structPtr->field_C++; - return TRUE; - } - } - else - { - if (r1 < structPtr->field_12 - 1) - { - structPtr->field_C++; - return TRUE; - } - } - return FALSE; -} - -u32 sub_81D06C4(void) -{ - struct PokenavSub13 *structPtr = GetSubstructPtr(13); - return structPtr->field_8->unk2; -} - -u32 sub_81D06D4(void) -{ - struct PokenavSub13 *structPtr = GetSubstructPtr(13); - return structPtr->field_8->unk0; -} - -static void GetCurrMonInfo1(u8 *nick, u8 *level, u8 *gender) -{ - struct PokenavSub13 *structPtr = GetSubstructPtr(13); - struct PokenavSub18 *mons = structPtr->field_8; - struct PokenavMonList *monInfo = &mons->unk4[mons->unk2]; - - if (monInfo->boxId == TOTAL_BOXES_COUNT) - { - struct Pokemon *mon = &gPlayerParty[monInfo->monId]; - GetMonData(mon, MON_DATA_NICKNAME, nick); - *level = GetLevelFromMonExp(mon); - *gender = GetMonGender(mon); - } - else - { - struct BoxPokemon *boxMon = GetBoxedMonPtr(monInfo->boxId, monInfo->monId); - *gender = GetBoxMonGender(boxMon); - *level = GetLevelFromBoxMonExp(boxMon); - GetBoxMonData(boxMon, MON_DATA_NICKNAME, nick); - } - StringGetEnd10(nick); -} - -static void GetCurrMonInfo2(u16 *species, u32 *personality, u32 *otId) -{ - struct PokenavSub13 *structPtr = GetSubstructPtr(13); - struct PokenavSub18 *mons = structPtr->field_8; - struct PokenavMonList *monInfo = &mons->unk4[mons->unk2]; - - if (monInfo->boxId == TOTAL_BOXES_COUNT) - { - struct Pokemon *mon = &gPlayerParty[monInfo->monId]; - *species = GetMonData(mon, MON_DATA_SPECIES); - *personality = GetMonData(mon, MON_DATA_PERSONALITY); - *otId = GetMonData(mon, MON_DATA_OT_ID); - } - else - { - struct BoxPokemon *boxMon = GetBoxedMonPtr(monInfo->boxId, monInfo->monId); - *species = GetBoxMonData(boxMon, MON_DATA_SPECIES); - *personality = GetBoxMonData(boxMon, MON_DATA_PERSONALITY); - *otId = GetBoxMonData(boxMon, MON_DATA_OT_ID); - } -} - -static u32 GetCurrMonRibbonCount(void) -{ - struct PokenavSub13 *structPtr = GetSubstructPtr(13); - struct PokenavSub18 *mons = structPtr->field_8; - struct PokenavMonList *monInfo = &mons->unk4[mons->unk2]; - - if (monInfo->boxId == TOTAL_BOXES_COUNT) - return GetMonData(&gPlayerParty[monInfo->monId], MON_DATA_RIBBON_COUNT); - else - return GetBoxMonDataAt(monInfo->boxId, monInfo->monId, MON_DATA_RIBBON_COUNT); -} - -void sub_81D0814(struct PokenavSub13 *structPtr) -{ - u32 ribbons; - s32 i, j; - struct PokenavSub18 *mons = structPtr->field_8; - struct PokenavMonList *monInfo = &mons->unk4[mons->unk2]; - - if (monInfo->boxId == TOTAL_BOXES_COUNT) - ribbons = GetMonData(&gPlayerParty[monInfo->monId], MON_DATA_RIBBONS); - else - ribbons = GetBoxMonDataAt(monInfo->boxId, monInfo->monId, MON_DATA_RIBBONS); - - structPtr->field_10 = 0; - structPtr->field_12 = 0; - for (i = 0; i < ARRAY_COUNT(gUnknown_086237F8); i++) - { - s32 r4 = ((1 << gUnknown_086237F8[i].unk0) - 1) & ribbons; - if (gUnknown_086237F8[i].unk3 == 0) - { - for (j = 0; j < r4; j++) - structPtr->field_14[structPtr->field_10++] = gUnknown_086237F8[i].unk2 + j; - } - else - { - for (j = 0; j < r4; j++) - structPtr->field_78[structPtr->field_12++] = gUnknown_086237F8[i].unk2 + j; - } - ribbons >>= gUnknown_086237F8[i].unk0; - } - - if (structPtr->field_10 != 0) - { - structPtr->field_E = ((structPtr->field_10 - 1) / 9) * 9; - structPtr->field_C = 0; - } - else - { - structPtr->field_E = 0; - structPtr->field_C = 27; - } -} - -u32 *sub_81D0914(u32 *arg0) -{ - struct PokenavSub13 *structPtr = GetSubstructPtr(13); - *arg0 = structPtr->field_10; - return structPtr->field_14; -} - -u32 *sub_81D092C(u32 *arg0) -{ - struct PokenavSub13 *structPtr = GetSubstructPtr(13); - *arg0 = structPtr->field_12; - return structPtr->field_78; -} - -u16 sub_81D0944(void) -{ - struct PokenavSub13 *structPtr = GetSubstructPtr(13); - return structPtr->field_C; -} - -u32 sub_81D0954(void) -{ - struct PokenavSub13 *structPtr = GetSubstructPtr(13); - int var = structPtr->field_C; - if (var <= 24) - return structPtr->field_14[var]; - else - return structPtr->field_78[var - 27]; -} - -bool32 sub_81D0978(void) -{ - struct PokenavSub14 *structPtr = AllocSubstruct(14, sizeof(struct PokenavSub14)); - if (structPtr == NULL) - return FALSE; - - structPtr->loopedTaskId = CreateLoopedTask(sub_81D0A6C, 1); - structPtr->field_0 = sub_81D0A58; - return TRUE; -} - -void sub_81D09B0(s32 id) -{ - struct PokenavSub14 *structPtr = GetSubstructPtr(14); - structPtr->loopedTaskId = CreateLoopedTask(gUnknown_08624BA0[id], 1); - structPtr->field_0 = sub_81D0A58; -} - -u32 sub_81D09E0(void) -{ - struct PokenavSub14 *structPtr = GetSubstructPtr(14); - return structPtr->field_0(); -} - -void sub_81D09F4(void) -{ - struct PokenavSub14 *structPtr = GetSubstructPtr(14); - RemoveWindow(structPtr->field_A); - RemoveWindow(structPtr->field_8); - RemoveWindow(structPtr->field_C); - RemoveWindow(structPtr->field_E); - sub_81D1178(structPtr); - FreeSpriteTilesByTag(9); - FreeSpritePaletteByTag(0xF); - FreeSpritePaletteByTag(0x10); - FreeSpritePaletteByTag(0x11); - FreeSpritePaletteByTag(0x12); - FreeSpritePaletteByTag(0x13); - FreeSpriteOamMatrix(structPtr->field_14); - DestroySprite(structPtr->field_14); - FreePokenavSubstruct(14); -} - -bool32 sub_81D0A58(void) -{ - struct PokenavSub14 *structPtr = GetSubstructPtr(14); - return IsLoopedTaskActive(structPtr->loopedTaskId); -} - -u32 sub_81D0A6C(s32 state) -{ - struct PokenavSub14 *structPtr = GetSubstructPtr(14); - switch (state) - { - case 0: - InitBgTemplates(gUnknown_08624B98, ARRAY_COUNT(gUnknown_08624B98)); - decompress_and_copy_tile_data_to_vram(2, gUnknown_08DDE030, 0, 0, 0); - SetBgTilemapBuffer(2, structPtr->tilemapBuffers[0]); - CopyToBgTilemapBuffer(2, gUnknown_08DDE12C, 0, 0); - CopyPaletteIntoBufferUnfaded(gUnknown_08DDE010, 0x10, 0x20); - CopyBgTilemapBufferToVram(2); - return LT_INC_AND_PAUSE; - case 1: - if (!free_temp_tile_data_buffers_if_possible()) - { - sub_8199DF0(1, 0, 0, 1); - decompress_and_copy_tile_data_to_vram(1, sRibbonIconsSmall_Gfx, 0, 1, 0); - SetBgTilemapBuffer(1, structPtr->tilemapBuffers[1]); - FillBgTilemapBufferRect_Palette0(1, 0, 0, 0, 32, 20); - CopyPaletteIntoBufferUnfaded(gUnknown_08623FF8, 0x20, 0xA0); - CopyPaletteIntoBufferUnfaded(gUnknown_08624098, 0xA0, 0x20); - CopyBgTilemapBufferToVram(1); - return LT_INC_AND_PAUSE; - } - return LT_PAUSE; - case 2: - if (!free_temp_tile_data_buffers_if_possible()) - { - sub_81D0E60(structPtr); - return LT_INC_AND_PAUSE; - } - return LT_PAUSE; - case 3: - if (!free_temp_tile_data_buffers_if_possible()) - { - sub_81D0FCC(structPtr); - return LT_INC_AND_PAUSE; - } - return LT_PAUSE; - case 4: - if (!free_temp_tile_data_buffers_if_possible()) - { - sub_81D10A4(structPtr); - return LT_INC_AND_PAUSE; - } - return LT_PAUSE; - case 5: - if (!IsDma3ManagerBusyWithBgCopy()) - { - CopyBgTilemapBufferToVram(2); - return LT_INC_AND_PAUSE; - } - return LT_PAUSE; - case 6: - if (!IsDma3ManagerBusyWithBgCopy()) - { - sub_81D1148(structPtr); - return LT_INC_AND_CONTINUE; - } - return LT_PAUSE; - case 7: - sub_81D12D8(structPtr); - PrintHelpBarText(HELPBAR_RIBBONS_LIST); - return LT_INC_AND_PAUSE; - case 8: - if (!IsDma3ManagerBusyWithBgCopy()) - { - sub_81D13FC(structPtr); - ChangeBgX(1, 0, 0); - ChangeBgY(1, 0, 0); - ChangeBgX(2, 0, 0); - ChangeBgY(2, 0, 0); - ShowBg(1); - ShowBg(2); - HideBg(3); - sub_81C7AC0(1); - return LT_INC_AND_PAUSE; - } - return LT_PAUSE; - case 9: - if (IsPaletteFadeActive()) - return LT_PAUSE; - return LT_FINISH; - } - return LT_FINISH; -} - -u32 sub_81D0C54(s32 state) -{ - switch (state) - { - case 0: - PlaySE(SE_SELECT); - sub_81C7AC0(0); - return LT_INC_AND_PAUSE; - case 1: - if (IsPaletteFadeActive()) - return LT_PAUSE; - return LT_FINISH; - } - return LT_FINISH; -} - -u32 sub_81D0C84(s32 state) -{ - struct PokenavSub14 *structPtr = GetSubstructPtr(14); - switch (state) - { - case 0: - PlaySE(SE_SELECT); - sub_81D11D8(structPtr); - return LT_INC_AND_PAUSE; - case 1: - if (!sub_81D1234(structPtr)) - { - sub_81D0FF0(structPtr); - return LT_INC_AND_CONTINUE; - } - return LT_PAUSE; - case 2: - sub_81D12D8(structPtr); - return LT_INC_AND_CONTINUE; - case 3: - sub_81D10D0(structPtr); - return LT_INC_AND_CONTINUE; - case 4: - sub_81D0E84(structPtr); - return LT_INC_AND_CONTINUE; - case 5: - if (!IsDma3ManagerBusyWithBgCopy()) - { - sub_81D11FC(structPtr); - return LT_INC_AND_PAUSE; - } - return LT_PAUSE; - case 6: - if (sub_81D1234(structPtr)) - return LT_PAUSE; - return LT_FINISH; - } - return LT_FINISH; -} - -u32 sub_81D0D2C(s32 state) -{ - struct PokenavSub14 *structPtr = GetSubstructPtr(14); - switch (state) - { - case 0: - PlaySE(SE_SELECT); - sub_81D1448(structPtr); - return LT_INC_AND_PAUSE; - case 1: - if (!sub_81D1524(structPtr)) - { - sub_81D0EFC(structPtr); - PrintHelpBarText(HELPBAR_RIBBONS_CHECK); - return LT_INC_AND_PAUSE; - } - return LT_PAUSE; - case 2: - if (IsDma3ManagerBusyWithBgCopy()) - return LT_PAUSE; - } - return LT_FINISH; -} - -u32 sub_81D0D8C(s32 state) -{ - struct PokenavSub14 *structPtr = GetSubstructPtr(14); - switch (state) - { - case 0: - PlaySE(SE_SELECT); - sub_81D1500(structPtr); - return LT_INC_AND_PAUSE; - case 1: - if (!sub_81D1524(structPtr)) - { - sub_81D1448(structPtr); - return LT_INC_AND_PAUSE; - } - return LT_PAUSE; - case 2: - if (!sub_81D1524(structPtr)) - { - sub_81D0EFC(structPtr); - return LT_INC_AND_PAUSE; - } - return LT_PAUSE; - case 3: - if (IsDma3ManagerBusyWithBgCopy()) - return LT_PAUSE; - } - return LT_FINISH; -} - -u32 sub_81D0E00(s32 state) -{ - struct PokenavSub14 *structPtr = GetSubstructPtr(14); - switch (state) - { - case 0: - PlaySE(SE_SELECT); - sub_81D1500(structPtr); - return LT_INC_AND_PAUSE; - case 1: - if (!sub_81D1524(structPtr)) - { - sub_81D0E84(structPtr); - PrintHelpBarText(HELPBAR_RIBBONS_LIST); - return LT_INC_AND_PAUSE; - } - return LT_PAUSE; - case 2: - if (IsDma3ManagerBusyWithBgCopy()) - return LT_PAUSE; - } - return LT_FINISH; -} - -static const struct WindowTemplate gUnknown_08624BB8 = -{ - .bg = 2, - .tilemapLeft = 12, - .tilemapTop = 13, - .width = 16, - .height = 4, - .paletteNum = 1, - .baseBlock = 0x14, -}; - -void sub_81D0E60(struct PokenavSub14 *structPtr) -{ - structPtr->field_A = AddWindow(&gUnknown_08624BB8); - PutWindowTilemap(structPtr->field_A); - sub_81D0E84(structPtr); -} - -void sub_81D0E84(struct PokenavSub14 *structPtr) -{ - u8 color[] = {TEXT_COLOR_RED, TEXT_COLOR_DARK_GREY, TEXT_COLOR_LIGHT_GREY}; - - ConvertIntToDecimalStringN(gStringVar1, GetCurrMonRibbonCount(), STR_CONV_MODE_LEFT_ALIGN, 2); - DynamicPlaceholderTextUtil_Reset(); - DynamicPlaceholderTextUtil_SetPlaceholderPtr(0, gStringVar1); - DynamicPlaceholderTextUtil_ExpandPlaceholders(gStringVar4, gText_RibbonsF700); - FillWindowPixelBuffer(structPtr->field_A, PIXEL_FILL(4)); - AddTextPrinterParameterized3(structPtr->field_A, 1, 0, 1, color, -1, gStringVar4); - CopyWindowToVram(structPtr->field_A, 2); -} - -void sub_81D0EFC(struct PokenavSub14 *structPtr) -{ - s32 i; - u32 ribbonId = sub_81D0954(); - u8 color[] = {TEXT_COLOR_RED, TEXT_COLOR_DARK_GREY, TEXT_COLOR_LIGHT_GREY}; - - FillWindowPixelBuffer(structPtr->field_A, PIXEL_FILL(4)); - if (ribbonId < 25) - { - for (i = 0; i < 2; i++) - AddTextPrinterParameterized3(structPtr->field_A, 1, 0, (i * 16) + 1, color, -1, gRibbonDescriptionPointers[ribbonId][i]); - } - else - { - ribbonId = gSaveBlock1Ptr->giftRibbons[ribbonId - 25]; - if (ribbonId == 0) - return; - - ribbonId--; - for (i = 0; i < 2; i++) - AddTextPrinterParameterized3(structPtr->field_A, 1, 0, (i * 16) + 1, color, -1, gGiftRibbonDescriptionPointers[ribbonId][i]); - } - - CopyWindowToVram(structPtr->field_A, 2); -} - -static const struct WindowTemplate gUnknown_08624BC4 = -{ - .bg = 2, - .tilemapLeft = 14, - .tilemapTop = 1, - .width = 13, - .height = 2, - .paletteNum = 10, - .baseBlock = 0x54, -}; - -void sub_81D0FCC(struct PokenavSub14 *structPtr) -{ - structPtr->field_8 = AddWindow(&gUnknown_08624BC4); - PutWindowTilemap(structPtr->field_8); - sub_81D0FF0(structPtr); -} - -static const u8 sMaleIconString[] = _("{COLOR_HIGHLIGHT_SHADOW}{LIGHT_RED}{WHITE}{GREEN}♂{COLOR_HIGHLIGHT_SHADOW}{DARK_GREY}{WHITE}{LIGHT_GREY}"); -static const u8 sFemaleIconString[] = _("{COLOR_HIGHLIGHT_SHADOW}{LIGHT_GREEN}{WHITE}{BLUE}♀{COLOR_HIGHLIGHT_SHADOW}{DARK_GREY}{WHITE}{LIGHT_GREY}"); -static const u8 sGenderlessIconString[] = _("{UNK_SPACER}"); - -void sub_81D0FF0(struct PokenavSub14 *structPtr) -{ - const u8 *genderTxt; - u8 *txtPtr; - u8 level, gender; - u16 windowId = structPtr->field_8; - - FillWindowPixelBuffer(windowId, PIXEL_FILL(1)); - GetCurrMonInfo1(gStringVar3, &level, &gender); - AddTextPrinterParameterized(windowId, 1, gStringVar3, 0, 1, TEXT_SPEED_FF, NULL); - switch (gender) - { - case MON_MALE: - genderTxt = sMaleIconString; - break; - case MON_FEMALE: - genderTxt = sFemaleIconString; - break; - default: - genderTxt = sGenderlessIconString; - break; - } - - txtPtr = StringCopy(gStringVar1, genderTxt); - *(txtPtr++) = CHAR_SLASH; - *(txtPtr++) = CHAR_SPECIAL_F9; - *(txtPtr++) = CHAR_LV_2; - ConvertIntToDecimalStringN(txtPtr, level, STR_CONV_MODE_LEFT_ALIGN, 3); - AddTextPrinterParameterized(windowId, 1, gStringVar1, 60, 1, TEXT_SPEED_FF, NULL); - CopyWindowToVram(windowId, 2); -} - -static const struct WindowTemplate gUnknown_08624BE8[] = -{ - { - .bg = 2, - .tilemapLeft = 1, - .tilemapTop = 5, - .width = 7, - .height = 2, - .paletteNum = 1, - .baseBlock = 0x6E, - }, - {}, -}; - -void sub_81D10A4(struct PokenavSub14 *structPtr) -{ - structPtr->field_C = AddWindow(gUnknown_08624BE8); - FillWindowPixelBuffer(structPtr->field_C, PIXEL_FILL(1)); - PutWindowTilemap(structPtr->field_C); - sub_81D10D0(structPtr); -} - -void sub_81D10D0(struct PokenavSub14 *structPtr) -{ - s32 x; - u8 *txtPtr; - u32 id = sub_81D06C4() + 1; - u32 count = sub_81D06D4(); - - txtPtr = ConvertIntToDecimalStringN(gStringVar1, id, STR_CONV_MODE_RIGHT_ALIGN, 3); - *(txtPtr++) = CHAR_SLASH; - ConvertIntToDecimalStringN(txtPtr, count, STR_CONV_MODE_RIGHT_ALIGN, 3); - x = GetStringCenterAlignXOffset(1, gStringVar1, 56); - AddTextPrinterParameterized(structPtr->field_C, 1, gStringVar1, x, 1, TEXT_SPEED_FF, NULL); - CopyWindowToVram(structPtr->field_C, 2); -} - -void sub_81D1148(struct PokenavSub14 *structPtr) -{ - u16 species; - u32 personality, otId; - - GetCurrMonInfo2(&species, &personality, &otId); - ResetAllPicSprites(); - structPtr->field_10 = sub_81D1184(40, 104); - sub_81C7990(15, 0); -} - -void sub_81D1178(struct PokenavSub14 *structPtr) -{ - FreeAndDestroyMonPicSprite(structPtr->field_10); -} - -u16 sub_81D1184(s32 unused0, s32 unused1) -{ - u16 species, spriteId; - u32 personality, otId; - - GetCurrMonInfo2(&species, &personality, &otId); - spriteId = CreateMonPicSprite_HandleDeoxys(species, otId, personality, TRUE, 40, 104, 15, 0xFFFF); - gSprites[spriteId].oam.priority = 0; - return spriteId; -} - -void sub_81D11D8(struct PokenavSub14 *structPtr) -{ - sub_81D1258(&gSprites[structPtr->field_10], 40, -32, 6); -} - -void sub_81D11FC(struct PokenavSub14 *structPtr) -{ - FreeAndDestroyMonPicSprite(structPtr->field_10); - structPtr->field_10 = sub_81D1184(-32, 104); - sub_81D1258(&gSprites[structPtr->field_10], -32, 40, 6); -} - -bool32 sub_81D1234(struct PokenavSub14 *structPtr) -{ - return (gSprites[structPtr->field_10].callback != SpriteCallbackDummy); -} - -void sub_81D1258(struct Sprite *sprite, s32 arg1, s32 arg2, s32 arg3) -{ - u32 var = arg2 - arg1; - - sprite->pos1.x = arg1; - sprite->data[0] = arg1 << 4; - sprite->data[1] = (var << 4) / arg3; - sprite->data[2] = arg3; - sprite->data[3] = arg2; - - sprite->callback = sub_81D1284; -} - -void sub_81D1284(struct Sprite *sprite) -{ - if (sprite->data[2] != 0) - { - sprite->data[2]--; - sprite->data[0] += sprite->data[1]; - sprite->pos1.x = sprite->data[0] >> 4; - if (sprite->pos1.x <= -32) - sprite->invisible = TRUE; - else - sprite->invisible = FALSE; - } - else - { - sprite->pos1.x = sprite->data[3]; - sprite->callback = SpriteCallbackDummy; - } -} - -void sub_81D12D8(struct PokenavSub14 *structPtr) -{ - u32 *ptr; - - sub_81D1350(); - - ptr = sub_81D0914(&gUnknown_030012C0); - for (gUnknown_030012C4 = 0; gUnknown_030012C4 < gUnknown_030012C0; gUnknown_030012C4++) - sub_81D1370(gUnknown_030012C4, *(ptr++)); - - ptr = sub_81D092C(&gUnknown_030012C0); - for (gUnknown_030012C4 = 0; gUnknown_030012C4 < gUnknown_030012C0; gUnknown_030012C4++) - sub_81D1370(gUnknown_030012C4 + 27, *(ptr++)); - - CopyBgTilemapBufferToVram(1); -} - -void sub_81D1350(void) -{ - FillBgTilemapBufferRect_Palette0(1, 0, 0, 0, 32, 20); -} - -void sub_81D1370(u32 arg0, u32 id) -{ - u16 bgData[4]; - u32 destX = (arg0 % 9) * 2 + 11; - u32 destY = (arg0 / 9) * 2 + 4; - - sub_81D13BC(bgData, id); - CopyToBgTilemapBufferRect(1, bgData, destX, destY, 2, 2); -} - -struct -{ - u16 var0; - u16 var2; -} static const gUnknown_08624BF8[] = -{ - {0, 0}, - {1, 0}, - {2, 0}, - {3, 0}, - {4, 0}, - {1, 1}, - {2, 1}, - {3, 1}, - {4, 1}, - {1, 2}, - {2, 2}, - {3, 2}, - {4, 2}, - {1, 3}, - {2, 3}, - {3, 3}, - {4, 3}, - {1, 4}, - {2, 4}, - {3, 4}, - {4, 4}, - {5, 0}, - {6, 0}, - {7, 1}, - {8, 2}, - {9, 1}, - {9, 3}, - {9, 4}, - {10, 3}, - {10, 4}, - {11, 0}, - {11, 1}, -}; - -void sub_81D13BC(u16 *dst, u32 id) -{ - u16 r3 = gUnknown_08624BF8[id].var2 + 2; - u16 r1 = (gUnknown_08624BF8[id].var0 * 2) + 1; - - dst[0] = r1 | (r3 << 12); - dst[1] = r1 | (r3 << 12) |0x400; - dst[2] = (r1 + 1) | (r3 << 12); - dst[3] = (r1 + 1) | (r3 << 12) | 0x400; -} - -static const struct CompressedSpriteSheet gUnknown_08624C78 = -{ - sRibbonIconsBig_Gfx, 0x1800, 9 -}; - -static const struct SpritePalette gUnknown_08624C80[] = -{ - {gUnknown_08623FF8, 15}, - {gUnknown_08624018, 16}, - {gUnknown_08624038, 17}, - {gUnknown_08624058, 18}, - {gUnknown_08624078, 19}, - {}, -}; - -static const struct OamData sOamData_8624CB0 = -{ - .y = 0, - .affineMode = ST_OAM_AFFINE_NORMAL, - .objMode = ST_OAM_OBJ_NORMAL, - .mosaic = 0, - .bpp = ST_OAM_4BPP, - .shape = SPRITE_SHAPE(32x32), - .x = 0, - .matrixNum = 0, - .size = SPRITE_SIZE(32x32), - .tileNum = 0, - .priority = 1, - .paletteNum = 0, - .affineParam = 0 -}; - -static const union AffineAnimCmd sSpriteAffineAnim_8624CB8[] = -{ - AFFINEANIMCMD_FRAME(128, 128, 0, 0), - AFFINEANIMCMD_END -}; - -static const union AffineAnimCmd sSpriteAffineAnim_8624CC8[] = -{ - AFFINEANIMCMD_FRAME(128, 128, 0, 0), - AFFINEANIMCMD_FRAME(32, 32, 0, 4), - AFFINEANIMCMD_END -}; - -static const union AffineAnimCmd sSpriteAffineAnim_8624CE0[] = -{ - AFFINEANIMCMD_FRAME(256, 256, 0, 0), - AFFINEANIMCMD_FRAME(-32, -32, 0, 4), - AFFINEANIMCMD_END -}; - -static const union AffineAnimCmd *const sSpriteAffineAnimTable_8624CF8[] = -{ - sSpriteAffineAnim_8624CB8, - sSpriteAffineAnim_8624CC8, - sSpriteAffineAnim_8624CE0 -}; - -static const struct SpriteTemplate gUnknown_08624D04 = -{ - .tileTag = 9, - .paletteTag = 15, - .oam = &sOamData_8624CB0, - .anims = gDummySpriteAnimTable, - .images = NULL, - .affineAnims = sSpriteAffineAnimTable_8624CF8, - .callback = SpriteCallbackDummy, -}; - -void sub_81D13FC(struct PokenavSub14 *structPtr) -{ - u8 spriteId; - - LoadCompressedSpriteSheet(&gUnknown_08624C78); - Pokenav_AllocAndLoadPalettes(gUnknown_08624C80); - - spriteId = CreateSprite(&gUnknown_08624D04, 0, 0, 0); - structPtr->field_14 = &gSprites[spriteId]; - structPtr->field_14->invisible = TRUE; -} - -void sub_81D1448(struct PokenavSub14 *structPtr) -{ - u32 ribbonId; - s32 r4 = sub_81D0944(); - s32 r5 = (r4 % 9) * 16 + 96; - s32 r0 = (r4 / 9) * 16 + 40; - - structPtr->field_14->pos1.x = r5; - structPtr->field_14->pos1.y = r0; - - ribbonId = sub_81D0954(); - structPtr->field_14->oam.tileNum = (gUnknown_08624BF8[ribbonId].var0 * 16) + GetSpriteTileStartByTag(9); - structPtr->field_14->oam.paletteNum = IndexOfSpritePaletteTag(gUnknown_08624BF8[ribbonId].var2 + 15); - - StartSpriteAffineAnim(structPtr->field_14, 1); - structPtr->field_14->invisible = FALSE; - structPtr->field_14->data[0] = 0; - structPtr->field_14->callback = sub_81D1538; -} - -void sub_81D1500(struct PokenavSub14 *structPtr) -{ - structPtr->field_14->data[0] = 1; - StartSpriteAffineAnim(structPtr->field_14, 2); - structPtr->field_14->callback = sub_81D1538; -} - -bool32 sub_81D1524(struct PokenavSub14 *structPtr) -{ - return (structPtr->field_14->callback != SpriteCallbackDummy); -} - -void sub_81D1538(struct Sprite *sprite) -{ - if (sprite->affineAnimEnded) - { - sprite->invisible = sprite->data[0]; - sprite->callback = SpriteCallbackDummy; - } -} diff --git a/src/pokenav_unk_2.c b/src/pokenav_unk_2.c deleted file mode 100644 index 94b816b6d..000000000 --- a/src/pokenav_unk_2.c +++ /dev/null @@ -1,1284 +0,0 @@ -#include "global.h" -#include "malloc.h" -#include "decompress.h" -#include "bg.h" -#include "palette.h" -#include "trig.h" -#include "gpu_regs.h" -#include "menu.h" -#include "window.h" -#include "pokenav.h" -#include "graphics.h" -#include "sound.h" -#include "gym_leader_rematch.h" -#include "window.h" -#include "strings.h" -#include "scanline_effect.h" -#include "constants/songs.h" -#include "constants/rgb.h" - -// Top Menu - -struct Pokenav2Struct -{ - bool32 (*callback)(void); - u32 loopedTaskId; - u16 optionDescWindowId; - u8 bg3ScrollTaskId; - u8 cursorPos; - bool8 otherIconsInMotion; - u8 field_00d; - bool32 iconVisible[MAX_POKENAV_MENUITEMS]; - struct Sprite * field_028; - struct Sprite * iconSprites[MAX_POKENAV_MENUITEMS][4]; - u16 bg1TilemapBuffer[0x400]; -}; - -static struct Pokenav2Struct * sub_81C9958(void); -static bool32 sub_81C99FC(void); -static u32 sub_81C9A10(s32 state); -static u32 LoopedTask_MoveMenuCursor(s32 state); -static u32 LoopedTask_OpenConditionMenu(s32 state); -static u32 LoopedTask_ReturnToMainMenu(s32 state); -static u32 LoopedTask_OpenConditionSearchMenu(s32 state); -static u32 LoopedTask_ReturnToConditionMenu(s32 state); -static u32 LoopedTask_SelectRibbonsNoWinners(s32 state); -static u32 LoopedTask_ReShowDescription(s32 state); -static u32 LoopedTask_OpenPokenavFeature(s32 state); -static void sub_81C9FC4(void); -static void sub_81C9FEC(void); -static void CreateMenuOptionSprites(void); -static void sub_81CA094(void); -static void sub_81CA0C8(void); -static void sub_81CA0EC(const u16 *const * a0, s32 a1, s32 a2); -static void sub_81CA20C(void); -static void sub_81CA278(void); -static void sub_81CA35C(struct Sprite ** sprites, s32 a1, s32 a2, s32 a3); -static void sub_81CA3B4(struct Sprite ** sprites); -static void sub_81CA2DC(void); -static bool32 AreMenuOptionSpritesMoving(void); -static void sub_81CA448(struct Sprite ** sprites, bool32 a1); -static void sub_81CA474(struct Sprite * sprite); -static void sub_81CA4AC(struct Sprite * sprite); -static void sub_81CA580(u8 taskId); -static void sub_81CA640(void); -static void sub_81CA6AC(struct Sprite * sprite); -static void sub_81CA698(void); -static void AddOptionDescriptionWindow(void); -static void PrintCurrentOptionDescription(void); -static void PrintNoRibbonWinners(void); -static bool32 sub_81CA7C4(void); -static void sub_81CA7D4(void); -static void sub_81CA7F4(void); -static void sub_81CA808(u8 taskId); -static void sub_81CA818(void); -static void sub_81CA850(void); -static void sub_81CA864(void); -static bool32 sub_81CA89C(void); -static void sub_81CA8B0(u8 taskId); -static void sub_81CA92C(void); -static void sub_81CA994(void); -static void sub_81CA9C8(void); -static void sub_81CA9D8(void); -static void sub_81CA9EC(u8 taskId); -static void sub_81CAA3C(void); - -static const u16 gUnknown_0861FC78[] = INCBIN_U16("graphics/pokenav/bg.gbapal"); -static const u32 gUnknown_0861FC98[] = INCBIN_U32("graphics/pokenav/bg.4bpp.lz"); -static const u32 gUnknown_0861FCAC[] = INCBIN_U32("graphics/pokenav/bg.bin.lz"); -static const u16 gUnknown_0861FD4C[] = INCBIN_U16("graphics/pokenav/outline.gbapal"); -static const u32 gUnknown_0861FD6C[] = INCBIN_U32("graphics/pokenav/outline.4bpp.lz"); -static const u32 gUnknown_0861FFF4[] = INCBIN_U32("graphics/pokenav/outline_map.bin.lz"); -static const u16 gUnknown_08620104[] = INCBIN_U16("graphics/pokenav/blue_light.gbapal"); -static const u32 gUnknown_08620124[] = INCBIN_U32("graphics/pokenav/blue_light.4bpp.lz"); - -static const struct BgTemplate gUnknown_08620194[] = { - { - .bg = 1, - .charBaseIndex = 1, - .mapBaseIndex = 15, - .screenSize = 0, - .paletteMode = 0, - .priority = 1, - .baseTile = 0x000 - }, { - .bg = 2, - .charBaseIndex = 2, - .mapBaseIndex = 23, - .screenSize = 0, - .paletteMode = 0, - .priority = 2, - .baseTile = 0x000 - }, { - .bg = 3, - .charBaseIndex = 3, - .mapBaseIndex = 31, - .screenSize = 0, - .paletteMode = 0, - .priority = 3, - .baseTile = 0x000 - } -}; - -static const LoopedTask sMenuHandlerLoopTaskFuncs[] = { - [POKENAV_MENU_FUNC_NONE] = NULL, - [POKENAV_MENU_FUNC_MOVE_CURSOR] = LoopedTask_MoveMenuCursor, - [POKENAV_MENU_FUNC_OPEN_CONDITION] = LoopedTask_OpenConditionMenu, - [POKENAV_MENU_FUNC_RETURN_TO_MAIN] = LoopedTask_ReturnToMainMenu, - [POKENAV_MENU_FUNC_OPEN_CONDITION_SEARCH] = LoopedTask_OpenConditionSearchMenu, - [POKENAV_MENU_FUNC_RETURN_TO_CONDITION] = LoopedTask_ReturnToConditionMenu, - [POKENAV_MENU_FUNC_NO_RIBBON_WINNERS] = LoopedTask_SelectRibbonsNoWinners, - [POKENAV_MENU_FUNC_RESHOW_DESCRIPTION] = LoopedTask_ReShowDescription, - [POKENAV_MENU_FUNC_OPEN_FEATURE] = LoopedTask_OpenPokenavFeature -}; - -static const struct CompressedSpriteSheet gUnknown_086201C4[] = -{ - { - .data = gPokenavOptions_Gfx, - .size = 0x3400, - .tag = 0x0003 - }, - { - .data = gUnknown_08620124, - .size = 0x0100, - .tag = 0x0001 - } -}; - -static const struct SpritePalette gUnknown_086201D4[] = -{ - {gPokenavOptions_Pal + 0x00, 4}, - {gPokenavOptions_Pal + 0x10, 5}, - {gPokenavOptions_Pal + 0x20, 6}, - {gPokenavOptions_Pal + 0x30, 7}, - {gPokenavOptions_Pal + 0x40, 8}, - {gUnknown_08620104, 3}, - {} -}; - -static const u16 gUnknown_0862020C[] = {0, 0}; -static const u16 gUnknown_08620210[] = {0x20, 1}; -static const u16 gUnknown_08620214[] = {0x40, 4}; -static const u16 gUnknown_08620218[] = {0x60, 2}; -static const u16 gUnknown_0862021C[] = {0x80, 3}; -static const u16 gUnknown_08620220[] = {0xA0, 1}; -static const u16 gUnknown_08620224[] = {0xC0, 1}; -static const u16 gUnknown_08620228[] = {0xE0, 4}; -static const u16 gUnknown_0862022C[] = {0x100, 1}; -static const u16 gUnknown_08620230[] = {0x120, 2}; -static const u16 gUnknown_08620234[] = {0x140, 0}; -static const u16 gUnknown_08620238[] = {0x160, 0}; -static const u16 gUnknown_0862023C[] = {0x180, 3}; - -struct UnkStruct_08620240 -{ - u16 unk0; - u16 unk2; - const u16 *unk4[MAX_POKENAV_MENUITEMS]; -}; - -// TODO -static const struct UnkStruct_08620240 gUnknown_08620240[POKENAV_MENU_TYPE_COUNT] = -{ - [POKENAV_MENU_TYPE_DEFAULT] = - { - 0x2A, - 0x14, - {gUnknown_0862020C, gUnknown_08620210, gUnknown_0862021C} - }, - [POKENAV_MENU_TYPE_UNLOCK_MC] = - { - 0x2A, - 0x14, - {gUnknown_0862020C, gUnknown_08620210, gUnknown_08620214, gUnknown_0862021C} - }, - [POKENAV_MENU_TYPE_UNLOCK_MC_RIBBONS] = - { - 0x2A, - 0x14, - {gUnknown_0862020C, gUnknown_08620210, gUnknown_08620214, gUnknown_08620218, gUnknown_0862021C} - }, - [POKENAV_MENU_TYPE_CONDITION] = - { - 0x38, - 0x14, - {gUnknown_08620220, gUnknown_08620224, gUnknown_0862023C} - }, - [POKENAV_MENU_TYPE_CONDITION_SEARCH] = - { - 0x28, - 0x10, - {gUnknown_08620228, gUnknown_0862022C, gUnknown_08620230, gUnknown_08620234, gUnknown_08620238, gUnknown_0862023C} - }, -}; - -static const struct WindowTemplate sOptionDescWindowTemplate = -{ - .bg = 1, - .tilemapLeft = 3, - .tilemapTop = 17, - .width = 0x18, - .height = 0x2, - .paletteNum = 1, - .baseBlock = 8 -}; - -static const u8 *const sPageDescriptions[] = -{ - [POKENAV_MENUITEM_MAP] = gText_CheckMapOfHoenn, - [POKENAV_MENUITEM_CONDITION] = gText_CheckPokemonInDetail, - [POKENAV_MENUITEM_MATCH_CALL] = gText_CallRegisteredTrainer, - [POKENAV_MENUITEM_RIBBONS] = gText_CheckObtainedRibbons, - [POKENAV_MENUITEM_SWITCH_OFF] = gText_PutAwayPokenav, - [POKENAV_MENUITEM_CONDITION_PARTY] = gText_CheckPartyPokemonInDetail, - [POKENAV_MENUITEM_CONDITION_SEARCH] = gText_CheckAllPokemonInDetail, - [POKENAV_MENUITEM_CONDITION_CANCEL] = gText_ReturnToPokenavMenu, - [POKENAV_MENUITEM_CONDITION_SEARCH_COOL] = gText_FindCoolPokemon, - [POKENAV_MENUITEM_CONDITION_SEARCH_BEAUTY] = gText_FindBeautifulPokemon, - [POKENAV_MENUITEM_CONDITION_SEARCH_CUTE] = gText_FindCutePokemon, - [POKENAV_MENUITEM_CONDITION_SEARCH_SMART] = gText_FindSmartPokemon, - [POKENAV_MENUITEM_CONDITION_SEARCH_TOUGH] = gText_FindToughPokemon, - [POKENAV_MENUITEM_CONDITION_SEARCH_CANCEL] = gText_ReturnToConditionMenu -}; - -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 struct OamData sOamData_MenuOption = -{ - .y = 0, - .affineMode = ST_OAM_AFFINE_OFF, - .objMode = ST_OAM_OBJ_NORMAL, - .bpp = ST_OAM_4BPP, - .shape = SPRITE_SHAPE(32x16), - .x = 0, - .size = SPRITE_SIZE(32x16), - .tileNum = 0, - .priority = 2, - .paletteNum = 0, -}; - -static const union AffineAnimCmd gUnknown_0862031C[] = -{ - AFFINEANIMCMD_FRAME(0x100, 0x100, 0, 0), - AFFINEANIMCMD_END, -}; - -static const union AffineAnimCmd gUnknown_0862032C[] = -{ - AFFINEANIMCMD_FRAME(0x100, 0x100, 0, 0), - AFFINEANIMCMD_FRAME(0x10, 0x10, 0, 0x12), - AFFINEANIMCMD_END, -}; - -static const union AffineAnimCmd *const sSpriteAnims_MenuOption[] = -{ - gUnknown_0862031C, - gUnknown_0862032C -}; - -static const struct SpriteTemplate sMenuOptionSpriteTemplate = -{ - .tileTag = 3, - .paletteTag = 4, - .oam = &sOamData_MenuOption, - .anims = gDummySpriteAnimTable, - .images = NULL, - .affineAnims = sSpriteAnims_MenuOption, - .callback = SpriteCallbackDummy, -}; - -static const struct OamData gUnknown_08620364 = -{ - .y = 0, - .affineMode = ST_OAM_AFFINE_OFF, - .objMode = ST_OAM_OBJ_NORMAL, - .bpp = ST_OAM_4BPP, - .shape = SPRITE_SHAPE(32x16), - .x = 0, - .size = SPRITE_SIZE(32x16), - .tileNum = 0, - .priority = 2, - .paletteNum = 0, -}; - -static const struct SpriteTemplate gUnknown_0862036C = -{ - .tileTag = 1, - .paletteTag = 3, - .oam = &gUnknown_08620364, - .anims = gDummySpriteAnimTable, - .images = NULL, - .affineAnims = gDummySpriteAffineAnimTable, - .callback = SpriteCallbackDummy, -}; - -static const struct ScanlineEffectParams gUnknown_08620384 = -{ - (void *)REG_ADDR_WIN0H, - ((DMA_ENABLE | DMA_START_HBLANK | DMA_REPEAT | DMA_DEST_RELOAD) << 16) | 1, - 1, - 0 -}; - -static bool32 sub_81C98D4(void) -{ - s32 i; - - for (i = 0; i < REMATCH_TABLE_ENTRIES; i++) - { - if (sub_81CB0C8(i) == gMapHeader.regionMapSectionId - && IsRematchEntryRegistered(i) - && gSaveBlock1Ptr->trainerRematches[i]) - return TRUE; - } - - return FALSE; -} - -bool32 sub_81C9924(void) -{ - struct Pokenav2Struct * unk = sub_81C9958(); - - if (unk == NULL) - return FALSE; - - unk->field_00d = 0; - return TRUE; -} - -bool32 sub_81C9940(void) -{ - struct Pokenav2Struct * unk = sub_81C9958(); - - if (unk == NULL) - return FALSE; - - unk->field_00d = 1; - return TRUE; -} - -static struct Pokenav2Struct * sub_81C9958(void) -{ - struct Pokenav2Struct * unk = AllocSubstruct(2, sizeof(struct Pokenav2Struct)); - - if (unk != NULL) - { - unk->otherIconsInMotion = FALSE; - unk->loopedTaskId = CreateLoopedTask(sub_81C9A10, 1); - unk->callback = sub_81C99FC; - } - - return unk; -} - - -void CreateMenuHandlerLoopedTask(s32 ltIdx) -{ - struct Pokenav2Struct * unk = GetSubstructPtr(2); - - unk->loopedTaskId = CreateLoopedTask(sMenuHandlerLoopTaskFuncs[ltIdx], 1); - unk->callback = sub_81C99FC; -} - -bool32 sub_81C99C0(void) -{ - struct Pokenav2Struct * unk = GetSubstructPtr(2); - - return unk->callback(); -} - -void sub_81C99D4(void) -{ - struct Pokenav2Struct * unk = GetSubstructPtr(2); - - sub_81CA7F4(); - RemoveWindow(unk->optionDescWindowId); - sub_81C9FEC(); - sub_81CA994(); - FreePokenavSubstruct(2); -} - -static bool32 sub_81C99FC(void) -{ - struct Pokenav2Struct * unk = GetSubstructPtr(2); - - return IsLoopedTaskActive(unk->loopedTaskId); -} - -static u32 sub_81C9A10(s32 state) -{ - struct Pokenav2Struct * unk = GetSubstructPtr(2); - - switch (state) - { - case 0: - InitBgTemplates(gUnknown_08620194, ARRAY_COUNT(gUnknown_08620194)); - decompress_and_copy_tile_data_to_vram(1, gPokenavMessageBox_Gfx, 0, 0, 0); - SetBgTilemapBuffer(1, unk->bg1TilemapBuffer); - CopyToBgTilemapBuffer(1, gPokenavMessageBox_Tilemap, 0, 0); - CopyBgTilemapBufferToVram(1); - CopyPaletteIntoBufferUnfaded(gPokenavMessageBox_Pal, 0x10, 0x20); - ChangeBgX(1, 0, 0); - ChangeBgY(1, 0, 0); - ChangeBgX(2, 0, 0); - ChangeBgY(2, 0, 0); - ChangeBgX(3, 0, 0); - ChangeBgY(3, 0, 0); - return LT_INC_AND_PAUSE; - case 1: - if (free_temp_tile_data_buffers_if_possible()) - return LT_PAUSE; - decompress_and_copy_tile_data_to_vram(2, gUnknown_0861FD6C, 0, 0, 0); - decompress_and_copy_tile_data_to_vram(2, gUnknown_0861FFF4, 0, 0, 1); - CopyPaletteIntoBufferUnfaded(gUnknown_0861FD4C, 0x20, 0x20); - return LT_INC_AND_PAUSE; - case 2: - if (free_temp_tile_data_buffers_if_possible()) - return LT_PAUSE; - 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); - CopyPaletteIntoBufferUnfaded(gUnknown_0861FC78, 0x30, 0x20); - if (GetPokenavMenuType() == POKENAV_MENU_TYPE_CONDITION || GetPokenavMenuType() == POKENAV_MENU_TYPE_CONDITION_SEARCH) - sub_81CA850(); - return LT_INC_AND_PAUSE; - case 3: - if (free_temp_tile_data_buffers_if_possible()) - return LT_PAUSE; - AddOptionDescriptionWindow(); - sub_81CA7D4(); - return LT_INC_AND_CONTINUE; - case 4: - sub_81C9FC4(); - return LT_INC_AND_CONTINUE; - case 5: - PrintCurrentOptionDescription(); - CreateMenuOptionSprites(); - sub_81CA640(); - sub_81CA0C8(); - return LT_INC_AND_PAUSE; - case 6: - if (sub_81CA7C4()) - return LT_PAUSE; - return LT_INC_AND_CONTINUE; - case 7: - ShowBg(1); - ShowBg(2); - ShowBg(3); - if (unk->field_00d) - sub_81C7AC0(1); - else - { - PlaySE(SE_PN_ON); - sub_81C7AC0(3); - } - switch (GetPokenavMenuType()) - { - case POKENAV_MENU_TYPE_CONDITION_SEARCH: - LoadLeftHeaderGfxForIndex(7); - // fallthrough - case POKENAV_MENU_TYPE_CONDITION: - LoadLeftHeaderGfxForIndex(1); - break; - default: - LoadLeftHeaderGfxForIndex(0); - break; - } - return LT_INC_AND_PAUSE; - case 8: - if (IsPaletteFadeActive()) - return LT_PAUSE; - switch (GetPokenavMenuType()) - { - case POKENAV_MENU_TYPE_CONDITION_SEARCH: - sub_81C7FA0(7, FALSE, FALSE); - // fallthrough - case POKENAV_MENU_TYPE_CONDITION: - sub_81C7FA0(1, FALSE, FALSE); - break; - default: - sub_81C7FA0(0, FALSE, FALSE); - break; - } - sub_81CA20C(); - sub_81CA92C(); - return LT_INC_AND_CONTINUE; - case 9: - if (AreMenuOptionSpritesMoving()) - return LT_PAUSE; - if (sub_81C8010()) - return LT_PAUSE; - break; - } - return LT_FINISH; -} - -static u32 LoopedTask_MoveMenuCursor(s32 state) -{ - switch (state) - { - case 0: - sub_81CAA3C(); - sub_81CA278(); - PrintCurrentOptionDescription(); - PlaySE(SE_SELECT); - return LT_INC_AND_PAUSE; - case 1: - if (AreMenuOptionSpritesMoving()) - return LT_PAUSE; - if (sub_81CA7C4()) - return LT_PAUSE; - break; - } - return LT_FINISH; -} - -static u32 LoopedTask_OpenConditionMenu(s32 state) -{ - switch (state) - { - case 0: - sub_81CA9C8(); - sub_81CA2DC(); - sub_81C7FC4(0, 0); - PlaySE(SE_SELECT); - return LT_INC_AND_PAUSE; - case 1: - if (AreMenuOptionSpritesMoving()) - return LT_PAUSE; - if (sub_81C8010()) - return LT_PAUSE; - sub_81CA0C8(); - LoadLeftHeaderGfxForIndex(1); - return LT_INC_AND_PAUSE; - case 2: - sub_81CA20C(); - sub_81C7FA0(1, FALSE, FALSE); - sub_81CA818(); - PrintCurrentOptionDescription(); - return LT_INC_AND_PAUSE; - case 3: - if (AreMenuOptionSpritesMoving()) - return LT_PAUSE; - if (sub_81C8010()) - return LT_PAUSE; - if (sub_81CA89C()) - return LT_PAUSE; - if (sub_81CA7C4()) - return LT_PAUSE; - sub_81CA9D8(); - break; - } - return LT_FINISH; -} - -static u32 LoopedTask_ReturnToMainMenu(s32 state) -{ - switch (state) - { - case 0: - sub_81CA9C8(); - sub_81CA2DC(); - sub_81C7FC4(1, 0); - return LT_INC_AND_PAUSE; - case 1: - if (AreMenuOptionSpritesMoving()) - return LT_PAUSE; - if (sub_81C8010()) - return LT_PAUSE; - sub_81CA0C8(); - LoadLeftHeaderGfxForIndex(0); - return LT_INC_AND_PAUSE; - case 2: - sub_81CA20C(); - sub_81C7FA0(0, FALSE, FALSE); - sub_81CA864(); - PrintCurrentOptionDescription(); - return LT_INC_AND_PAUSE; - case 3: - if (AreMenuOptionSpritesMoving()) - return LT_PAUSE; - if (sub_81C8010()) - return LT_PAUSE; - if (sub_81CA89C()) - return LT_PAUSE; - if (sub_81CA7C4()) - return LT_PAUSE; - sub_81CA9D8(); - break; - } - return LT_FINISH; -} - -static u32 LoopedTask_OpenConditionSearchMenu(s32 state) -{ - switch (state) - { - case 0: - sub_81CA9C8(); - sub_81CA2DC(); - PlaySE(SE_SELECT); - return LT_INC_AND_PAUSE; - case 1: - if (AreMenuOptionSpritesMoving()) - return LT_PAUSE; - LoadLeftHeaderGfxForIndex(7); - sub_81CA0C8(); - return LT_INC_AND_PAUSE; - case 2: - sub_81CA20C(); - sub_81C7FA0(7, FALSE, FALSE); - PrintCurrentOptionDescription(); - return LT_INC_AND_PAUSE; - case 3: - if (AreMenuOptionSpritesMoving()) - return LT_PAUSE; - if (sub_81C8010()) - return LT_PAUSE; - if (sub_81CA89C()) - return LT_PAUSE; - sub_81CA9D8(); - break; - } - return LT_FINISH; -} - -static u32 LoopedTask_ReturnToConditionMenu(s32 state) -{ - switch (state) - { - case 0: - sub_81CA9C8(); - sub_81CA2DC(); - sub_81C7FC4(7, 0); - return LT_INC_AND_PAUSE; - case 1: - if (AreMenuOptionSpritesMoving()) - return LT_PAUSE; - if (sub_81C8010()) - return LT_PAUSE; - sub_81CA0C8(); - return LT_INC_AND_PAUSE; - case 2: - sub_81CA20C(); - PrintCurrentOptionDescription(); - return LT_INC_AND_PAUSE; - case 3: - if (AreMenuOptionSpritesMoving()) - return LT_PAUSE; - if (sub_81CA89C()) - return LT_PAUSE; - sub_81CA9D8(); - break; - } - return LT_FINISH; -} - -static u32 LoopedTask_SelectRibbonsNoWinners(s32 state) -{ - switch (state) - { - case 0: - PlaySE(SE_HAZURE); - PrintNoRibbonWinners(); - return LT_INC_AND_PAUSE; - case 1: - if (IsDma3ManagerBusyWithBgCopy()) - return LT_PAUSE; - break; - } - return LT_FINISH; -} - -// For redisplaying the Ribbons description to replace the No Ribbon Winners message -static u32 LoopedTask_ReShowDescription(s32 state) -{ - switch (state) - { - case 0: - PlaySE(SE_SELECT); - PrintCurrentOptionDescription(); - return LT_INC_AND_PAUSE; - case 1: - if (IsDma3ManagerBusyWithBgCopy()) - return LT_PAUSE; - break; - } - return LT_FINISH; -} - -// 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) - { - case 0: - PrintHelpBarText(GetHelpBarTextId()); - return LT_INC_AND_PAUSE; - case 1: - if (WaitForHelpBar()) - return LT_PAUSE; - sub_81C7880(); - sub_81CA9C8(); - sub_81CA2DC(); - switch (GetPokenavMenuType()) - { - case POKENAV_MENU_TYPE_CONDITION_SEARCH: - sub_81C7FC4(7, FALSE); - // fallthrough - case POKENAV_MENU_TYPE_CONDITION: - sub_81C7FC4(1, FALSE); - break; - default: - sub_81C7FC4(0, FALSE); - break; - } - PlaySE(SE_SELECT); - return LT_INC_AND_PAUSE; - case 2: - if (AreMenuOptionSpritesMoving()) - return LT_PAUSE; - if (sub_81C8010()) - return LT_PAUSE; - sub_81C7AC0(0); - return LT_INC_AND_PAUSE; - case 3: - if (IsPaletteFadeActive()) - return LT_PAUSE; - break; - } - return LT_FINISH; -} - -static void sub_81C9FC4(void) -{ - s32 i; - - for (i = 0; i < NELEMS(gUnknown_086201C4); i++) - LoadCompressedSpriteSheet(&gUnknown_086201C4[i]); - Pokenav_AllocAndLoadPalettes(gUnknown_086201D4); -} - -static void sub_81C9FEC(void) -{ - FreeSpriteTilesByTag(3); - FreeSpriteTilesByTag(1); - FreeSpritePaletteByTag(4); - FreeSpritePaletteByTag(5); - FreeSpritePaletteByTag(6); - FreeSpritePaletteByTag(7); - FreeSpritePaletteByTag(8); - FreeSpritePaletteByTag(3); - sub_81CA094(); - sub_81CA698(); -} - -static void CreateMenuOptionSprites(void) -{ - s32 i, j; - struct Pokenav2Struct * unk = GetSubstructPtr(2); - - for (i = 0; i < MAX_POKENAV_MENUITEMS; i++) - { - // Each menu option is 4 subsprites - for (j = 0; j < 4; j++) - { - u8 spriteId = CreateSprite(&sMenuOptionSpriteTemplate, 0x8c, 20 * i + 40, 3); - unk->iconSprites[i][j] = &gSprites[spriteId]; - gSprites[spriteId].pos2.x = 32 * j; - } - } -} - -static void sub_81CA094(void) -{ - s32 i, j; - struct Pokenav2Struct * unk = GetSubstructPtr(2); - - for (i = 0; i < MAX_POKENAV_MENUITEMS; i++) - { - for (j = 0; j < 4; j++) - { - FreeSpriteOamMatrix(unk->iconSprites[i][j]); - DestroySprite(unk->iconSprites[i][j]); - } - } -} - -static void sub_81CA0C8(void) -{ - s32 menuType = GetPokenavMenuType(); - 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) -{ - s32 i, j; - struct Pokenav2Struct * unk = GetSubstructPtr(2); - s32 sp04 = GetSpriteTileStartByTag(3); - - for (i = 0; i < MAX_POKENAV_MENUITEMS; i++) - { - if (*a0 != NULL) - { - for (j = 0; j < 4; j++) - { - unk->iconSprites[i][j]->oam.tileNum = (*a0)[0] + sp04 + 8 * j; - unk->iconSprites[i][j]->oam.paletteNum = IndexOfSpritePaletteTag((*a0)[1] + 4); - unk->iconSprites[i][j]->invisible = TRUE; - unk->iconSprites[i][j]->pos1.y = a1; - unk->iconSprites[i][j]->pos1.x = 0x8c; - unk->iconSprites[i][j]->pos2.x = 32 * j; - } - unk->iconVisible[i] = TRUE; - } - else - { - for (j = 0; j < 4; j++) - { - unk->iconSprites[i][j]->invisible = TRUE; - } - unk->iconVisible[i] = FALSE; - } - a0++; - a1 += a2; - } -} - -static void sub_81CA20C(void) -{ - s32 i; - struct Pokenav2Struct * unk = GetSubstructPtr(2); - s32 r8 = GetPokenavCursorPos(); - s32 r7 = 0; - s32 r2; - - for (i = 0; i < MAX_POKENAV_MENUITEMS; i++) - { - if (unk->iconVisible[i]) - { - if (r7++ == r8) - { - r2 = 0x82; - unk->cursorPos = i; - } - else - r2 = 0x8c; - sub_81CA35C(unk->iconSprites[i], 0x100, r2, 0xC); - sub_81CA448(unk->iconSprites[i], FALSE); - } - else - sub_81CA448(unk->iconSprites[i], TRUE); - } -} - -static void sub_81CA278(void) -{ - s32 i; - struct Pokenav2Struct * unk = GetSubstructPtr(2); - s32 r3 = GetPokenavCursorPos(); - s32 r5; - - for (i = 0, r5 = 0; i < MAX_POKENAV_MENUITEMS; i++) - { - if (unk->iconVisible[i]) - { - if (r5 == r3) - { - r5 = i; - break; - } - r5++; - } - } - - sub_81CA35C(unk->iconSprites[unk->cursorPos], 0x82, 0x8c, 0x4); - sub_81CA35C(unk->iconSprites[r5], 0x8c, 0x82, 0x4); - unk->cursorPos = r5; -} - -static void sub_81CA2DC(void) -{ - s32 i; - struct Pokenav2Struct * unk = GetSubstructPtr(2); - - for (i = 0; i < MAX_POKENAV_MENUITEMS; i++) - { - if (unk->iconVisible[i]) - { - if (unk->cursorPos != i) - sub_81CA35C(unk->iconSprites[i], 0x8C, 0x100, 0x8); - else - sub_81CA3B4(unk->iconSprites[i]); - } - } -} - -static bool32 AreMenuOptionSpritesMoving(void) -{ - s32 i; - struct Pokenav2Struct * unk = GetSubstructPtr(2); - - for (i = 0; i < MAX_POKENAV_MENUITEMS; i++) - { - if (unk->iconSprites[i][0]->callback != SpriteCallbackDummy) - return TRUE; - } - - if (unk->otherIconsInMotion) - return TRUE; - - return FALSE; -} - -static void sub_81CA35C(struct Sprite ** sprites, s32 a1, s32 a2, s32 a3) -{ - s32 i; - - for (i = 0; i < 4; i++) - { - (*sprites)->pos1.x = a1; - (*sprites)->data[0] = a3; - (*sprites)->data[1] = 16 * (a2 - a1) / a3; - (*sprites)->data[2] = 16 * a1; - (*sprites)->data[7] = a2; - (*sprites)->callback = sub_81CA474; - sprites++; - } -} - -static void sub_81CA3B4(struct Sprite ** sprites) -{ - s32 i; - struct Pokenav2Struct * unk = GetSubstructPtr(2); - u8 taskId; - - for (i = 0; i < 4; i++) - { - (*sprites)->oam.objMode = ST_OAM_OBJ_BLEND; - (*sprites)->oam.affineMode = ST_OAM_AFFINE_DOUBLE; - (*sprites)->callback = sub_81CA4AC; - (*sprites)->data[0] = 8; - (*sprites)->data[1] = 0; - (*sprites)->data[7] = i; - InitSpriteAffineAnim(sprites[0]); - StartSpriteAffineAnim(sprites[0], 0); - sprites++; - } - - SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(0x10, 0x00)); - taskId = CreateTask(sub_81CA580, 3); - gTasks[taskId].data[0] = 8; - unk->otherIconsInMotion++; -} - -static void sub_81CA448(struct Sprite ** sprites, bool32 a1) -{ - s32 i; - - for (i = 0; i < 4; i++) - { - (*sprites)->invisible = a1; - sprites++; - } -} - -static void sub_81CA474(struct Sprite * sprite) -{ - sprite->data[0]--; - if (sprite->data[0] != -1) - { - sprite->data[2] += sprite->data[1]; - sprite->pos1.x = sprite->data[2] >> 4; - } - else - { - sprite->pos1.x = sprite->data[7]; - sprite->callback = SpriteCallbackDummy; - } -} - -static void sub_81CA4AC(struct Sprite * sprite) -{ - s32 r0; - s32 r1; - if (sprite->data[0] == 0) - { - if (sprite->data[1] == 0) - { - StartSpriteAffineAnim(sprite, 1); - sprite->data[1]++; - sprite->data[2] = 0x100; - sprite->pos1.x += sprite->pos2.x; - sprite->pos2.x = 0; - } - else - { - sprite->data[2] += 16; - r0 = sprite->data[2]; - r1 = r0 >> 3; - r1 = (r1 - 32) / 2; - switch (sprite->data[7]) - { - case 0: - sprite->pos2.x = -r1 * 3; - break; - case 1: - sprite->pos2.x = -r1; - break; - case 2: - sprite->pos2.x = r1; - break; - case 3: - sprite->pos2.x = r1 * 3; - break; - } - if (sprite->affineAnimEnded) - { - sprite->invisible = TRUE; - FreeOamMatrix(sprite->oam.matrixNum); - CalcCenterToCornerVec(sprite, sprite->oam.shape, sprite->oam.size, ST_OAM_AFFINE_OFF); - sprite->oam.affineMode = ST_OAM_AFFINE_OFF; - sprite->oam.objMode = ST_OAM_OBJ_NORMAL; - sprite->callback = SpriteCallbackDummy; - } - } - } - else - { - sprite->data[0]--; - } -} - -static void sub_81CA580(u8 taskId) -{ - s16 * data = gTasks[taskId].data; - - if (data[0] == 0) - { - switch (data[1]) - { - case 0: - data[2] = 16; - data[3] = 0; - SetGpuReg(REG_OFFSET_BLDCNT, BLDCNT_EFFECT_NONE | BLDCNT_TGT2_ALL); - SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(0x10, 0x00)); - data[1]++; - break; - case 1: - if (data[4] & 1) - { - data[2] -= 3; - if (data[2] < 0) - data[2] = 0; - } - else - { - data[3] += 3; - if (data[3] > 16) - data[3] = 16; - } - SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(data[2], data[3])); - data[4]++; - if (data[4] == 12) - { - ((struct Pokenav2Struct *)GetSubstructPtr(2))->otherIconsInMotion--; - SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(0x00, 0x10)); - DestroyTask(taskId); - } - break; - } - } - else - data[0]--; -} - -static void sub_81CA640(void) -{ - struct Pokenav2Struct * ptr = GetSubstructPtr(2); - u8 spriteId = CreateSprite(&gUnknown_0862036C, 0x10, 0x60, 4); - ptr->field_028 = &gSprites[spriteId]; - if (sub_81C98D4()) - ptr->field_028->callback = sub_81CA6AC; - else - ptr->field_028->invisible = TRUE; -} - -static void sub_81CA698(void) -{ - struct Pokenav2Struct * ptr = GetSubstructPtr(2); - DestroySprite(ptr->field_028); -} - -static void sub_81CA6AC(struct Sprite * sprite) -{ - sprite->data[0]++; - if (sprite->data[0] > 8) - { - sprite->data[0] = 0; - sprite->invisible ^= 1; - } -} - -static void AddOptionDescriptionWindow(void) -{ - struct Pokenav2Struct * ptr = GetSubstructPtr(2); - - ptr->optionDescWindowId = AddWindow(&sOptionDescWindowTemplate); - PutWindowTilemap(ptr->optionDescWindowId); - FillWindowPixelBuffer(ptr->optionDescWindowId, PIXEL_FILL(6)); - CopyWindowToVram(ptr->optionDescWindowId, 3); -} - -static void PrintCurrentOptionDescription(void) -{ - struct Pokenav2Struct * ptr = GetSubstructPtr(2); - int menuItem = GetCurrentMenuItemId(); - const u8 * s = sPageDescriptions[menuItem]; - u32 width = GetStringWidth(1, s, -1); - FillWindowPixelBuffer(ptr->optionDescWindowId, PIXEL_FILL(6)); - AddTextPrinterParameterized3(ptr->optionDescWindowId, 1, (192 - width) / 2, 1, sOptionDescTextColors, 0, s); -} - -// Printed when Ribbons is selected if no PC/party mons have ribbons -// Can occur by obtaining a mon with a ribbon and then releasing all ribbon winners -static void PrintNoRibbonWinners(void) -{ - struct Pokenav2Struct * ptr = GetSubstructPtr(2); - const u8 * s = gText_NoRibbonWinners; - u32 width = GetStringWidth(1, s, -1); - FillWindowPixelBuffer(ptr->optionDescWindowId, PIXEL_FILL(6)); - AddTextPrinterParameterized3(ptr->optionDescWindowId, 1, (192 - width) / 2, 1, sOptionDescTextColors2, 0, s); -} - -static bool32 sub_81CA7C4(void) -{ - return IsDma3ManagerBusyWithBgCopy(); -} - -static void sub_81CA7D4(void) -{ - struct Pokenav2Struct * ptr = GetSubstructPtr(2); - ptr->bg3ScrollTaskId = CreateTask(sub_81CA808, 2); -} - -static void sub_81CA7F4(void) -{ - struct Pokenav2Struct * ptr = GetSubstructPtr(2); - DestroyTask(ptr->bg3ScrollTaskId); -} - -static void sub_81CA808(u8 taskId) -{ - ChangeBgX(3, 0x80, 1); -} - -static void sub_81CA818(void) -{ - u8 taskId = CreateTask(sub_81CA8B0, 3); - SetWordTaskArg(taskId, 1, (uintptr_t)(gUnknown_0861FC78 + 1)); - SetWordTaskArg(taskId, 3, (uintptr_t)(gUnknown_0861FC78 + 7)); -} - -static void sub_81CA850(void) -{ - CopyPaletteIntoBufferUnfaded(gUnknown_0861FC78 + 7, 0x31, 4); -} - -static void sub_81CA864(void) -{ - u8 taskId = CreateTask(sub_81CA8B0, 3); - SetWordTaskArg(taskId, 1, (uintptr_t)(gUnknown_0861FC78 + 7)); - SetWordTaskArg(taskId, 3, (uintptr_t)(gUnknown_0861FC78 + 1)); -} - -static bool32 sub_81CA89C(void) -{ - return FuncIsActiveTask(sub_81CA8B0); -} - -static void sub_81CA8B0(u8 taskId) -{ - u16 sp8[2]; - s16 * data = gTasks[taskId].data; - const u16 * pal1 = (const u16 *)GetWordTaskArg(taskId, 1); - const u16 * pal2 = (const u16 *)GetWordTaskArg(taskId, 3); - - sub_81C79BC(pal1, pal2, 2, 12, ++data[0], sp8); - LoadPalette(sp8, 0x31, 4); - if (data[0] == 12) - DestroyTask(taskId); -} - -static void sub_81CA914(void) -{ - TransferPlttBuffer(); - LoadOam(); - ProcessSpriteCopyRequests(); - ScanlineEffect_InitHBlankDmaTransfer(); -} - -static void sub_81CA92C(void) -{ - SetGpuReg(REG_OFFSET_BLDCNT, BLDCNT_TGT1_OBJ | BLDCNT_EFFECT_LIGHTEN); - SetGpuReg(REG_OFFSET_BLDY, 0); - SetGpuRegBits(REG_OFFSET_DISPCNT, DISPCNT_WIN0_ON); - SetGpuRegBits(REG_OFFSET_WININ, 0x3F); - SetGpuRegBits(REG_OFFSET_WINOUT, 0x1F); - SetGpuRegBits(REG_OFFSET_WIN0V, 0xA0); - ScanlineEffect_Stop(); - sub_81CAA3C(); - ScanlineEffect_SetParams(gUnknown_08620384); - SetVBlankCallback_(sub_81CA914); - CreateTask(sub_81CA9EC, 3); -} - -static void sub_81CA994(void) -{ - SetGpuReg(REG_OFFSET_BLDCNT, 0); - ClearGpuRegBits(REG_OFFSET_DISPCNT, DISPCNT_WIN0_ON); - ScanlineEffect_Stop(); - DestroyTask(FindTaskIdByFunc(sub_81CA9EC)); - SetPokenavVBlankCallback(); -} - -static void sub_81CA9C8(void) -{ - SetGpuReg(REG_OFFSET_BLDCNT, 0); -} - -static void sub_81CA9D8(void) -{ - sub_81CAA3C(); - SetGpuReg(REG_OFFSET_BLDCNT, BLDCNT_TGT1_OBJ | BLDCNT_EFFECT_LIGHTEN); -} - -static void sub_81CA9EC(u8 taskId) -{ - s16 * data = gTasks[taskId].data; - data[0]++; - if (data[0] > 0) - { - data[0] = 0; - data[1] += 3; - data[1] &= 0x7F; - SetGpuReg(REG_OFFSET_BLDY, gSineTable[data[1]] >> 5); - } -} - -static void sub_81CAA3C(void) -{ - int menuType = GetPokenavMenuType(); - int cursorPos = GetPokenavCursorPos(); - int r4 = gUnknown_08620240[menuType].unk2 * cursorPos + gUnknown_08620240[menuType].unk0 - 8; - CpuFill16(0, gScanlineEffectRegBuffers[0], 0x140); - CpuFill16(0, gScanlineEffectRegBuffers[1], 0x140); - CpuFill16(RGB(16, 23, 28), &gScanlineEffectRegBuffers[0][r4], 0x20); - CpuFill16(RGB(16, 23, 28), &gScanlineEffectRegBuffers[1][r4], 0x20); -} - -void sub_81CAADC(void) -{ - sub_81CA9C8(); -} diff --git a/src/pokenav_unk_3.c b/src/pokenav_unk_3.c deleted file mode 100755 index 28e84b50b..000000000 --- a/src/pokenav_unk_3.c +++ /dev/null @@ -1,516 +0,0 @@ -#include "global.h" -#include "battle_setup.h" -#include "data.h" -#include "event_data.h" -#include "gym_leader_rematch.h" -#include "international_string_util.h" -#include "main.h" -#include "match_call.h" -#include "overworld.h" -#include "pokemon.h" -#include "pokenav.h" -#include "sound.h" -#include "string_util.h" -#include "strings.h" -#include "constants/flags.h" -#include "constants/songs.h" - -struct Pokenav3Struct -{ - u16 optionCursorPos; - u16 maxOptionId; - const u8 *matchCallOptions; - u16 headerId; - u16 numRegistered; - u16 unkC; - u32 unk10; - u32 unk14; - u32 (*callback)(struct Pokenav3Struct*); - struct PokenavMatchCallEntries matchCallEntries[MAX_REMATCH_ENTRIES - 1]; -}; - -static u32 CB2_HandleMatchCallInput(struct Pokenav3Struct *); -static u32 sub_81CABFC(struct Pokenav3Struct *); -static u32 CB2_HandleMatchCallOptionsInput(struct Pokenav3Struct *); -static u32 CB2_HandleCheckPageInput(struct Pokenav3Struct *); -static u32 CB2_HandleCallInput(struct Pokenav3Struct *); -static u32 sub_81CAD20(s32); -static bool32 sub_81CB1D0(void); - -#include "data/text/match_call_messages.h" - -static const u8 sMatchCallOptionsNoCheckPage[] = -{ - MATCH_CALL_OPTION_CALL, - MATCH_CALL_OPTION_CANCEL -}; - -static const u8 sMatchCallOptionsHasCheckPage[] = -{ - MATCH_CALL_OPTION_CALL, - MATCH_CALL_OPTION_CHECK, - MATCH_CALL_OPTION_CANCEL -}; - -bool32 PokenavCallback_Init_11(void) -{ - struct Pokenav3Struct *state = AllocSubstruct(5, sizeof(struct Pokenav3Struct)); - if (!state) - return FALSE; - - state->callback = CB2_HandleMatchCallInput; - state->headerId = 0; - state->unk10 = 0; - state->unk14 = CreateLoopedTask(sub_81CAD20, 1); - return TRUE; -} - -u32 sub_81CAB24(void) -{ - struct Pokenav3Struct *state = GetSubstructPtr(5); - return state->callback(state); -} - -void sub_81CAB38(void) -{ - FreePokenavSubstruct(5); -} - -static u32 CB2_HandleMatchCallInput(struct Pokenav3Struct *state) -{ - int selection; - - if (gMain.newAndRepeatedKeys & DPAD_UP) - return POKENAV_MC_FUNC_UP; - if (gMain.newAndRepeatedKeys & DPAD_DOWN) - return POKENAV_MC_FUNC_DOWN; - if (gMain.newAndRepeatedKeys & DPAD_LEFT) - return POKENAV_MC_FUNC_PG_UP; - if (gMain.newAndRepeatedKeys & DPAD_RIGHT) - return POKENAV_MC_FUNC_PG_DOWN; - - if (gMain.newKeys & A_BUTTON) - { - state->callback = CB2_HandleMatchCallOptionsInput; - state->optionCursorPos = 0; - selection = GetSelectedMatchCall(); - - if (!state->matchCallEntries[selection].isSpecialTrainer || MatchCall_HasCheckPage(state->matchCallEntries[selection].headerId)) - { - state->matchCallOptions = sMatchCallOptionsHasCheckPage; - state->maxOptionId = ARRAY_COUNT(sMatchCallOptionsHasCheckPage) - 1; - } - else - { - state->matchCallOptions = sMatchCallOptionsNoCheckPage; - state->maxOptionId = ARRAY_COUNT(sMatchCallOptionsNoCheckPage) - 1; - } - - return POKENAV_MC_FUNC_SELECT; - } - - if (gMain.newKeys & B_BUTTON) - { - if (GetPokenavMode() != POKENAV_MODE_FORCE_CALL_READY) - { - state->callback = sub_81CABFC; - return POKENAV_MC_FUNC_EXIT; - } - else - { - // Cant exit Match Call menu before calling Mr Stone during tutorial - PlaySE(SE_HAZURE); - } - } - - return POKENAV_MC_FUNC_NONE; -} - -static u32 sub_81CABFC(struct Pokenav3Struct *state) -{ - return POKENAV_MENU_4; -} - -static u32 CB2_HandleMatchCallOptionsInput(struct Pokenav3Struct *state) -{ - if ((gMain.newKeys & DPAD_UP) && state->optionCursorPos) - { - state->optionCursorPos--; - return POKENAV_MC_FUNC_MOVE_OPTIONS_CURSOR; - } - - if ((gMain.newKeys & DPAD_DOWN) && state->optionCursorPos < state->maxOptionId) - { - state->optionCursorPos++; - return POKENAV_MC_FUNC_MOVE_OPTIONS_CURSOR; - } - - if (gMain.newKeys & A_BUTTON) - { - switch (state->matchCallOptions[state->optionCursorPos]) - { - case MATCH_CALL_OPTION_CANCEL: - state->callback = CB2_HandleMatchCallInput; - return POKENAV_MC_FUNC_CANCEL; - case MATCH_CALL_OPTION_CALL: - if (GetPokenavMode() == POKENAV_MODE_FORCE_CALL_READY) - SetPokenavMode(POKENAV_MODE_FORCE_CALL_EXIT); - - state->callback = CB2_HandleCallInput; - if (sub_81CB1D0()) - return POKENAV_MC_FUNC_NEARBY_MSG; - - return POKENAV_MC_FUNC_CALL_MSG; - case MATCH_CALL_OPTION_CHECK: - state->callback = CB2_HandleCheckPageInput; - return POKENAV_MC_FUNC_SHOW_CHECK_PAGE; - } - } - - if (gMain.newKeys & B_BUTTON) - { - state->callback = CB2_HandleMatchCallInput; - return POKENAV_MC_FUNC_CANCEL; - } - - return POKENAV_MC_FUNC_NONE; -} - -static u32 CB2_HandleCheckPageInput(struct Pokenav3Struct *state) -{ - if (gMain.newAndRepeatedKeys & DPAD_UP) - return POKENAV_MC_FUNC_CHECK_PAGE_UP; - if (gMain.newAndRepeatedKeys & DPAD_DOWN) - return POKENAV_MC_FUNC_CHECK_PAGE_DOWN; - - if (gMain.newKeys & B_BUTTON) - { - state->callback = CB2_HandleMatchCallInput; - return POKENAV_MC_FUNC_EXIT_CHECK_PAGE; - } - - return POKENAV_MC_FUNC_NONE; -} - -static u32 CB2_HandleCallInput(struct Pokenav3Struct *state) -{ - if (gMain.newKeys & (A_BUTTON | B_BUTTON)) - { - state->callback = CB2_HandleMatchCallInput; - return POKENAV_MC_FUNC_10; - } - - return POKENAV_MC_FUNC_NONE; -} - -static u32 sub_81CAD20(s32 taskState) -{ - int i, j; - struct Pokenav3Struct *state = GetSubstructPtr(5); - switch (taskState) - { - case 0: - state->headerId = 0; - state->numRegistered = 0; - return LT_INC_AND_CONTINUE; - case 1: - for (i = 0, j = state->headerId; i < 30; i++, j++) - { - if (MatchCall_GetEnabled(j)) - { - state->matchCallEntries[state->numRegistered].headerId = j; - state->matchCallEntries[state->numRegistered].isSpecialTrainer = TRUE; - state->matchCallEntries[state->numRegistered].mapSec = MatchCall_GetMapSec(j); - state->numRegistered++; - } - - if (++state->headerId >= MC_HEADER_COUNT) - { - state->unkC = state->headerId; - state->headerId = 0; - return LT_INC_AND_CONTINUE; - } - } - - return LT_CONTINUE; - case 2: - for (i = 0, j = state->headerId; i < 30; i++, j++) - { - if (!MatchCall_HasRematchId(state->headerId) && IsRematchEntryRegistered(state->headerId)) - { - state->matchCallEntries[state->numRegistered].headerId = state->headerId; - state->matchCallEntries[state->numRegistered].isSpecialTrainer = FALSE; - state->matchCallEntries[state->numRegistered].mapSec = sub_81CB0C8(j); - state->numRegistered++; - } - - if (++state->headerId > REMATCH_TABLE_ENTRIES - 1) - return LT_INC_AND_CONTINUE; - } - - return LT_CONTINUE; - case 3: - state->unk10 = 1; - break; - } - - return LT_FINISH; -} - -bool32 IsRematchEntryRegistered(int rematchIndex) -{ - if (rematchIndex < REMATCH_TABLE_ENTRIES) - return FlagGet(FLAG_MATCH_CALL_REGISTERED + rematchIndex); - - return FALSE; -} - -int sub_81CAE28(void) -{ - struct Pokenav3Struct *state = GetSubstructPtr(5); - return state->unk10; -} - -int GetNumberRegistered(void) -{ - struct Pokenav3Struct *state = GetSubstructPtr(5); - return state->numRegistered; -} - -int sub_81CAE48(void) -{ - struct Pokenav3Struct *state = GetSubstructPtr(5); - return state->unkC; -} - -int unref_sub_81CAE58(void) -{ - struct Pokenav3Struct *state = GetSubstructPtr(5); - return state->numRegistered - state->unkC; -} - -int unref_sub_81CAE6C(int arg0) -{ - struct Pokenav3Struct *state = GetSubstructPtr(5); - arg0 += state->unkC; - if (arg0 >= state->numRegistered) - return REMATCH_TABLE_ENTRIES; - - return state->matchCallEntries[arg0].headerId; -} - -struct PokenavMatchCallEntries *sub_81CAE94(void) -{ - struct Pokenav3Struct *state = GetSubstructPtr(5); - return state->matchCallEntries; -} - -u16 GetMatchCallMapSec(int index) -{ - struct Pokenav3Struct *state = GetSubstructPtr(5); - return state->matchCallEntries[index].mapSec; -} - -bool32 ShouldDrawRematchPokeballIcon(int index) -{ - struct Pokenav3Struct *state = GetSubstructPtr(5); - if (!state->matchCallEntries[index].isSpecialTrainer) - index = state->matchCallEntries[index].headerId; - else - index = MatchCall_GetRematchTableIdx(state->matchCallEntries[index].headerId); - - if (index == REMATCH_TABLE_ENTRIES) - return FALSE; - - return gSaveBlock1Ptr->trainerRematches[index] != 0; -} - -int GetMatchCallTrainerPic(int index) -{ - int headerId; - struct Pokenav3Struct *state = GetSubstructPtr(5); - if (!state->matchCallEntries[index].isSpecialTrainer) - { - index = GetTrainerIdxByRematchIdx(state->matchCallEntries[index].headerId); - return gTrainers[index].trainerPic; - } - - headerId = state->matchCallEntries[index].headerId; - index = MatchCall_GetRematchTableIdx(headerId); - if (index != REMATCH_TABLE_ENTRIES) - { - index = GetTrainerIdxByRematchIdx(index); - return gTrainers[index].trainerPic; - } - - index = MatchCall_GetOverrideFacilityClass(headerId); - return gFacilityClassToPicIndex[index]; -} - -const u8 *GetMatchCallMessageText(int index, u8 *arg1) -{ - struct Pokenav3Struct *state = GetSubstructPtr(5); - *arg1 = 0; - if (!Overworld_MapTypeAllowsTeleportAndFly(gMapHeader.mapType)) - return gText_CallCantBeMadeHere; - - if (!state->matchCallEntries[index].isSpecialTrainer) - *arg1 = SelectMatchCallMessage(GetTrainerIdxByRematchIdx(state->matchCallEntries[index].headerId), gStringVar4); - else - MatchCall_GetMessage(state->matchCallEntries[index].headerId, gStringVar4); - - return gStringVar4; -} - -const u8 *GetMatchCallFlavorText(int index, int checkPageEntry) -{ - int rematchId; - struct Pokenav3Struct *state = GetSubstructPtr(5); - if (state->matchCallEntries[index].isSpecialTrainer) - { - rematchId = MatchCall_GetRematchTableIdx(state->matchCallEntries[index].headerId); - if (rematchId == REMATCH_TABLE_ENTRIES) - return MatchCall_GetOverrideFlavorText(state->matchCallEntries[index].headerId, checkPageEntry); - } - else - { - rematchId = state->matchCallEntries[index].headerId; - } - - return gMatchCallFlavorTexts[rematchId][checkPageEntry]; -} - -u16 GetMatchCallOptionCursorPos(void) -{ - struct Pokenav3Struct *state = GetSubstructPtr(5); - return state->optionCursorPos; -} - -u16 GetMatchCallOptionId(int optionId) -{ - struct Pokenav3Struct *state = GetSubstructPtr(5); - if (state->maxOptionId < optionId) - return MATCH_CALL_OPTION_COUNT; - - return state->matchCallOptions[optionId]; -} - -void BufferMatchCallNameAndDesc(struct PokenavMatchCallEntries *matchCallEntry, u8 *str) -{ - const u8 *trainerName; - const u8 *className; - if (!matchCallEntry->isSpecialTrainer) - { - int index = GetTrainerIdxByRematchIdx(matchCallEntry->headerId); - const struct Trainer *trainer = &gTrainers[index]; - int class = trainer->trainerClass; - className = gTrainerClassNames[class]; - trainerName = trainer->trainerName; - } - else - { - MatchCall_GetNameAndDesc(matchCallEntry->headerId, &className, &trainerName); - } - - if (className && trainerName) - { - u8 *str2 = sub_81DB494(str, 7, className, 69); - sub_81DB494(str2, 7, trainerName, 51); - } - else - { - sub_81DB494(str, 7, NULL, 120); - } -} - -u8 sub_81CB0C8(int rematchIndex) -{ - int mapGroup = gRematchTable[rematchIndex].mapGroup; - int mapNum = gRematchTable[rematchIndex].mapNum; - return Overworld_GetMapHeaderByGroupAndId(mapGroup, mapNum)->regionMapSectionId; -} - -int GetIndexDeltaOfNextCheckPageDown(int index) -{ - struct Pokenav3Struct *state = GetSubstructPtr(5); - int count = 1; - while (++index < state->numRegistered) - { - if (!state->matchCallEntries[index].isSpecialTrainer) - return count; - if (MatchCall_HasCheckPage(state->matchCallEntries[index].headerId)) - return count; - - count++; - } - - return 0; -} - -int GetIndexDeltaOfNextCheckPageUp(int index) -{ - struct Pokenav3Struct *state = GetSubstructPtr(5); - int count = -1; - while (--index >= 0) - { - if (!state->matchCallEntries[index].isSpecialTrainer) - return count; - if (MatchCall_HasCheckPage(state->matchCallEntries[index].headerId)) - return count; - - count--; - } - - return 0; -} - -bool32 unref_sub_81CB16C(void) -{ - int i; - - for (i = 0; i < REMATCH_TABLE_ENTRIES; i++) - { - if (IsRematchEntryRegistered(i) && gSaveBlock1Ptr->trainerRematches[i]) - return TRUE; - } - - for (i = 0; i < MC_HEADER_COUNT; i++) - { - if (MatchCall_GetEnabled(i)) - { - int index = MatchCall_GetRematchTableIdx(i); - if (gSaveBlock1Ptr->trainerRematches[index]) - return TRUE; - } - } - - return FALSE; -} - -static bool32 sub_81CB1D0(void) -{ - struct Pokenav3Struct *state = GetSubstructPtr(5); - int selection = GetSelectedMatchCall(); - if (!state->matchCallEntries[selection].isSpecialTrainer) - { - if (GetMatchCallMapSec(selection) == gMapHeader.regionMapSectionId) - { - if (!gSaveBlock1Ptr->trainerRematches[state->matchCallEntries[selection].headerId]) - return TRUE; - } - } - else - { - if (state->matchCallEntries[selection].headerId == MC_HEADER_WATTSON) - { - if (GetMatchCallMapSec(selection) == gMapHeader.regionMapSectionId - && FlagGet(FLAG_BADGE05_GET) == TRUE) - { - if (!FlagGet(FLAG_WATTSON_REMATCH_AVAILABLE)) - return TRUE; - } - } - } - - return FALSE; -} diff --git a/src/pokenav_unk_4.c b/src/pokenav_unk_4.c deleted file mode 100755 index aaa1767aa..000000000 --- a/src/pokenav_unk_4.c +++ /dev/null @@ -1,1279 +0,0 @@ -#include "global.h" -#include "bg.h" -#include "data.h" -#include "decompress.h" -#include "dma3.h" -#include "international_string_util.h" -#include "main.h" -#include "match_call.h" -#include "menu.h" -#include "overworld.h" -#include "palette.h" -#include "pokenav.h" -#include "region_map.h" -#include "sound.h" -#include "sprite.h" -#include "string_util.h" -#include "strings.h" -#include "task.h" -#include "text.h" -#include "text_window.h" -#include "trig.h" -#include "window.h" -#include "constants/game_stat.h" -#include "constants/region_map_sections.h" -#include "constants/songs.h" -#include "constants/species.h" - -struct Pokenav4Struct -{ - bool32 (*unk0)(void); - u32 unk4; - u8 filler8[0x6]; - u8 unkE; - u8 unkF; - u16 locWindowId; - u16 infoBoxWindowId; - u16 msgBoxWindowId; - s16 unk16; - u8 unused18; - u8 unk19; - u16 unk1A; - struct Sprite *optionsCursorSprite; - struct Sprite *trainerPicSprite; - u8 unk24[0x800]; - u8 unk824[0x800]; - u8 unk1024[0x800]; - u8 *unk1824; - u8 unk1828[0x800]; - u8 unk2028[0x20]; -}; - -static bool32 sub_81CB310(void); -static u32 sub_81CB324(s32); -static void sub_81CBBB8(void); -static void sub_81CBC1C(void); -static void sub_81CC2B4(void); -static void sub_81CC034(struct Pokenav4Struct *); -static void DrawMatchCallLeftColumnWindows(struct Pokenav4Struct *); -static void UpdateMatchCallInfoBox(struct Pokenav4Struct *); -static void PrintMatchCallLocation(struct Pokenav4Struct *, int); -static void sub_81CC214(void); -static void sub_81CBC38(int); -static void PrintMatchCallSelectionOptions(struct Pokenav4Struct *); -static bool32 sub_81CBFC4(struct Pokenav4Struct *); -static void UpdateCursorGfxPos(struct Pokenav4Struct *, int); -static bool32 IsDma3ManagerBusyWithBgCopy1(struct Pokenav4Struct *); -static void UpdateWindowsReturnToTrainerList(struct Pokenav4Struct *); -static void DrawMsgBoxForMatchCallMsg(struct Pokenav4Struct *); -static bool32 IsDma3ManagerBusyWithBgCopy2(struct Pokenav4Struct *); -static void PrintCallingDots(struct Pokenav4Struct *); -static bool32 WaitForCallingDotsText(struct Pokenav4Struct *); -static void PrintMatchCallMessage(struct Pokenav4Struct *); -static bool32 WaitForMatchCallMessageText(struct Pokenav4Struct *); -static void DrawMsgBoxForCloseByMsg(struct Pokenav4Struct *); -static void PrintTrainerIsCloseBy(struct Pokenav4Struct *); -static bool32 WaitForTrainerIsCloseByText(struct Pokenav4Struct *); -static void DrawSpinningPokenavForCall(struct Pokenav4Struct *); -static bool32 WaitForSpinningPokenav(struct Pokenav4Struct *); -static void UpdateWindowsToShowCheckPage(struct Pokenav4Struct *); -static void LoadCheckPageTrainerPic(struct Pokenav4Struct *); -static bool32 WaitForTrainerPic(struct Pokenav4Struct *); -static void TrainerPicSlideOffscreen(struct Pokenav4Struct *); -static void sub_81CBC64(u8 taskId); -static void TryDrawRematchPokeballIcon(u16 windowId, u32, u32); -static void PrintNumberRegisteredLabel(u16 windowId); -static void PrintNumberRegistered(u16 windowId); -static void PrintNumberOfBattlesLabel(u16 windowId); -static void PrintNumberOfBattles(u16 windowId); -static void PrintMatchCallInfoLabel(u16 windowId, const u8 *str, int top); -static void PrintMatchCallInfoNumber(u16 windowId, const u8 *str, int top); -static void sub_81CC2F0(struct Pokenav4Struct *, int); -static void CloseMatchCallSelectOptionsWindow(struct Pokenav4Struct *); -static struct Sprite *CreateTrainerPicSprite(void); -static void SpriteCB_TrainerPicSlideOnscreen(struct Sprite *sprite); -static void SpriteCB_TrainerPicSlideOffscreen(struct Sprite *sprite); -void SpriteCB_OptionsCursor(struct Sprite *sprite); -u32 MatchCallListCursorDown(s32); -u32 MatchCallListCursorUp(s32); -u32 MatchCallListPageDown(s32); -u32 MatchCallListPageUp(s32); -u32 SelectMatchCallEntry(s32); -u32 MoveMatchCallOptionsCursor(s32); -static u32 CancelMatchCallSelection(s32); -u32 DoMatchCallMessage(s32); -u32 DoTrainerCloseByMessage(s32); -u32 sub_81CB888(s32); -u32 ShowCheckPage(s32); -u32 ShowCheckPageUp(s32); -u32 ShowCheckPageDown(s32); -u32 ExitCheckPage(s32); -u32 ExitMatchCall(s32); - -static const u16 sMatchCallUI_Pal[] = INCBIN_U16("graphics/pokenav/ui_matchcall.gbapal"); -static const u32 sMatchCallUI_Gfx[] = INCBIN_U32("graphics/pokenav/ui_matchcall.4bpp.lz"); -static const u32 sMatchCallUI_Tilemap[] = INCBIN_U32("graphics/pokenav/ui_matchcall.bin.lz"); -static const u16 gUnknown_08622698[] = INCBIN_U16("graphics/pokenav/arrow2.gbapal"); -static const u32 gUnknown_086226B8[] = INCBIN_U32("graphics/pokenav/arrow2.4bpp.lz"); -static const u16 gUnknown_086226E0[] = INCBIN_U16("graphics/pokenav/86226E0.gbapal"); -static const u16 gUnknown_08622700[] = INCBIN_U16("graphics/pokenav/8622700.gbapal"); -static const u16 gUnknown_08622720[] = INCBIN_U16("graphics/pokenav/pokeball_matchcall.gbapal"); -static const u32 gUnknown_08622760[] = INCBIN_U32("graphics/pokenav/pokeball_matchcall.4bpp.lz"); - -const struct BgTemplate gUnknown_0862278C[3] = -{ - { - .bg = 1, - .charBaseIndex = 3, - .mapBaseIndex = 0x1F, - .screenSize = 0, - .paletteMode = 0, - .priority = 1, - .baseTile = 0 - }, - { - .bg = 2, - .charBaseIndex = 2, - .mapBaseIndex = 0x06, - .screenSize = 0, - .paletteMode = 0, - .priority = 2, - .baseTile = 0x80 - }, - { - .bg = 3, - .charBaseIndex = 1, - .mapBaseIndex = 0x07, - .screenSize = 0, - .paletteMode = 0, - .priority = 3, - .baseTile = 0 - } -}; - -static const LoopedTask sMatchCallLoopTaskFuncs[] = -{ - [POKENAV_MC_FUNC_NONE] = NULL, - [POKENAV_MC_FUNC_DOWN] = MatchCallListCursorDown, - [POKENAV_MC_FUNC_UP] = MatchCallListCursorUp, - [POKENAV_MC_FUNC_PG_DOWN] = MatchCallListPageDown, - [POKENAV_MC_FUNC_PG_UP] = MatchCallListPageUp, - [POKENAV_MC_FUNC_SELECT] = SelectMatchCallEntry, - [POKENAV_MC_FUNC_MOVE_OPTIONS_CURSOR] = MoveMatchCallOptionsCursor, - [POKENAV_MC_FUNC_CANCEL] = CancelMatchCallSelection, - [POKENAV_MC_FUNC_CALL_MSG] = DoMatchCallMessage, - [POKENAV_MC_FUNC_NEARBY_MSG] = DoTrainerCloseByMessage, - [POKENAV_MC_FUNC_10] = sub_81CB888, - [POKENAV_MC_FUNC_SHOW_CHECK_PAGE] = ShowCheckPage, - [POKENAV_MC_FUNC_CHECK_PAGE_UP] = ShowCheckPageUp, - [POKENAV_MC_FUNC_CHECK_PAGE_DOWN] = ShowCheckPageDown, - [POKENAV_MC_FUNC_EXIT_CHECK_PAGE] = ExitCheckPage, - [POKENAV_MC_FUNC_EXIT] = ExitMatchCall -}; - -static const struct WindowTemplate sMatchCallLocationWindowTemplate = -{ - .bg = 2, - .tilemapLeft = 0, - .tilemapTop = 5, - .width = 11, - .height = 2, - .paletteNum = 2, - .baseBlock = 16 -}; - -static const struct WindowTemplate sMatchCallInfoBoxWindowTemplate = -{ - .bg = 2, - .tilemapLeft = 0, - .tilemapTop = 9, - .width = 11, - .height = 8, - .paletteNum = 2, - .baseBlock = 38 -}; - -static const u8 *const sMatchCallOptionTexts[MATCH_CALL_OPTION_COUNT] = -{ - [MATCH_CALL_OPTION_CALL] = gText_Call, - [MATCH_CALL_OPTION_CHECK] = gText_Check, - [MATCH_CALL_OPTION_CANCEL] = gText_Cancel6 -}; - -// The series of 5 dots that appear when someone is called with Match Call -static const u8 sText_CallingDots[] = _("·{PAUSE 0x04}·{PAUSE 0x04}·{PAUSE 0x04}·{PAUSE 0x04}·\p"); - -static const struct WindowTemplate sCallMsgBoxWindowTemplate = -{ - .bg = 1, - .tilemapLeft = 1, - .tilemapTop = 12, - .width = 0x1C, - .height = 0x04, - .paletteNum = 1, - .baseBlock = 10 -}; - -const struct CompressedSpriteSheet gUnknown_08622810[1] = -{ - {gUnknown_086226B8, 0x40, 7} -}; - -const struct SpritePalette gUnknown_08622818[2] = -{ - {gUnknown_08622698, 12} -}; - -static const struct OamData sOptionsCursorOamData = -{ - .y = 0, - .affineMode = ST_OAM_AFFINE_OFF, - .objMode = ST_OAM_OBJ_NORMAL, - .bpp = ST_OAM_4BPP, - .shape = SPRITE_SHAPE(8x16), - .x = 0, - .size = SPRITE_SIZE(8x16), - .tileNum = 0, - .priority = 1, - .paletteNum = 0, -}; - -static const struct SpriteTemplate sOptionsCursorSpriteTemplate = -{ - .tileTag = 7, - .paletteTag = 12, - .oam = &sOptionsCursorOamData, - .anims = gDummySpriteAnimTable, - .images = NULL, - .affineAnims = gDummySpriteAffineAnimTable, - .callback = SpriteCB_OptionsCursor, -}; - -static const struct OamData sTrainerPicOamData = -{ - .y = 0, - .affineMode = ST_OAM_AFFINE_OFF, - .objMode = ST_OAM_OBJ_NORMAL, - .bpp = ST_OAM_4BPP, - .shape = SPRITE_SHAPE(64x64), - .x = 0, - .size = SPRITE_SIZE(64x64), - .tileNum = 0, - .priority = 1, - .paletteNum = 0, -}; - -static const struct SpriteTemplate sTrainerPicSpriteTemplate = -{ - .tileTag = 8, - .paletteTag = 13, - .oam = &sTrainerPicOamData, - .anims = gDummySpriteAnimTable, - .images = NULL, - .affineAnims = gDummySpriteAffineAnimTable, - .callback = SpriteCallbackDummy, -}; - -bool32 sub_81CB260(void) -{ - struct Pokenav4Struct *state = AllocSubstruct(6, sizeof(struct Pokenav4Struct)); - if (!state) - return FALSE; - - state->unk19 = 0; - state->unk4 = CreateLoopedTask(sub_81CB324, 1); - state->unk0 = sub_81CB310; - return TRUE; -} - -void CreateMatchCallLoopedTask(s32 index) -{ - struct Pokenav4Struct *state = GetSubstructPtr(6); - state->unk4 = CreateLoopedTask(sMatchCallLoopTaskFuncs[index], 1); - state->unk0 = sub_81CB310; -} - -u32 sub_81CB2CC(void) -{ - struct Pokenav4Struct *state = GetSubstructPtr(6); - return state->unk0(); -} - -void sub_81CB2E0(void) -{ - struct Pokenav4Struct *state = GetSubstructPtr(6); - sub_81CC2B4(); - sub_81CBC1C(); - RemoveWindow(state->infoBoxWindowId); - RemoveWindow(state->locWindowId); - RemoveWindow(state->msgBoxWindowId); - FreePokenavSubstruct(6); -} - -static bool32 sub_81CB310(void) -{ - struct Pokenav4Struct *state = GetSubstructPtr(6); - return IsLoopedTaskActive(state->unk4); -} - -static u32 sub_81CB324(s32 taskState) -{ - struct Pokenav4Struct *state = GetSubstructPtr(6); - switch (taskState) - { - case 0: - InitBgTemplates(gUnknown_0862278C, ARRAY_COUNT(gUnknown_0862278C)); - ChangeBgX(2, 0, 0); - ChangeBgY(2, 0, 0); - decompress_and_copy_tile_data_to_vram(2, sMatchCallUI_Gfx, 0, 0, 0); - SetBgTilemapBuffer(2, state->unk1024); - CopyToBgTilemapBuffer(2, sMatchCallUI_Tilemap, 0, 0); - CopyBgTilemapBufferToVram(2); - CopyPaletteIntoBufferUnfaded(sMatchCallUI_Pal, 0x20, 0x20); - CopyBgTilemapBufferToVram(2); - return LT_INC_AND_PAUSE; - case 1: - if (free_temp_tile_data_buffers_if_possible()) - return LT_PAUSE; - - sub_8199DF0(1, 0, 0, 1); - SetBgTilemapBuffer(1, state->unk24); - FillBgTilemapBufferRect_Palette0(1, 0x1000, 0, 0, 32, 20); - CopyPaletteIntoBufferUnfaded(gUnknown_086226E0, 0x10, 0x20); - CopyBgTilemapBufferToVram(1); - return LT_INC_AND_PAUSE; - case 2: - if (free_temp_tile_data_buffers_if_possible()) - return LT_PAUSE; - - sub_81CC034(state); - decompress_and_copy_tile_data_to_vram(3, gUnknown_08622760, 0, 0, 0); - CopyPaletteIntoBufferUnfaded(gUnknown_08622700, 0x30, 0x20); - CopyPaletteIntoBufferUnfaded(gUnknown_08622720, 0x50, 0x20); - return LT_INC_AND_PAUSE; - case 3: - if (free_temp_tile_data_buffers_if_possible() || !sub_81CAE28()) - return LT_PAUSE; - - sub_81CBBB8(); - return LT_INC_AND_PAUSE; - case 4: - if (sub_81C8224()) - return LT_PAUSE; - - DrawMatchCallLeftColumnWindows(state); - return LT_INC_AND_PAUSE; - case 5: - UpdateMatchCallInfoBox(state); - PrintMatchCallLocation(state, 0); - return LT_INC_AND_PAUSE; - case 6: - ChangeBgX(1, 0, 0); - ChangeBgY(1, 0, 0); - ShowBg(2); - ShowBg(3); - ShowBg(1); - sub_81CC214(); - LoadLeftHeaderGfxForIndex(3); - sub_81C7FA0(3, 1, 0); - sub_81C7AC0(1); - return LT_INC_AND_PAUSE; - case 7: - if (IsPaletteFadeActive() || sub_81C8010()) - return LT_PAUSE; - - sub_81CBC38(1); - return LT_FINISH; - default: - return LT_FINISH; - } -} - -u32 MatchCallListCursorDown(s32 taskState) -{ - struct Pokenav4Struct *state = GetSubstructPtr(6); - switch (taskState) - { - case 0: - switch (MatchCall_MoveCursorDown()) - { - case 0: - break; - case 1: - PlaySE(SE_SELECT); - return 7; - case 2: - PlaySE(SE_SELECT); - // fall through - default: - return LT_INC_AND_PAUSE; - } - break; - case 1: - if (sub_81C8630()) - return LT_PAUSE; - - PrintMatchCallLocation(state, 0); - return LT_INC_AND_PAUSE; - case 2: - PrintMatchCallLocation(state, 0); - return LT_INC_AND_PAUSE; - case 3: - if (IsDma3ManagerBusyWithBgCopy()) - return LT_PAUSE; - break; - } - return LT_FINISH; -} - -u32 MatchCallListCursorUp(s32 taskState) -{ - struct Pokenav4Struct *state = GetSubstructPtr(6); - switch (taskState) - { - case 0: - switch (MatchCall_MoveCursorUp()) - { - case 0: - break; - case 1: - PlaySE(SE_SELECT); - return 7; - case 2: - PlaySE(SE_SELECT); - // fall through - default: - return LT_INC_AND_PAUSE; - } - break; - case 1: - if (sub_81C8630()) - return LT_PAUSE; - - PrintMatchCallLocation(state, 0); - return LT_INC_AND_PAUSE; - case 2: - PrintMatchCallLocation(state, 0); - return LT_INC_AND_PAUSE; - case 3: - if (IsDma3ManagerBusyWithBgCopy()) - return LT_PAUSE; - break; - } - return LT_FINISH; -} - -u32 MatchCallListPageDown(s32 taskState) -{ - struct Pokenav4Struct *state = GetSubstructPtr(6); - switch (taskState) - { - case 0: - switch (MatchCall_PageDown()) - { - case 0: - break; - case 1: - PlaySE(SE_SELECT); - return 7; - case 2: - PlaySE(SE_SELECT); - // fall through - default: - return LT_INC_AND_PAUSE; - } - break; - case 1: - if (sub_81C8630()) - return LT_PAUSE; - - PrintMatchCallLocation(state, 0); - return LT_INC_AND_PAUSE; - case 2: - PrintMatchCallLocation(state, 0); - return LT_INC_AND_PAUSE; - case 3: - if (IsDma3ManagerBusyWithBgCopy()) - return LT_PAUSE; - break; - } - return LT_FINISH; -} - -u32 MatchCallListPageUp(s32 taskState) -{ - struct Pokenav4Struct *state = GetSubstructPtr(6); - switch (taskState) - { - case 0: - switch (MatchCall_PageUp()) - { - case 0: - break; - case 1: - PlaySE(SE_SELECT); - return 7; - case 2: - PlaySE(SE_SELECT); - // fall through - default: - return LT_INC_AND_PAUSE; - } - break; - case 1: - if (sub_81C8630()) - return LT_PAUSE; - - PrintMatchCallLocation(state, 0); - return LT_INC_AND_PAUSE; - case 2: - PrintMatchCallLocation(state, 0); - return LT_INC_AND_PAUSE; - case 3: - if (IsDma3ManagerBusyWithBgCopy()) - return LT_PAUSE; - break; - } - return LT_FINISH; -} - -u32 SelectMatchCallEntry(s32 taskState) -{ - struct Pokenav4Struct *state = GetSubstructPtr(6); - switch (taskState) - { - case 0: - PlaySE(SE_SELECT); - PrintMatchCallSelectionOptions(state); - PrintHelpBarText(HELPBAR_MC_CALL_MENU); - return LT_INC_AND_PAUSE; - case 1: - if (sub_81CBFC4(state)) - return LT_PAUSE; - break; - } - - return LT_FINISH; -} - -u32 MoveMatchCallOptionsCursor(s32 taskState) -{ - struct Pokenav4Struct *state; - u16 cursorPos; - - PlaySE(SE_SELECT); - state = GetSubstructPtr(6); - cursorPos = GetMatchCallOptionCursorPos(); - UpdateCursorGfxPos(state, cursorPos); - return LT_FINISH; -} - -u32 CancelMatchCallSelection(s32 taskState) -{ - struct Pokenav4Struct *state = GetSubstructPtr(6); - switch (taskState) - { - case 0: - PlaySE(SE_SELECT); - UpdateWindowsReturnToTrainerList(state); - PrintHelpBarText(HELPBAR_MC_TRAINER_LIST); - return LT_INC_AND_PAUSE; - case 1: - if (IsDma3ManagerBusyWithBgCopy1(state)) - return LT_PAUSE; - break; - } - - return LT_FINISH; -} - -u32 DoMatchCallMessage(s32 taskState) -{ - struct Pokenav4Struct *state = GetSubstructPtr(6); - switch (taskState) - { - case 0: - ToggleMatchCallVerticalArrows(TRUE); - DrawMsgBoxForMatchCallMsg(state); - return LT_INC_AND_PAUSE; - case 1: - if (IsDma3ManagerBusyWithBgCopy2(state)) - return LT_PAUSE; - - PrintCallingDots(state); - PlaySE(SE_TOREEYE); - state->unkE = 0; - return LT_INC_AND_PAUSE; - case 2: - if (WaitForCallingDotsText(state)) - return LT_PAUSE; - - PrintMatchCallMessage(state); - return LT_INC_AND_PAUSE; - case 3: - if (WaitForMatchCallMessageText(state)) - return LT_PAUSE; - break; - } - - return LT_FINISH; -} - -u32 DoTrainerCloseByMessage(s32 taskState) -{ - struct Pokenav4Struct *state = GetSubstructPtr(6); - switch (taskState) - { - case 0: - PlaySE(SE_SELECT); - DrawMsgBoxForCloseByMsg(state); - ToggleMatchCallVerticalArrows(TRUE); - state->unkE = 1; - return LT_INC_AND_PAUSE; - case 1: - if (IsDma3ManagerBusyWithBgCopy2(state)) - return LT_PAUSE; - - PrintTrainerIsCloseBy(state); - return LT_INC_AND_PAUSE; - case 2: - if (WaitForTrainerIsCloseByText(state)) - return LT_PAUSE; - break; - } - - return LT_FINISH; -} - -u32 sub_81CB888(s32 taskState) -{ - struct Pokenav4Struct *state = GetSubstructPtr(6); - u32 result = LT_INC_AND_PAUSE; - - switch (taskState) - { - case 0: - if (!state->unkE) - PlaySE(SE_TOREOFF); - - PlaySE(SE_SELECT); - break; - case 1: - DrawSpinningPokenavForCall(state); - break; - case 2: - if (WaitForSpinningPokenav(state)) - result = LT_PAUSE; - break; - case 3: - UpdateWindowsReturnToTrainerList(state); - break; - case 4: - if (IsDma3ManagerBusyWithBgCopy1(state)) - result = LT_PAUSE; - - PrintHelpBarText(HELPBAR_MC_TRAINER_LIST); - break; - case 5: - if (WaitForHelpBar()) - { - result = LT_PAUSE; - } - else - { - if (state->unkF) - { - sub_81C8838(); - result = LT_INC_AND_CONTINUE; - } - else - { - ToggleMatchCallVerticalArrows(FALSE); - result = LT_FINISH; - } - } - break; - case 6: - if (IsDma3ManagerBusyWithBgCopy()) - { - result = LT_PAUSE; - } - else - { - ToggleMatchCallVerticalArrows(FALSE); - result = LT_FINISH; - } - break; - } - - return result; -} - -u32 ShowCheckPage(s32 taskState) -{ - struct Pokenav4Struct *state = GetSubstructPtr(6); - switch (taskState) - { - case 0: - PlaySE(SE_SELECT); - sub_81C877C(); - UpdateWindowsToShowCheckPage(state); - return LT_INC_AND_PAUSE; - case 1: - if (sub_81C8820() || IsDma3ManagerBusyWithBgCopy1(state)) - return LT_PAUSE; - - PrintHelpBarText(HELPBAR_MC_CHECK_PAGE); - return LT_INC_AND_PAUSE; - case 2: - PrintCheckPageInfo(0); - LoadCheckPageTrainerPic(state); - return LT_INC_AND_PAUSE; - case 3: - if (sub_81C8820() || WaitForTrainerPic(state) || WaitForHelpBar()) - return LT_PAUSE; - break; - } - - return LT_FINISH; -} - -u32 ShowCheckPageDown(s32 taskState) -{ - int topId; - int delta; - struct Pokenav4Struct *state = GetSubstructPtr(6); - switch (taskState) - { - case 0: - topId = GetMatchCallListTopIndex(); - delta = GetIndexDeltaOfNextCheckPageDown(topId); - if (delta) - { - PlaySE(SE_SELECT); - state->unk16 = delta; - TrainerPicSlideOffscreen(state); - return LT_INC_AND_PAUSE; - } - break; - case 1: - if (WaitForTrainerPic(state)) - return LT_PAUSE; - - PrintMatchCallLocation(state, state->unk16); - return LT_INC_AND_PAUSE; - case 2: - PrintCheckPageInfo(state->unk16); - return LT_INC_AND_PAUSE; - case 3: - LoadCheckPageTrainerPic(state); - return LT_INC_AND_PAUSE; - case 4: - if (sub_81C8820() || WaitForTrainerPic(state)) - return LT_PAUSE; - break; - } - - return LT_FINISH; -} - -u32 ExitCheckPage(s32 taskState) -{ - struct Pokenav4Struct *state = GetSubstructPtr(6); - switch (taskState) - { - case 0: - PlaySE(SE_SELECT); - TrainerPicSlideOffscreen(state); - sub_81C87F0(); - return LT_INC_AND_PAUSE; - case 1: - if (sub_81C8820() || WaitForTrainerPic(state)) - return LT_PAUSE; - - PrintHelpBarText(HELPBAR_MC_TRAINER_LIST); - UpdateMatchCallInfoBox(state); - return LT_INC_AND_PAUSE; - case 2: - if (IsDma3ManagerBusyWithBgCopy()) - return LT_PAUSE; - break; - } - - return LT_FINISH; -} - -u32 ShowCheckPageUp(s32 taskState) -{ - int topId; - int delta; - struct Pokenav4Struct *state = GetSubstructPtr(6); - switch (taskState) - { - case 0: - topId = GetMatchCallListTopIndex(); - delta = GetIndexDeltaOfNextCheckPageUp(topId); - if (delta) - { - PlaySE(SE_SELECT); - state->unk16 = delta; - TrainerPicSlideOffscreen(state); - return LT_INC_AND_PAUSE; - } - break; - case 1: - if (WaitForTrainerPic(state)) - return LT_PAUSE; - - PrintMatchCallLocation(state, state->unk16); - return LT_INC_AND_PAUSE; - case 2: - PrintCheckPageInfo(state->unk16); - return LT_INC_AND_PAUSE; - case 3: - LoadCheckPageTrainerPic(state); - return LT_INC_AND_PAUSE; - case 4: - if (sub_81C8820() || WaitForTrainerPic(state)) - return LT_PAUSE; - break; - } - - return LT_FINISH; -} - -u32 ExitMatchCall(s32 taskState) -{ - switch (taskState) - { - case 0: - PlaySE(SE_SELECT); - sub_81CBC38(0); - sub_81C7AC0(0); - sub_81C78A0(); - return LT_INC_AND_PAUSE; - case 1: - if (IsPaletteFadeActive() || MainMenuLoopedTaskIsBusy()) - return LT_PAUSE; - - sub_81C7FDC(); - break; - } - - return LT_FINISH; -} - -static void sub_81CBBB8(void) -{ - struct PokenavListTemplate template; - template.list.matchCallEntries = sub_81CAE94(); - template.unk4 = GetNumberRegistered(); - template.unk8 = 4; - template.unk6 = 0; - template.unk9 = 13; - template.unkA = 16; - template.unkB = 1; - template.unkC = 8; - template.unkD = 3; - template.unkE = 7; - template.listFunc.unk10_2 = BufferMatchCallNameAndDesc; - template.unk14 = TryDrawRematchPokeballIcon; - sub_81C81D4(&gUnknown_0862278C[2], &template, 2); - CreateTask(sub_81CBC64, 7); -} - -static void sub_81CBC1C(void) -{ - sub_81C8234(); - DestroyTask(FindTaskIdByFunc(sub_81CBC64)); -} - -static void sub_81CBC38(int arg0) -{ - u8 taskId = FindTaskIdByFunc(sub_81CBC64); - if (taskId != 0xFF) - gTasks[taskId].data[15] = arg0; -} - -static void sub_81CBC64(u8 taskId) -{ - s16 *taskData = gTasks[taskId].data; - if (taskData[15]) - { - taskData[0] += 4; - taskData[0] &= 0x7F; - taskData[1] = gSineTable[taskData[0]] >> 4; - sub_81C79BC(gUnknown_08622720, gUnknown_08622720 + 0x10, 0x10, 0x10, taskData[1], gPlttBufferUnfaded + 0x50); - if (!gPaletteFade.active) - CpuCopy32(gPlttBufferUnfaded + 0x50, gPlttBufferFaded + 0x50, 0x20); - } -} - -static void TryDrawRematchPokeballIcon(u16 windowId, u32 rematchId, u32 arg2) -{ - u8 bg = GetWindowAttribute(windowId, WINDOW_BG); - u16 *tilemap = GetBgTilemapBuffer(bg); - tilemap += arg2 * 0x40 + 0x1D; - if (ShouldDrawRematchPokeballIcon(rematchId)) - { - tilemap[0] = 0x5000; - tilemap[0x20] = 0x5001; - } - else - { - tilemap[0] = 0x5002; - tilemap[0x20] = 0x5002; - } -} - -void ClearRematchPokeballIcon(u16 windowId, u32 arg0) -{ - u8 bg = GetWindowAttribute(windowId, WINDOW_BG); - u16 *tilemap = GetBgTilemapBuffer(bg); - tilemap += arg0 * 0x40 + 0x1D; - tilemap[0] = 0x5002; - tilemap[0x20] = 0x5002; -} - -static void DrawMatchCallLeftColumnWindows(struct Pokenav4Struct *state) -{ - state->locWindowId = AddWindow(&sMatchCallLocationWindowTemplate); - state->infoBoxWindowId = AddWindow(&sMatchCallInfoBoxWindowTemplate); - FillWindowPixelBuffer(state->locWindowId, PIXEL_FILL(1)); - PutWindowTilemap(state->locWindowId); - FillWindowPixelBuffer(state->infoBoxWindowId, PIXEL_FILL(1)); - PutWindowTilemap(state->infoBoxWindowId); - CopyWindowToVram(state->locWindowId, 1); -} - -static void UpdateMatchCallInfoBox(struct Pokenav4Struct *state) -{ - FillWindowPixelBuffer(state->infoBoxWindowId, PIXEL_FILL(1)); - PrintNumberRegisteredLabel(state->infoBoxWindowId); - PrintNumberRegistered(state->infoBoxWindowId); - PrintNumberOfBattlesLabel(state->infoBoxWindowId); - PrintNumberOfBattles(state->infoBoxWindowId); - CopyWindowToVram(state->infoBoxWindowId, 2); -} - -static void PrintNumberRegisteredLabel(u16 windowId) -{ - PrintMatchCallInfoLabel(windowId, gText_NumberRegistered, 0); -} - -static void PrintNumberRegistered(u16 windowId) -{ - u8 str[3]; - ConvertIntToDecimalStringN(str, GetNumberRegistered(), STR_CONV_MODE_LEFT_ALIGN, 3); - PrintMatchCallInfoNumber(windowId, str, 1); -} - -static void PrintNumberOfBattlesLabel(u16 windowId) -{ - PrintMatchCallInfoLabel(windowId, gText_NumberOfBattles, 2); -} - -static void PrintNumberOfBattles(u16 windowId) -{ - u8 str[5]; - int numTrainerBattles = GetGameStat(GAME_STAT_TRAINER_BATTLES); - if (numTrainerBattles > 99999) - numTrainerBattles = 99999; - - ConvertIntToDecimalStringN(str, numTrainerBattles, STR_CONV_MODE_LEFT_ALIGN, 5); - PrintMatchCallInfoNumber(windowId, str, 3); -} - -static void PrintMatchCallInfoLabel(u16 windowId, const u8 *str, int top) -{ - int y = top * 16 + 1; - AddTextPrinterParameterized(windowId, 7, str, 2, y, TEXT_SPEED_FF, NULL); -} - -static void PrintMatchCallInfoNumber(u16 windowId, const u8 *str, int top) -{ - int x = GetStringRightAlignXOffset(7, str, 86); - int y = top * 16 + 1; - AddTextPrinterParameterized(windowId, 7, str, x, y, TEXT_SPEED_FF, NULL); -} - -static void PrintMatchCallLocation(struct Pokenav4Struct *state, int arg1) -{ - u8 mapName[32]; - int x; - int index = GetSelectedMatchCall() + arg1; - int mapSec = GetMatchCallMapSec(index); - if (mapSec != MAPSEC_NONE) - GetMapName(mapName, mapSec, 0); - else - StringCopy(mapName, gText_Unknown); - - x = GetStringCenterAlignXOffset(7, mapName, 88); - FillWindowPixelBuffer(state->locWindowId, PIXEL_FILL(1)); - AddTextPrinterParameterized(state->locWindowId, 7, mapName, x, 1, 0, NULL); -} - -static void PrintMatchCallSelectionOptions(struct Pokenav4Struct *state) -{ - u32 i; - - FillWindowPixelBuffer(state->infoBoxWindowId, PIXEL_FILL(1)); - for (i = 0; i < MATCH_CALL_OPTION_COUNT; i++) - { - int optionText = GetMatchCallOptionId(i); - if (optionText == MATCH_CALL_OPTION_COUNT) - break; - - AddTextPrinterParameterized(state->infoBoxWindowId, 7, sMatchCallOptionTexts[optionText], 16, i * 16 + 1, TEXT_SPEED_FF, NULL); - } - - CopyWindowToVram(state->infoBoxWindowId, 2); -} - -static bool32 sub_81CBFC4(struct Pokenav4Struct *state) -{ - if (!IsDma3ManagerBusyWithBgCopy()) - { - sub_81CC2F0(state, GetMatchCallOptionCursorPos()); - return FALSE; - } - - return TRUE; -} - -static void UpdateWindowsReturnToTrainerList(struct Pokenav4Struct *state) -{ - CloseMatchCallSelectOptionsWindow(state); - UpdateMatchCallInfoBox(state); -} - -static bool32 IsDma3ManagerBusyWithBgCopy1(struct Pokenav4Struct *state) -{ - return IsDma3ManagerBusyWithBgCopy(); -} - -static void UpdateWindowsToShowCheckPage(struct Pokenav4Struct *state) -{ - CloseMatchCallSelectOptionsWindow(state); - FillWindowPixelBuffer(state->infoBoxWindowId, PIXEL_FILL(1)); - CopyWindowToVram(state->infoBoxWindowId, 2); -} - -static void sub_81CC034(struct Pokenav4Struct *state) -{ - state->msgBoxWindowId = AddWindow(&sCallMsgBoxWindowTemplate); - sub_8197184(state->msgBoxWindowId, 1, 4); - sub_81C7B40(); -} - -static void DrawMsgBoxForMatchCallMsg(struct Pokenav4Struct *state) -{ - struct Sprite *sprite; - sub_8197184(state->msgBoxWindowId, 1, 4); - sub_81971C4(state->msgBoxWindowId, 1, 4); - FillWindowPixelBuffer(state->msgBoxWindowId, PIXEL_FILL(1)); - PutWindowTilemap(state->msgBoxWindowId); - CopyWindowToVram(state->msgBoxWindowId, 3); - sprite = PauseSpinningPokenavSprite(); - sprite->pos1.x = 24; - sprite->pos1.y = 112; - sprite->pos2.y = 0; -} - -static void DrawMsgBoxForCloseByMsg(struct Pokenav4Struct *state) -{ - LoadUserWindowBorderGfx(state->msgBoxWindowId, 1, 0x40); - DrawTextBorderOuter(state->msgBoxWindowId, 1, 4); - FillWindowPixelBuffer(state->msgBoxWindowId, PIXEL_FILL(1)); - PutWindowTilemap(state->msgBoxWindowId); - CopyWindowToVram(state->msgBoxWindowId, 3); -} - -static bool32 IsDma3ManagerBusyWithBgCopy2(struct Pokenav4Struct *state) -{ - return IsDma3ManagerBusyWithBgCopy(); -} - -static void PrintCallingDots(struct Pokenav4Struct *state) -{ - AddTextPrinterParameterized(state->msgBoxWindowId, 1, sText_CallingDots, 32, 1, 1, NULL); -} - -static bool32 WaitForCallingDotsText(struct Pokenav4Struct *state) -{ - RunTextPrinters(); - return IsTextPrinterActive(state->msgBoxWindowId); -} - -static void PrintTrainerIsCloseBy(struct Pokenav4Struct *state) -{ - AddTextPrinterParameterized(state->msgBoxWindowId, 1, gText_TrainerCloseBy, 0, 1, 1, NULL); -} - -static bool32 WaitForTrainerIsCloseByText(struct Pokenav4Struct *state) -{ - RunTextPrinters(); - return IsTextPrinterActive(state->msgBoxWindowId); -} - -static void PrintMatchCallMessage(struct Pokenav4Struct *state) -{ - int index = GetSelectedMatchCall(); - const u8 *str = GetMatchCallMessageText(index, &state->unkF); - u8 speed = GetPlayerTextSpeedDelay(); - AddTextPrinterParameterized(state->msgBoxWindowId, 1, str, 32, 1, speed, NULL); -} - -static bool32 WaitForMatchCallMessageText(struct Pokenav4Struct *state) -{ - if (gMain.heldKeys & A_BUTTON) - gTextFlags.canABSpeedUpPrint = 1; - else - gTextFlags.canABSpeedUpPrint = 0; - - RunTextPrinters(); - return IsTextPrinterActive(state->msgBoxWindowId); -} - -static void DrawSpinningPokenavForCall(struct Pokenav4Struct *state) -{ - ResumeSpinningPokenavSprite(); - FillBgTilemapBufferRect_Palette0(1, 0, 0, 0, 32, 20); - CopyBgTilemapBufferToVram(1); -} - -static bool32 WaitForSpinningPokenav(struct Pokenav4Struct *state) -{ - return IsDma3ManagerBusyWithBgCopy(); -} - -static void sub_81CC214(void) -{ - int i; - u8 paletteNum; - struct SpriteSheet spriteSheet; - struct Pokenav4Struct *state = GetSubstructPtr(6); - - for (i = 0; i < ARRAY_COUNT(gUnknown_08622810); i++) - LoadCompressedSpriteSheet(&gUnknown_08622810[i]); - - Pokenav_AllocAndLoadPalettes(gUnknown_08622818); - state->optionsCursorSprite = NULL; - spriteSheet.data = state->unk1828; - spriteSheet.size = 0x800; - spriteSheet.tag = 8; - state->unk1824 = (u8 *)OBJ_VRAM0 + LoadSpriteSheet(&spriteSheet) * 0x20; - paletteNum = AllocSpritePalette(13); - state->unk1A = 0x100 + paletteNum * 0x10; - state->trainerPicSprite = CreateTrainerPicSprite(); - state->trainerPicSprite->invisible = TRUE; -} - -static void sub_81CC2B4(void) -{ - struct Pokenav4Struct *state = GetSubstructPtr(6); - if (state->optionsCursorSprite) - DestroySprite(state->optionsCursorSprite); - if (state->trainerPicSprite) - DestroySprite(state->trainerPicSprite); - - FreeSpriteTilesByTag(8); - FreeSpriteTilesByTag(7); - FreeSpritePaletteByTag(12); - FreeSpritePaletteByTag(13); -} - -static void sub_81CC2F0(struct Pokenav4Struct *state, int top) -{ - if (!state->optionsCursorSprite) - { - u8 spriteId = CreateSprite(&sOptionsCursorSpriteTemplate, 4, 80, 5); - state->optionsCursorSprite = &gSprites[spriteId]; - UpdateCursorGfxPos(state, top); - } -} - -static void CloseMatchCallSelectOptionsWindow(struct Pokenav4Struct *state) -{ - DestroySprite(state->optionsCursorSprite); - state->optionsCursorSprite = NULL; -} - -static void UpdateCursorGfxPos(struct Pokenav4Struct *state, int top) -{ - state->optionsCursorSprite->pos2.y = top * 16; -} - -void SpriteCB_OptionsCursor(struct Sprite *sprite) -{ - if (++sprite->data[0] > 3) - { - sprite->data[0] = 0; - sprite->pos2.x = (sprite->pos2.x + 1) & 0x7; - } -} - -static struct Sprite *CreateTrainerPicSprite(void) -{ - u8 spriteId = CreateSprite(&sTrainerPicSpriteTemplate, 44, 104, 6); - return &gSprites[spriteId]; -} - -static void LoadCheckPageTrainerPic(struct Pokenav4Struct *state) -{ - u16 cursor; - int trainerPic = GetMatchCallTrainerPic(GetSelectedMatchCall()); - if (trainerPic >= 0) - { - DecompressPicFromTable(&gTrainerFrontPicTable[trainerPic], state->unk1828, SPECIES_NONE); - LZ77UnCompWram(gTrainerFrontPicPaletteTable[trainerPic].data, state->unk2028); - cursor = RequestDma3Copy(state->unk1828, state->unk1824, 0x800, 1); - LoadPalette(state->unk2028, state->unk1A, 0x20); - state->trainerPicSprite->data[0] = 0; - state->trainerPicSprite->data[7] = cursor; - state->trainerPicSprite->callback = SpriteCB_TrainerPicSlideOnscreen; - } -} - -static void TrainerPicSlideOffscreen(struct Pokenav4Struct *state) -{ - state->trainerPicSprite->callback = SpriteCB_TrainerPicSlideOffscreen; -} - -static bool32 WaitForTrainerPic(struct Pokenav4Struct *state) -{ - return state->trainerPicSprite->callback != SpriteCallbackDummy; -} - -static void SpriteCB_TrainerPicSlideOnscreen(struct Sprite *sprite) -{ - switch (sprite->data[0]) - { - case 0: - if (CheckForSpaceForDma3Request(sprite->data[7]) != -1) - { - sprite->pos2.x = -80; - sprite->invisible = FALSE; - sprite->data[0]++; - } - break; - case 1: - sprite->pos2.x += 8; - if (sprite->pos2.x >= 0) - { - sprite->pos2.x = 0; - sprite->callback = SpriteCallbackDummy; - } - break; - } -} - -static void SpriteCB_TrainerPicSlideOffscreen(struct Sprite *sprite) -{ - sprite->pos2.x -= 8; - if (sprite->pos2.x <= -80) - { - sprite->invisible = TRUE; - sprite->callback = SpriteCallbackDummy; - } -} diff --git a/src/pokenav_unk_5.c b/src/pokenav_unk_5.c deleted file mode 100755 index be30ca94d..000000000 --- a/src/pokenav_unk_5.c +++ /dev/null @@ -1,729 +0,0 @@ -#include "global.h" -#include "bg.h" -#include "decompress.h" -#include "landmark.h" -#include "main.h" -#include "menu.h" -#include "palette.h" -#include "pokenav.h" -#include "region_map.h" -#include "sound.h" -#include "sprite.h" -#include "string_util.h" -#include "task.h" -#include "text_window.h" -#include "window.h" -#include "constants/songs.h" - -struct Pokenav5Struct -{ - u8 filler0[0xC]; - bool32 unkC; - u32 (*unk10)(struct Pokenav5Struct *); -}; - -struct Pokenav5Struct_2 -{ - bool32 (*unk0)(void); - u32 unk4; - u16 unk8; - struct Sprite *cityFeatureTextSprites[3]; - u8 unk18[0x800]; - u8 cityZoomPics[22][0xC8]; -}; - -struct CityMapEntry -{ - u16 mapSecId; - u16 index; - const u32 *tilemap; -}; - -static u32 sub_81CC568(struct Pokenav5Struct *); -static u32 sub_81CC5B4(struct Pokenav5Struct *); -static u32 sub_81CC5DC(struct Pokenav5Struct *); -static u32 sub_81CC6F4(s32); -static u32 sub_81CCD34(s32); -static bool32 sub_81CC6BC(void); -static void sub_81CC9EC(void); -static void sub_81CC9C0(void); -static void sub_81CCD10(void); -static bool32 sub_81CCD24(void); -static void sub_81CCA1C(struct Pokenav5Struct_2 *); -static bool32 sub_81CCAFC(void); -static void sub_81CCB0C(struct Pokenav5Struct_2 *); -static bool32 sub_81CCC4C(struct Pokenav5Struct_2 *); -static void sub_81CCC5C(int); -static bool32 sub_81CCC88(void); -static void sub_81CCE58(void); -static void sub_81CCD70(struct Pokenav5Struct_2 *, int, int); -static void sub_81CCDE8(struct Pokenav5Struct_2 *, int, int); -static void sub_81CCFA4(int); -static void sub_81CCC9C(u8 taskId); -static void sub_81CCF78(void); -void sub_81CCEF4(struct Sprite *sprite); -u32 sub_81CC848(s32); -u32 sub_81CC878(s32); -u32 sub_81CC8D8(s32); -u32 sub_81CC95C(s32); - -extern const u16 gHoennMapZoomIcons_Pal[]; -extern const struct SpriteTemplate gUnknown_086231D0; -extern const u32 gHoennMapZoomIcons_Gfx[]; - -const u16 gUnknown_08622868[] = INCBIN_U16("graphics/pokenav/8622868.gbapal"); -const u32 gUnknown_08622888[] = INCBIN_U32("graphics/pokenav/zoom_tiles.4bpp.lz"); - -#include "data/region_map/city_map_tilemaps.h" - - -const struct BgTemplate gUnknown_086230D8[3] = -{ - { - .bg = 1, - .charBaseIndex = 1, - .mapBaseIndex = 0x1F, - .screenSize = 0, - .paletteMode = 0, - .priority = 1, - .baseTile = 0 - }, - { - .bg = 2, - .charBaseIndex = 2, - .mapBaseIndex = 0x06, - .screenSize = 0, - .paletteMode = 0, - .priority = 2, - .baseTile = 0 - }, - { - .bg = 2, - .charBaseIndex = 0, - .mapBaseIndex = 0x00, - .screenSize = 2, - .paletteMode = 0, - .priority = 3, - .baseTile = 0 - }, -}; - -const LoopedTask gUnknown_086230E4[] = -{ - NULL, - sub_81CC848, - sub_81CC878, - sub_81CC8D8, - sub_81CC95C -}; - -const struct CompressedSpriteSheet gUnknown_086230F8[1] = -{ - {gHoennMapZoomIcons_Gfx, 0x800, 6} -}; - -const struct SpritePalette gUnknown_08623100[] = -{ - {gHoennMapZoomIcons_Pal, 11}, - {} -}; - -const struct WindowTemplate gUnknown_08623110 = -{ - .bg = 1, - .tilemapLeft = 17, - .tilemapTop = 4, - .width = 12, - .height = 13, - .paletteNum = 1, - .baseBlock = 0x4C -}; - -#include "data/region_map/city_map_entries.h" - -const struct OamData gUnknown_086231C8 = -{ - .y = 0, - .affineMode = ST_OAM_AFFINE_OFF, - .objMode = ST_OAM_OBJ_NORMAL, - .bpp = ST_OAM_4BPP, - .shape = SPRITE_SHAPE(32x8), - .x = 0, - .size = SPRITE_SIZE(32x8), - .tileNum = 0, - .priority = 1, - .paletteNum = 0, -}; - -const struct SpriteTemplate gUnknown_086231D0 = -{ - .tileTag = 6, - .paletteTag = 11, - .oam = &gUnknown_086231C8, - .anims = gDummySpriteAnimTable, - .images = NULL, - .affineAnims = gDummySpriteAffineAnimTable, - .callback = sub_81CCEF4, -}; - -u32 PokenavCallback_Init_6(void) -{ - struct Pokenav5Struct *state = AllocSubstruct(3, sizeof(struct Pokenav5Struct)); - if (!state) - return FALSE; - - if (!AllocSubstruct(16, sizeof(struct RegionMap))) - return FALSE; - - state->unkC = sub_8124668(gMapHeader.regionMapSectionId); - if (!state->unkC) - state->unk10 = sub_81CC568; - else - state->unk10 = sub_81CC5B4; - - return TRUE; -} - -void sub_81CC524(void) -{ - gSaveBlock2Ptr->regionMapZoom = sub_8124658(); - FreePokenavSubstruct(16); - FreePokenavSubstruct(3); -} - -u32 sub_81CC554(void) -{ - struct Pokenav5Struct *state = GetSubstructPtr(3); - return state->unk10(state); -} - -static u32 sub_81CC568(struct Pokenav5Struct *state) -{ - switch (sub_81230AC()) - { - case 3: - return 1; - case 4: - if (!sub_8124658()) - return 3; - return 2; - case 5: - state->unk10 = sub_81CC5DC; - return 4; - } - - return 0; -} - -static u32 sub_81CC5B4(struct Pokenav5Struct *state) -{ - if (gMain.newKeys & B_BUTTON) - { - state->unk10 = sub_81CC5DC; - return 4; - } - - return 0; -} - -static u32 sub_81CC5DC(struct Pokenav5Struct *state) -{ - return POKENAV_MENU_1; -} - -bool32 sub_81CC5E4(void) -{ - struct Pokenav5Struct *state = GetSubstructPtr(3); - return state->unkC; -} - -bool32 sub_81CC5F4(void) -{ - struct Pokenav5Struct_2 *state = AllocSubstruct(4, sizeof(struct Pokenav5Struct_2)); - if (!state) - return FALSE; - - state->unk4 = CreateLoopedTask(sub_81CC6F4, 1); - state->unk0 = sub_81CC6BC; - return TRUE; -} - -void sub_81CC62C(s32 index) -{ - struct Pokenav5Struct_2 *state = GetSubstructPtr(4); - state->unk4 = CreateLoopedTask(gUnknown_086230E4[index], 1); - state->unk0 = sub_81CC6BC; -} - -u32 sub_81CC65C(void) -{ - struct Pokenav5Struct_2 *state = GetSubstructPtr(4); - return state->unk0(); -} - -void sub_81CC670(void) -{ - struct Pokenav5Struct_2 *state = GetSubstructPtr(4); - FreeRegionMapIconResources(); - sub_81CC9EC(); - RemoveWindow(state->unk8); - FreePokenavSubstruct(16); - FreePokenavSubstruct(4); - SetPokenavVBlankCallback(); - SetBgMode(0); -} - -static void sub_81CC6A4(void) -{ - TransferPlttBuffer(); - LoadOam(); - ProcessSpriteCopyRequests(); - UpdateRegionMapVideoRegs(); -} - -static bool32 sub_81CC6BC(void) -{ - struct Pokenav5Struct_2 *state = GetSubstructPtr(4); - return IsLoopedTaskActive(state->unk4); -} - -static bool8 sub_81CC6D0(void) -{ - if (sub_81CC5E4()) - return FALSE; - - return gSaveBlock2Ptr->regionMapZoom == 1; -} - -static u32 sub_81CC6F4(s32 taskState) -{ - int var0; - struct RegionMap *regionMap; - struct Pokenav5Struct_2 *state = GetSubstructPtr(4); - switch (taskState) - { - case 0: - SetVBlankCallback_(NULL); - HideBg(1); - HideBg(2); - HideBg(3); - SetBgMode(1); - InitBgTemplates(gUnknown_086230D8, ARRAY_COUNT(gUnknown_086230D8) - 1); - regionMap = GetSubstructPtr(16); - sub_8122CF8(regionMap, &gUnknown_086230D8[1], sub_81CC6D0()); - sub_81CC9C0(); - return 0; - case 1: - if (sub_8122DB0()) - return 2; - - if (!sub_81CC5E4()) - { - CreateRegionMapPlayerIcon(4, 9); - CreateRegionMapCursor(5, 10); - sub_812454C(); - } - else - { - sub_8123030(0, 6); - } - return 0; - case 2: - sub_81CCD10(); - return 1; - case 3: - if (sub_81CCD24()) - return 2; - - sub_81CCA1C(state); - return 1; - case 4: - if (sub_81CCAFC()) - return 2; - - sub_81CCB0C(state); - sub_81C7B40(); - return 0; - case 5: - if (sub_81CCC4C(state)) - return 2; - - ShowBg(1); - ShowBg(2); - SetVBlankCallback_(sub_81CC6A4); - return 0; - case 6: - if (!sub_81CC6D0()) - var0 = 4; - else - var0 = 5; - - LoadLeftHeaderGfxForIndex(var0); - sub_81C7FA0(var0, 1, 1); - sub_81C7AC0(1); - return 0; - case 7: - if (IsPaletteFadeActive() || sub_81C8010()) - return 2; - return 1; - default: - return 4; - } -} - -u32 sub_81CC848(s32 taskState) -{ - struct Pokenav5Struct_2 *state = GetSubstructPtr(4); - switch (taskState) - { - case 0: - sub_81CCB0C(state); - return 0; - case 1: - if (sub_81CCC4C(state)) - return 2; - break; - } - - return 4; -} - -u32 sub_81CC878(s32 taskState) -{ - switch (taskState) - { - case 0: - PlaySE(SE_SELECT); - sub_81CCC5C(0); - sub_8123418(); - return 0; - case 1: - if (sub_8123514() || sub_81CCC88()) - return 2; - - PrintHelpBarText(HELPBAR_MAP_ZOOMED_OUT); - return 0; - case 2: - if (WaitForHelpBar()) - return 2; - - sub_81C7E14(4); - break; - } - - return 4; -} - -u32 sub_81CC8D8(s32 taskState) -{ - struct Pokenav5Struct_2 *state = GetSubstructPtr(4); - switch (taskState) - { - case 0: - PlaySE(SE_SELECT); - sub_81CCB0C(state); - return 0; - case 1: - if (sub_81CCC4C(state)) - return 2; - - sub_81CCC5C(1); - sub_8123418(); - return 0; - case 2: - if (sub_8123514() || sub_81CCC88()) - return 2; - - PrintHelpBarText(HELPBAR_MAP_ZOOMED_IN); - return 0; - case 3: - if (WaitForHelpBar()) - return 2; - - sub_81C7E14(5); - break; - } - - return 4; -} - -u32 sub_81CC95C(s32 taskState) -{ - switch (taskState) - { - case 0: - PlaySE(SE_SELECT); - sub_81C7AC0(0); - return 0; - case 1: - if (IsPaletteFadeActive()) - return 2; - - sub_81C7FDC(); - sub_81C78A0(); - return 0; - case 2: - if (MainMenuLoopedTaskIsBusy()) - return 2; - - HideBg(1); - HideBg(2); - HideBg(3); - return 0; - } - - return 4; -} - -static void sub_81CC9C0(void) -{ - int i; - for (i = 0; i < ARRAY_COUNT(gUnknown_086230F8); i++) - LoadCompressedSpriteSheet(&gUnknown_086230F8[i]); - - Pokenav_AllocAndLoadPalettes(gUnknown_08623100); - sub_81CCE58(); -} - -static void sub_81CC9EC(void) -{ - int i; - struct Pokenav5Struct_2 *state = GetSubstructPtr(4); - FreeSpriteTilesByTag(6); - FreeSpritePaletteByTag(11); - for (i = 0; i < 3; i++) - DestroySprite(state->cityFeatureTextSprites[i]); -} - -static void sub_81CCA1C(struct Pokenav5Struct_2 *state) -{ - sub_8199DF0(1, PIXEL_FILL(0), 0x40, 1); - sub_8199DF0(1, PIXEL_FILL(1), 0x41, 1); - CpuFill16(0x1040, state->unk18, 0x800); - SetBgTilemapBuffer(1, state->unk18); - state->unk8 = AddWindow(&gUnknown_08623110); - LoadUserWindowBorderGfx_(state->unk8, 0x42, 0x40); - DrawTextBorderOuter(state->unk8, 0x42, 4); - decompress_and_copy_tile_data_to_vram(1, gUnknown_08622888, 0, 0, 0); - FillWindowPixelBuffer(state->unk8, PIXEL_FILL(1)); - PutWindowTilemap(state->unk8); - CopyWindowToVram(state->unk8, 3); - CopyPaletteIntoBufferUnfaded(gUnknown_08622868, 0x10, 0x20); - CopyPaletteIntoBufferUnfaded(gHoennMapZoomIcons_Pal, 0x30, 0x20); - if (!sub_8124658()) - ChangeBgY(1, -0x6000, 0); - else - ChangeBgY(1, 0, 0); - - ChangeBgX(1, 0, 0); -} - -static bool32 sub_81CCAFC(void) -{ - return free_temp_tile_data_buffers_if_possible(); -} - -static void sub_81CCB0C(struct Pokenav5Struct_2 *state) -{ - struct RegionMap *regionMap = GetSubstructPtr(16); - switch (regionMap->iconDrawType) - { - case MAPSECTYPE_CITY_CANFLY: - FillWindowPixelBuffer(state->unk8, PIXEL_FILL(1)); - PutWindowRectTilemap(state->unk8, 0, 0, 12, 2); - AddTextPrinterParameterized(state->unk8, 7, regionMap->mapSecName, 0, 1, TEXT_SPEED_FF, NULL); - sub_81CCD70(state, regionMap->mapSecId, regionMap->posWithinMapSec); - CopyWindowToVram(state->unk8, 3); - sub_81CCFA4(0); - break; - case MAPSECTYPE_CITY_CANTFLY: - FillWindowPixelBuffer(state->unk8, PIXEL_FILL(1)); - PutWindowRectTilemap(state->unk8, 0, 0, 12, 2); - AddTextPrinterParameterized(state->unk8, 7, regionMap->mapSecName, 0, 1, TEXT_SPEED_FF, NULL); - FillBgTilemapBufferRect(1, 0x1041, 17, 6, 12, 11, 17); - CopyWindowToVram(state->unk8, 3); - sub_81CCFA4(1); - break; - case MAPSECTYPE_PLAIN: - case MAPSECTYPE_BATTLE_FRONTIER: - FillWindowPixelBuffer(state->unk8, PIXEL_FILL(1)); - PutWindowTilemap(state->unk8); - AddTextPrinterParameterized(state->unk8, 7, regionMap->mapSecName, 0, 1, TEXT_SPEED_FF, NULL); - sub_81CCDE8(state, regionMap->mapSecId, regionMap->posWithinMapSec); - CopyWindowToVram(state->unk8, 3); - sub_81CCFA4(1); - break; - case MAPSECTYPE_NONE: - FillBgTilemapBufferRect(1, 0x1041, 17, 4, 12, 13, 17); - CopyBgTilemapBufferToVram(1); - sub_81CCFA4(1); - break; - } -} - -static bool32 sub_81CCC4C(struct Pokenav5Struct_2 *state) -{ - return IsDma3ManagerBusyWithBgCopy(); -} - -static void sub_81CCC5C(int arg0) -{ - u8 taskId = CreateTask(sub_81CCC9C, 3); - gTasks[taskId].data[0] = arg0; -} - -static bool32 sub_81CCC88(void) -{ - return FuncIsActiveTask(sub_81CCC9C); -} - -static void sub_81CCC9C(u8 taskId) -{ - if (gTasks[taskId].data[0]) - { - if (ChangeBgY(1, 0x480, 1) >= 0) - { - ChangeBgY(1, 0, 0); - DestroyTask(taskId); - } - - sub_81CCF78(); - } - else - { - if (ChangeBgY(1, 0x480, 2) <= -0x6000) - { - ChangeBgY(1, -0x6000, 0); - DestroyTask(taskId); - } - - sub_81CCF78(); - } -} - -static void sub_81CCD10(void) -{ - CreateLoopedTask(sub_81CCD34, 1); -} - -static bool32 sub_81CCD24(void) -{ - return FuncIsActiveLoopedTask(sub_81CCD34); -} - -static u32 sub_81CCD34(s32 taskState) -{ - struct Pokenav5Struct_2 *state = GetSubstructPtr(4); - if (taskState < (int)ARRAY_COUNT(gPokenavCityMaps)) - { - LZ77UnCompWram(gPokenavCityMaps[taskState].tilemap, state->cityZoomPics[taskState]); - return 1; - } - - return 4; -} - -static void sub_81CCD70(struct Pokenav5Struct_2 *state, int mapSecId, int pos) -{ - int i; - for (i = 0; i < (int)ARRAY_COUNT(gPokenavCityMaps) && (gPokenavCityMaps[i].mapSecId != mapSecId || gPokenavCityMaps[i].index != pos); i++) - ; - - if (i == ARRAY_COUNT(gPokenavCityMaps)) - return; - - FillBgTilemapBufferRect_Palette0(1, 0x1041, 17, 6, 12, 11); - CopyToBgTilemapBufferRect(1, state->cityZoomPics[i], 18, 6, 10, 10); -} - -static void sub_81CCDE8(struct Pokenav5Struct_2 *state, int mapSecId, int pos) -{ - int i = 0; - while (1) - { - const u8 *landmarkName = GetLandmarkName(mapSecId, pos, i); - if (!landmarkName) - break; - - StringCopyPadded(gStringVar1, landmarkName, CHAR_SPACE, 12); - AddTextPrinterParameterized(state->unk8, 7, gStringVar1, 0, i * 16 + 17, TEXT_SPEED_FF, NULL); - i++; - } -} - -static void sub_81CCE58(void) -{ - int i; - int y; - struct Sprite *sprite; - struct Pokenav5Struct_2 *state = GetSubstructPtr(4); - - if (!sub_8124658()) - y = 228; - else - y = 132; - - for (i = 0; i < 3; i++) - { - u8 spriteId = CreateSprite(&gUnknown_086231D0, 152 + i * 32, y, 8); - sprite = &gSprites[spriteId]; - sprite->data[0] = 0; - sprite->data[1] = i * 4; - sprite->data[2] = sprite->oam.tileNum; - sprite->data[3] = 150; - sprite->data[4] = i * 4; - sprite->oam.tileNum += i * 4; - state->cityFeatureTextSprites[i] = sprite; - } -} - -void sub_81CCEF4(struct Sprite *sprite) -{ - if (sprite->data[3]) - { - sprite->data[3]--; - return; - } - - if (++sprite->data[0] > 11) - sprite->data[0] = 0; - - if (++sprite->data[1] > 60) - sprite->data[1] = 0; - - sprite->oam.tileNum = sprite->data[2] + sprite->data[1]; - if (sprite->data[5] < 4) - { - if (sprite->data[0] == 0) - { - sprite->data[5]++; - sprite->data[3] = 120; - } - } - else - { - if (sprite->data[1] == sprite->data[4]) - { - sprite->data[5] = 0; - sprite->data[0] = 0; - sprite->data[3] = 120; - } - } -} - -static void sub_81CCF78(void) -{ - int i; - struct Pokenav5Struct_2 *state = GetSubstructPtr(4); - int y = 132 - (GetBgY(1) >> 8); - for (i = 0; i < 3; i++) - state->cityFeatureTextSprites[i]->pos1.y = y; -} - -static void sub_81CCFA4(int invisible) -{ - int i; - struct Pokenav5Struct_2 *state = GetSubstructPtr(4); - for (i = 0; i < 3; i++) - state->cityFeatureTextSprites[i]->invisible = invisible; -} diff --git a/src/pokenav_unk_6.c b/src/pokenav_unk_6.c deleted file mode 100644 index b16aec16e..000000000 --- a/src/pokenav_unk_6.c +++ /dev/null @@ -1,625 +0,0 @@ -#include "global.h" -#include "data.h" -#include "decompress.h" -#include "main.h" -#include "menu_specialized.h" -#include "mon_markings.h" -#include "pokenav.h" -#include "pokemon.h" -#include "pokemon_storage_system.h" -#include "sound.h" -#include "string_util.h" -#include "strings.h" -#include "text.h" -#include "constants/songs.h" -#include "constants/species.h" - -struct PokenavSub11 -{ - u32 monPal[3][0x20]; - u8 fill[0x180]; - u32 monPicGfx[3][0x800]; - u8 unk6300; - s16 unk6302; - u32 (*unk6304)(struct PokenavSub11 *); - u8 fill2[0x6320 - 0x6308]; - u8 unk6320[3][24]; - u8 unk6368[3][64]; - struct UnknownStruct_81D1ED4 unk6428; - u8 unk6780[3]; - u8 unk6783[3]; - s8 unk6786; - s8 unk6787; - s8 unk6788; - s8 unk6789; - u8 unk678A; -}; - -void sub_81CD970(void); -void sub_81CD9F8(void); -u32 sub_81CD08C(struct PokenavSub11 *structPtr); -u32 sub_81CD19C(struct PokenavSub11 *structPtr); -u32 sub_81CD110(struct PokenavSub11 *structPtr); -u8 sub_81CD1E4(struct PokenavSub11 *structPtr); -u8 sub_81CD258(u8 arg0); -void sub_81CD824(s16 arg0, u8 arg1); -void sub_81CDA1C(s16 arg0, u8 arg1); -void sub_81CDB98(s16 arg0, u8 arg1); - -// code -bool32 PokenavCallback_Init_7(void) -{ - struct PokenavSub11 *structPtr = AllocSubstruct(11, sizeof(struct PokenavSub11)); - - if (structPtr == NULL) - return FALSE; - - sub_81D1ED4(&structPtr->unk6428); - sub_81CD970(); - gKeyRepeatStartDelay = 20; - structPtr->unk6304 = sub_81CD08C; - return TRUE; -} - -bool32 PokenavCallback_Init_9(void) -{ - struct PokenavSub11 *structPtr = AllocSubstruct(11, sizeof(struct PokenavSub11)); - - if (structPtr == NULL) - return FALSE; - - sub_81D1ED4(&structPtr->unk6428); - sub_81CD9F8(); - gKeyRepeatStartDelay = 20; - structPtr->unk6304 = sub_81CD08C; - return TRUE; -} - -u32 sub_81CD070(void) -{ - struct PokenavSub11 *structPtr = GetSubstructPtr(11); - - return structPtr->unk6304(structPtr); -} - -u32 sub_81CD08C(struct PokenavSub11 *structPtr) -{ - struct PokenavSub18 *unkPtr = GetSubstructPtr(18); - u32 ret = sub_81CD1E4(structPtr); - - if (ret == 0) - { - if (gMain.newKeys & B_BUTTON) - { - PlaySE(SE_SELECT); - structPtr->unk6304 = sub_81CD19C; - ret = 2; - } - else if (gMain.newKeys & A_BUTTON) - { - if (structPtr->unk6300 == 0) - { - if (unkPtr->unk2 == unkPtr->unk0 - 1) - { - PlaySE(SE_SELECT); - structPtr->unk6304 = sub_81CD19C; - ret = 2; - } - } - else - { - PlaySE(SE_SELECT); - ret = 5; - structPtr->unk6304 = sub_81CD110; - } - } - } - - return ret; -} - -u32 sub_81CD110(struct PokenavSub11 *structPtr) -{ - struct PokenavSub18 *unkPtr; - u8 markings; - u32 ret = 0, boxId, monId; - - if (!sub_811FBA4()) - { - structPtr->unk6783[structPtr->unk6786] = sub_81CEF14(); - unkPtr = GetSubstructPtr(18); - boxId = unkPtr->unk4[unkPtr->unk2].boxId; - monId = unkPtr->unk4[unkPtr->unk2].monId; - markings = structPtr->unk6783[structPtr->unk6786]; - - if (boxId == TOTAL_BOXES_COUNT) - SetMonData(&gPlayerParty[monId], MON_DATA_MARKINGS, &markings); - else - SetBoxMonDataAt(boxId, monId, MON_DATA_MARKINGS, &markings); - - structPtr->unk6304 = sub_81CD08C; - ret = 6; - } - - return ret; -} - -u32 sub_81CD19C(struct PokenavSub11 *structPtr) -{ - if (structPtr->unk6300 == 0) - return 100002; - else - return 100010; -} - -void sub_81CD1C0(void) -{ - struct PokenavSub11 *structPtr = GetSubstructPtr(11); - if (structPtr->unk6300 == 0) - FreePokenavSubstruct(18); - - FreePokenavSubstruct(11); -} - -u8 sub_81CD1E4(struct PokenavSub11 *structPtr) -{ - struct PokenavSub18 *unkPtr = GetSubstructPtr(18); - u8 ret = 0; - - if (gMain.heldKeys & DPAD_UP) - { - if (structPtr->unk6300 == 0 || unkPtr->unk2 != 0) - { - PlaySE(SE_SELECT); - ret = sub_81CD258(1); - } - } - else if (gMain.heldKeys & DPAD_DOWN) - { - if (structPtr->unk6300 == 0 || unkPtr->unk2 < unkPtr->unk0 - 1) - { - PlaySE(SE_SELECT); - ret = sub_81CD258(0); - } - } - - return ret; -} - -u8 sub_81CD258(u8 arg0) -{ - u16 r7; - bool8 r6, r0; - struct PokenavSub11 *structPtr = GetSubstructPtr(11); - struct PokenavSub18 *unkPtr = GetSubstructPtr(18); - - r7 = (arg0) ? structPtr->unk6788 : structPtr->unk6787; - sub_81D1F84(&structPtr->unk6428, structPtr->unk6428.unk14[structPtr->unk6786], structPtr->unk6428.unk14[r7]); - r6 = (unkPtr->unk2 != ((sub_81CDD5C() != 0) ? unkPtr->unk0 : unkPtr->unk0 - 1)); - if (arg0) - { - structPtr->unk6788 = structPtr->unk6787; - structPtr->unk6787 = structPtr->unk6786; - structPtr->unk6786 = r7; - structPtr->unk6789 = structPtr->unk6788; - - unkPtr->unk2 = (unkPtr->unk2 == 0) ? unkPtr->unk0 - 1 : unkPtr->unk2 - 1; - structPtr->unk6302 = (unkPtr->unk2 != 0) ? unkPtr->unk2 - 1 : unkPtr->unk0 - 1; - } - else - { - structPtr->unk6787 = structPtr->unk6788; - structPtr->unk6788 = structPtr->unk6786; - structPtr->unk6786 = r7; - structPtr->unk6789 = structPtr->unk6787; - - unkPtr->unk2 = (unkPtr->unk2 < unkPtr->unk0 - 1) ? unkPtr->unk2 + 1 : 0; - structPtr->unk6302 = (unkPtr->unk2 < unkPtr->unk0 - 1) ? unkPtr->unk2 + 1 : 0; - } - - r0 = (unkPtr->unk2 != ((sub_81CDD5C() != 0) ? unkPtr->unk0 : unkPtr->unk0 - 1)); - - if (!r6) - return 3; - else if (!r0) - return 4; - else - return 1; -} - -bool32 sub_81CD3C4(void) -{ - s32 var; - struct PokenavSub11 *structPtr = GetSubstructPtr(11); - struct PokenavSub18 *unkPtr = GetSubstructPtr(18); - - switch (structPtr->unk678A) - { - case 0: - sub_81CD824(unkPtr->unk2, 0); - break; - case 1: - sub_81CDA1C(unkPtr->unk2, 0); - break; - case 2: - sub_81CDB98(unkPtr->unk2, 0); - break; - case 3: - if (unkPtr->unk0 == 1) - { - structPtr->unk6786 = 0; - structPtr->unk6787 = 0; - structPtr->unk6788 = 0; - structPtr->unk678A = 0; - return TRUE; - } - else - { - structPtr->unk6786 = 0; - structPtr->unk6787 = 1; - structPtr->unk6788 = 2; - } - break; - // These were probably ternaries just like cases 7-9, but couldn't match it any other way. - case 4: - var = unkPtr->unk2 + 1; - if (var >= unkPtr->unk0) - var = 0; - sub_81CD824(var, 1); - break; - case 5: - var = unkPtr->unk2 + 1; - if (var >= unkPtr->unk0) - var = 0; - sub_81CDA1C(var, 1); - break; - case 6: - var = unkPtr->unk2 + 1; - if (var >= unkPtr->unk0) - var = 0; - sub_81CDB98(var, 1); - break; - case 7: - sub_81CD824((unkPtr->unk2 - 1 >= 0) ? unkPtr->unk2 - 1 : unkPtr->unk0 - 1, 2); - break; - case 8: - sub_81CDA1C((unkPtr->unk2 - 1 >= 0) ? unkPtr->unk2 - 1 : unkPtr->unk0 - 1, 2); - break; - case 9: - sub_81CDB98((unkPtr->unk2 - 1 >= 0) ? unkPtr->unk2 - 1 : unkPtr->unk0 - 1, 2); - structPtr->unk678A = 0; - return TRUE; - } - - structPtr->unk678A++; - return FALSE; -} - -bool32 sub_81CD548(u8 arg0) -{ - struct PokenavSub11 *structPtr = GetSubstructPtr(11); - - switch (arg0) - { - case 0: - sub_81CD824(structPtr->unk6302, structPtr->unk6789); - break; - case 1: - sub_81CDA1C(structPtr->unk6302, structPtr->unk6789); - break; - case 2: - sub_81CDB98(structPtr->unk6302, structPtr->unk6789); - return TRUE; - } - - return FALSE; -} - -u8 *sub_81CD5CC(u8 *dst, const u8 *src, s16 n) -{ - while (*src != EOS) - *dst++ = *src++, n--; - - while (n-- > 0) - *dst++ = CHAR_SPACE; - - *dst = EOS; - return dst; -} - -u8 *sub_81CD624(u8 *str, u16 id, bool8 arg3) -{ - u16 boxId, monId, gender, species, level, lvlDigits; - struct BoxPokemon *boxMon; - u8 *txtPtr, *str_; - struct PokenavSub18 *unkPtr = GetSubstructPtr(18); - - boxId = unkPtr->unk4[id].boxId; - monId = unkPtr->unk4[id].monId; - *(str++) = EXT_CTRL_CODE_BEGIN; - *(str++) = 4; - *(str++) = 8; - *(str++) = 0; - *(str++) = 9; - - if (GetBoxOrPartyMonData(boxId, monId, MON_DATA_IS_EGG, NULL)) - return StringCopyPadded(str, gText_EggNickname, CHAR_SPACE, 12); - - GetBoxOrPartyMonData(boxId, monId, MON_DATA_NICKNAME, str); - StringGetEnd10(str); - species = GetBoxOrPartyMonData(boxId, monId, MON_DATA_SPECIES, NULL); - if (boxId == TOTAL_BOXES_COUNT) - { - level = GetMonData(&gPlayerParty[monId], MON_DATA_LEVEL); - gender = GetMonGender(&gPlayerParty[monId]); - } - else - { - boxMon = GetBoxedMonPtr(boxId, monId); - gender = GetBoxMonGender(boxMon); - level = GetLevelFromBoxMonExp(boxMon); - } - - if ((species == SPECIES_NIDORAN_F || species == SPECIES_NIDORAN_M) && !StringCompare(str, gSpeciesNames[species])) - gender = MON_GENDERLESS; - - str_ = str; // For some reason, a variable is needed to match. - while (*str_ != EOS) - (str_++); - - *(str_++) = EXT_CTRL_CODE_BEGIN; - *(str_++) = 0x12; - *(str_++) = 0x3C; - switch (gender) - { - default: - *(str_++) = 0x77; - break; - case MON_MALE: - *(str_++) = EXT_CTRL_CODE_BEGIN; - *(str_++) = EXT_CTRL_CODE_COLOR; - *(str_++) = 4; - *(str_++) = EXT_CTRL_CODE_BEGIN; - *(str_++) = 3; - *(str_++) = 5; - *(str_++) = CHAR_MALE; - break; - case MON_FEMALE: - *(str_++) = EXT_CTRL_CODE_BEGIN; - *(str_++) = EXT_CTRL_CODE_COLOR; - *(str_++) = 6; - *(str_++) = EXT_CTRL_CODE_BEGIN; - *(str_++) = 3; - *(str_++) = 7; - *(str_++) = CHAR_FEMALE; - break; - } - - *(str_++) = EXT_CTRL_CODE_BEGIN; - *(str_++) = 4; - *(str_++) = 8; - *(str_++) = 0; - *(str_++) = 9; - *(str_++) = CHAR_SLASH; - *(str_++) = CHAR_SPECIAL_F9; - *(str_++) = CHAR_LV_2; - txtPtr = str_; - str_ = ConvertIntToDecimalStringN(str_, level, STR_CONV_MODE_LEFT_ALIGN, 3); - lvlDigits = str_ - txtPtr; - *(str_++) = CHAR_SPACE; - if (!arg3) - { - lvlDigits = 3 - lvlDigits; - while (lvlDigits-- != 0) - *(str_++) = CHAR_SPACE; - } - - *str_ = EOS; - return str_; -} - -void sub_81CD824(s16 arg0, u8 arg1) -{ - u16 boxId, i; - struct PokenavSub11 *structPtr = GetSubstructPtr(11); - struct PokenavSub18 *unkPtr = GetSubstructPtr(18); - - if (arg0 != (sub_81CDD5C() != 0 ? unkPtr->unk0 : unkPtr->unk0 - 1)) - { - sub_81CD624(structPtr->unk6368[arg1], arg0, FALSE); - boxId = unkPtr->unk4[arg0].boxId; - structPtr->unk6320[arg1][0] = EXT_CTRL_CODE_BEGIN; - structPtr->unk6320[arg1][1] = 4; - structPtr->unk6320[arg1][2] = 8; - structPtr->unk6320[arg1][3] = 0; - structPtr->unk6320[arg1][4] = 9; - if (boxId == TOTAL_BOXES_COUNT) - sub_81CD5CC(&structPtr->unk6320[arg1][5], gText_InParty, 8); - else - sub_81CD5CC(&structPtr->unk6320[arg1][5], GetBoxNamePtr(boxId), 8); - } - else - { - for (i = 0; i < 12; i++) - structPtr->unk6368[arg1][i] = CHAR_SPACE; - structPtr->unk6368[arg1][i] = EOS; - - for (i = 0; i < 8; i++) - structPtr->unk6320[arg1][i] = CHAR_SPACE; - structPtr->unk6320[arg1][i] = EOS; - } -} - -void sub_81CD970(void) -{ - u16 i, count; - struct PokenavSub11 *structPtr = GetSubstructPtr(11); - struct PokenavSub18 *unkPtr = AllocSubstruct(18, sizeof(struct PokenavSub18)); - - structPtr->unk6300 = 0; - for (i = 0, count = 0; i < CalculatePlayerPartyCount(); i++) - { - if (!GetMonData(&gPlayerParty[i], MON_DATA_IS_EGG)) - { - unkPtr->unk4[count].boxId = TOTAL_BOXES_COUNT; - unkPtr->unk4[count].monId = i; - unkPtr->unk4[count].data = 0; - count++; - } - } - - unkPtr->unk4[count].boxId = 0; - unkPtr->unk4[count].monId = 0; - unkPtr->unk4[count].data = 0; - unkPtr->unk2 = 0; - unkPtr->unk0 = count + 1; - structPtr->unk678A = 0; -} - -void sub_81CD9F8(void) -{ - struct PokenavSub11 *structPtr = GetSubstructPtr(11); - structPtr->unk6300 = 1; - structPtr->unk678A = 0; -} - -void sub_81CDA1C(s16 arg0, u8 arg1) -{ - u16 boxId, monId, i; - struct PokenavSub11 *structPtr = GetSubstructPtr(11); - struct PokenavSub18 *unkPtr = GetSubstructPtr(18); - - if (arg0 != (sub_81CDD5C() != 0 ? unkPtr->unk0 : unkPtr->unk0 - 1)) - { - boxId = unkPtr->unk4[arg0].boxId; - monId = unkPtr->unk4[arg0].monId; - structPtr->unk6428.unk0[arg1][0] = GetBoxOrPartyMonData(boxId, monId, MON_DATA_COOL, NULL); - structPtr->unk6428.unk0[arg1][1] = GetBoxOrPartyMonData(boxId, monId, MON_DATA_TOUGH, NULL); - structPtr->unk6428.unk0[arg1][2] = GetBoxOrPartyMonData(boxId, monId, MON_DATA_SMART, NULL); - structPtr->unk6428.unk0[arg1][3] = GetBoxOrPartyMonData(boxId, monId, MON_DATA_CUTE, NULL); - structPtr->unk6428.unk0[arg1][4] = GetBoxOrPartyMonData(boxId, monId, MON_DATA_BEAUTY, NULL); - structPtr->unk6780[arg1] = (GetBoxOrPartyMonData(boxId, monId, MON_DATA_SHEEN, NULL) != 255) - ? GetBoxOrPartyMonData(boxId, monId, MON_DATA_SHEEN, NULL) / 29u - : 9; - structPtr->unk6783[arg1] = GetBoxOrPartyMonData(boxId, monId, MON_DATA_MARKINGS, NULL); - sub_81D2754(structPtr->unk6428.unk0[arg1], structPtr->unk6428.unk14[arg1]); - } - else - { - for (i = 0; i < 5; i++) - { - structPtr->unk6428.unk0[arg1][i] = 0; - structPtr->unk6428.unk14[arg1][i].unk0 = 155; - structPtr->unk6428.unk14[arg1][i].unk2 = 91; - } - } -} - -void sub_81CDB98(s16 arg0, u8 arg1) -{ - u16 boxId, monId, species; - u32 personality, tid; - struct PokenavSub11 *structPtr = GetSubstructPtr(11); - struct PokenavSub18 *unkPtr = GetSubstructPtr(18); - - if (arg0 == (sub_81CDD5C() != 0 ? unkPtr->unk0 : unkPtr->unk0 - 1)) - return; - - boxId = unkPtr->unk4[arg0].boxId; - monId = unkPtr->unk4[arg0].monId; - species = GetBoxOrPartyMonData(boxId, monId, MON_DATA_SPECIES2, NULL); - tid = GetBoxOrPartyMonData(boxId, monId, MON_DATA_OT_ID, NULL); - personality = GetBoxOrPartyMonData(boxId, monId, MON_DATA_PERSONALITY, NULL); - LoadSpecialPokePic(&gMonFrontPicTable[species], structPtr->monPicGfx[arg1], species, personality, TRUE); - LZ77UnCompWram(GetMonSpritePalFromSpeciesAndPersonality(species, tid, personality), structPtr->monPal[arg1]); -} - -u16 sub_81CDC50(void) -{ - struct PokenavSub18 *unkPtr = GetSubstructPtr(18); - return unkPtr->unk0; -} - -u16 sub_81CDC60(void) -{ - struct PokenavSub18 *unkPtr = GetSubstructPtr(18); - return unkPtr->unk2; -} - -struct UnknownStruct_81D1ED4 *sub_81CDC70(void) -{ - struct PokenavSub11 *structPtr = GetSubstructPtr(11); - return &structPtr->unk6428; -} - -u8 sub_81CDC84(void) -{ - struct PokenavSub11 *structPtr = GetSubstructPtr(11); - return structPtr->unk6786; -} - -u8 sub_81CDC9C(void) -{ - struct PokenavSub11 *structPtr = GetSubstructPtr(11); - return structPtr->unk6302; -} - -void *sub_81CDCB4(u8 id) -{ - struct PokenavSub11 *structPtr = GetSubstructPtr(11); - return structPtr->monPicGfx[id]; -} - -void *sub_81CDCD4(u8 id) -{ - struct PokenavSub11 *structPtr = GetSubstructPtr(11); - return structPtr->monPal[id]; -} - -u8 sub_81CDCEC(void) -{ - struct PokenavSub11 *structPtr = GetSubstructPtr(11); - return structPtr->unk6789; -} - -u8 *sub_81CDD04(u8 id) -{ - struct PokenavSub11 *structPtr = GetSubstructPtr(11); - return structPtr->unk6368[id]; -} - -u8 *sub_81CDD24(u8 id) -{ - struct PokenavSub11 *structPtr = GetSubstructPtr(11); - return structPtr->unk6320[id]; -} - -u16 sub_81CDD48(void) -{ - struct PokenavSub18 *unkPtr = GetSubstructPtr(18); - return unkPtr->unk4[unkPtr->unk2].data; -} - -bool32 sub_81CDD5C(void) -{ - struct PokenavSub11 *structPtr = GetSubstructPtr(11); - if (structPtr->unk6300 == 1) - return TRUE; - else - return FALSE; -} - -u8 sub_81CDD7C(void) -{ - struct PokenavSub11 *structPtr = GetSubstructPtr(11); - if (structPtr->unk6300 == 1) - return structPtr->unk6783[structPtr->unk6786]; - else - return 0; -} - -u8 sub_81CDDB0(void) -{ - struct PokenavSub11 *structPtr = GetSubstructPtr(11); - return structPtr->unk6780[structPtr->unk6786]; -} diff --git a/src/pokenav_unk_7.c b/src/pokenav_unk_7.c deleted file mode 100644 index 11fdaa425..000000000 --- a/src/pokenav_unk_7.c +++ /dev/null @@ -1,884 +0,0 @@ -#include "global.h" -#include "bg.h" -#include "window.h" -#include "pokenav.h" -#include "decompress.h" -#include "gpu_regs.h" -#include "graphics.h" -#include "menu.h" -#include "menu_specialized.h" -#include "mon_markings.h" -#include "palette.h" -#include "pokenav.h" -#include "scanline_effect.h" -#include "string_util.h" -#include "strings.h" -#include "text.h" - -u32 sub_81CE37C(s32); -u32 sub_81CE2D0(s32); -u32 sub_81CE4D8(s32); -u32 sub_81CE5E4(s32); -u32 sub_81CE6BC(s32); -u32 sub_81CE700(s32); - -BSS_DATA u8 gUnknown_030012BC; - -const u16 gUnknown_086231E8[] = INCBIN_U16("graphics/pokenav/86231E8.gbapal"); -const u16 gUnknown_08623208[] = INCBIN_U16("graphics/pokenav/8623208.gbapal"); -const u32 gUnknown_08623228[] = INCBIN_U32("graphics/pokenav/8623228.4bpp.lz"); -const u32 gUnknown_0862323C[] = INCBIN_U32("graphics/pokenav/862323C.bin.lz"); -const u16 gUnknown_08623338[] = INCBIN_U16("graphics/pokenav/8623338.gbapal"); - -const struct BgTemplate gUnknown_08623358[3] = -{ - { - .bg = 1, - .charBaseIndex = 1, - .mapBaseIndex = 0x1F, - .screenSize = 0, - .paletteMode = 0, - .priority = 1, - .baseTile = 0 - }, - { - .bg = 2, - .charBaseIndex = 3, - .mapBaseIndex = 0x1D, - .screenSize = 0, - .paletteMode = 0, - .priority = 2, - .baseTile = 0 - }, - { - .bg = 3, - .charBaseIndex = 2, - .mapBaseIndex = 0x1E, - .screenSize = 0, - .paletteMode = 0, - .priority = 3, - .baseTile = 0 - } -}; - -const struct WindowTemplate gUnknown_08623364 = -{ - .bg = 1, - .tilemapLeft = 13, - .tilemapTop = 1, - .width = 13, - .height = 4, - .paletteNum = 15, - .baseBlock = 2 -}; - -const struct WindowTemplate gUnknown_0862336C = -{ - .bg = 1, - .tilemapLeft = 1, - .tilemapTop = 6, - .width = 7, - .height = 2, - .paletteNum = 15, - .baseBlock = 0x36 -}; - -const struct WindowTemplate gUnknown_08623374 = -{ - .bg = 1, - .tilemapLeft = 1, - .tilemapTop = 0x1C, - .width = 5, - .height = 2, - .paletteNum = 15, - .baseBlock = 0x44 -}; - -const struct WindowTemplate gUnknown_0862337C = -{ - .bg = 1, - .tilemapLeft = 13, - .tilemapTop = 0x1C, - .width = 3, - .height = 2, - .paletteNum = 15, - .baseBlock = 0x44 -}; - -const LoopedTask gUnknown_08623384[] = -{ - NULL, - sub_81CE37C, - sub_81CE2D0, - sub_81CE4D8, - sub_81CE5E4, - sub_81CE6BC, - sub_81CE700 -}; - -struct Pokenav7Struct -{ - u32 loopedTaskId; - u8 tilemapBuffers[3][BG_SCREEN_SIZE]; - u8 filler[2]; - u8 unk1806[10]; - u32 (*unk1810)(void); - s16 unk1814; - u8 unk1816; - u16 unk1818; - u16 unk181A; - void *unk181C; - u8 unk1820; - u8 unk1821; - u8 unk1822; - u8 unk1823; - struct PokemonMarkMenu monMarks; - struct Sprite *unk28dc; - struct Sprite *unk28e0[10]; - u8 unk2908; - u8 filler2[0x38ac - 0x2909]; -}; - -extern s8 sub_81CDC84(void); // This function's declaration here is different than its definition in pokenav_unk_6. u8/s8 - -u32 sub_81CDE94(s32 state); -u32 sub_81CDE80(void); -void sub_81CED30(u8 var); -void sub_81CE9E4(void); -void sub_81CE934(void); -bool32 sub_81CE754(u8 a0, u16 a1, bool8 a2); -void sub_81CEE44(void); -void sub_81CEE90(void); -void sub_81CEEC8(void); -void sub_81CEE68(void); -void sub_81CEE74(bool8 showBg); - -// code -bool32 sub_81CDDD4(void) -{ - struct Pokenav7Struct *structPtr = AllocSubstruct(0xC, sizeof(struct Pokenav7Struct)); - - if (structPtr == NULL) - return FALSE; - - structPtr->unk1816 = 0xFF; - structPtr->loopedTaskId = CreateLoopedTask(sub_81CDE94, 1); - structPtr->unk1810 = sub_81CDE80; - structPtr->unk2908 = 0; - return TRUE; -} - -void sub_81CDE2C(s32 id) -{ - struct Pokenav7Struct *structPtr = GetSubstructPtr(0xC); - structPtr->loopedTaskId = CreateLoopedTask(gUnknown_08623384[id], 1); - structPtr->unk1810 = sub_81CDE80; -} - -u32 sub_81CDE64(void) -{ - struct Pokenav7Struct *structPtr = GetSubstructPtr(0xC); - return structPtr->unk1810(); -} - -u32 sub_81CDE80(void) -{ - struct Pokenav7Struct *structPtr = GetSubstructPtr(0xC); - return IsLoopedTaskActive(structPtr->loopedTaskId); -} - -u32 sub_81CDE94(s32 state) -{ - struct Pokenav7Struct *structPtr = GetSubstructPtr(0xC); - - switch (state) - { - case 0: - if (sub_81CD3C4() != TRUE) - return LT_PAUSE; - return LT_INC_AND_PAUSE; - case 1: - InitBgTemplates(gUnknown_08623358, ARRAY_COUNT(gUnknown_08623358)); - ChangeBgX(1, 0, 0); - ChangeBgY(1, 0, 0); - ChangeBgX(2, 0, 0); - ChangeBgY(2, 0, 0); - ChangeBgX(3, 0, 0); - ChangeBgY(3, 0, 0); - SetGpuReg(REG_OFFSET_DISPCNT, DISPCNT_WIN0_ON | DISPCNT_WIN1_ON | DISPCNT_OBJ_ON | DISPCNT_OBJ_1D_MAP | DISPCNT_BG0_ON | DISPCNT_BG3_ON); - SetGpuReg(REG_OFFSET_BLDCNT, BLDCNT_TGT1_BG2 | BLDCNT_EFFECT_BLEND | BLDCNT_TGT2_BG3); - SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(11, 4)); - decompress_and_copy_tile_data_to_vram(3, gPokenavCondition_Gfx, 0, 0, 0); - return LT_INC_AND_PAUSE; - case 2: - if (free_temp_tile_data_buffers_if_possible()) - return LT_PAUSE; - decompress_and_copy_tile_data_to_vram(2, gUnknown_08623228, 0, 0, 0); - return LT_INC_AND_PAUSE; - case 3: - if (free_temp_tile_data_buffers_if_possible()) - return LT_PAUSE; - - LZ77UnCompVram(gPokenavCondition_Tilemap, structPtr->tilemapBuffers[0]); - SetBgTilemapBuffer(3, structPtr->tilemapBuffers[0]); - if (sub_81CDD5C() == TRUE) - CopyToBgTilemapBufferRect(3, gPokenavOptions_Tilemap, 0, 5, 9, 4); - - CopyBgTilemapBufferToVram(3); - CopyPaletteIntoBufferUnfaded(gPokenavCondition_Pal, 0x10, 0x20); - CopyPaletteIntoBufferUnfaded(gUnknown_08623208, 0xF0, 0x20); - structPtr->unk1814 = -80; - return LT_INC_AND_PAUSE; - case 4: - if (free_temp_tile_data_buffers_if_possible()) - return LT_PAUSE; - - LZ77UnCompVram(gUnknown_0862323C, structPtr->tilemapBuffers[2]); - SetBgTilemapBuffer(2, structPtr->tilemapBuffers[2]); - CopyBgTilemapBufferToVram(2); - CopyPaletteIntoBufferUnfaded(gUnknown_086231E8, 0x30, 0x20); - sub_81D21DC(2); - return LT_INC_AND_PAUSE; - case 5: - sub_8199DF0(1, 0, 0, 1); - sub_8199DF0(1, 17, 1, 1); - CpuFill32(0, structPtr->tilemapBuffers[1], BG_SCREEN_SIZE); - SetBgTilemapBuffer(1, structPtr->tilemapBuffers[1]); - return LT_INC_AND_PAUSE; - case 6: - if (free_temp_tile_data_buffers_if_possible()) - return LT_PAUSE; - - structPtr->unk1820 = AddWindow(&gUnknown_08623364); - if (sub_81CDD5C() == TRUE) - { - structPtr->unk1821 = AddWindow(&gUnknown_0862336C); - structPtr->unk1822 = AddWindow(&gUnknown_08623374); - structPtr->unk1823 = AddWindow(&gUnknown_0862337C); - } - DeactivateAllTextPrinters(); - return LT_INC_AND_PAUSE; - case 7: - sub_81CED30(0); - return LT_INC_AND_PAUSE; - case 8: - sub_81CE9E4(); - return LT_INC_AND_PAUSE; - case 9: - if (sub_81CDD5C() == TRUE) - sub_81CE934(); - return LT_INC_AND_PAUSE; - case 10: - sub_81CE754(0, sub_81CDC84(), TRUE); - return LT_INC_AND_PAUSE; - case 11: - sub_81CE754(1, sub_81CDC84(), TRUE); - return LT_INC_AND_PAUSE; - case 12: - sub_81CE754(2, sub_81CDC84(), TRUE); - return LT_INC_AND_PAUSE; - case 13: - if (sub_81CE754(3, sub_81CDC84(), TRUE) != TRUE) - return LT_PAUSE; - PutWindowTilemap(structPtr->unk1820); - if (sub_81CDD5C() == TRUE) - { - PutWindowTilemap(structPtr->unk1821); - PutWindowTilemap(structPtr->unk1822); - PutWindowTilemap(structPtr->unk1823); - } - return LT_INC_AND_PAUSE; - case 14: - ShowBg(1); - HideBg(2); - ShowBg(3); - if (sub_81CDD5C() == TRUE) - PrintHelpBarText(HELPBAR_CONDITION_MON_STATUS); - return LT_INC_AND_PAUSE; - case 15: - sub_81C7AC0(1); - if (!sub_81CDD5C()) - { - LoadLeftHeaderGfxForIndex(6); - sub_81C7FA0(1, TRUE, 0); - sub_81C7FA0(6, TRUE, 0); - } - return LT_INC_AND_PAUSE; - case 16: - if (IsPaletteFadeActive()) - return LT_PAUSE; - if (!sub_81CDD5C() && sub_81C8010()) - return LT_PAUSE; - SetVBlankCallback_(sub_81CEE44); - return LT_INC_AND_PAUSE; - case 17: - sub_81CEE90(); - sub_81D20AC(sub_81CDC70()); - return LT_INC_AND_PAUSE; - case 18: - if (sub_81D20BC(sub_81CDC70())) - return LT_PAUSE; - return LT_INC_AND_PAUSE; - case 19: - sub_81CEE74(TRUE); - return LT_INC_AND_PAUSE; - case 20: - if (!sub_81D3178(sub_81CDC70(), &structPtr->unk1814)) - { - sub_81D3464(structPtr->unk28e0); - if (sub_81CDD5C() == TRUE || sub_81CDC60() != sub_81CDC50()) - sub_81D3480(structPtr->unk28e0, structPtr->unk1816, sub_81CDDB0()); - - return LT_FINISH; - } - return LT_PAUSE; - } - - return LT_FINISH; -} - -u32 sub_81CE2D0(s32 state) -{ - struct Pokenav7Struct *structPtr = GetSubstructPtr(0xC); - - switch (state) - { - case 0: - sub_81CEEC8(); - sub_81D3520(structPtr->unk28e0); - return 1; - case 1: - if (sub_81D31A4(sub_81CDC70(), &structPtr->unk1814)) - return 2; - sub_81CEE74(FALSE); - return 1; - case 2: - sub_81C7AC0(0); - if (!sub_81CDD5C()) - sub_81C78A0(); - return 0; - case 3: - if (IsPaletteFadeActive() || MainMenuLoopedTaskIsBusy()) - return 2; - sub_81D354C(structPtr->unk28e0); - HideBg(1); - HideBg(2); - HideBg(3); - return 1; - } - - return LT_FINISH; -} - -u32 sub_81CE37C(s32 state) -{ - struct Pokenav7Struct *structPtr = GetSubstructPtr(0xC); - struct UnknownStruct_81D1ED4 *unkPtr = sub_81CDC70(); - - switch (state) - { - case 0: - sub_81CD548(0); - return 1; - case 1: - sub_81CD548(1); - return 1; - case 2: - sub_81CD548(2); - sub_81D3520(structPtr->unk28e0); - return 1; - case 3: - sub_81D2074(unkPtr); - return 1; - case 4: - if (!sub_81D3150(&structPtr->unk1814)) - { - sub_81CED30(sub_81CDC84()); - return 1; - } - return 2; - case 5: - sub_81CE754(0, sub_81CDC84(), FALSE); - return 1; - case 6: - sub_81CE754(1, sub_81CDC84(), FALSE); - return 1; - case 7: - sub_81CE754(2, sub_81CDC84(), FALSE); - return 1; - case 8: - if (sub_81CE754(3, sub_81CDC84(), FALSE) == TRUE) - return 1; - return 2; - case 9: - unkPtr = sub_81CDC70(); - if (!sub_81D3178(unkPtr, &structPtr->unk1814)) - { - sub_81D3464(structPtr->unk28e0); - if (sub_81CDD5C() != TRUE && sub_81CDC60() == sub_81CDC50()) - return 1; - - sub_81D3480(structPtr->unk28e0, structPtr->unk1816, sub_81CDDB0()); - return 1; - } - return 2; - } - - return LT_FINISH; -} - -u32 sub_81CE4D8(s32 state) -{ - struct Pokenav7Struct *structPtr = GetSubstructPtr(0xC); - - switch (state) - { - case 0: - sub_81CD548(0); - return 1; - case 1: - sub_81CD548(1); - return 1; - case 2: - sub_81CD548(2); - return 1; - case 3: - sub_81CED30(sub_81CDC84()); - return 1; - case 4: - sub_81CE754(0, sub_81CDC84(), FALSE); - return 1; - case 5: - sub_81CE754(1, sub_81CDC84(), FALSE); - return 1; - case 6: - sub_81CE754(2, sub_81CDC84(), FALSE); - return 1; - case 7: - if (sub_81CE754(3, sub_81CDC84(), FALSE) == TRUE) - return 1; - return 2; - case 8: - if (!sub_81D3178(sub_81CDC70(), &structPtr->unk1814)) - { - sub_81D3464(structPtr->unk28e0); - sub_81D3480(structPtr->unk28e0, structPtr->unk1816, sub_81CDDB0()); - return 1; - } - return 2; - } - - return LT_FINISH; -} - -u32 sub_81CE5E4(s32 state) -{ - struct Pokenav7Struct *structPtr = GetSubstructPtr(0xC); - - switch (state) - { - case 0: - sub_81CD548(0); - return 1; - case 1: - sub_81CD548(1); - return 1; - case 2: - sub_81CD548(2); - sub_81D3520(structPtr->unk28e0); - return 1; - case 3: - if (!sub_81D31A4(sub_81CDC70(), &structPtr->unk1814)) - return 1; - return 2; - case 4: - sub_81CE754(0, sub_81CDC84(), FALSE); - return 1; - case 5: - sub_81CE754(1, sub_81CDC84(), FALSE); - return 1; - case 6: - sub_81CE754(2, sub_81CDC84(), FALSE); - return 1; - case 7: - if (sub_81CE754(3, sub_81CDC84(), FALSE) == TRUE) - return 1; - return 2; - } - - return LT_FINISH; -} - -u32 sub_81CE6BC(s32 state) -{ - switch (state) - { - case 0: - sub_811FAA4(sub_81CDD7C(), 176, 32); - return 1; - case 1: - PrintHelpBarText(HELPBAR_CONDITION_MARKINGS); - return 1; - case 2: - if (WaitForHelpBar() == TRUE) - return 2; - return 1; - } - - return LT_FINISH; -} - -u32 sub_81CE700(s32 state) -{ - switch (state) - { - case 0: - sub_811FAF8(); - return 1; - case 1: - PrintHelpBarText(HELPBAR_CONDITION_MON_STATUS); - return 1; - case 2: - if (WaitForHelpBar() == TRUE) - return 2; - return 1; - } - - return LT_FINISH; -} - -static u8 *UnusedPrintNumberString(u8 *dst, u16 num) -{ - u8 *txtPtr = ConvertIntToDecimalStringN(dst, num, STR_CONV_MODE_RIGHT_ALIGN, 4); - txtPtr = StringCopy(txtPtr, gText_Number2); - - return txtPtr; -} - -bool32 sub_81CE754(u8 a0, u16 a1, bool8 a2) -{ - u8 text[32]; - const u8 *str; - struct Pokenav7Struct *structPtr = GetSubstructPtr(0xC); - - switch (a0) - { - case 0: - FillWindowPixelBuffer(structPtr->unk1820, 0); - if (sub_81CDD5C() == TRUE) - FillWindowPixelBuffer(structPtr->unk1821, 0); - break; - case 1: - if (sub_81CDC60() != sub_81CDC50() - 1 || sub_81CDD5C() == TRUE) - { - str = sub_81CDD04(a1); - AddTextPrinterParameterized(structPtr->unk1820, 1, str, 0, 1, 0, NULL); - } - break; - case 2: - if (sub_81CDD5C() == TRUE) - { - str = sub_81CDD24(a1); - AddTextPrinterParameterized(structPtr->unk1820, 1, str, 0, 17, 0, NULL); - text[0] = EXT_CTRL_CODE_BEGIN; - text[1] = 4; - text[2] = 8; - text[3] = 0; - text[4] = 9; - StringCopy(text + 5, gText_Number2); - AddTextPrinterParameterized(structPtr->unk1821, 1, text, 4, 1, 0, NULL); - ConvertIntToDecimalStringN(text + 5, sub_81CDD48(), STR_CONV_MODE_RIGHT_ALIGN, 4); - AddTextPrinterParameterized(structPtr->unk1821, 1, text, 28, 1, 0, NULL); - } - break; - case 3: - switch (structPtr->unk2908) - { - case 0: - if (a2) - CopyWindowToVram(structPtr->unk1820, 3); - else - CopyWindowToVram(structPtr->unk1820, 2); - - if (sub_81CDD5C() == TRUE) - { - structPtr->unk2908++; - return FALSE; - } - else - { - structPtr->unk2908 = 0; - return TRUE; - } - case 1: - if (a2) - CopyWindowToVram(structPtr->unk1821, 3); - else - CopyWindowToVram(structPtr->unk1821, 2); - - structPtr->unk2908 = 0; - return TRUE; - } - } - - return FALSE; -} - -void sub_81CE934(void) -{ - struct Pokenav7Struct *structPtr = GetSubstructPtr(0xC); - - CopyWindowToVram(structPtr->unk1822, 3); - CopyWindowToVram(structPtr->unk1823, 3); -} - -void sub_81CE964(struct Sprite *sprite) -{ - if (sprite->data[0] == sub_81CDC60()) - StartSpriteAnim(sprite, 0); - else - StartSpriteAnim(sprite, 1); -} - -void sub_81CE990(struct Sprite *sprite) -{ - if (sub_81CDC60() == sub_81CDC50() - 1) - sprite->oam.paletteNum = IndexOfSpritePaletteTag(0x65); - else - sprite->oam.paletteNum = IndexOfSpritePaletteTag(0x66); -} - -void sub_81CE9C8(struct Sprite *sprite) -{ - StartSpriteAnim(sprite, sub_81CDD7C()); -} - -void sub_81CE9E4(void) -{ - struct SpriteSheet sprSheets[4]; - struct SpriteTemplate sprTemplate; - struct SpritePalette sprPals[3]; - struct SpriteSheet sprSheet; - struct Sprite *sprite; - u16 i, spriteId; - struct Pokenav7Struct *structPtr = GetSubstructPtr(0xC); - - sub_81D321C(sprSheets, &sprTemplate, sprPals); - if (sub_81CDD5C() == TRUE) - { - structPtr->monMarks.baseTileTag = 0x6A; - structPtr->monMarks.basePaletteTag = 0x6A; - sub_811F90C(&structPtr->monMarks); - sub_811FA90(); - sprite = sub_811FF94(0x69, 0x69, gUnknown_08623338); - sprite->oam.priority = 3; - sprite->pos1.x = 192; - sprite->pos1.y = 32; - sprite->callback = sub_81CE9C8; - structPtr->unk28dc = sprite; - sub_81C7990(IndexOfSpritePaletteTag(0x69), 0); - } - else - { - LoadSpriteSheets(sprSheets); - Pokenav_AllocAndLoadPalettes(sprPals); - for (i = 0; i < sub_81CDC50() - 1; i++) - { - spriteId = CreateSprite(&sprTemplate, 226, (i * 20) + 8, 0); - if (spriteId != MAX_SPRITES) - { - structPtr->unk1806[i] = spriteId; - gSprites[spriteId].data[0] = i; - gSprites[spriteId].callback = sub_81CE964; - } - else - { - structPtr->unk1806[i] = 0xFF; - } - } - - sprTemplate.tileTag = 0x67; - sprTemplate.callback = SpriteCallbackDummy; - for (; i < 6; i++) - { - spriteId = CreateSprite(&sprTemplate, 230, (i * 20) + 8, 0); - if (spriteId != MAX_SPRITES) - { - structPtr->unk1806[i] = spriteId; - gSprites[spriteId].oam.size = 0; - } - else - { - structPtr->unk1806[i] = 0xFF; - } - } - - sprTemplate.tileTag = 0x66; - sprTemplate.callback = sub_81CE990; - spriteId = CreateSprite(&sprTemplate, 222, (i * 20) + 8, 0); - if (spriteId != MAX_SPRITES) - { - structPtr->unk1806[i] = spriteId; - gSprites[spriteId].oam.shape = SPRITE_SHAPE(32x16); - gSprites[spriteId].oam.size = SPRITE_SIZE(32x16); - } - else - { - structPtr->unk1806[i] = 0xFF; - } - } - - sub_81D32B0(&sprSheet, &sprPals[0]); - LoadSpriteSheet(&sprSheet); - sprPals[1].data = NULL; - Pokenav_AllocAndLoadPalettes(sprPals); -} - -void sub_81CEBF4(struct Pokenav7Struct *structPtr) -{ - u8 i; - - if (sub_81CDD5C() == TRUE) - { - DestroySprite(structPtr->unk28dc); - FreeSpriteTilesByTag(0x6A); - FreeSpriteTilesByTag(0x69); - FreeSpritePaletteByTag(0x6A); - FreeSpritePaletteByTag(0x69); - } - else - { - for (i = 0; i < 7; i++) - DestroySprite(&gSprites[structPtr->unk1806[i]]); - - FreeSpriteTilesByTag(0x65); - FreeSpriteTilesByTag(0x66); - FreeSpriteTilesByTag(0x67); - FreeSpritePaletteByTag(0x65); - FreeSpritePaletteByTag(0x66); - } - - if (structPtr->unk1816 != 0xFF) - { - DestroySprite(&gSprites[structPtr->unk1816]); - FreeSpriteTilesByTag(0x64); - FreeSpritePaletteByTag(0x64); - } -} - -void sub_81CECA0(void) -{ - struct Pokenav7Struct *structPtr = GetSubstructPtr(0xC); - - RemoveWindow(structPtr->unk1820); - if (sub_81CDD5C() == TRUE) - { - RemoveWindow(structPtr->unk1821); - RemoveWindow(structPtr->unk1822); - RemoveWindow(structPtr->unk1823); - } - else - { - sub_81C7FDC(); - } - - SetGpuReg(REG_OFFSET_DISPCNT, DISPCNT_OBJ_ON | DISPCNT_BG0_ON | DISPCNT_OBJ_1D_MAP); - sub_81CEBF4(structPtr); - sub_81CEE68(); - FreePokenavSubstruct(0xC); -} - -void sub_81CED10(struct Sprite *sprite) -{ - struct Pokenav7Struct *structPtr = GetSubstructPtr(0xC); - sprite->pos1.x = structPtr->unk1814 + 38; -} - -void sub_81CED30(u8 var) -{ - struct SpriteTemplate sprTemplate; - struct SpriteSheet sprSheet; - struct SpritePalette sprPal; - u8 spriteId; - struct Pokenav7Struct *structPtr = GetSubstructPtr(0xC); - - if (structPtr->unk1816 == 0xFF) - { - sub_81D31D0(&sprSheet, &sprTemplate, &sprPal); - sprSheet.data = sub_81CDCB4(var); - sprPal.data = sub_81CDCD4(var); - structPtr->unk1818 = LoadSpritePalette(&sprPal); - structPtr->unk181A = LoadSpriteSheet(&sprSheet); - spriteId = CreateSprite(&sprTemplate, 38, 104, 0); - structPtr->unk1816 = spriteId; - if (spriteId == MAX_SPRITES) - { - FreeSpriteTilesByTag(0x64); - FreeSpritePaletteByTag(0x64); - structPtr->unk1816 = 0xFF; - } - else - { - structPtr->unk1816 = spriteId; - gSprites[structPtr->unk1816].callback = sub_81CED10; - structPtr->unk181C = (void*)(VRAM) + 0x10000 + (structPtr->unk181A * 32); - structPtr->unk1818 = (structPtr->unk1818 * 16) + 0x100; - } - } - else - { - DmaCopy16Defvars(3, sub_81CDCB4(var), structPtr->unk181C, 0x800); - LoadPalette(sub_81CDCD4(var), structPtr->unk1818, 0x20); - } -} - -void sub_81CEE44(void) -{ - struct UnknownStruct_81D1ED4 *unk = sub_81CDC70(); - LoadOam(); - ProcessSpriteCopyRequests(); - TransferPlttBuffer(); - sub_81D2108(unk); - ScanlineEffect_InitHBlankDmaTransfer(); -} - -void sub_81CEE68(void) -{ - SetPokenavVBlankCallback(); -} - -void sub_81CEE74(bool8 showBg) -{ - if (showBg) - ShowBg(2); - else - HideBg(2); -} - -void sub_81CEE90(void) -{ - struct UnknownStruct_81D1ED4 *unk = sub_81CDC70(); - u8 id = sub_81CDC84(); - - gUnknown_030012BC = id; - sub_81D1F84(unk, unk->unk14[3], unk->unk14[id]); - sub_81D2074(unk); -} - -void sub_81CEEC8(void) -{ - struct UnknownStruct_81D1ED4 *unk = sub_81CDC70(); - - if (sub_81CDD5C() || sub_81CDC60() != sub_81CDC50() - 1) - sub_81D1F84(unk, unk->unk14[sub_81CDC84()], unk->unk14[3]); -} - -u8 sub_81CEF14(void) -{ - struct Pokenav7Struct *structPtr = GetSubstructPtr(0xC); - - if (sub_81CDD5C() == 1) - return structPtr->monMarks.markings; - else - return 0; -} diff --git a/src/pokenav_unk_8.c b/src/pokenav_unk_8.c deleted file mode 100644 index 9b6ce432b..000000000 --- a/src/pokenav_unk_8.c +++ /dev/null @@ -1,714 +0,0 @@ -#include "global.h" -#include "pokenav.h" -#include "bg.h" -#include "menu.h" -#include "window.h" -#include "sound.h" -#include "dynamic_placeholder_text_util.h" -#include "strings.h" -#include "string_util.h" -#include "international_string_util.h" -#include "constants/songs.h" - -struct PokenavSub7 -{ - u32 (*unk0)(struct PokenavSub7 *); - u32 loopedTaskId; - u8 fill1[4]; - s32 unkC; - s32 unk10; - u32 unk14; - u32 unk18; - u32 unk1C; - struct PokenavSub18 *unkPtr; -}; - -struct PokenavSub8 -{ - bool32 (*callback)(void); - u32 ltid; - u16 winid; - bool32 unkC; - u8 buff[BG_SCREEN_SIZE]; -}; // size: 0x810 - -static u32 sub_81CF010(struct PokenavSub7 *structPtr); -static u32 sub_81CF030(struct PokenavSub7 *structPtr); -static u32 sub_81CF0B8(struct PokenavSub7 *structPtr); -static u32 sub_81CF0B0(struct PokenavSub7 *structPtr); -static u32 sub_81CF11C(s32 state); -static u32 sub_81CF134(s32 state); -static u32 sub_81CF1C4(s32 state); -static u32 sub_81CF1D8(s32 state); -static u32 sub_81CF278(s32 state); -static u32 sub_81CF578(s32 state); -static u32 sub_81CF5F0(s32 state); -static u32 sub_81CF668(s32 state); -static u32 sub_81CF6E0(s32 state); -static u32 sub_81CF758(s32 state); -static u32 sub_81CF798(s32 state); -static void sub_81CF2C4(struct PokenavSub7 *structPtr, struct PokenavMonList *item); -static bool32 sub_81CF3E4(void); -static u32 sub_81CF418(s32 state); -static void sub_81CF7C8(struct PokenavSub8 *); -static void sub_81CF7F4(struct PokenavSub8 *); -static void sub_81CF88C(void); -static void sub_81CF8E4(struct PokenavMonList *, u8 *); - -static const u32 gUnknown_086233A0[] = {0x16, 0x17, 0x18, 0x21, 0x2F}; - -static const LoopedTask gUnknown_086233B4[] = -{ - sub_81CF134, - sub_81CF1C4, - sub_81CF1D8, - sub_81CF278 -}; - -static const u16 gUnknown_086233C4[] = INCBIN_U16("graphics/pokenav/condition_search2.gbapal"); -static const u32 gUnknown_086233E4[] = INCBIN_U32("graphics/pokenav/condition_search2.4bpp.lz"); -static const u32 gUnknown_086234AC[] = INCBIN_U32("graphics/pokenav/condition_search2.bin.lz"); -static const u16 gUnknown_08623570[] = INCBIN_U16("graphics/pokenav/8623570.gbapal"); - -static const struct BgTemplate gUnknown_08623590[] = -{ - { - .bg = 1, - .charBaseIndex = 1, - .mapBaseIndex = 0x06, - .screenSize = 0, - .paletteMode = 0, - .priority = 2, - .baseTile = 0 - }, { - .bg = 2, - .charBaseIndex = 2, - .mapBaseIndex = 0x07, - .screenSize = 0, - .paletteMode = 0, - .priority = 3, - .baseTile = 0 - } -}; - -static const LoopedTask gUnknown_08623598[] = -{ - NULL, - sub_81CF578, - sub_81CF5F0, - sub_81CF668, - sub_81CF6E0, - sub_81CF758, - sub_81CF798 -}; - -static const struct WindowTemplate gUnknown_086235B4 = -{ - .bg = 1, - .tilemapLeft = 1, - .tilemapTop = 6, - .width = 7, - .height = 2, - .paletteNum = 1, - .baseBlock = 20 -}; - -static const u8 sText_MaleSymbol[] = _("{COLOR_HIGHLIGHT_SHADOW}{LIGHT_RED}{WHITE}{GREEN}♂{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 sText_NoGenderSymbol[] = _("{UNK_SPACER}"); - -bool32 PokenavCallback_Init_8(void) -{ - struct PokenavSub7 *structPtr = AllocSubstruct(7, sizeof(struct PokenavSub7)); - if (structPtr == NULL) - return FALSE; - - structPtr->unkPtr = AllocSubstruct(18, sizeof(struct PokenavSub18)); - if (structPtr->unkPtr == NULL) - return FALSE; - - structPtr->unk0 = sub_81CF010; - structPtr->loopedTaskId = CreateLoopedTask(sub_81CF11C, 1); - structPtr->unk18 = 0; - structPtr->unk14 = gUnknown_086233A0[GetSelectedConditionSearch()]; - return TRUE; -} - -bool32 PokenavCallback_Init_10(void) -{ - struct PokenavSub7 *structPtr = AllocSubstruct(7, sizeof(struct PokenavSub7)); - if (structPtr == NULL) - return FALSE; - - structPtr->unkPtr = GetSubstructPtr(18); - structPtr->unk0 = sub_81CF030; - structPtr->unk18 = 1; - structPtr->unk14 = gUnknown_086233A0[GetSelectedConditionSearch()]; - return TRUE; -} - -u32 sub_81CEFDC(void) -{ - struct PokenavSub7 *structPtr = GetSubstructPtr(7); - return structPtr->unk0(structPtr); -} - -void sub_81CEFF0(void) -{ - struct PokenavSub7 *structPtr = GetSubstructPtr(7); - if (structPtr->unk1C == 0) - FreePokenavSubstruct(18); - FreePokenavSubstruct(7); -} - -static bool32 sub_81CF010(struct PokenavSub7 *structPtr) -{ - if (!IsLoopedTaskActive(structPtr->loopedTaskId)) - structPtr->unk0 = sub_81CF030; - return FALSE; -} - -static u32 sub_81CF030(struct PokenavSub7 *structPtr) -{ - if (gMain.newAndRepeatedKeys & DPAD_UP) - return 1; - else if (gMain.newAndRepeatedKeys & DPAD_DOWN) - return 2; - else if (gMain.newKeys & DPAD_LEFT) - return 3; - else if (gMain.newKeys & DPAD_RIGHT) - return 4; - else if (gMain.newKeys & B_BUTTON) - { - structPtr->unk1C = 0; - structPtr->unk0 = sub_81CF0B0; - return 5; - } - else if (gMain.newKeys & A_BUTTON) - { - structPtr->unkPtr->unk2 = GetSelectedMatchCall(); - structPtr->unk1C = 1; - structPtr->unk0 = sub_81CF0B8; - return 6; - } - else - return 0; -} - -static u32 sub_81CF0B0(struct PokenavSub7 *structPtr) -{ - return 100003; -} - -static u32 sub_81CF0B8(struct PokenavSub7 *structPtr) -{ - return 100009; -} - -static u32 sub_81CF0C0(void) -{ - struct PokenavSub7 *structPtr = GetSubstructPtr(7); - return structPtr->unk18; -} - -static struct PokenavMonList * sub_81CF0D0(void) -{ - struct PokenavSub7 * ptr = GetSubstructPtr(7); - return ptr->unkPtr->unk4; -} - -static u16 sub_81CF0E0(void) -{ - struct PokenavSub7 * ptr = GetSubstructPtr(7); - return ptr->unkPtr->unk0; -} - -static s32 sub_81CF0F0(void) -{ - struct PokenavSub7 * ptr = GetSubstructPtr(7); - s32 i = GetSelectedMatchCall(); - return ptr->unkPtr->unk4[i].data; -} - -static u16 sub_81CF10C(void) -{ - struct PokenavSub7 * ptr = GetSubstructPtr(7); - return ptr->unkPtr->unk2; -} - -static u32 sub_81CF11C(s32 state) -{ - return gUnknown_086233B4[state](state); -} - -static u32 sub_81CF134(s32 state) -{ - s32 i; - struct PokenavMonList item; - struct PokenavSub7 * ptr = GetSubstructPtr(7); - - ptr->unkPtr->unk0 = 0; - ptr->unkPtr->unk2 = 0; - item.boxId = 14; - for (i = 0; i < PARTY_SIZE; i++) - { - struct Pokemon * pokemon = &gPlayerParty[i]; - if (!GetMonData(pokemon, MON_DATA_SANITY_HAS_SPECIES)) - return LT_INC_AND_CONTINUE; - if (!GetMonData(pokemon, MON_DATA_SANITY_IS_EGG)) - { - item.monId = i; - item.data = GetMonData(pokemon, ptr->unk14); - sub_81CF2C4(ptr, &item); - } - } - - return LT_INC_AND_CONTINUE; -} - -static u32 sub_81CF1C4(s32 state) -{ - struct PokenavSub7 * ptr = GetSubstructPtr(7); - ptr->unk10 = 0; - ptr->unkC = 0; - return LT_INC_AND_CONTINUE; -} - -static u32 sub_81CF1D8(s32 state) -{ - struct PokenavSub7 * ptr = GetSubstructPtr(7); - s32 boxId = ptr->unkC; - s32 monId = ptr->unk10; - s32 boxCount = 0; - struct PokenavMonList item; - - while (boxId < TOTAL_BOXES_COUNT) - { - while (monId < IN_BOX_COUNT) - { - if (CheckBoxMonSanityAt(boxId, monId)) - { - item.boxId = boxId; - item.monId = monId; - item.data = GetBoxMonDataAt(boxId, monId, ptr->unk14); - sub_81CF2C4(ptr, &item); - } - boxCount++; - monId++; - if (boxCount > 14) - { - ptr->unkC = boxId; - ptr->unk10 = monId; - return LT_CONTINUE; - } - } - monId = 0; - boxId++; - } - - return LT_INC_AND_CONTINUE; -} - -static u32 sub_81CF278(s32 state) -{ - struct PokenavSub7 * ptr = GetSubstructPtr(7); - s32 r6 = ptr->unkPtr->unk0; - s32 r4 = ptr->unkPtr->unk4[0].data; - s32 i; - ptr->unkPtr->unk4[0].data = 1; - for (i = 1; i < r6; i++) - { - if (ptr->unkPtr->unk4[i].data == r4) - { - ptr->unkPtr->unk4[i].data = ptr->unkPtr->unk4[i - 1].data; - } - else - { - r4 = ptr->unkPtr->unk4[i].data; - ptr->unkPtr->unk4[i].data = i + 1; - } - } - ptr->unk18 = 1; - return LT_FINISH; -} - -static void sub_81CF2C4(struct PokenavSub7 *structPtr, struct PokenavMonList *item) -{ - u32 left = 0; - u32 right = structPtr->unkPtr->unk0; - u32 insertionIdx = left + (right - left) / 2; - - while (right != insertionIdx) - { - if (item->data > structPtr->unkPtr->unk4[insertionIdx].data) - right = insertionIdx; - else - left = insertionIdx + 1; - insertionIdx = left + (right - left) / 2; - } - for (right = structPtr->unkPtr->unk0; right > insertionIdx; right--) - structPtr->unkPtr->unk4[right] = structPtr->unkPtr->unk4[right - 1]; - structPtr->unkPtr->unk4[insertionIdx] = *item; - structPtr->unkPtr->unk0++; -} - -bool32 sub_81CF330(void) -{ - struct PokenavSub8 * unk = AllocSubstruct(8, sizeof(struct PokenavSub8)); - if (unk == NULL) - return FALSE; - unk->ltid = CreateLoopedTask(sub_81CF418, 1); - unk->callback = sub_81CF3E4; - unk->unkC = FALSE; - return TRUE; -} - -bool32 sub_81CF368(void) -{ - struct PokenavSub8 * unk = AllocSubstruct(8, sizeof(struct PokenavSub8)); - if (unk == NULL) - return FALSE; - unk->ltid = CreateLoopedTask(sub_81CF418, 1); - unk->callback = sub_81CF3E4; - unk->unkC = TRUE; - return TRUE; -} - -void sub_81CF3A0(s32 idx) -{ - struct PokenavSub8 * unk = GetSubstructPtr(8); - unk->ltid = CreateLoopedTask(gUnknown_08623598[idx], 1); - unk->callback = sub_81CF3E4; -} - -bool32 sub_81CF3D0(void) -{ - struct PokenavSub8 * unk = GetSubstructPtr(8); - return unk->callback(); -} - -bool32 sub_81CF3E4(void) -{ - struct PokenavSub8 * unk = GetSubstructPtr(8); - return IsLoopedTaskActive(unk->ltid); -} - -void sub_81CF3F8(void) -{ - struct PokenavSub8 * unk = GetSubstructPtr(8); - sub_81C8234(); - RemoveWindow(unk->winid); - FreePokenavSubstruct(8); -} - -static u32 sub_81CF418(s32 state) -{ - struct PokenavSub8 * unk = GetSubstructPtr(8); - switch (state) - { - case 0: - InitBgTemplates(gUnknown_08623590, NELEMS(gUnknown_08623590)); - decompress_and_copy_tile_data_to_vram(1, gUnknown_086233E4, 0, 0, 0); - SetBgTilemapBuffer(1, unk->buff); - CopyToBgTilemapBuffer(1, gUnknown_086234AC, 0, 0); - CopyBgTilemapBufferToVram(1); - CopyPaletteIntoBufferUnfaded(gUnknown_086233C4, 0x10, 0x20); - CopyBgTilemapBufferToVram(1); - return LT_INC_AND_PAUSE; - case 1: - if (free_temp_tile_data_buffers_if_possible()) - return LT_PAUSE; - if (!sub_81CF0C0()) - return LT_PAUSE; - return LT_INC_AND_PAUSE; - case 2: - if (free_temp_tile_data_buffers_if_possible()) - return LT_PAUSE; - CopyPaletteIntoBufferUnfaded(gUnknown_08623570, 0x20, 0x20); - sub_81CF88C(); - return LT_INC_AND_PAUSE; - case 3: - if (sub_81C8224()) - return LT_PAUSE; - sub_81CF7C8(unk); - PrintHelpBarText(HELPBAR_CONDITION_MON_LIST); - return LT_INC_AND_PAUSE; - case 4: - if (free_temp_tile_data_buffers_if_possible()) - return LT_PAUSE; - ChangeBgX(1, 0, 0); - ChangeBgY(1, 0, 0); - ShowBg(1); - ShowBg(2); - HideBg(3); - if (!unk->unkC) - { - u8 r4 = GetSelectedConditionSearch() + POKENAV_MENUITEM_CONDITION_SEARCH_COOL; - LoadLeftHeaderGfxForIndex(r4); - sub_81C7FA0(r4, 1, 0); - sub_81C7FA0(1, 1, 0); - } - sub_81C7AC0(1); - return LT_INC_AND_PAUSE; - case 5: - if (IsPaletteFadeActive()) - return LT_PAUSE; - if (sub_81C8010()) - return LT_PAUSE; - break; - } - return LT_FINISH; -} - -static u32 sub_81CF578(s32 state) -{ - struct PokenavSub8 * unk = GetSubstructPtr(8); - switch (state) - { - case 0: - switch (MatchCall_MoveCursorUp()) - { - case 0: - return LT_FINISH; - case 1: - PlaySE(SE_SELECT); - return LT_SET_STATE(2); - case 2: - PlaySE(SE_SELECT); - break; - } - return LT_INC_AND_PAUSE; - case 1: - if (sub_81C8630()) - return LT_PAUSE; - // fallthrough - case 2: - sub_81CF7F4(unk); - return LT_INC_AND_PAUSE; - case 3: - if (IsDma3ManagerBusyWithBgCopy()) - return LT_PAUSE; - break; - } - return LT_FINISH; -} - -static u32 sub_81CF5F0(s32 state) -{ - struct PokenavSub8 * unk = GetSubstructPtr(8); - switch (state) - { - case 0: - switch (MatchCall_MoveCursorDown()) - { - case 0: - return LT_FINISH; - case 1: - PlaySE(SE_SELECT); - return LT_SET_STATE(2); - case 2: - PlaySE(SE_SELECT); - break; - } - return LT_INC_AND_PAUSE; - case 1: - if (sub_81C8630()) - return LT_PAUSE; - // fallthrough - case 2: - sub_81CF7F4(unk); - return LT_INC_AND_PAUSE; - case 3: - if (IsDma3ManagerBusyWithBgCopy()) - return LT_PAUSE; - break; - } - return LT_FINISH; -} - -static u32 sub_81CF668(s32 state) -{ - struct PokenavSub8 * unk = GetSubstructPtr(8); - switch (state) - { - case 0: - switch (MatchCall_PageUp()) - { - case 0: - return LT_FINISH; - case 1: - PlaySE(SE_SELECT); - return LT_SET_STATE(2); - case 2: - PlaySE(SE_SELECT); - break; - } - return LT_INC_AND_PAUSE; - case 1: - if (sub_81C8630()) - return LT_PAUSE; - // fallthrough - case 2: - sub_81CF7F4(unk); - return LT_INC_AND_PAUSE; - case 3: - if (IsDma3ManagerBusyWithBgCopy()) - return LT_PAUSE; - break; - } - return LT_FINISH; -} - -static u32 sub_81CF6E0(s32 state) -{ - struct PokenavSub8 * unk = GetSubstructPtr(8); - switch (state) - { - case 0: - switch (MatchCall_PageDown()) - { - case 0: - return LT_FINISH; - case 1: - PlaySE(SE_SELECT); - return LT_SET_STATE(2); - case 2: - PlaySE(SE_SELECT); - break; - } - return LT_INC_AND_PAUSE; - case 1: - if (sub_81C8630()) - return LT_PAUSE; - // fallthrough - case 2: - sub_81CF7F4(unk); - return LT_INC_AND_PAUSE; - case 3: - if (IsDma3ManagerBusyWithBgCopy()) - return LT_PAUSE; - break; - } - return LT_FINISH; -} - -static u32 sub_81CF758(s32 state) -{ - switch (state) - { - case 0: - PlaySE(SE_SELECT); - sub_81C7AC0(0); - sub_81C78A0(); - return LT_INC_AND_PAUSE; - case 1: - if (IsPaletteFadeActive()) - return LT_PAUSE; - if (MainMenuLoopedTaskIsBusy()) - return LT_PAUSE; - sub_81C7FDC(); - break; - } - return LT_FINISH; -} - -static u32 sub_81CF798(s32 state) -{ - switch (state) - { - case 0: - PlaySE(SE_SELECT); - sub_81C7AC0(0); - return LT_INC_AND_PAUSE; - case 1: - if (IsPaletteFadeActive()) - return LT_PAUSE; - break; - } - return LT_FINISH; -} - -static void sub_81CF7C8(struct PokenavSub8 * ptr) -{ - ptr->winid = AddWindow(&gUnknown_086235B4); - PutWindowTilemap(ptr->winid); - CopyWindowToVram(ptr->winid, 1); - sub_81CF7F4(ptr); -} - -static void sub_81CF7F4(struct PokenavSub8 * ptr) -{ - s32 r7 = sub_81CF0F0(); - DynamicPlaceholderTextUtil_Reset(); - DynamicPlaceholderTextUtil_SetPlaceholderPtr(0, gStringVar1); - *gStringVar1 = EOS; - DynamicPlaceholderTextUtil_ExpandPlaceholders(gStringVar2, gText_NumberF700); - AddTextPrinterParameterized(ptr->winid, 1, gStringVar2, 4, 1, 0xFF, NULL); - ConvertIntToDecimalStringN(gStringVar1, r7, STR_CONV_MODE_RIGHT_ALIGN, 3); - AddTextPrinterParameterized(ptr->winid, 1, gStringVar1, 34, 1, 0xFF, NULL); - CopyWindowToVram(ptr->winid, 2); -} - -static void sub_81CF88C(void) -{ - struct PokenavListTemplate template; - template.list.monList = sub_81CF0D0(); - template.unk4 = sub_81CF0E0(); - template.unk8 = 4; - template.unk6 = sub_81CF10C(); - template.unk9 = 13; - template.unkA = 17; - template.unkB = 1; - template.unkC = 8; - template.unkD = 2; - template.unkE = 1; - template.listFunc.unk10_1 = sub_81CF8E4; - template.unk14 = NULL; - sub_81C81D4(&gUnknown_08623590[1], &template, 0); -} - -static void sub_81CF8E4(struct PokenavMonList * item, u8 * dest) -{ - u8 gender; - u8 level; - u8 * s; - const u8 * genderStr; - - // Mon is in party - if (item->boxId == TOTAL_BOXES_COUNT) - { - struct Pokemon * mon = &gPlayerParty[item->monId]; - gender = GetMonGender(mon); - level = GetLevelFromMonExp(mon); - GetMonData(mon, MON_DATA_NICKNAME, gStringVar3); - } - // Mon is in PC - else - { - struct BoxPokemon * mon = GetBoxedMonPtr(item->boxId, item->monId); - gender = GetBoxMonGender(mon); - level = GetLevelFromBoxMonExp(mon); - GetBoxMonData(mon, MON_DATA_NICKNAME, gStringVar3); - } - - StringGetEnd10(gStringVar3); - dest = sub_81DB494(dest, 1, gStringVar3, 60); - switch (gender) - { - default: - genderStr = sText_NoGenderSymbol; - break; - case MON_MALE: - genderStr = sText_MaleSymbol; - break; - case MON_FEMALE: - genderStr = sText_FemaleSymbol; - break; - } - s = StringCopy(gStringVar1, genderStr); - *s++ = CHAR_SLASH; - *s++ = CHAR_SPECIAL_F9; - *s++ = CHAR_LV_2; - ConvertIntToDecimalStringN(s, level, STR_CONV_MODE_LEFT_ALIGN, 3); - sub_81DB494(dest, 1, gStringVar1, 40); -} diff --git a/src/pokenav_unk_9.c b/src/pokenav_unk_9.c deleted file mode 100644 index 63b4adb30..000000000 --- a/src/pokenav_unk_9.c +++ /dev/null @@ -1,732 +0,0 @@ -#include "global.h" -#include "pokenav.h" -#include "bg.h" -#include "menu.h" -#include "window.h" -#include "sound.h" -#include "string_util.h" -#include "international_string_util.h" -#include "constants/songs.h" - -struct PokenavSub9 -{ - u32 (*unk0)(struct PokenavSub9*); - u32 loopedTaskId; - u16 winid; - s32 unkC; - s32 unk10; - u32 unk14; - u32 unk18; - struct PokenavSub18 *unk1C; -}; - -struct PokenavSub10 -{ - bool32 (*callback)(void); - u32 ltid; - u16 winid; - bool32 unkC; - u8 buff[BG_SCREEN_SIZE]; -}; - -static u32 sub_81CFA68(struct PokenavSub9 *structPtr); -static u32 sub_81CFA88(struct PokenavSub9 *structPtr); -static u32 sub_81CFB08(struct PokenavSub9 *structPtr); -static u32 sub_81CFB10(struct PokenavSub9 *structPtr); -static u32 sub_81CFB8C(s32 state); -static u32 sub_81CFC2C(s32 state); -static u32 sub_81CFC40(s32 state); -static u32 sub_81CFB74(s32 state); -static void sub_81CFCEC(struct PokenavSub9 *structPtr, struct PokenavMonList *item); -static u32 sub_81CFEB8(s32 state); -static bool32 sub_81CFE84(void); -static u32 sub_81CFFFC(s32 state); -static u32 sub_81D0074(s32 state); -static u32 sub_81D00EC(s32 state); -static u32 sub_81D0164(s32 state); -static u32 sub_81D01DC(s32 state); -static u32 sub_81D021C(s32 state); -static void sub_81D02B0(s32 windowId, s32 val1, s32 val2); -static void sub_81D024C(struct PokenavSub10 *ptr); -static void sub_81D0288(struct PokenavSub10 *ptr); -static void sub_81D0304(void); -static void BufferRibbonMonInfoText(struct PokenavMonList *, u8 *); - -static const LoopedTask gUnknown_086235D8[] = -{ - sub_81CFB8C, - sub_81CFC2C, - sub_81CFC40 -}; - -static const u16 gUnknown_086235E4[] = INCBIN_U16("graphics/pokenav/ui_ribbons.gbapal"); -static const u32 gUnknown_08623604[] = INCBIN_U32("graphics/pokenav/ui_ribbons.4bpp.lz"); -static const u32 gUnknown_086236CC[] = INCBIN_U32("graphics/pokenav/ui_ribbons.bin.lz"); -static const u16 gUnknown_08623790[] = INCBIN_U16("graphics/pokenav/8623790.gbapal"); - -static const struct BgTemplate gUnknown_086237B0[] = -{ - { - .bg = 1, - .charBaseIndex = 1, - .mapBaseIndex = 0x06, - .screenSize = 0, - .paletteMode = 0, - .priority = 2, - .baseTile = 0 - }, { - .bg = 2, - .charBaseIndex = 2, - .mapBaseIndex = 0x07, - .screenSize = 0, - .paletteMode = 0, - .priority = 3, - .baseTile = 0 - } -}; - -static const LoopedTask gUnknown_086237B8[] = -{ - NULL, - sub_81CFFFC, - sub_81D0074, - sub_81D00EC, - sub_81D0164, - sub_81D01DC, - sub_81D021C -}; - -static const struct WindowTemplate gUnknown_086237D4 = -{ - .bg = 1, - .tilemapLeft = 1, - .tilemapTop = 6, - .width = 7, - .height = 2, - .paletteNum = 1, - .baseBlock = 20 -}; - -static const u8 sText_MaleSymbol[] = _("{COLOR_HIGHLIGHT_SHADOW}{LIGHT_RED}{WHITE}{GREEN}♂{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 sText_NoGenderSymbol[] = _("{UNK_SPACER}"); - -bool32 PokenavCallback_Init_12(void) -{ - struct PokenavSub9 *structPtr = AllocSubstruct(9, sizeof(struct PokenavSub9)); - if (structPtr == NULL) - return FALSE; - - structPtr->unk1C = AllocSubstruct(18, sizeof(struct PokenavSub18)); - if (structPtr->unk1C == NULL) - return FALSE; - - structPtr->unk0 = sub_81CFA68; - structPtr->loopedTaskId = CreateLoopedTask(sub_81CFB74, 1); - structPtr->unk14 = 0; - return TRUE; -} - -bool32 PokenavCallback_Init_14(void) -{ - struct PokenavSub9 *structPtr = AllocSubstruct(9, sizeof(struct PokenavSub9)); - if (structPtr == NULL) - return FALSE; - - structPtr->unk1C = GetSubstructPtr(18); - structPtr->unk0 = sub_81CFA88; - structPtr->unk14 = 1; - return TRUE; -} - -u32 sub_81CFA34(void) -{ - struct PokenavSub9 *structPtr = GetSubstructPtr(9); - return structPtr->unk0(structPtr); -} - -void sub_81CFA48(void) -{ - struct PokenavSub9 *structPtr = GetSubstructPtr(9); - if (!structPtr->unk18) - FreePokenavSubstruct(18); - FreePokenavSubstruct(9); -} - -static u32 sub_81CFA68(struct PokenavSub9 *structPtr) -{ - if (!IsLoopedTaskActive(structPtr->loopedTaskId)) - structPtr->unk0 = sub_81CFA88; - return 0; -} - -static u32 sub_81CFA88(struct PokenavSub9 *structPtr) -{ - if (gMain.newAndRepeatedKeys & DPAD_UP) - return 1; - if (gMain.newAndRepeatedKeys & DPAD_DOWN) - return 2; - if (gMain.newKeys & DPAD_LEFT) - return 3; - if (gMain.newKeys & DPAD_RIGHT) - return 4; - if (gMain.newKeys & B_BUTTON) - { - structPtr->unk18 = 0; - structPtr->unk0 = sub_81CFB08; - return 5; - } - if (gMain.newKeys & A_BUTTON) - { - structPtr->unk1C->unk2 = GetSelectedMatchCall(); - structPtr->unk18 = 1; - structPtr->unk0 = sub_81CFB10; - return 6; - } - return 0; -} - -static u32 sub_81CFB08(struct PokenavSub9 *structPtr) -{ - return POKENAV_MENU_5; -} - -static u32 sub_81CFB10(struct PokenavSub9 *structPtr) -{ - return POKENAV_MENU_D; -} - -static u32 sub_81CFB18(void) -{ - struct PokenavSub9 *structPtr = GetSubstructPtr(9); - return structPtr->unk14; -} - -static struct PokenavMonList * sub_81CFB28(void) -{ - struct PokenavSub9 * ptr = GetSubstructPtr(9); - return ptr->unk1C->unk4; -} - -static s32 sub_81CFB38(void) -{ - struct PokenavSub9 * ptr = GetSubstructPtr(9); - return ptr->unk1C->unk0; -} - -static s32 sub_81CFB48(void) -{ - struct PokenavSub9 * ptr = GetSubstructPtr(9); - s32 idx = GetSelectedMatchCall(); - return ptr->unk1C->unk4[idx].data; -} - -static s32 sub_81CFB64(void) -{ - struct PokenavSub9 * ptr = GetSubstructPtr(9); - return ptr->unk1C->unk2; -} - -static u32 sub_81CFB74(s32 state) -{ - return gUnknown_086235D8[state](state); -} - -static u32 sub_81CFB8C(s32 state) -{ - s32 i; - struct PokenavMonList item; - struct PokenavSub9 * ptr = GetSubstructPtr(9); - - ptr->unk1C->unk0 = 0; - ptr->unk1C->unk2 = 0; - item.boxId = TOTAL_BOXES_COUNT; - for (i = 0; i < PARTY_SIZE; i++) - { - struct Pokemon * pokemon = &gPlayerParty[i]; - if (!GetMonData(pokemon, MON_DATA_SANITY_HAS_SPECIES)) - return LT_INC_AND_CONTINUE; - if (!GetMonData(pokemon, MON_DATA_SANITY_IS_EGG) && !GetMonData(pokemon, MON_DATA_SANITY_IS_BAD_EGG)) - { - u32 ribbonCount = GetMonData(pokemon, MON_DATA_RIBBON_COUNT); - if (ribbonCount != 0) - { - item.monId = i; - item.data = ribbonCount; - sub_81CFCEC(ptr, &item); - } - } - } - - return LT_INC_AND_CONTINUE; -} - -static u32 sub_81CFC2C(s32 state) -{ - struct PokenavSub9 * ptr = GetSubstructPtr(9); - ptr->unk10 = 0; - ptr->unkC = 0; - return LT_INC_AND_CONTINUE; -} - -static u32 sub_81CFC40(s32 state) -{ - struct PokenavSub9 * ptr = GetSubstructPtr(9); - s32 boxId = ptr->unkC; - s32 monId = ptr->unk10; - s32 boxCount = 0; - struct PokenavMonList item; - - while (boxId < TOTAL_BOXES_COUNT) - { - while (monId < IN_BOX_COUNT) - { - if (CheckBoxMonSanityAt(boxId, monId)) - { - u32 ribbonCount = GetBoxMonDataAt(boxId, monId, MON_DATA_RIBBON_COUNT); - if (ribbonCount != 0) - { - item.boxId = boxId; - item.monId = monId; - item.data = ribbonCount; - sub_81CFCEC(ptr, &item); - } - } - boxCount++; - monId++; - if (boxCount > TOTAL_BOXES_COUNT) - { - ptr->unkC = boxId; - ptr->unk10 = monId; - return LT_CONTINUE; - } - } - monId = 0; - boxId++; - } - - ptr->unk14 = 1; - return LT_FINISH; -} - -static void sub_81CFCEC(struct PokenavSub9 *structPtr, struct PokenavMonList *item) -{ - u32 left = 0; - u32 right = structPtr->unk1C->unk0; - u32 insertionIdx = left + (right - left) / 2; - - while (right != insertionIdx) - { - if (item->data > structPtr->unk1C->unk4[insertionIdx].data) - right = insertionIdx; - else - left = insertionIdx + 1; - insertionIdx = left + (right - left) / 2; - } - for (right = structPtr->unk1C->unk0; right > insertionIdx; right--) - structPtr->unk1C->unk4[right] = structPtr->unk1C->unk4[right - 1]; - structPtr->unk1C->unk4[insertionIdx] = *item; - structPtr->unk1C->unk0++; -} - -static bool32 sub_81CFD58(void) -{ - s32 i, j; - - for (i = 0; i < PARTY_SIZE; i++) - { - struct Pokemon * mon = &gPlayerParty[i]; - if (!GetMonData(mon, MON_DATA_SANITY_HAS_SPECIES)) - continue; - if (GetMonData(mon, MON_DATA_SANITY_IS_EGG)) - continue; - if (GetMonData(mon, MON_DATA_RIBBONS)) - return TRUE; - } - - for (i = 0; i < TOTAL_BOXES_COUNT; i++) - { - for (j = 0; j < IN_BOX_COUNT; j++) - { - if (!CheckBoxMonSanityAt(i, j)) - continue; - if (GetBoxMonDataAt(i, j, MON_DATA_RIBBONS)) - return TRUE; - } - } - - return FALSE; -} - -bool32 sub_81CFDD0(void) -{ - struct PokenavSub10 * ptr = AllocSubstruct(10, sizeof(struct PokenavSub10)); - if (ptr == NULL) - return FALSE; - ptr->ltid = CreateLoopedTask(sub_81CFEB8, 1); - ptr->callback = sub_81CFE84; - ptr->unkC = FALSE; - return TRUE; -} - -bool32 sub_81CFE08(void) -{ - struct PokenavSub10 * ptr = AllocSubstruct(10, sizeof(struct PokenavSub10)); - if (ptr == NULL) - return FALSE; - ptr->ltid = CreateLoopedTask(sub_81CFEB8, 1); - ptr->callback = sub_81CFE84; - ptr->unkC = TRUE; - return TRUE; -} - -void sub_81CFE40(s32 idx) -{ - struct PokenavSub10 * ptr = GetSubstructPtr(10); - ptr->ltid = CreateLoopedTask(gUnknown_086237B8[idx], 1); - ptr->callback = sub_81CFE84; -} - -bool32 sub_81CFE70(void) -{ - struct PokenavSub10 * ptr = GetSubstructPtr(10); - return ptr->callback(); -} - -bool32 sub_81CFE84(void) -{ - struct PokenavSub10 * ptr = GetSubstructPtr(10); - return IsLoopedTaskActive(ptr->ltid); -} - -void sub_81CFE98(void) -{ - struct PokenavSub10 * ptr = GetSubstructPtr(10); - sub_81C8234(); - RemoveWindow(ptr->winid); - FreePokenavSubstruct(10); -} - -static u32 sub_81CFEB8(s32 state) -{ - struct PokenavSub10 * unk = GetSubstructPtr(10); - switch (state) - { - case 0: - InitBgTemplates(gUnknown_086237B0, NELEMS(gUnknown_086237B0)); - decompress_and_copy_tile_data_to_vram(1, gUnknown_08623604, 0, 0, 0); - SetBgTilemapBuffer(1, unk->buff); - CopyToBgTilemapBuffer(1, gUnknown_086236CC, 0, 0); - CopyPaletteIntoBufferUnfaded(gUnknown_086235E4, 0x10, 0x20); - CopyBgTilemapBufferToVram(1); - return LT_INC_AND_PAUSE; - case 1: - if (free_temp_tile_data_buffers_if_possible()) - return LT_PAUSE; - if (!sub_81CFB18()) - return LT_PAUSE; - ChangeBgX(1, 0, 0); - ChangeBgY(1, 0, 0); - ShowBg(1); - return LT_INC_AND_PAUSE; - case 2: - if (free_temp_tile_data_buffers_if_possible()) - return LT_PAUSE; - CopyPaletteIntoBufferUnfaded(gUnknown_08623790, 0x20, 0x20); - sub_81D0304(); - return LT_INC_AND_PAUSE; - case 3: - if (sub_81C8224()) - return LT_PAUSE; - sub_81D024C(unk); - return LT_INC_AND_PAUSE; - case 4: - if (free_temp_tile_data_buffers_if_possible()) - return LT_PAUSE; - ShowBg(2); - HideBg(3); - PrintHelpBarText(HELPBAR_RIBBONS_MON_LIST); - sub_81C7AC0(1); - if (!unk->unkC) - { - LoadLeftHeaderGfxForIndex(2); - sub_81C7FA0(2, 1, 0); - } - return LT_INC_AND_PAUSE; - case 5: - if (IsPaletteFadeActive()) - return LT_PAUSE; - if (sub_81C8010()) - return LT_PAUSE; - break; - } - return LT_FINISH; -} - -static u32 sub_81CFFFC(s32 state) -{ - struct PokenavSub10 * unk = GetSubstructPtr(10); - switch (state) - { - case 0: - switch (MatchCall_MoveCursorUp()) - { - case 0: - return LT_FINISH; - case 1: - PlaySE(SE_SELECT); - return LT_SET_STATE(2); - case 2: - PlaySE(SE_SELECT); - break; - } - return LT_INC_AND_PAUSE; - case 1: - if (sub_81C8630()) - return LT_PAUSE; - // fallthrough - case 2: - sub_81D0288(unk); - return LT_INC_AND_PAUSE; - case 3: - if (IsDma3ManagerBusyWithBgCopy()) - return LT_PAUSE; - break; - } - return LT_FINISH; -} - -static u32 sub_81D0074(s32 state) -{ - struct PokenavSub10 * unk = GetSubstructPtr(10); - switch (state) - { - case 0: - switch (MatchCall_MoveCursorDown()) - { - case 0: - return LT_FINISH; - case 1: - PlaySE(SE_SELECT); - return LT_SET_STATE(2); - case 2: - PlaySE(SE_SELECT); - break; - } - return LT_INC_AND_PAUSE; - case 1: - if (sub_81C8630()) - return LT_PAUSE; - // fallthrough - case 2: - sub_81D0288(unk); - return LT_INC_AND_PAUSE; - case 3: - if (IsDma3ManagerBusyWithBgCopy()) - return LT_PAUSE; - break; - } - return LT_FINISH; -} - -static u32 sub_81D00EC(s32 state) -{ - struct PokenavSub10 * unk = GetSubstructPtr(10); - switch (state) - { - case 0: - switch (MatchCall_PageUp()) - { - case 0: - return LT_FINISH; - case 1: - PlaySE(SE_SELECT); - return LT_SET_STATE(2); - case 2: - PlaySE(SE_SELECT); - break; - } - return LT_INC_AND_PAUSE; - case 1: - if (sub_81C8630()) - return LT_PAUSE; - // fallthrough - case 2: - sub_81D0288(unk); - return LT_INC_AND_PAUSE; - case 3: - if (IsDma3ManagerBusyWithBgCopy()) - return LT_PAUSE; - break; - } - return LT_FINISH; -} - -static u32 sub_81D0164(s32 state) -{ - struct PokenavSub10 * unk = GetSubstructPtr(10); - switch (state) - { - case 0: - switch (MatchCall_PageDown()) - { - case 0: - return LT_FINISH; - case 1: - PlaySE(SE_SELECT); - return LT_SET_STATE(2); - case 2: - PlaySE(SE_SELECT); - break; - } - return LT_INC_AND_PAUSE; - case 1: - if (sub_81C8630()) - return LT_PAUSE; - // fallthrough - case 2: - sub_81D0288(unk); - return LT_INC_AND_PAUSE; - case 3: - if (IsDma3ManagerBusyWithBgCopy()) - return LT_PAUSE; - break; - } - return LT_FINISH; -} - -static u32 sub_81D01DC(s32 state) -{ - switch (state) - { - case 0: - PlaySE(SE_SELECT); - sub_81C7AC0(0); - sub_81C78A0(); - return LT_INC_AND_PAUSE; - case 1: - if (IsPaletteFadeActive()) - return LT_PAUSE; - if (MainMenuLoopedTaskIsBusy()) - return LT_PAUSE; - sub_81C7FDC(); - break; - } - return LT_FINISH; -} - -static u32 sub_81D021C(s32 state) -{ - switch (state) - { - case 0: - PlaySE(SE_SELECT); - sub_81C7AC0(0); - return LT_INC_AND_PAUSE; - case 1: - if (IsPaletteFadeActive()) - return LT_PAUSE; - break; - } - return LT_FINISH; -} - -static void sub_81D024C(struct PokenavSub10 * ptr) -{ - s32 r2; - ptr->winid = AddWindow(&gUnknown_086237D4); - PutWindowTilemap(ptr->winid); - r2 = sub_81CFB38(); - sub_81D02B0(ptr->winid, 0, r2); - CopyWindowToVram(ptr->winid, 1); - sub_81D0288(ptr); -} - -static void sub_81D0288(struct PokenavSub10 * ptr) -{ - s32 r4 = GetSelectedMatchCall(); - s32 r2 = sub_81CFB38(); - sub_81D02B0(ptr->winid, r4 + 1, r2); - CopyWindowToVram(ptr->winid, 2); -} - -static void sub_81D02B0(s32 windowId, s32 val1, s32 val2) -{ - u8 strbuf[16]; - u32 x; - - u8 * ptr = strbuf; - ptr = ConvertIntToDecimalStringN(ptr, val1, STR_CONV_MODE_RIGHT_ALIGN, 3); - *ptr++ = CHAR_SLASH; - ConvertIntToDecimalStringN(ptr, val2, STR_CONV_MODE_RIGHT_ALIGN, 3); - x = GetStringCenterAlignXOffset(1, strbuf, 56); - AddTextPrinterParameterized(windowId, 1, strbuf, x, 1, 0xFF, NULL); -} - -static void sub_81D0304(void) -{ - struct PokenavListTemplate template; - template.list.monList = sub_81CFB28(); - template.unk4 = sub_81CFB38(); - template.unk8 = 4; - template.unk6 = sub_81CFB64(); - template.unk9 = 13; - template.unkA = 17; - template.unkB = 1; - template.unkC = 8; - template.unkD = 2; - template.unkE = 1; - template.listFunc.unk10_1 = BufferRibbonMonInfoText; - template.unk14 = NULL; - sub_81C81D4(&gUnknown_086237B0[1], &template, 0); -} - -// Buffers the "Nickname gender/level" text for the ribbon mon list -static void BufferRibbonMonInfoText(struct PokenavMonList * item0, u8 * dest) -{ - u8 gender; - u8 level; - u8 * s; - const u8 * genderStr; - struct PokenavMonList * item = item0; - - // Mon is in party - if (item->boxId == TOTAL_BOXES_COUNT) - { - struct Pokemon * mon = &gPlayerParty[item->monId]; - gender = GetMonGender(mon); - level = GetLevelFromMonExp(mon); - GetMonData(mon, MON_DATA_NICKNAME, gStringVar3); - } - // Mon is in PC - else - { - struct BoxPokemon * mon = GetBoxedMonPtr(item->boxId, item->monId); - gender = GetBoxMonGender(mon); - level = GetLevelFromBoxMonExp(mon); - GetBoxMonData(mon, MON_DATA_NICKNAME, gStringVar3); - } - - StringGetEnd10(gStringVar3); - dest = sub_81DB494(dest, 1, gStringVar3, 60); - switch (gender) - { - default: - genderStr = sText_NoGenderSymbol; - break; - case MON_MALE: - genderStr = sText_MaleSymbol; - break; - case MON_FEMALE: - genderStr = sText_FemaleSymbol; - break; - } - - s = StringCopy(gStringVar1, genderStr); - *s++ = CHAR_SLASH; - *s++ = CHAR_SPECIAL_F9; - *s++ = CHAR_LV_2; - ConvertIntToDecimalStringN(s, level, STR_CONV_MODE_LEFT_ALIGN, 3); - dest = sub_81DB494(dest, 1, gStringVar1, 54); - ConvertIntToDecimalStringN(dest, item->data, STR_CONV_MODE_RIGHT_ALIGN, 2); -} -- cgit v1.2.3 From 27c4329e4518a9838476e16c9fbb4cfb6d83a0d7 Mon Sep 17 00:00:00 2001 From: GriffinR Date: Sun, 2 Feb 2020 13:28:54 -0500 Subject: Use friendship event constants --- src/battle_main.c | 2 +- src/battle_script_commands.c | 2 +- src/battle_util2.c | 6 ++-- src/field_poison.c | 2 +- src/party_menu.c | 2 +- src/pokemon.c | 65 ++++++++++++++++++++++++-------------------- 6 files changed, 43 insertions(+), 36 deletions(-) (limited to 'src') diff --git a/src/battle_main.c b/src/battle_main.c index bcef3b286..0f6ec40a4 100644 --- a/src/battle_main.c +++ b/src/battle_main.c @@ -718,7 +718,7 @@ static void CB2_InitBattleInternal(void) gSaveBlock2Ptr->frontier.disableRecordBattle = FALSE; for (i = 0; i < PARTY_SIZE; i++) - AdjustFriendship(&gPlayerParty[i], 3); + AdjustFriendship(&gPlayerParty[i], FRIENDSHIP_EVENT_LEAGUE_BATTLE); gBattleCommunication[MULTIUSE_STATE] = 0; } diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index b6dd292f8..685626a85 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -3434,7 +3434,7 @@ static void Cmd_getexp(void) gLeveledUpInBattle |= gBitTable[gBattleStruct->expGetterMonId]; gBattlescriptCurrInstr = BattleScript_LevelUp; gBattleMoveDamage = (gBattleBufferB[gActiveBattler][2] | (gBattleBufferB[gActiveBattler][3] << 8)); - AdjustFriendship(&gPlayerParty[gBattleStruct->expGetterMonId], 0); + AdjustFriendship(&gPlayerParty[gBattleStruct->expGetterMonId], FRIENDSHIP_EVENT_GROW_LEVEL); // update battle mon structure after level up if (gBattlerPartyIndexes[0] == gBattleStruct->expGetterMonId && gBattleMons[0].hp) diff --git a/src/battle_util2.c b/src/battle_util2.c index fd0dda76b..6d51f51e7 100644 --- a/src/battle_util2.c +++ b/src/battle_util2.c @@ -92,13 +92,13 @@ void AdjustFriendshipOnBattleFaint(u8 battlerId) if (gBattleMons[opposingBattlerId].level > gBattleMons[battlerId].level) { if (gBattleMons[opposingBattlerId].level - gBattleMons[battlerId].level > 29) - AdjustFriendship(&gPlayerParty[gBattlerPartyIndexes[battlerId]], 8); + AdjustFriendship(&gPlayerParty[gBattlerPartyIndexes[battlerId]], FRIENDSHIP_EVENT_FAINT_LARGE); else - AdjustFriendship(&gPlayerParty[gBattlerPartyIndexes[battlerId]], 6); + AdjustFriendship(&gPlayerParty[gBattlerPartyIndexes[battlerId]], FRIENDSHIP_EVENT_FAINT_SMALL); } else { - AdjustFriendship(&gPlayerParty[gBattlerPartyIndexes[battlerId]], 6); + AdjustFriendship(&gPlayerParty[gBattlerPartyIndexes[battlerId]], FRIENDSHIP_EVENT_FAINT_SMALL); } } diff --git a/src/field_poison.c b/src/field_poison.c index 8385966d4..9d3ca047c 100644 --- a/src/field_poison.c +++ b/src/field_poison.c @@ -48,7 +48,7 @@ static void FaintFromFieldPoison(u8 partyIdx) struct Pokemon *pokemon = gPlayerParty + partyIdx; u32 status = STATUS1_NONE; - AdjustFriendship(pokemon, 0x07); + AdjustFriendship(pokemon, FRIENDSHIP_EVENT_FAINT_FIELD_PSN); SetMonData(pokemon, MON_DATA_STATUS, &status); GetMonData(pokemon, MON_DATA_NICKNAME, gStringVar1); StringGetEnd10(gStringVar1); diff --git a/src/party_menu.c b/src/party_menu.c index bc4cf8c0b..4decdeb02 100755 --- a/src/party_menu.c +++ b/src/party_menu.c @@ -4701,7 +4701,7 @@ static void Task_LearnedMove(u8 taskId) if (move[1] == 0) { - AdjustFriendship(mon, 4); + AdjustFriendship(mon, FRIENDSHIP_EVENT_LEARN_TMHM); if (item < ITEM_HM01_CUT) RemoveBagItem(item, 1); } diff --git a/src/pokemon.c b/src/pokemon.c index 040b342d2..3f49c0440 100644 --- a/src/pokemon.c +++ b/src/pokemon.c @@ -61,6 +61,7 @@ static void DecryptBoxMon(struct BoxPokemon *boxMon); static void sub_806E6CC(u8 taskId); static bool8 ShouldGetStatBadgeBoost(u16 flagId, u8 battlerId); static u16 GiveMoveToBoxMon(struct BoxPokemon *boxMon, u16 move); +static bool8 ShouldSkipFriendshipChange(void); // EWRAM vars EWRAM_DATA static u8 sLearningMoveTableID = 0; @@ -1886,12 +1887,12 @@ const u8 gStatStageRatios[][2] = static const u16 sDeoxysBaseStats[] = { - 50, // Hp - 95, // Attack - 90, // Defense - 180, // Speed - 95, // Sp.Attack - 90, // Sp.Defense + [STAT_HP] = 50, + [STAT_ATK] = 95, + [STAT_DEF] = 90, + [STAT_SPEED] = 180, + [STAT_SPATK] = 95, + [STAT_SPDEF] = 90, }; const u16 gLinkPlayerFacilityClasses[] = @@ -2063,17 +2064,19 @@ static const u8 sStatsToRaise[] = STAT_ATK, STAT_ATK, STAT_SPEED, STAT_DEF, STAT_SPATK, STAT_ACC }; -static const s8 gUnknown_08329ECE[][3] = -{ - { 5, 3, 2}, - { 5, 3, 2}, - { 1, 1, 0}, - { 3, 2, 1}, - { 1, 1, 0}, - { 1, 1, 1}, - {-1, -1, -1}, - {-5, -5, -10}, - {-5, -5, -10}, +// 3 modifiers each for how much to change friendship for different ranges +// 0-99, 100-199, 200+ +static const s8 sFriendshipEventModifiers[][3] = +{ + [FRIENDSHIP_EVENT_GROW_LEVEL] = { 5, 3, 2}, + [FRIENDSHIP_EVENT_VITAMIN] = { 5, 3, 2}, + [FRIENDSHIP_EVENT_BATTLE_ITEM] = { 1, 1, 0}, + [FRIENDSHIP_EVENT_LEAGUE_BATTLE] = { 3, 2, 1}, + [FRIENDSHIP_EVENT_LEARN_TMHM] = { 1, 1, 0}, + [FRIENDSHIP_EVENT_WALKING] = { 1, 1, 1}, + [FRIENDSHIP_EVENT_FAINT_SMALL] = {-1, -1, -1}, + [FRIENDSHIP_EVENT_FAINT_FIELD_PSN] = {-5, -5, -10}, + [FRIENDSHIP_EVENT_FAINT_LARGE] = {-5, -5, -10}, }; static const u16 sHMMoves[] = @@ -5083,7 +5086,7 @@ bool8 PokemonUseItemEffects(struct Pokemon *mon, u16 item, u8 partyIndex, u8 mov } break; case 5: - if (GetMonData(mon, MON_DATA_FRIENDSHIP, NULL) < 100 && (retVal == 0 || var_28 != 0) && !sub_806F104() && var_34 == 0) + if (GetMonData(mon, MON_DATA_FRIENDSHIP, NULL) < 100 && (retVal == 0 || var_28 != 0) && !ShouldSkipFriendshipChange() && var_34 == 0) { var_34 = itemEffect[var_3C]; friendship = GetMonData(mon, MON_DATA_FRIENDSHIP, NULL); @@ -5109,7 +5112,7 @@ bool8 PokemonUseItemEffects(struct Pokemon *mon, u16 item, u8 partyIndex, u8 mov break; case 6: if (GetMonData(mon, MON_DATA_FRIENDSHIP, NULL) >= 100 && GetMonData(mon, MON_DATA_FRIENDSHIP, NULL) < 200 - && (retVal == 0 || var_28 != 0) && !sub_806F104() && var_34 == 0) + && (retVal == 0 || var_28 != 0) && !ShouldSkipFriendshipChange() && var_34 == 0) { var_34 = itemEffect[var_3C]; friendship = GetMonData(mon, MON_DATA_FRIENDSHIP, NULL); @@ -5134,7 +5137,7 @@ bool8 PokemonUseItemEffects(struct Pokemon *mon, u16 item, u8 partyIndex, u8 mov var_3C++; break; case 7: - if (GetMonData(mon, MON_DATA_FRIENDSHIP, NULL) >= 200 && (retVal == 0 || var_28 != 0) && !sub_806F104() && var_34 == 0) + if (GetMonData(mon, MON_DATA_FRIENDSHIP, NULL) >= 200 && (retVal == 0 || var_28 != 0) && !ShouldSkipFriendshipChange() && var_34 == 0) { var_34 = itemEffect[var_3C]; friendship = GetMonData(mon, MON_DATA_FRIENDSHIP, NULL); @@ -5752,12 +5755,18 @@ u16 ModifyStatByNature(u8 nature, u16 n, u8 statIndex) return n; } +#define IS_LEAGUE_BATTLE \ + ((gBattleTypeFlags & BATTLE_TYPE_TRAINER) \ + && (gTrainers[gTrainerBattleOpponent_A].trainerClass == TRAINER_CLASS_ELITE_FOUR \ + || gTrainers[gTrainerBattleOpponent_A].trainerClass == TRAINER_CLASS_LEADER \ + || gTrainers[gTrainerBattleOpponent_A].trainerClass == TRAINER_CLASS_CHAMPION)) \ + void AdjustFriendship(struct Pokemon *mon, u8 event) { u16 species, heldItem; u8 holdEffect; - if (sub_806F104()) + if (ShouldSkipFriendshipChange()) return; species = GetMonData(mon, MON_DATA_SPECIES2, 0); @@ -5779,18 +5788,16 @@ void AdjustFriendship(struct Pokemon *mon, u8 event) { u8 friendshipLevel = 0; s16 friendship = GetMonData(mon, MON_DATA_FRIENDSHIP, 0); + if (friendship > 99) friendshipLevel++; if (friendship > 199) friendshipLevel++; - if ((event != 5 || !(Random() & 1)) - && (event != 3 - || ((gBattleTypeFlags & BATTLE_TYPE_TRAINER) - && (gTrainers[gTrainerBattleOpponent_A].trainerClass == TRAINER_CLASS_ELITE_FOUR - || gTrainers[gTrainerBattleOpponent_A].trainerClass == TRAINER_CLASS_LEADER - || gTrainers[gTrainerBattleOpponent_A].trainerClass == TRAINER_CLASS_CHAMPION)))) + + if ((event != FRIENDSHIP_EVENT_WALKING || !(Random() & 1)) + && (event != FRIENDSHIP_EVENT_LEAGUE_BATTLE || IS_LEAGUE_BATTLE)) { - s8 mod = gUnknown_08329ECE[event][friendshipLevel]; + s8 mod = sFriendshipEventModifiers[event][friendshipLevel]; if (mod > 0 && holdEffect == HOLD_EFFECT_HAPPINESS_UP) mod = (150 * mod) / 100; friendship += mod; @@ -6782,7 +6789,7 @@ bool8 HasTwoFramesAnimation(u16 species) && species != SPECIES_UNOWN); } -bool8 sub_806F104(void) +static bool8 ShouldSkipFriendshipChange(void) { if (gMain.inBattle && gBattleTypeFlags & (BATTLE_TYPE_FRONTIER)) return TRUE; -- cgit v1.2.3 From 85dc8a528cff3fa35c2c23c25098367b21affb0e Mon Sep 17 00:00:00 2001 From: GriffinR Date: Fri, 7 Feb 2020 22:08:59 -0500 Subject: Move rotating tile puzzle data to src --- src/rotating_tile_puzzle.c | 89 +++++++++++++++++++++++++++++++++++----------- 1 file changed, 68 insertions(+), 21 deletions(-) (limited to 'src') diff --git a/src/rotating_tile_puzzle.c b/src/rotating_tile_puzzle.c index 7238ec751..c19e3abf9 100644 --- a/src/rotating_tile_puzzle.c +++ b/src/rotating_tile_puzzle.c @@ -8,15 +8,6 @@ #include "constants/event_objects.h" #include "constants/metatile_labels.h" -extern const u8 RotatingTilePuzzle_Movement_ShiftRight[]; -extern const u8 RotatingTilePuzzle_Movement_ShiftDown[]; -extern const u8 RotatingTilePuzzle_Movement_ShiftLeft[]; -extern const u8 RotatingTilePuzzle_Movement_ShiftUp[]; -extern const u8 RotatingTilePuzzle_Movement_FaceRight[]; -extern const u8 RotatingTilePuzzle_Movement_FaceDown[]; -extern const u8 RotatingTilePuzzle_Movement_FaceLeft[]; -extern const u8 RotatingTilePuzzle_Movement_FaceUp[]; - #define ROTATE_COUNTERCLOCKWISE 0 #define ROTATE_CLOCKWISE 1 #define ROTATE_NONE 2 @@ -34,6 +25,62 @@ struct RotatingTilePuzzle bool8 isTrickHouse; }; +static const u8 sMovement_ShiftRight[] = +{ + MOVEMENT_ACTION_STORE_AND_LOCK_ANIM, + MOVEMENT_ACTION_WALK_NORMAL_RIGHT, + MOVEMENT_ACTION_FREE_AND_UNLOCK_ANIM, + MOVEMENT_ACTION_STEP_END +}; + +static const u8 sMovement_ShiftDown[] = +{ + MOVEMENT_ACTION_STORE_AND_LOCK_ANIM, + MOVEMENT_ACTION_WALK_NORMAL_DOWN, + MOVEMENT_ACTION_FREE_AND_UNLOCK_ANIM, + MOVEMENT_ACTION_STEP_END +}; + +static const u8 sMovement_ShiftLeft[] = +{ + MOVEMENT_ACTION_STORE_AND_LOCK_ANIM, + MOVEMENT_ACTION_WALK_NORMAL_LEFT, + MOVEMENT_ACTION_FREE_AND_UNLOCK_ANIM, + MOVEMENT_ACTION_STEP_END +}; + +static const u8 sMovement_ShiftUp[] = +{ + MOVEMENT_ACTION_STORE_AND_LOCK_ANIM, + MOVEMENT_ACTION_WALK_NORMAL_UP, + MOVEMENT_ACTION_FREE_AND_UNLOCK_ANIM, + MOVEMENT_ACTION_STEP_END +}; + +static const u8 sMovement_FaceRight[] = +{ + MOVEMENT_ACTION_FACE_RIGHT, + MOVEMENT_ACTION_STEP_END +}; + +static const u8 sMovement_FaceDown[] = +{ + MOVEMENT_ACTION_FACE_DOWN, + MOVEMENT_ACTION_STEP_END +}; + +static const u8 sMovement_FaceLeft[] = +{ + MOVEMENT_ACTION_FACE_LEFT, + MOVEMENT_ACTION_STEP_END +}; + +static const u8 sMovement_FaceUp[] = +{ + MOVEMENT_ACTION_FACE_UP, + MOVEMENT_ACTION_STEP_END +}; + // This file's functions. static void SaveRotatingTileObject(u8 eventTemplateId, u8 arg1); static void TurnUnsavedRotatingTileObject(u8 eventTemplateId, u8 arg1); @@ -106,19 +153,19 @@ u16 MoveRotatingTileObjects(u8 puzzleNumber) switch (puzzleTileNum) { case 0: // Right Arrow - movementScript = RotatingTilePuzzle_Movement_ShiftRight; + movementScript = sMovement_ShiftRight; x = 1; break; case 1: // Down Arrow - movementScript = RotatingTilePuzzle_Movement_ShiftDown; + movementScript = sMovement_ShiftDown; y = 1; break; case 2: // Left Arrow - movementScript = RotatingTilePuzzle_Movement_ShiftLeft; + movementScript = sMovement_ShiftLeft; x = -1; break; case 3: // Up Arrow - movementScript = RotatingTilePuzzle_Movement_ShiftUp; + movementScript = sMovement_ShiftUp; y = -1; break; default: @@ -204,19 +251,19 @@ void TurnRotatingTileObjects(void) switch (direction) { case DIR_EAST: - movementScript = RotatingTilePuzzle_Movement_FaceUp; + movementScript = sMovement_FaceUp; eventObjects[sRotatingTilePuzzle->objects[i].eventTemplateId].movementType = MOVEMENT_TYPE_FACE_UP; break; case DIR_SOUTH: - movementScript = RotatingTilePuzzle_Movement_FaceRight; + movementScript = sMovement_FaceRight; eventObjects[sRotatingTilePuzzle->objects[i].eventTemplateId].movementType = MOVEMENT_TYPE_FACE_RIGHT; break; case DIR_WEST: - movementScript = RotatingTilePuzzle_Movement_FaceDown; + movementScript = sMovement_FaceDown; eventObjects[sRotatingTilePuzzle->objects[i].eventTemplateId].movementType = MOVEMENT_TYPE_FACE_DOWN; break; case DIR_NORTH: - movementScript = RotatingTilePuzzle_Movement_FaceLeft; + movementScript = sMovement_FaceLeft; eventObjects[sRotatingTilePuzzle->objects[i].eventTemplateId].movementType = MOVEMENT_TYPE_FACE_LEFT; break; default: @@ -233,19 +280,19 @@ void TurnRotatingTileObjects(void) switch (direction) { case DIR_EAST: - movementScript = RotatingTilePuzzle_Movement_FaceDown; + movementScript = sMovement_FaceDown; eventObjects[sRotatingTilePuzzle->objects[i].eventTemplateId].movementType = MOVEMENT_TYPE_FACE_DOWN; break; case DIR_SOUTH: - movementScript = RotatingTilePuzzle_Movement_FaceLeft; + movementScript = sMovement_FaceLeft; eventObjects[sRotatingTilePuzzle->objects[i].eventTemplateId].movementType = MOVEMENT_TYPE_FACE_LEFT; break; case DIR_WEST: - movementScript = RotatingTilePuzzle_Movement_FaceUp; + movementScript = sMovement_FaceUp; eventObjects[sRotatingTilePuzzle->objects[i].eventTemplateId].movementType = MOVEMENT_TYPE_FACE_UP; break; case DIR_NORTH: - movementScript = RotatingTilePuzzle_Movement_FaceRight; + movementScript = sMovement_FaceRight; eventObjects[sRotatingTilePuzzle->objects[i].eventTemplateId].movementType = MOVEMENT_TYPE_FACE_RIGHT; break; default: -- cgit v1.2.3 From d1035f027e3aeb1cb0553a4207a345c9ca325a1a Mon Sep 17 00:00:00 2001 From: GriffinR Date: Sat, 8 Feb 2020 12:20:05 -0500 Subject: Move contest_link_80F57C4 data to src --- src/contest_link_80F57C4.c | 256 ++++++++++++++++++++++++++++++++++++++++----- 1 file changed, 228 insertions(+), 28 deletions(-) (limited to 'src') diff --git a/src/contest_link_80F57C4.c b/src/contest_link_80F57C4.c index 8a1fce64b..0cecaed07 100644 --- a/src/contest_link_80F57C4.c +++ b/src/contest_link_80F57C4.c @@ -83,19 +83,6 @@ struct ContestLink80F57C4 EWRAM_DATA struct ContestLink80F57C4 *gUnknown_0203A034 = NULL; -extern const struct BgTemplate gUnknown_0858D888[4]; -extern const struct WindowTemplate gUnknown_0858D898[]; -extern const struct CompressedSpriteSheet gUnknown_0858D878[]; -extern const struct CompressedSpritePalette gUnknown_0858D880[]; -extern const struct SpriteSheet gUnknown_0858D8E0; -extern const struct SpriteTemplate gSpriteTemplate_858D8C8; -extern const u8 sContestLinkTextColors[]; -extern const u8 gUnknown_0858D6D0[]; -extern const struct SpriteTemplate gSpriteTemplate_858D7F8; -extern const struct SpriteSheet gUnknown_0858D810[]; -extern const struct SpritePalette gUnknown_0858D850; -extern const struct SpriteTemplate gSpriteTemplate_858D860; - static void sub_80F6A9C(void); static void sub_80F71C8(void); u8 sub_80F7310(u8, u8); @@ -152,6 +139,219 @@ static void sub_80F85BC(u8); static void sub_80F86B8(u8); static void sub_80F878C(u8); static void sub_80F87B4(u8); +static void sub_80F7768(struct Sprite *sprite); + +static const u16 sUnknown_0858D6B0[] = INCBIN_U16("graphics/unknown/unknown_58D6B0.gbapal"); +static const u8 sUnknown_0858D6D0[] = INCBIN_U8("graphics/unknown/unknown_58D6D0.4bpp"); +static const u16 sMiscBlank_Pal[] = INCBIN_U16("graphics/interface/blank.gbapal"); + +static const struct OamData sOamData_858D7F0 = +{ + .y = 0, + .affineMode = ST_OAM_AFFINE_OFF, + .objMode = ST_OAM_OBJ_NORMAL, + .mosaic = 0, + .bpp = ST_OAM_4BPP, + .shape = SPRITE_SHAPE(64x32), + .x = 0, + .matrixNum = 0, + .size = SPRITE_SIZE(64x32), + .tileNum = 0, + .priority = 3, + .paletteNum = 2, + .affineParam = 0, +}; + +static const struct SpriteTemplate sSpriteTemplate_858D7F8 = +{ + .tileTag = 3009, + .paletteTag = 3009, + .oam = &sOamData_858D7F0, + .anims = gDummySpriteAnimTable, + .images = NULL, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = SpriteCallbackDummy +}; + +static const struct SpriteSheet sUnknown_0858D810[] = +{ + { .data = gMiscBlank_Gfx, .size = 0x400, .tag = 3009 }, + { .data = gMiscBlank_Gfx, .size = 0x400, .tag = 3010 }, + { .data = gMiscBlank_Gfx, .size = 0x400, .tag = 3011 }, + { .data = gMiscBlank_Gfx, .size = 0x400, .tag = 3012 }, + { .data = gMiscBlank_Gfx, .size = 0x400, .tag = 3013 }, + { .data = gMiscBlank_Gfx, .size = 0x400, .tag = 3014 }, + { .data = gMiscBlank_Gfx, .size = 0x400, .tag = 3015 }, + { .data = gMiscBlank_Gfx, .size = 0x400, .tag = 3016 }, +}; + +static const struct SpritePalette sUnknown_0858D850 = +{ + .data = sMiscBlank_Pal, + .tag = 3009, +}; + +static const struct OamData sOamData_858D858 = +{ + .y = 0, + .affineMode = ST_OAM_AFFINE_OFF, + .objMode = ST_OAM_OBJ_NORMAL, + .mosaic = 0, + .bpp = ST_OAM_4BPP, + .shape = SPRITE_SHAPE(8x8), + .x = 0, + .matrixNum = 0, + .size = SPRITE_SIZE(8x8), + .tileNum = 0, + .priority = 0, + .paletteNum = 0, + .affineParam = 0, +}; + +static const struct SpriteTemplate sSpriteTemplate_858D860 = +{ + .tileTag = 3017, + .paletteTag = 3017, + .oam = &sOamData_858D858, + .anims = gDummySpriteAnimTable, + .images = NULL, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = sub_80F7768 +}; + +static const struct CompressedSpriteSheet sUnknown_0858D878 = +{ + .data = gContestConfetti_Gfx, + .size = 0x220, + .tag = 3017 +}; + + +static const struct CompressedSpritePalette sUnknown_0858D880 = +{ + .data = gContestConfetti_Pal, + .tag = 3017 +}; + +static const struct BgTemplate sUnknown_0858D888[] = +{ + { + .bg = 0, + .charBaseIndex = 0, + .mapBaseIndex = 30, + .screenSize = 0, + .paletteMode = 0, + .priority = 0, + .baseTile = 0, + }, + { + .bg = 1, + .charBaseIndex = 0, + .mapBaseIndex = 24, + .screenSize = 0, + .paletteMode = 0, + .priority = 3, + .baseTile = 0, + }, + { + .bg = 2, + .charBaseIndex = 0, + .mapBaseIndex = 28, + .screenSize = 0, + .paletteMode = 0, + .priority = 3, + .baseTile = 0, + }, + { + .bg = 3, + .charBaseIndex = 0, + .mapBaseIndex = 26, + .screenSize = 0, + .paletteMode = 0, + .priority = 3, + .baseTile = 0, + } +}; + +static const struct WindowTemplate sUnknown_0858D898[] = +{ + { + .bg = 1, + .tilemapLeft = 7, + .tilemapTop = 4, + .width = 12, + .height = 2, + .paletteNum = 15, + .baseBlock = 770 + }, + { + .bg = 1, + .tilemapLeft = 7, + .tilemapTop = 7, + .width = 12, + .height = 2, + .paletteNum = 15, + .baseBlock = 794 + }, + { + .bg = 1, + .tilemapLeft = 7, + .tilemapTop = 10, + .width = 12, + .height = 2, + .paletteNum = 15, + .baseBlock = 818 + }, + { + .bg = 1, + .tilemapLeft = 7, + .tilemapTop = 13, + .width = 12, + .height = 2, + .paletteNum = 15, + .baseBlock = 842 + }, + DUMMY_WIN_TEMPLATE, +}; + +static const struct OamData sUnknown_0858D8C0 = +{ + .y = 0, + .affineMode = ST_OAM_AFFINE_OFF, + .objMode = ST_OAM_OBJ_NORMAL, + .mosaic = 0, + .bpp = ST_OAM_4BPP, + .shape = SPRITE_SHAPE(16x16), + .x = 0, + .matrixNum = 0, + .size = SPRITE_SIZE(16x16), + .tileNum = 0, + .priority = 0, + .paletteNum = 0, + .affineParam = 0, +}; + + +static const struct SpriteTemplate sSpriteTemplate_858D8C8 = +{ + .tileTag = 22222, + .paletteTag = 0, + .oam = &sUnknown_0858D8C0, + .anims = gDummySpriteAnimTable, + .images = NULL, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = SpriteCallbackDummy +}; + +static const struct SpriteSheet sUnknown_0858D8E0 = +{ + .data = gMiscBlank_Gfx, + .size = 0x200, + .tag = 22222 +}; + +static const u8 sContestLinkTextColors[4] = {TEXT_COLOR_WHITE, TEXT_DYNAMIC_COLOR_6, TEXT_DYNAMIC_COLOR_5}; + void sub_80F57C4(void) { @@ -159,11 +359,11 @@ void sub_80F57C4(void) SetGpuReg(REG_OFFSET_DISPCNT, DISPCNT_OBJ_1D_MAP); ResetBgsAndClearDma3BusyFlags(0); - InitBgsFromTemplates(0, gUnknown_0858D888, ARRAY_COUNT(gUnknown_0858D888)); + InitBgsFromTemplates(0, sUnknown_0858D888, ARRAY_COUNT(sUnknown_0858D888)); for (i = 0; i < 4; i++) SetBgTilemapBuffer(i, gUnknown_0203A034->unkC[i]); - InitWindows(gUnknown_0858D898); + InitWindows(sUnknown_0858D898); DeactivateAllTextPrinters(); SetGpuReg(REG_OFFSET_MOSAIC, 0); SetGpuReg(REG_OFFSET_WININ, WININ_WIN0_BG_ALL | WININ_WIN0_OBJ | WININ_WIN0_CLR | WININ_WIN1_BG_ALL | WININ_WIN1_OBJ | WININ_WIN1_CLR); @@ -210,7 +410,7 @@ void sub_80F591C(void) CopyToBgTilemapBuffer(0, gUnknown_08C19EEC, 0, 0); sub_80F71C8(); LoadCompressedPalette(gUnknown_08C1A2B4, 0, 0x200); - LoadPalette(gUnknown_0858D6B0, 0xF0, 0x20); + LoadPalette(sUnknown_0858D6B0, 0xF0, 0x20); for (i = 0; i < 4; i++) { @@ -669,8 +869,8 @@ static void sub_80F6404(u8 taskId) gSprites[spriteId].oam.priority = 0; gSprites[spriteId].callback = sub_80F75A8; gUnknown_0203A034->unk0->spriteId = spriteId; - LoadCompressedSpriteSheet(gUnknown_0858D878); - LoadCompressedSpritePalette(gUnknown_0858D880); + LoadCompressedSpriteSheet(&sUnknown_0858D878); + LoadCompressedSpritePalette(&sUnknown_0858D880); CreateTask(sub_80F7670, 10); gTasks[taskId].data[0]++; break; @@ -900,9 +1100,9 @@ static void sub_80F6AE8(void) LoadWirelessStatusIndicatorSpriteGfx(); CreateWirelessStatusIndicatorSprite(8, 8); gSprites[gWirelessStatusIndicatorSpriteId].subpriority = 1; - sheet = LoadSpriteSheet(&gUnknown_0858D8E0); + sheet = LoadSpriteSheet(&sUnknown_0858D8E0); RequestDma3Fill(0xFFFFFFFF, (void *)BG_CHAR_ADDR(4) + sheet * 0x20, 0x80, 1); - spriteId = CreateSprite(&gSpriteTemplate_858D8C8, 8, 8, 0); + spriteId = CreateSprite(&sSpriteTemplate_858D8C8, 8, 8, 0); gSprites[spriteId].oam.objMode = ST_OAM_OBJ_WINDOW; } } @@ -937,7 +1137,7 @@ s32 sub_80F6B78(const u8 *text, u8 spriteId) AddTextPrinterParameterized3(windowId, 1, (strWidth * 8 - origWidth) / 2, 1, sContestLinkTextColors, -1, text); windowTilesPtr = (u8 *)(GetWindowAttribute(windowId, WINDOW_TILE_DATA)); - src = (u8 *)(gUnknown_0858D6D0); + src = (u8 *)(sUnknown_0858D6D0); sprite = &gSprites[spriteId]; spriteTilePtrs[0] = (u8 *)(sprite->oam.tileNum * 32 + VRAM + 0x10000); @@ -1043,7 +1243,7 @@ _080F6BD0:\n\ movs r1, 0x7\n\ bl GetWindowAttribute\n\ mov r9, r0\n\ - ldr r2, =gUnknown_0858D6D0\n\ + ldr r2, =sUnknown_0858D6D0\n\ mov r8, r2\n\ lsls r1, r7, 4\n\ adds r1, r7\n\ @@ -1257,11 +1457,11 @@ static void sub_80F6DC0(void) struct SpriteTemplate template; u8 spriteIds[8]; - template = gSpriteTemplate_858D7F8; - for (i = 0; i < 8; i++) - LoadSpriteSheet(&gUnknown_0858D810[i]); + template = sSpriteTemplate_858D7F8; + for (i = 0; i < (int)ARRAY_COUNT(sUnknown_0858D810); i++) + LoadSpriteSheet(&sUnknown_0858D810[i]); - LoadSpritePalette(&gUnknown_0858D850); + LoadSpritePalette(&sUnknown_0858D850); for (i = 0; i < 8; i++) { spriteIds[i] = CreateSprite(&template, 272, 144, 10); @@ -1629,7 +1829,7 @@ static void sub_80F7670(u8 taskId) gTasks[taskId].data[0] = 0; if (gUnknown_0203A034->unk0->unk7 < 40) { - u8 spriteId = CreateSprite(&gSpriteTemplate_858D860, (Random() % 240) - 20, 44, 5); + u8 spriteId = CreateSprite(&sSpriteTemplate_858D860, (Random() % 240) - 20, 44, 5); gSprites[spriteId].data[0] = Random() % 512; gSprites[spriteId].data[1] = (Random() % 24) + 16; gSprites[spriteId].data[2] = (Random() % 256) + 48; @@ -1642,7 +1842,7 @@ static void sub_80F7670(u8 taskId) DestroyTask(taskId); } -void sub_80F7768(struct Sprite *sprite) +static void sub_80F7768(struct Sprite *sprite) { s16 delta; -- cgit v1.2.3 From 43ec11b92a5e7b90e8bdada6cbf8183ae3eb44f2 Mon Sep 17 00:00:00 2001 From: GriffinR Date: Sat, 8 Feb 2020 13:54:15 -0500 Subject: Move berry powder data to src --- src/berry_powder.c | 112 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 112 insertions(+) (limited to 'src') diff --git a/src/berry_powder.c b/src/berry_powder.c index 91f9d0d4e..50d280f0a 100755 --- a/src/berry_powder.c +++ b/src/berry_powder.c @@ -14,6 +14,118 @@ static EWRAM_DATA u8 sBerryPowderVendorWindowId = 0; +// Unused +static const struct BgTemplate sBerryPowderBgTemplates[] = +{ + { + .bg = 0, + .charBaseIndex = 0, + .mapBaseIndex = 30, + .screenSize = 0, + .paletteMode = 0, + .priority = 0, + .baseTile = 0 + }, + { + .bg = 1, + .charBaseIndex = 2, + .mapBaseIndex = 12, + .screenSize = 1, + .paletteMode = 0, + .priority = 1, + .baseTile = 0 + }, + { + .bg = 2, + .charBaseIndex = 2, + .mapBaseIndex = 14, + .screenSize = 1, + .paletteMode = 0, + .priority = 1, + .baseTile = 0 + }, + { + .bg = 3, + .charBaseIndex = 3, + .mapBaseIndex = 31, + .screenSize = 0, + .paletteMode = 0, + .priority = 2, + .baseTile = 0 + }, +}; + +// ? Part of the BG templates? +static const u32 sUnknown[] = {0xFF, 0x00}; + +// Unused +static const struct WindowTemplate sBerryPowderWindowTemplates[] = +{ + { + .bg = 0, + .tilemapLeft = 1, + .tilemapTop = 1, + .width = 28, + .height = 2, + .paletteNum = 13, + .baseBlock = 19 + }, + { + .bg = 0, + .tilemapLeft = 1, + .tilemapTop = 5, + .width = 28, + .height = 14, + .paletteNum = 13, + .baseBlock = 75 + }, + { + .bg = 0, + .tilemapLeft = 1, + .tilemapTop = 5, + .width = 28, + .height = 7, + .paletteNum = 13, + .baseBlock = 75 + }, + { + .bg = 0, + .tilemapLeft = 1, + .tilemapTop = 8, + .width = 19, + .height = 3, + .paletteNum = 13, + .baseBlock = 19 + }, + { + .bg = 0, + .tilemapLeft = 22, + .tilemapTop = 7, + .width = 6, + .height = 4, + .paletteNum = 13, + .baseBlock = 76 + }, + { + .bg = 0, + .tilemapLeft = 4, + .tilemapTop = 6, + .width = 22, + .height = 5, + .paletteNum = 13, + .baseBlock = 19 + }, + { + .bg = 0, + .tilemapLeft = 5, + .tilemapTop = 8, + .width = 19, + .height = 3, + .paletteNum = 13, + .baseBlock = 19 + }, +}; + static u32 DecryptBerryPowder(u32 *powder) { return *powder ^ gSaveBlock2Ptr->encryptionKey; -- cgit v1.2.3 From faeb974c46275f466a4f4d513734d8bccf4485ab Mon Sep 17 00:00:00 2001 From: GriffinR Date: Fri, 7 Feb 2020 17:12:27 -0500 Subject: Minor berry fix data clean up --- src/berry_fix_graphics.c | 49 +++++++++++++++++++++++++++ src/berry_fix_program.c | 86 ++++++++++++++++++++++++++++++++++++++---------- src/unk_81BAD84.c | 47 -------------------------- 3 files changed, 117 insertions(+), 65 deletions(-) create mode 100644 src/berry_fix_graphics.c delete mode 100644 src/unk_81BAD84.c (limited to 'src') diff --git a/src/berry_fix_graphics.c b/src/berry_fix_graphics.c new file mode 100644 index 000000000..b37645d4c --- /dev/null +++ b/src/berry_fix_graphics.c @@ -0,0 +1,49 @@ +#include "global.h" +#include "graphics.h" + +// Duplicate of sBerryFixGraphics in berry_fix_program.c +static const struct { + const u32 *gfx; + const u32 *tilemap; + const u16 *pltt; +} sBerryFixGraphics[] = { + { + gBerryFixGameboy_Gfx, + gBerryFixGameboy_Tilemap, + gBerryFixGameboy_Pal + }, { + gBerryFixGameboyLogo_Gfx, + gBerryFixGameboyLogo_Tilemap, + gBerryFixGameboyLogo_Pal + }, { + gBerryFixGbaTransfer_Gfx, + gBerryFixGbaTransfer_Tilemap, + gBerryFixGbaTransfer_Pal + }, { + gBerryFixGbaTransferHighlight_Gfx, + gBerryFixGbaTransferHighlight_Tilemap, + gBerryFixGbaTransferHighlight_Pal + }, { + gBerryFixGbaTransferError_Gfx, + gBerryFixGbaTransferError_Tilemap, + gBerryFixGbaTransferError_Pal + }, { + gBerryFixWindow_Gfx, + gBerryFixWindow_Tilemap, + gBerryFixWindow_Pal + } +}; + +// Unused. See berry_fix_program.c +static void LoadBerryFixGraphics(u32 idx) +{ + REG_DISPCNT = 0; + REG_BG0HOFS = 0; + REG_BG0VOFS = 0; + REG_BLDCNT = 0; + LZ77UnCompVram(sBerryFixGraphics[idx].gfx, (void *)BG_CHAR_ADDR(0)); + LZ77UnCompVram(sBerryFixGraphics[idx].tilemap, (void *)BG_SCREEN_ADDR(31)); + CpuCopy16(sBerryFixGraphics[idx].pltt, (void *)PLTT, 0x200); + REG_BG0CNT = 0x1f00; + REG_DISPCNT = DISPCNT_BG0_ON; +} diff --git a/src/berry_fix_program.c b/src/berry_fix_program.c index f42531f15..dcc21d036 100644 --- a/src/berry_fix_program.c +++ b/src/berry_fix_program.c @@ -47,20 +47,65 @@ static const u8 sText_TransmittingPleaseWait[] = _("Transmitting. Please wait.\n static const u8 sText_PleaseFollowInstructionsOnScreen[] = _("Please follow the instructions on your\nPOKéMON Ruby/Sapphire screen."); static const u8 sText_TransmissionFailureTryAgain[] = _("Transmission failure.\n{COLOR RED}{SHADOW LIGHT_RED}Please try again."); -static const struct BgTemplate gUnknown_08618108[] = { +static const struct BgTemplate sBerryFixBgTemplates[] = { { - 0, 0, 30, 0, 0, 0 - }, { - 1, 1, 31, 0, 0, 1 + .bg = 0, + .charBaseIndex = 0, + .mapBaseIndex = 30, + .screenSize = 0, + .paletteMode = 0, + .priority = 0, + .baseTile = 0 + }, + { + .bg = 1, + .charBaseIndex = 1, + .mapBaseIndex = 31, + .screenSize = 0, + .paletteMode = 0, + .priority = 1, + .baseTile = 0 } }; -static const struct WindowTemplate gUnknown_08618110[] = { - {0, 2, 4, 26, 2, 15, 0x001}, - {0, 1, 11, 28, 8, 15, 0x035}, - {0, 0, 8, 30, 2, 15, 0x115}, - {0, 8, 0, 14, 2, 15, 0x151}, - {-1} +static const struct WindowTemplate sBerryFixWindowTemplates[] = { + { + .bg = 0, + .tilemapLeft = 2, + .tilemapTop = 4, + .width = 26, + .height = 2, + .paletteNum = 15, + .baseBlock = 1 + }, + { + .bg = 0, + .tilemapLeft = 1, + .tilemapTop = 11, + .width = 28, + .height = 8, + .paletteNum = 15, + .baseBlock = 53 + }, + { + .bg = 0, + .tilemapLeft = 0, + .tilemapTop = 8, + .width = 30, + .height = 2, + .paletteNum = 15, + .baseBlock = 277 + }, + { + .bg = 0, + .tilemapLeft = 8, + .tilemapTop = 0, + .width = 14, + .height = 2, + .paletteNum = 15, + .baseBlock = 337 + }, + DUMMY_WIN_TEMPLATE }; static const u16 sUnknown_08618138[] = { @@ -82,7 +127,12 @@ static const u8 *const sBerryProgramTexts[] = { sText_BerryProgramWillBeUpdatedPressA }; -static const void *const gUnknown_08618178[][3] = { + +static const struct { + const u32 *gfx; + const u32 *tilemap; + const u16 *pltt; +} sBerryFixGraphics[] = { { gBerryFixGameboy_Gfx, gBerryFixGameboy_Tilemap, @@ -117,8 +167,8 @@ extern const u8 gMultiBootProgram_BerryGlitchFix_End[]; void CB2_InitBerryFixProgram(void) { - DisableInterrupts(0xFFFF); - EnableInterrupts(0x0001); + DisableInterrupts(0xFFFF); // all + EnableInterrupts(INTR_FLAG_VBLANK); m4aSoundVSyncOff(); SetVBlankCallback(NULL); ResetSpriteData(); @@ -216,12 +266,12 @@ static void berry_fix_gpu_set(void) DmaFill32(3, 0, PLTT, PLTT_SIZE); ResetBgsAndClearDma3BusyFlags(0); - InitBgsFromTemplates(0, gUnknown_08618108, ARRAY_COUNT(gUnknown_08618108)); + InitBgsFromTemplates(0, sBerryFixBgTemplates, ARRAY_COUNT(sBerryFixBgTemplates)); ChangeBgX(0, 0, 0); ChangeBgY(0, 0, 0); ChangeBgX(1, 0, 0); ChangeBgY(1, 0, 0); - InitWindows(gUnknown_08618110); + InitWindows(sBerryFixWindowTemplates); DeactivateAllTextPrinters(); DmaCopy32(3, sUnknown_08618138, BG_PLTT + 0x1E0, 0x20); @@ -293,9 +343,9 @@ static void berry_fix_text_print(int scene) break; } CopyBgTilemapBufferToVram(0); - LZ77UnCompVram(gUnknown_08618178[scene][0], (void *)BG_CHAR_ADDR(1)); - LZ77UnCompVram(gUnknown_08618178[scene][1], (void *)BG_SCREEN_ADDR(31)); - CpuCopy32(gUnknown_08618178[scene][2], (void *)BG_PLTT, 0x100); + LZ77UnCompVram(sBerryFixGraphics[scene].gfx, (void *)BG_CHAR_ADDR(1)); + LZ77UnCompVram(sBerryFixGraphics[scene].tilemap, (void *)BG_SCREEN_ADDR(31)); + CpuCopy32(sBerryFixGraphics[scene].pltt, (void *)BG_PLTT, 0x100); ShowBg(0); ShowBg(1); } diff --git a/src/unk_81BAD84.c b/src/unk_81BAD84.c deleted file mode 100644 index adf43bb90..000000000 --- a/src/unk_81BAD84.c +++ /dev/null @@ -1,47 +0,0 @@ -#include "global.h" -#include "graphics.h" - -const struct { - const u32 *gfx; - const u32 *tileMap; - const u16 *pltt; -} gUnknown_08617128[] = { - { - gBerryFixGameboy_Gfx, - gBerryFixGameboy_Tilemap, - gBerryFixGameboy_Pal - }, { - gBerryFixGameboyLogo_Gfx, - gBerryFixGameboyLogo_Tilemap, - gBerryFixGameboyLogo_Pal - }, { - gBerryFixGbaTransfer_Gfx, - gBerryFixGbaTransfer_Tilemap, - gBerryFixGbaTransfer_Pal - }, { - gBerryFixGbaTransferHighlight_Gfx, - gBerryFixGbaTransferHighlight_Tilemap, - gBerryFixGbaTransferHighlight_Pal - }, { - gBerryFixGbaTransferError_Gfx, - gBerryFixGbaTransferError_Tilemap, - gBerryFixGbaTransferError_Pal - }, { - gBerryFixWindow_Gfx, - gBerryFixWindow_Tilemap, - gBerryFixWindow_Pal - } -}; - -void sub_81BAD84(u32 idx) -{ - REG_DISPCNT = 0x0000; - REG_BG0HOFS = 0x0000; - REG_BG0VOFS = 0x0000; - REG_BLDCNT = 0x0000; - LZ77UnCompVram(gUnknown_08617128[idx].gfx, (void *)BG_CHAR_ADDR(0)); - LZ77UnCompVram(gUnknown_08617128[idx].tileMap, (void *)BG_SCREEN_ADDR(31)); - CpuCopy16(gUnknown_08617128[idx].pltt, (void *)PLTT, 0x200); - REG_BG0CNT = 0x1f00; - REG_DISPCNT = DISPCNT_BG0_ON; -} -- cgit v1.2.3 From 084bd669244d03e75a08fb618199fd4e8aaf784a Mon Sep 17 00:00:00 2001 From: GriffinR Date: Fri, 7 Feb 2020 12:48:47 -0500 Subject: Document Trainer Card --- src/battle_setup.c | 2 +- src/cable_club.c | 8 +- src/field_message_box.c | 2 +- src/graphics.c | 28 +- src/main_menu.c | 2 +- src/match_call.c | 6 +- src/menu.c | 22 +- src/player_pc.c | 6 +- src/pokemon.c | 28 +- src/pokemon_storage_system.c | 2 +- src/reset_rtc_screen.c | 2 +- src/scrcmd.c | 2 +- src/start_menu.c | 20 +- src/strings.c | 6 +- src/trainer_card.c | 877 ++++++++++++++++++++++-------------------- src/trainer_pokemon_sprites.c | 11 +- src/tv.c | 2 +- src/union_room.c | 8 +- 18 files changed, 543 insertions(+), 491 deletions(-) (limited to 'src') diff --git a/src/battle_setup.c b/src/battle_setup.c index 33d50807f..dfc922a0b 100644 --- a/src/battle_setup.c +++ b/src/battle_setup.c @@ -321,7 +321,7 @@ const struct RematchTrainer gRematchTable[REMATCH_TABLE_ENTRIES] = [REMATCH_WALLACE] = REMATCH(TRAINER_WALLACE, TRAINER_WALLACE, TRAINER_WALLACE, TRAINER_WALLACE, TRAINER_WALLACE, EVER_GRANDE_CITY), }; -static const u16 sBadgeFlags[8] = +static const u16 sBadgeFlags[NUM_BADGES] = { FLAG_BADGE01_GET, FLAG_BADGE02_GET, FLAG_BADGE03_GET, FLAG_BADGE04_GET, FLAG_BADGE05_GET, FLAG_BADGE06_GET, FLAG_BADGE07_GET, FLAG_BADGE08_GET, diff --git a/src/cable_club.c b/src/cable_club.c index 11920bea9..c2ac72883 100644 --- a/src/cable_club.c +++ b/src/cable_club.c @@ -1190,16 +1190,16 @@ void Script_ShowLinkTrainerCard(void) // color into gStringVar2. bool32 GetLinkTrainerCardColor(u8 linkPlayerIndex) { - u32 trainerCardColorIndex; + u32 numStars; gSpecialVar_0x8006 = linkPlayerIndex; StringCopy(gStringVar1, gLinkPlayers[linkPlayerIndex].name); - trainerCardColorIndex = GetTrainerCardStars(linkPlayerIndex); - if (trainerCardColorIndex == 0) + numStars = GetTrainerCardStars(linkPlayerIndex); + if (numStars == 0) return FALSE; - StringCopy(gStringVar2, gTrainerCardColorNames[trainerCardColorIndex - 1]); + StringCopy(gStringVar2, gTrainerCardColorNames[numStars - 1]); return TRUE; } diff --git a/src/field_message_box.c b/src/field_message_box.c index 1c554b6c6..be76b0c19 100755 --- a/src/field_message_box.c +++ b/src/field_message_box.c @@ -27,7 +27,7 @@ static void sub_8098154(u8 taskId) switch (task->data[0]) { case 0: - sub_81973A4(); + LoadMessageBoxAndBorderGfx(); task->data[0]++; break; case 1: diff --git a/src/graphics.c b/src/graphics.c index eeeba56c9..d6f590158 100644 --- a/src/graphics.c +++ b/src/graphics.c @@ -1424,21 +1424,19 @@ const u8 gUnknown_08DD1A18[] = INCBIN_U8("graphics/unknown/unknown_DD1A18.4bpp") // trainer card -const u16 gEmeraldTrainerCard0Star_Pal[] = INCBIN_U16("graphics/trainer_card/0star.gbapal"); -const u32 gEmeraldTrainerCard_Gfx[] = INCBIN_U32("graphics/trainer_card/card.4bpp.lz"); - -const u32 gUnknown_08DD1F78[] = INCBIN_U32("graphics/unknown/unknown_DD1F78.bin.lz"); -const u32 gUnknown_08DD2010[] = INCBIN_U32("graphics/unknown/unknown_DD2010.bin.lz"); -const u32 gUnknown_08DD21B0[] = INCBIN_U32("graphics/unknown/unknown_DD21B0.bin.lz"); -const u32 gUnknown_08DD228C[] = INCBIN_U32("graphics/unknown/unknown_DD228C.bin.lz"); - -const u16 gFireRedTrainerCard0Star_Pal[] = INCBIN_U16("graphics/trainer_card/0star_fr.gbapal"); -const u32 gFireRedTrainerCard_Gfx[] = INCBIN_U32("graphics/trainer_card/card_fr.4bpp.lz"); - -const u32 gUnknown_08DD2AE0[] = INCBIN_U32("graphics/unknown/unknown_DD2AE0.bin.lz"); -const u32 gUnknown_08DD2B78[] = INCBIN_U32("graphics/unknown/unknown_DD2B78.bin.lz"); -const u32 gUnknown_08DD2D30[] = INCBIN_U32("graphics/unknown/unknown_DD2D30.bin.lz"); -const u32 gUnknown_08DD2E5C[] = INCBIN_U32("graphics/unknown/unknown_DD2E5C.bin.lz"); +const u16 gHoennTrainerCard0Star_Pal[] = INCBIN_U16("graphics/trainer_card/0star.gbapal"); +const u32 gHoennTrainerCard_Gfx[] = INCBIN_U32("graphics/trainer_card/card.4bpp.lz"); +const u32 gHoennTrainerCardBg_Tilemap[] = INCBIN_U32("graphics/trainer_card/bg.bin.lz"); +const u32 gHoennTrainerCardFront_Tilemap[] = INCBIN_U32("graphics/trainer_card/front.bin.lz"); +const u32 gHoennTrainerCardBack_Tilemap[] = INCBIN_U32("graphics/trainer_card/back.bin.lz"); +const u32 gHoennTrainerCardFrontLink_Tilemap[] = INCBIN_U32("graphics/trainer_card/front_link.bin.lz"); + +const u16 gKantoTrainerCard0Star_Pal[] = INCBIN_U16("graphics/trainer_card/0star_fr.gbapal"); +const u32 gKantoTrainerCard_Gfx[] = INCBIN_U32("graphics/trainer_card/card_fr.4bpp.lz"); +const u32 gKantoTrainerCardBg_Tilemap[] = INCBIN_U32("graphics/trainer_card/bg_fr.bin.lz"); +const u32 gKantoTrainerCardFront_Tilemap[] = INCBIN_U32("graphics/trainer_card/front_fr.bin.lz"); +const u32 gKantoTrainerCardBack_Tilemap[] = INCBIN_U32("graphics/trainer_card/back_fr.bin.lz"); +const u32 gKantoTrainerCardFrontLink_Tilemap[] = INCBIN_U32("graphics/trainer_card/front_link_fr.bin.lz"); // pokemon storage system diff --git a/src/main_menu.c b/src/main_menu.c index 61a60a8e7..91931e581 100644 --- a/src/main_menu.c +++ b/src/main_menu.c @@ -2188,7 +2188,7 @@ static void MainMenu_FormatSavegameBadges(void) u8 badgeCount = 0; u32 i; - for (i = FLAG_BADGE01_GET; i <= FLAG_BADGE08_GET; i++) + for (i = FLAG_BADGE01_GET; i < FLAG_BADGE01_GET + NUM_BADGES; i++) { if (FlagGet(i)) badgeCount++; diff --git a/src/match_call.c b/src/match_call.c index dac98e559..b48bc5c52 100644 --- a/src/match_call.c +++ b/src/match_call.c @@ -1287,7 +1287,7 @@ static bool32 sub_81963F0(u8 taskId) ChangeBgY(0, 0, 0); if (!gMatchCallState.triggeredFromScript) { - sub_81973A4(); + LoadMessageBoxAndBorderGfx(); playerObjectId = GetEventObjectIdByLocalIdAndMap(EVENT_OBJ_ID_PLAYER, 0, 0); EventObjectClearHeldMovementIfFinished(&gEventObjects[playerObjectId]); ScriptMovement_UnfreezeEventObjects(); @@ -1746,7 +1746,7 @@ static void PopulateBattleFrontierStreak(int matchCallId, u8 *destStr) ConvertIntToDecimalStringN(destStr, gBattleFrontierStreakInfo.streak, STR_CONV_MODE_LEFT_ALIGN, i); } -static const u16 sBadgeFlags[] = +static const u16 sBadgeFlags[NUM_BADGES] = { FLAG_BADGE01_GET, FLAG_BADGE02_GET, @@ -1762,7 +1762,7 @@ static int GetNumOwnedBadges(void) { u32 i; - for (i = 0; i < 8; i++) + for (i = 0; i < NUM_BADGES; i++) { if (!FlagGet(sBadgeFlags[i])) break; diff --git a/src/menu.c b/src/menu.c index fb7f44ceb..62387c323 100644 --- a/src/menu.c +++ b/src/menu.c @@ -159,7 +159,7 @@ void sub_8197200(void) ChangeBgX(0, 0, 0); ChangeBgY(0, 0, 0); DeactivateAllTextPrinters(); - sub_81973A4(); + LoadMessageBoxAndBorderGfx(); } u16 RunTextPrintersAndIsPrinter0Active(void) @@ -209,7 +209,7 @@ void AddTextPrinterWithCustomSpeedForMessage(bool8 allowSkippingDelayWithButtonP AddTextPrinterParameterized2(0, 1, gStringVar4, speed, NULL, 2, 1, 3); } -void sub_81973A4(void) +void LoadMessageBoxAndBorderGfx(void) { LoadMessageBoxGfx(0, DLG_WINDOW_BASE_TILE_NUM, DLG_WINDOW_PALETTE_NUM * 0x10); LoadUserWindowBorderGfx(0, STD_WINDOW_BASE_TILE_NUM, STD_WINDOW_PALETTE_NUM * 0x10); @@ -458,7 +458,7 @@ u16 sub_81978D0(u8 colorNum) void DisplayItemMessageOnField(u8 taskId, const u8 *string, TaskFunc callback) { - sub_81973A4(); + LoadMessageBoxAndBorderGfx(); DisplayMessageAndContinueTask(taskId, 0, DLG_WINDOW_BASE_TILE_NUM, DLG_WINDOW_PALETTE_NUM, 1, GetPlayerTextSpeedDelay(), string, callback); CopyWindowToVram(0, 3); } @@ -2133,7 +2133,7 @@ void blit_move_info_icon(u8 windowId, u8 iconId, u16 x, u16 y) BlitBitmapRectToWindow(windowId, gFireRedMenuElements_Gfx + gMoveMenuInfoIcons[iconId].offset * 32, 0, 0, 128, 128, x, y, gMoveMenuInfoIcons[iconId].width, gMoveMenuInfoIcons[iconId].height); } -void sub_819A344(u8 a0, u8 *dest, u8 color) +void BufferSaveMenuText(u8 textId, u8 *dest, u8 color) { s32 curFlag; s32 flagCount; @@ -2147,28 +2147,28 @@ void sub_819A344(u8 a0, u8 *dest, u8 color) *(string++) = EXT_CTRL_CODE_SHADOW; *(string++) = color + 1; - switch (a0) + switch (textId) { - case 0: + case SAVE_MENU_NAME: StringCopy(string, gSaveBlock2Ptr->playerName); break; - case 1: + case SAVE_MENU_CAUGHT: if (IsNationalPokedexEnabled()) string = ConvertIntToDecimalStringN(string, GetNationalPokedexCount(FLAG_GET_CAUGHT), STR_CONV_MODE_LEFT_ALIGN, 3); else string = ConvertIntToDecimalStringN(string, GetHoennPokedexCount(FLAG_GET_CAUGHT), STR_CONV_MODE_LEFT_ALIGN, 3); *string = EOS; break; - case 2: + case SAVE_MENU_PLAY_TIME: string = ConvertIntToDecimalStringN(string, gSaveBlock2Ptr->playTimeHours, STR_CONV_MODE_LEFT_ALIGN, 3); *(string++) = CHAR_COLON; ConvertIntToDecimalStringN(string, gSaveBlock2Ptr->playTimeMinutes, STR_CONV_MODE_LEADING_ZEROS, 2); break; - case 3: + case SAVE_MENU_LOCATION: GetMapNameGeneric(string, gMapHeader.regionMapSectionId); break; - case 4: - for (curFlag = FLAG_BADGE01_GET, flagCount = 0, endOfString = string + 1; curFlag <= FLAG_BADGE08_GET; curFlag++) + case SAVE_MENU_BADGES: + for (curFlag = FLAG_BADGE01_GET, flagCount = 0, endOfString = string + 1; curFlag < FLAG_BADGE01_GET + NUM_BADGES; curFlag++) { if (FlagGet(curFlag)) flagCount++; diff --git a/src/player_pc.c b/src/player_pc.c index bf3a5b01d..bb2361779 100644 --- a/src/player_pc.c +++ b/src/player_pc.c @@ -505,7 +505,7 @@ void sub_816B31C(void) void Mailbox_DoRedrawMailboxMenuAfterReturn(void) { - sub_81973A4(); + LoadMessageBoxAndBorderGfx(); DrawDialogueFrame(0, 1); InitItemStorageMenu(CreateTask(ItemStorage_HandleReturnToProcessInput, 0), 1); FadeInFromBlack(); @@ -739,7 +739,7 @@ static void pal_fill_for_maplights_or_black(void) { u8 taskId; - sub_81973A4(); + LoadMessageBoxAndBorderGfx(); taskId = CreateTask(Mailbox_HandleReturnToProcessInput, 0); if (sub_81D1C44(playerPCItemPageInfo.count) == TRUE) Mailbox_DrawMailboxMenu(taskId); @@ -847,7 +847,7 @@ static void Mailbox_UpdateMailListAfterDeposit(void) && playerPCItemPageInfo.itemsAbove != 0) playerPCItemPageInfo.itemsAbove--; ItemStorage_SetItemAndMailCount(taskId); - sub_81973A4(); + LoadMessageBoxAndBorderGfx(); if (sub_81D1C44(playerPCItemPageInfo.count) == TRUE) Mailbox_DrawMailboxMenu(taskId); else diff --git a/src/pokemon.c b/src/pokemon.c index 3f49c0440..ec29af02d 100644 --- a/src/pokemon.c +++ b/src/pokemon.c @@ -1895,14 +1895,26 @@ static const u16 sDeoxysBaseStats[] = [STAT_SPDEF] = 90, }; -const u16 gLinkPlayerFacilityClasses[] = -{ - FACILITY_CLASS_COOLTRAINER_M, FACILITY_CLASS_BLACK_BELT, FACILITY_CLASS_CAMPER, - FACILITY_CLASS_YOUNGSTER, FACILITY_CLASS_PSYCHIC_M, FACILITY_CLASS_BUG_CATCHER, - FACILITY_CLASS_PKMN_BREEDER_M, FACILITY_CLASS_GUITARIST, - FACILITY_CLASS_COOLTRAINER_F, FACILITY_CLASS_HEX_MANIAC, FACILITY_CLASS_PICNICKER, - FACILITY_CLASS_LASS, FACILITY_CLASS_PSYCHIC_F, FACILITY_CLASS_BATTLE_GIRL, - FACILITY_CLASS_PKMN_BREEDER_F, FACILITY_CLASS_BEAUTY +const u16 gLinkPlayerFacilityClasses[NUM_MALE_LINK_FACILITY_CLASSES + NUM_FEMALE_LINK_FACILITY_CLASSES] = +{ + // Male classes + FACILITY_CLASS_COOLTRAINER_M, + FACILITY_CLASS_BLACK_BELT, + FACILITY_CLASS_CAMPER, + FACILITY_CLASS_YOUNGSTER, + FACILITY_CLASS_PSYCHIC_M, + FACILITY_CLASS_BUG_CATCHER, + FACILITY_CLASS_PKMN_BREEDER_M, + FACILITY_CLASS_GUITARIST, + // Female Classes + FACILITY_CLASS_COOLTRAINER_F, + FACILITY_CLASS_HEX_MANIAC, + FACILITY_CLASS_PICNICKER, + FACILITY_CLASS_LASS, + FACILITY_CLASS_PSYCHIC_F, + FACILITY_CLASS_BATTLE_GIRL, + FACILITY_CLASS_PKMN_BREEDER_F, + FACILITY_CLASS_BEAUTY }; static const u8 sHoldEffectToType[][2] = diff --git a/src/pokemon_storage_system.c b/src/pokemon_storage_system.c index f5a013209..c99841ea2 100644 --- a/src/pokemon_storage_system.c +++ b/src/pokemon_storage_system.c @@ -1735,7 +1735,7 @@ static void Task_PokemonStorageSystemPC(u8 taskId) { case 0: CreatePCMenu(task->data[1], &task->data[15]); - sub_81973A4(); + LoadMessageBoxAndBorderGfx(); DrawDialogueFrame(0, 0); FillWindowPixelBuffer(0, PIXEL_FILL(1)); AddTextPrinterParameterized2(0, 1, gUnknown_085716C0[task->data[1]].desc, TEXT_SPEED_FF, NULL, 2, 1, 3); diff --git a/src/reset_rtc_screen.c b/src/reset_rtc_screen.c index efad640e3..07e96f3bd 100644 --- a/src/reset_rtc_screen.c +++ b/src/reset_rtc_screen.c @@ -475,7 +475,7 @@ static void sub_809F048(void) ShowBg(0); InitWindows(sUnknown_08510408); DeactivateAllTextPrinters(); - sub_81973A4(); + LoadMessageBoxAndBorderGfx(); } static void CB2_ResetRtcScreen(void) diff --git a/src/scrcmd.c b/src/scrcmd.c index 0e52f5953..2e01e32a0 100644 --- a/src/scrcmd.c +++ b/src/scrcmd.c @@ -1304,7 +1304,7 @@ bool8 ScrCmd_cmdDB(struct ScriptContext *ctx) if (msg == NULL) msg = (const u8 *)ctx->data[0]; - sub_81973A4(); + LoadMessageBoxAndBorderGfx(); DrawDialogueFrame(0, 1); AddTextPrinterParameterized(0, 1, msg, 0, 1, 0, 0); return FALSE; diff --git a/src/start_menu.c b/src/start_menu.c index a816f4f2f..6f3df5b19 100644 --- a/src/start_menu.c +++ b/src/start_menu.c @@ -450,7 +450,7 @@ static bool32 InitStartMenuStep(void) sInitStartMenuData[0]++; break; case 2: - sub_81973A4(); + LoadMessageBoxAndBorderGfx(); DrawStdWindowFrame(sub_81979C4(sNumStartMenuActions), FALSE); sInitStartMenuData[1] = 0; sInitStartMenuData[0]++; @@ -1314,37 +1314,37 @@ static void ShowSaveInfoWindow(void) // Print region name yOffset = 1; - sub_819A344(3, gStringVar4, TEXT_COLOR_GREEN); + BufferSaveMenuText(SAVE_MENU_LOCATION, gStringVar4, TEXT_COLOR_GREEN); AddTextPrinterParameterized(sSaveInfoWindowId, 1, gStringVar4, 0, yOffset, 0xFF, NULL); // Print player name - yOffset = 0x11; + yOffset += 16; AddTextPrinterParameterized(sSaveInfoWindowId, 1, gText_SavingPlayer, 0, yOffset, 0xFF, NULL); - sub_819A344(0, gStringVar4, color); + BufferSaveMenuText(SAVE_MENU_NAME, gStringVar4, color); xOffset = GetStringRightAlignXOffset(1, gStringVar4, 0x70); PrintPlayerNameOnWindow(sSaveInfoWindowId, gStringVar4, xOffset, yOffset); // Print badge count - yOffset = 0x21; + yOffset += 16; AddTextPrinterParameterized(sSaveInfoWindowId, 1, gText_SavingBadges, 0, yOffset, 0xFF, NULL); - sub_819A344(4, gStringVar4, color); + BufferSaveMenuText(SAVE_MENU_BADGES, gStringVar4, color); xOffset = GetStringRightAlignXOffset(1, gStringVar4, 0x70); AddTextPrinterParameterized(sSaveInfoWindowId, 1, gStringVar4, xOffset, yOffset, 0xFF, NULL); if (FlagGet(FLAG_SYS_POKEDEX_GET) == TRUE) { // Print pokedex count - yOffset = 0x31; + yOffset += 16; AddTextPrinterParameterized(sSaveInfoWindowId, 1, gText_SavingPokedex, 0, yOffset, 0xFF, NULL); - sub_819A344(1, gStringVar4, color); + BufferSaveMenuText(SAVE_MENU_CAUGHT, gStringVar4, color); xOffset = GetStringRightAlignXOffset(1, gStringVar4, 0x70); AddTextPrinterParameterized(sSaveInfoWindowId, 1, gStringVar4, xOffset, yOffset, 0xFF, NULL); } // Print play time - yOffset += 0x10; + yOffset += 16; AddTextPrinterParameterized(sSaveInfoWindowId, 1, gText_SavingTime, 0, yOffset, 0xFF, NULL); - sub_819A344(2, gStringVar4, color); + BufferSaveMenuText(SAVE_MENU_PLAY_TIME, gStringVar4, color); xOffset = GetStringRightAlignXOffset(1, gStringVar4, 0x70); AddTextPrinterParameterized(sSaveInfoWindowId, 1, gStringVar4, xOffset, yOffset, 0xFF, NULL); diff --git a/src/strings.c b/src/strings.c index f0566c859..3ca7f693f 100644 --- a/src/strings.c +++ b/src/strings.c @@ -1206,12 +1206,12 @@ const u8 gText_UnionTradesAndBattles[] = _("UNION TRADES & BATTLES"); const u8 gText_BerryCrush[] = _("BERRY CRUSH"); const u8 gText_WaitingTrainerFinishReading[] = _("Waiting for the other TRAINER to\nfinish reading your TRAINER CARD."); const u8 gText_PokeblocksWithFriends[] = _("{POKEBLOCK}S W/FRIENDS"); -const u8 gText_Var1DarkGreyShadowLightGrey[] = _("{STR_VAR_1}{COLOR DARK_GREY}{SHADOW LIGHT_GREY}"); +const u8 gText_NumPokeblocks[] = _("{STR_VAR_1}{COLOR DARK_GREY}{SHADOW LIGHT_GREY}"); const u8 gText_WonContestsWFriends[] = _("WON CONTESTS W/FRIENDS"); const u8 gText_BattlePtsWon[] = _("BATTLE POINTS WON"); -const u8 gText_Var1DarkLightGreyBP[] = _("{STR_VAR_1}{COLOR DARK_GREY}{SHADOW LIGHT_GREY}BP"); +const u8 gText_NumBP[] = _("{STR_VAR_1}{COLOR DARK_GREY}{SHADOW LIGHT_GREY}BP"); const u8 gText_BattleTower[] = _("BATTLE TOWER"); -const u8 gText_WSlashStraightSlash[] = _("W/{COLOR RED}{SHADOW LIGHT_RED}{STR_VAR_1}{COLOR DARK_GREY}{SHADOW LIGHT_GREY} STRAIGHT/{COLOR RED}{SHADOW LIGHT_RED}{STR_VAR_2}"); +const u8 gText_WinsStraight[] = _("W/{COLOR RED}{SHADOW LIGHT_RED}{STR_VAR_1}{COLOR DARK_GREY}{SHADOW LIGHT_GREY} STRAIGHT/{COLOR RED}{SHADOW LIGHT_RED}{STR_VAR_2}"); const u8 gText_BattleTower2[] = _("BATTLE TOWER"); const u8 gText_BattleDome[] = _("BATTLE DOME"); const u8 gText_BattlePalace[] = _("BATTLE PALACE"); diff --git a/src/trainer_card.c b/src/trainer_card.c index 5ea076c2a..fb92dc336 100755 --- a/src/trainer_card.c +++ b/src/trainer_card.c @@ -31,62 +31,56 @@ #include "constants/game_stat.h" #include "constants/battle_frontier.h" #include "constants/rgb.h" - -enum -{ - CARD_TYPE_FRLG, - CARD_TYPE_RS, - CARD_TYPE_EMERALD, -}; +#include "constants/trainers.h" struct TrainerCardData { - u8 var_0; + u8 mainState; u8 printState; u8 gfxLoadState; u8 bgPalLoadState; - u8 var_4; + u8 flipDrawState; bool8 isLink; - u8 var_6; - u8 var_7; - u8 var_8; + u8 timeColonBlinkTimer; + bool8 timeColonInvisible; + bool8 onBack; bool8 allowDMACopy; bool8 hasPokedex; bool8 hasHofResult; bool8 hasLinkResults; bool8 hasBattleTowerWins; - u8 var_E; - u8 var_F; + bool8 unused_E; + bool8 unused_F; bool8 hasTrades; - u8 badgeCount[8]; - u8 var_19[4][0xD]; - u8 var_4D[0x46]; - u8 var_93[0x46]; - u8 var_D9[0x8C]; - u8 var_165[0x46]; - u8 var_1AB[0x8C]; - u8 var_237[0x8C]; - u8 var_2C3[0x8C]; - u8 var_34F[0x46]; - u8 var_395[0x46]; - u8 var_3DB[0x46]; - u8 var_421[0x46]; - u16 var_468[0x60]; - s8 var_528; - u8 var_529; + u8 badgeCount[NUM_BADGES]; + u8 easyChatProfile[TRAINER_CARD_PROFILE_LENGTH][13]; + u8 textPlayersCard[70]; + u8 textHofTime[70]; + u8 textLinkBattleType[140]; + u8 textLinkBattleWins[70]; + u8 textLinkBattleLosses[140]; + u8 textNumTrades[140]; + u8 textBerryCrushPts[140]; + u8 textUnionRoomStats[70]; + u8 textNumLinkPokeblocks[70]; + u8 textNumLinkContests[70]; + u8 textBattleFacilityStat[70]; + u16 monIconPal[16 * PARTY_SIZE]; + s8 flipBlendY; + bool8 timeColonNeedDraw; u8 cardType; bool8 isHoenn; - u16 var_52C; + u16 blendColor; void (*callback2)(void); struct TrainerCard trainerCard; - u16 var_598[0x4B0 / 2]; - u16 var_A48[0x4B0 / 2]; - u16 var_EF8[0x4B0 / 2]; - u8 var_13A8[0x400]; - u8 var_17A8[0x200]; - u8 var_19A8[0x2300]; - u16 var_3CA8[0x2000 / 2]; - u16 var_5CA8[0x2000 / 2]; + u16 frontTilemap[600]; + u16 backTilemap[600]; + u16 bgTilemap[600]; + u8 badgeTiles[0x80 * NUM_BADGES]; + u8 stickerTiles[0x200]; + u8 cardTiles[0x2300]; + u16 cardTilemapBuffer[0x1000]; + u16 bgTilemapBuffer[0x1000]; u16 var_7CA8; u8 language; }; @@ -98,18 +92,18 @@ EWRAM_DATA static struct TrainerCardData *sData = NULL; //this file's functions static void VblankCb_TrainerCard(void); static void HblankCb_TrainerCard(void); -static void sub_80C48C8(void); +static void BlinkTimeColon(void); static void CB2_TrainerCard(void); static void CloseTrainerCard(u8 task); -static bool8 PrintAllOnCardPage1(void); -static void sub_80C438C(u8); -static void sub_80C4FF0(void); -static void sub_80C4550(u16*); -static void sub_80C45C0(u16*); -static void TrainerCard_PrintStarsAndBadgesOnCard(void); +static bool8 PrintAllOnCardFront(void); +static void DrawTrainerCardWindow(u8); +static void CreateTrainerCardTrainerPic(void); +static void DrawCardScreenBackground(u16*); +static void DrawCardFrontOrBack(u16*); +static void DrawStarsAndBadgesOnCard(void); static void PrintTimeOnCard(void); -static void sub_80C4918(void); -static bool8 sub_80C4940(void); +static void FlipTrainerCard(void); +static bool8 IsCardFlipTaskActive(void); static bool8 LoadCardGfx(void); static void CB2_InitTrainerCard(void); static u32 GetCappedGameStat(u8 statId, u32 maxValue); @@ -124,74 +118,74 @@ static void HandleGpuRegs(void); static void ResetGpuRegs(void); static void InitBgsAndWindows(void); static void SetTrainerCardCb2(void); -static void sub_80C3414(void); -static void sub_80C4EE4(void); +static void SetUpTrainerCardTask(void); +static void InitTrainerCardData(void); static u8 GetSetCardType(void); -static void PrintNameOnCard(void); +static void PrintNameOnCardFront(void); static void PrintIdOnCard(void); static void PrintMoneyOnCard(void); static void PrintPokedexOnCard(void); static void PrintProfilePhraseOnCard(void); -static bool8 PrintStringsOnCardPage2(void); -static void sub_80C3B50(void); -static void PrintHofDebutStringOnCard(void); -static void PrintWinsLossesStringOnCard(void); +static bool8 PrintAllOnCardBack(void); +static void PrintNameOnCardBack(void); +static void PrintHofDebutTimeOnCard(void); +static void PrintLinkBattleResultsOnCard(void); static void PrintTradesStringOnCard(void); static void PrintBerryCrushStringOnCard(void); static void PrintPokeblockStringOnCard(void); static void PrintUnionStringOnCard(void); static void PrintContestStringOnCard(void); -static void TrainerCard_PrintPokemonIconsOnCard(void); +static void PrintPokemonIconsOnCard(void); static void PrintBattleFacilityStringOnCard(void); -static void sub_80C42A4(void); -static void PrintAllVariableNumsOnCardPage2(void); -static void PrintNameOnCard2(void); -static void PrintHofTimeOnCard(void); -static void PrintLinkResultsNumsOnCard(void); -static void PrintTradesNumOnCard(void); -static void PrintBerryCrushNumOnCard(void); -static void PrintUnionNumOnCard(void); -static void PrintPokeblocksNumOnCard(void); -static void PrintContestNumOnCard(void); -static void PrintBattleFacilityNumsOnCard(void); -static void PrintString(u8 top, const u8* str1, u8* str2, const u8* color); -static void sub_80C4330(void); +static void PrintStickersOnCard(void); +static void BufferTextsVarsForCardPage2(void); +static void BufferNameForCardBack(void); +static void BufferHofDebutTime(void); +static void BufferLinkBattleResults(void); +static void BufferNumTrades(void); +static void BufferBerryCrushPoints(void); +static void BufferUnionRoomStats(void); +static void BufferLinkPokeblocksNum(void); +static void BufferLinkContestNum(void); +static void BufferBattleFacilityStats(void); +static void PrintStatOnBackOfCard(u8 top, const u8* str1, u8* str2, const u8* color); +static void LoadStickerGfx(void); static u8 SetCardBgsAndPals(void); -static void sub_80C474C(void); -static void sub_80C4960(u8); -static bool8 sub_80C4998(struct Task* task); -static bool8 sub_80C49D8(struct Task* task); -static bool8 sub_80C4B08(struct Task* task); -static bool8 sub_80C4C1C(struct Task* task); -static bool8 sub_80C4C84(struct Task* task); -static bool8 sub_80C4DB0(struct Task* task); +static void DrawCardBackStats(void); +static void Task_DoCardFlipTask(u8); +static bool8 Task_BeginCardFlip(struct Task* task); +static bool8 Task_AnimateCardFlipDown(struct Task* task); +static bool8 Task_DrawFlippedCardSide(struct Task* task); +static bool8 Task_SetCardFlipped(struct Task* task); +static bool8 Task_AnimateCardFlipUp(struct Task* task); +static bool8 Task_EndCardFlip(struct Task* task); static void sub_80C32EC(u16); -static void sub_80C41D8(void); +static void LoadMonIconGfx(void); // const rom data -static const u32 gUnknown_0856F018[] = INCBIN_U32("graphics/trainer_card/stickers_fr.4bpp.lz"); -static const u16 gUnknown_0856F18C[] = INCBIN_U16("graphics/trainer_card/unknown_56F18C.gbapal"); -static const u16 gEmeraldTrainerCard1Star_Pal[] = INCBIN_U16("graphics/trainer_card/one_star.gbapal"); -static const u16 gFireRedTrainerCard1Star_Pal[] = INCBIN_U16("graphics/trainer_card/one_star_fr.gbapal"); -static const u16 gEmeraldTrainerCard2Star_Pal[] = INCBIN_U16("graphics/trainer_card/two_stars.gbapal"); -static const u16 gFireRedTrainerCard2Star_Pal[] = INCBIN_U16("graphics/trainer_card/two_stars_fr.gbapal"); -static const u16 gEmeraldTrainerCard3Star_Pal[] = INCBIN_U16("graphics/trainer_card/three_stars.gbapal"); -static const u16 gFireRedTrainerCard3Star_Pal[] = INCBIN_U16("graphics/trainer_card/three_stars_fr.gbapal"); -static const u16 gEmeraldTrainerCard4Star_Pal[] = INCBIN_U16("graphics/trainer_card/four_stars.gbapal"); -static const u16 gFireRedTrainerCard4Star_Pal[] = INCBIN_U16("graphics/trainer_card/four_stars_fr.gbapal"); -static const u16 sEmeraldTrainerCardFemaleBackground_Pal[] = INCBIN_U16("graphics/trainer_card/female_bg.gbapal"); -static const u16 sFireRedTrainerCardFemaleBackground_Pal[] = INCBIN_U16("graphics/trainer_card/female_bg_fr.gbapal"); -static const u16 sEmeraldTrainerCardBadges_Pal[] = INCBIN_U16("graphics/trainer_card/badges.gbapal"); -static const u16 sFireRedTrainerCardBadges_Pal[] = INCBIN_U16("graphics/trainer_card/badges_fr.gbapal"); -static const u16 gUnknown_0856F52C[] = INCBIN_U16("graphics/trainer_card/gold.gbapal"); -static const u16 gUnknown_0856F54C[] = INCBIN_U16("graphics/trainer_card/stickers_fr1.gbapal"); -static const u16 gUnknown_0856F56C[] = INCBIN_U16("graphics/trainer_card/stickers_fr2.gbapal"); -static const u16 gUnknown_0856F58C[] = INCBIN_U16("graphics/trainer_card/stickers_fr3.gbapal"); -static const u16 gUnknown_0856F5AC[] = INCBIN_U16("graphics/trainer_card/stickers_fr4.gbapal"); -static const u32 sEmeraldTrainerCardBadges_Tile[] = INCBIN_U32("graphics/trainer_card/badges.4bpp.lz"); -static const u32 sFireRedTrainerCardBadges_Tile[] = INCBIN_U32("graphics/trainer_card/badges_fr.4bpp.lz"); - -static const struct BgTemplate gUnknown_0856FAB4[4] = +static const u32 sTrainerCardStickers_Gfx[] = INCBIN_U32("graphics/trainer_card/stickers_fr.4bpp.lz"); +static const u16 sUnused_0856F18C[] = INCBIN_U16("graphics/trainer_card/unknown_56F18C.gbapal"); +static const u16 sHoennTrainerCard1Star_Pal[] = INCBIN_U16("graphics/trainer_card/one_star.gbapal"); +static const u16 sKantoTrainerCard1Star_Pal[] = INCBIN_U16("graphics/trainer_card/one_star_fr.gbapal"); +static const u16 sHoennTrainerCard2Star_Pal[] = INCBIN_U16("graphics/trainer_card/two_stars.gbapal"); +static const u16 sKantoTrainerCard2Star_Pal[] = INCBIN_U16("graphics/trainer_card/two_stars_fr.gbapal"); +static const u16 sHoennTrainerCard3Star_Pal[] = INCBIN_U16("graphics/trainer_card/three_stars.gbapal"); +static const u16 sKantoTrainerCard3Star_Pal[] = INCBIN_U16("graphics/trainer_card/three_stars_fr.gbapal"); +static const u16 sHoennTrainerCard4Star_Pal[] = INCBIN_U16("graphics/trainer_card/four_stars.gbapal"); +static const u16 sKantoTrainerCard4Star_Pal[] = INCBIN_U16("graphics/trainer_card/four_stars_fr.gbapal"); +static const u16 sHoennTrainerCardFemaleBg_Pal[] = INCBIN_U16("graphics/trainer_card/female_bg.gbapal"); +static const u16 sKantoTrainerCardFemaleBg_Pal[] = INCBIN_U16("graphics/trainer_card/female_bg_fr.gbapal"); +static const u16 sHoennTrainerCardBadges_Pal[] = INCBIN_U16("graphics/trainer_card/badges.gbapal"); +static const u16 sKantoTrainerCardBadges_Pal[] = INCBIN_U16("graphics/trainer_card/badges_fr.gbapal"); +static const u16 sTrainerCardGold_Pal[] = INCBIN_U16("graphics/trainer_card/gold.gbapal"); +static const u16 sTrainerCardSticker1_Pal[] = INCBIN_U16("graphics/trainer_card/stickers_fr1.gbapal"); +static const u16 sTrainerCardSticker2_Pal[] = INCBIN_U16("graphics/trainer_card/stickers_fr2.gbapal"); +static const u16 sTrainerCardSticker3_Pal[] = INCBIN_U16("graphics/trainer_card/stickers_fr3.gbapal"); +static const u16 sTrainerCardSticker4_Pal[] = INCBIN_U16("graphics/trainer_card/stickers_fr4.gbapal"); +static const u32 sHoennTrainerCardBadges_Gfx[] = INCBIN_U32("graphics/trainer_card/badges.4bpp.lz"); +static const u32 sKantoTrainerCardBadges_Gfx[] = INCBIN_U32("graphics/trainer_card/badges_fr.4bpp.lz"); + +static const struct BgTemplate sTrainerCardBgTemplates[4] = { { .bg = 0, @@ -231,7 +225,7 @@ static const struct BgTemplate gUnknown_0856FAB4[4] = }, }; -static const struct WindowTemplate gUnknown_0856FAC4[] = +static const struct WindowTemplate sTrainerCardWindowTemplates[] = { { .bg = 1, @@ -263,44 +257,69 @@ static const struct WindowTemplate gUnknown_0856FAC4[] = DUMMY_WIN_TEMPLATE }; -static const u16 *const gEmeraldTrainerCardStarPals[] = +static const u16 *const sHoennTrainerCardStarPals[] = { - gEmeraldTrainerCard0Star_Pal, - gEmeraldTrainerCard1Star_Pal, - gEmeraldTrainerCard2Star_Pal, - gEmeraldTrainerCard3Star_Pal, - gEmeraldTrainerCard4Star_Pal, + gHoennTrainerCard0Star_Pal, + sHoennTrainerCard1Star_Pal, + sHoennTrainerCard2Star_Pal, + sHoennTrainerCard3Star_Pal, + sHoennTrainerCard4Star_Pal, }; -static const u16 *const gFireRedTrainerCardStarPals[] = +static const u16 *const sKantoTrainerCardStarPals[] = { - gFireRedTrainerCard0Star_Pal, - gFireRedTrainerCard1Star_Pal, - gFireRedTrainerCard2Star_Pal, - gFireRedTrainerCard3Star_Pal, - gFireRedTrainerCard4Star_Pal, + gKantoTrainerCard0Star_Pal, + sKantoTrainerCard1Star_Pal, + sKantoTrainerCard2Star_Pal, + sKantoTrainerCard3Star_Pal, + sKantoTrainerCard4Star_Pal, }; static const u8 sTrainerCardTextColors[] = {TEXT_COLOR_TRANSPARENT, TEXT_COLOR_DARK_GREY, TEXT_COLOR_LIGHT_GREY}; static const u8 sTrainerCardStatColors[] = {TEXT_COLOR_TRANSPARENT, TEXT_COLOR_RED, TEXT_COLOR_LIGHT_RED}; -static const u8 gUnknown_0856FB12[6] = {0}; +static const u8 sTimeColonInvisibleTextColors[6] = {TEXT_COLOR_TRANSPARENT, TEXT_COLOR_TRANSPARENT, TEXT_COLOR_TRANSPARENT}; -static const u8 gUnknown_0856FB18[][2][2] = +static const u8 sTrainerPicOffset[2][GENDER_COUNT][2] = { - {{0xD, 4}, {0xD, 4}}, - {{1, 0}, {1, 0}}, + // Kanto + { + [MALE] = {13, 4}, + [FEMALE] = {13, 4} + }, + // Hoenn + { + [MALE] = {1, 0}, + [FEMALE] = {1, 0} + }, }; -static const u8 gUnknown_0856FB20[][2] = {{0x4E, 0x4F}, {0x50, 0x51}, {0x3C, 0x3F}}; +static const u8 sTrainerPicFacilityClass[][GENDER_COUNT] = +{ + [CARD_TYPE_FRLG] = + { + [MALE] = FACILITY_CLASS_RED, + [FEMALE] = FACILITY_CLASS_LEAF + }, + [CARD_TYPE_RS] = + { + [MALE] = FACILITY_CLASS_RS_BRENDAN, + [FEMALE] = FACILITY_CLASS_RS_MAY + }, + [CARD_TYPE_EMERALD] = + { + [MALE] = FACILITY_CLASS_BRENDAN, + [FEMALE] = FACILITY_CLASS_MAY + } +}; -static bool8 (*const gUnknown_0856FB28[])(struct Task *) = +static bool8 (*const sTrainerCardFlipTasks[])(struct Task *) = { - sub_80C4998, - sub_80C49D8, - sub_80C4B08, - sub_80C4C1C, - sub_80C4C84, - sub_80C4DB0, + Task_BeginCardFlip, + Task_AnimateCardFlipDown, + Task_DrawFlippedCardSide, + Task_SetCardFlipped, + Task_AnimateCardFlipUp, + Task_EndCardFlip, }; // code @@ -309,7 +328,7 @@ static void VblankCb_TrainerCard(void) LoadOam(); ProcessSpriteCopyRequests(); TransferPlttBuffer(); - sub_80C48C8(); + BlinkTimeColon(); if (sData->allowDMACopy) DmaCopy16(3, &gScanlineEffectRegBuffers[0], &gScanlineEffectRegBuffers[1], 0x140); } @@ -342,114 +361,126 @@ static void CloseTrainerCard(u8 taskId) DestroyTask(taskId); } -static void sub_80C2760(u8 taskId) +// States for Task_TrainerCard. Skips the initial states, which are done once in order +#define STATE_HANDLE_INPUT_FRONT 10 +#define STATE_HANDLE_INPUT_BACK 11 +#define STATE_WAIT_FLIP_TO_BACK 12 +#define STATE_WAIT_FLIP_TO_FRONT 13 +#define STATE_CLOSE_CARD 14 +#define STATE_WAIT_LINK_PARTNER 15 +#define STATE_CLOSE_CARD_LINK 16 + +static void Task_TrainerCard(u8 taskId) { - switch (sData->var_0) + switch (sData->mainState) { + // Draw card initially case 0: if (!IsDma3ManagerBusyWithBgCopy()) { FillWindowPixelBuffer(1, PIXEL_FILL(0)); - sData->var_0++; + sData->mainState++; } break; case 1: - if (PrintAllOnCardPage1()) - sData->var_0++; + if (PrintAllOnCardFront()) + sData->mainState++; break; case 2: - sub_80C438C(1); - sData->var_0++; + DrawTrainerCardWindow(1); + sData->mainState++; break; case 3: FillWindowPixelBuffer(2, PIXEL_FILL(0)); - sub_80C4FF0(); - sub_80C438C(2); - sData->var_0++; + CreateTrainerCardTrainerPic(); + DrawTrainerCardWindow(2); + sData->mainState++; break; case 4: - sub_80C4550(sData->var_EF8); - sData->var_0++; + DrawCardScreenBackground(sData->bgTilemap); + sData->mainState++; break; case 5: - sub_80C45C0(sData->var_598); - sData->var_0++; + DrawCardFrontOrBack(sData->frontTilemap); + sData->mainState++; break; case 6: - TrainerCard_PrintStarsAndBadgesOnCard(); - sData->var_0++; + DrawStarsAndBadgesOnCard(); + sData->mainState++; break; + // Fade in case 7: if (gWirelessCommType == 1 && gReceivedRemoteLinkPlayers == TRUE) { LoadWirelessStatusIndicatorSpriteGfx(); CreateWirelessStatusIndicatorSprite(230, 150); } - BlendPalettes(0xFFFFFFFF, 16, sData->var_52C); - BeginNormalPaletteFade(0xFFFFFFFF, 0, 16, 0, sData->var_52C); + BlendPalettes(0xFFFFFFFF, 16, sData->blendColor); + BeginNormalPaletteFade(0xFFFFFFFF, 0, 16, 0, sData->blendColor); SetVBlankCallback(VblankCb_TrainerCard); - sData->var_0++; + sData->mainState++; break; case 8: if (!UpdatePaletteFade() && !IsDma3ManagerBusyWithBgCopy()) { PlaySE(SE_RG_CARD3); - sData->var_0 = 10; + sData->mainState = STATE_HANDLE_INPUT_FRONT; } break; case 9: if (!IsSEPlaying()) - sData->var_0++; + sData->mainState++; break; - case 10: - if (!gReceivedRemoteLinkPlayers && sData->var_529) + case STATE_HANDLE_INPUT_FRONT: + // Blink the : in play time + if (!gReceivedRemoteLinkPlayers && sData->timeColonNeedDraw) { PrintTimeOnCard(); - sub_80C438C(1); - sData->var_529 = 0; + DrawTrainerCardWindow(1); + sData->timeColonNeedDraw = FALSE; } if (gMain.newKeys & A_BUTTON) { - sub_80C4918(); + FlipTrainerCard(); PlaySE(SE_RG_CARD1); - sData->var_0 = 12; + sData->mainState = STATE_WAIT_FLIP_TO_BACK; } else if (gMain.newKeys & B_BUTTON) { if (gReceivedRemoteLinkPlayers && sData->isLink && InUnionRoom() == TRUE) { - sData->var_0 = 15; + sData->mainState = STATE_WAIT_LINK_PARTNER; } else { - BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 16, sData->var_52C); - sData->var_0 = 14; + BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 16, sData->blendColor); + sData->mainState = STATE_CLOSE_CARD; } } break; - case 12: - if (sub_80C4940() && sub_8087598() != TRUE) + case STATE_WAIT_FLIP_TO_BACK: + if (IsCardFlipTaskActive() && sub_8087598() != TRUE) { PlaySE(SE_RG_CARD3); - sData->var_0 = 11; + sData->mainState = STATE_HANDLE_INPUT_BACK; } break; - case 11: + case STATE_HANDLE_INPUT_BACK: if (gMain.newKeys & B_BUTTON) { if (gReceivedRemoteLinkPlayers && sData->isLink && InUnionRoom() == TRUE) { - sData->var_0 = 15; + sData->mainState = STATE_WAIT_LINK_PARTNER; } else if (gReceivedRemoteLinkPlayers) { - BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 16, sData->var_52C); - sData->var_0 = 14; + BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 16, sData->blendColor); + sData->mainState = STATE_CLOSE_CARD; } else { - sub_80C4918(); - sData->var_0 = 13; + FlipTrainerCard(); + sData->mainState = STATE_WAIT_FLIP_TO_FRONT; PlaySE(SE_RG_CARD1); } } @@ -457,37 +488,37 @@ static void sub_80C2760(u8 taskId) { if (gReceivedRemoteLinkPlayers && sData->isLink && InUnionRoom() == TRUE) { - sData->var_0 = 15; + sData->mainState = STATE_WAIT_LINK_PARTNER; } else { - BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 16, sData->var_52C); - sData->var_0 = 14; + BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 16, sData->blendColor); + sData->mainState = STATE_CLOSE_CARD; } } break; - case 15: + case STATE_WAIT_LINK_PARTNER: sub_800AC34(); DrawDialogueFrame(0, 1); AddTextPrinterParameterized(0, 1, gText_WaitingTrainerFinishReading, 0, 1, 255, 0); CopyWindowToVram(0, 3); - sData->var_0 = 16; + sData->mainState = STATE_CLOSE_CARD_LINK; break; - case 16: + case STATE_CLOSE_CARD_LINK: if (!gReceivedRemoteLinkPlayers) { - BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 16, sData->var_52C); - sData->var_0 = 14; + BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 16, sData->blendColor); + sData->mainState = STATE_CLOSE_CARD; } break; - case 14: + case STATE_CLOSE_CARD: if (!UpdatePaletteFade()) CloseTrainerCard(taskId); break; - case 13: - if (sub_80C4940() && sub_8087598() != TRUE) + case STATE_WAIT_FLIP_TO_FRONT: + if (IsCardFlipTaskActive() && sub_8087598() != TRUE) { - sData->var_0 = 10; + sData->mainState = STATE_HANDLE_INPUT_FRONT; PlaySE(SE_RG_CARD3); } break; @@ -500,47 +531,47 @@ static bool8 LoadCardGfx(void) { case 0: if (sData->cardType != CARD_TYPE_FRLG) - LZ77UnCompWram(gUnknown_08DD1F78, sData->var_EF8); + LZ77UnCompWram(gHoennTrainerCardBg_Tilemap, sData->bgTilemap); else - LZ77UnCompWram(gUnknown_08DD2AE0, sData->var_EF8); + LZ77UnCompWram(gKantoTrainerCardBg_Tilemap, sData->bgTilemap); break; case 1: if (sData->cardType != CARD_TYPE_FRLG) - LZ77UnCompWram(gUnknown_08DD21B0, sData->var_A48); + LZ77UnCompWram(gHoennTrainerCardBack_Tilemap, sData->backTilemap); else - LZ77UnCompWram(gUnknown_08DD2D30, sData->var_A48); + LZ77UnCompWram(gKantoTrainerCardBack_Tilemap, sData->backTilemap); break; case 2: if (!sData->isLink) { if (sData->cardType != CARD_TYPE_FRLG) - LZ77UnCompWram(gUnknown_08DD2010, sData->var_598); + LZ77UnCompWram(gHoennTrainerCardFront_Tilemap, sData->frontTilemap); else - LZ77UnCompWram(gUnknown_08DD2B78, sData->var_598); + LZ77UnCompWram(gKantoTrainerCardFront_Tilemap, sData->frontTilemap); } else { if (sData->cardType != CARD_TYPE_FRLG) - LZ77UnCompWram(gUnknown_08DD228C, sData->var_598); + LZ77UnCompWram(gHoennTrainerCardFrontLink_Tilemap, sData->frontTilemap); else - LZ77UnCompWram(gUnknown_08DD2E5C, sData->var_598); + LZ77UnCompWram(gKantoTrainerCardFrontLink_Tilemap, sData->frontTilemap); } break; case 3: if (sData->cardType != CARD_TYPE_FRLG) - LZ77UnCompWram(sEmeraldTrainerCardBadges_Tile, sData->var_13A8); + LZ77UnCompWram(sHoennTrainerCardBadges_Gfx, sData->badgeTiles); else - LZ77UnCompWram(sFireRedTrainerCardBadges_Tile, sData->var_13A8); + LZ77UnCompWram(sKantoTrainerCardBadges_Gfx, sData->badgeTiles); break; case 4: if (sData->cardType != CARD_TYPE_FRLG) - LZ77UnCompWram(gEmeraldTrainerCard_Gfx, sData->var_19A8); + LZ77UnCompWram(gHoennTrainerCard_Gfx, sData->cardTiles); else - LZ77UnCompWram(gFireRedTrainerCard_Gfx, sData->var_19A8); + LZ77UnCompWram(gKantoTrainerCard_Gfx, sData->cardTiles); break; case 5: if (sData->cardType == CARD_TYPE_FRLG) - LZ77UnCompWram(gUnknown_0856F018, sData->var_17A8); + LZ77UnCompWram(sTrainerCardStickers_Gfx, sData->stickerTiles); break; default: sData->gfxLoadState = 0; @@ -556,7 +587,7 @@ static void CB2_InitTrainerCard(void) { case 0: ResetGpuRegs(); - sub_80C3414(); + SetUpTrainerCardTask(); gMain.state++; break; case 1: @@ -564,7 +595,7 @@ static void CB2_InitTrainerCard(void) gMain.state++; break; case 2: - if (!sData->var_52C) + if (!sData->blendColor) DmaClear16(3, (void *)PLTT, PLTT_SIZE); gMain.state++; break; @@ -578,7 +609,7 @@ static void CB2_InitTrainerCard(void) gMain.state++; break; case 5: - sub_80C41D8(); + LoadMonIconGfx(); gMain.state++; break; case 6: @@ -586,7 +617,7 @@ static void CB2_InitTrainerCard(void) gMain.state++; break; case 7: - sub_80C4330(); + LoadStickerGfx(); gMain.state++; break; case 8: @@ -594,7 +625,7 @@ static void CB2_InitTrainerCard(void) gMain.state++; break; case 9: - PrintAllVariableNumsOnCardPage2(); + BufferTextsVarsForCardPage2(); gMain.state++; break; case 10: @@ -693,8 +724,8 @@ static void SetPlayerCardData(struct TrainerCard *trainerCard, u8 cardType) trainerCard->money = GetMoney(&gSaveBlock1Ptr->money); - for (i = 0; i < 4; i++) - trainerCard->var_28[i] = gSaveBlock1Ptr->easyChatProfile[i]; + for (i = 0; i < TRAINER_CARD_PROFILE_LENGTH; i++) + trainerCard->easyChatProfile[i] = gSaveBlock1Ptr->easyChatProfile[i]; StringCopy(trainerCard->playerName, gSaveBlock2Ptr->playerName); @@ -733,9 +764,9 @@ static void TrainerCard_GenerateCardForLinkPlayer(struct TrainerCard *trainerCar trainerCard->stars++; if (trainerCard->gender == FEMALE) - trainerCard->var_4F = gLinkPlayerFacilityClasses[(trainerCard->trainerId % 8) + 8]; + trainerCard->facilityClass = gLinkPlayerFacilityClasses[(trainerCard->trainerId % NUM_FEMALE_LINK_FACILITY_CLASSES) + NUM_MALE_LINK_FACILITY_CLASSES]; else - trainerCard->var_4F = gLinkPlayerFacilityClasses[trainerCard->trainerId % 8]; + trainerCard->facilityClass = gLinkPlayerFacilityClasses[trainerCard->trainerId % NUM_MALE_LINK_FACILITY_CLASSES]; } void TrainerCard_GenerateCardForPlayer(struct TrainerCard *trainerCard) @@ -743,15 +774,15 @@ void TrainerCard_GenerateCardForPlayer(struct TrainerCard *trainerCard) memset(trainerCard, 0, 0x60); trainerCard->version = GAME_VERSION; SetPlayerCardData(trainerCard, CARD_TYPE_EMERALD); - trainerCard->var_3A = HasAllFrontierSymbols(); + trainerCard->hasAllFrontierSymbols = HasAllFrontierSymbols(); *((u16*)&trainerCard->berryCrushPoints) = gSaveBlock2Ptr->frontier.cardBattlePoints; - if (trainerCard->var_3A) + if (trainerCard->hasAllFrontierSymbols) trainerCard->stars++; if (trainerCard->gender == FEMALE) - trainerCard->var_4F = gLinkPlayerFacilityClasses[(trainerCard->trainerId % 8) + 8]; + trainerCard->facilityClass = gLinkPlayerFacilityClasses[(trainerCard->trainerId % NUM_FEMALE_LINK_FACILITY_CLASSES) + NUM_MALE_LINK_FACILITY_CLASSES]; else - trainerCard->var_4F = gLinkPlayerFacilityClasses[trainerCard->trainerId % 8]; + trainerCard->facilityClass = gLinkPlayerFacilityClasses[trainerCard->trainerId % NUM_MALE_LINK_FACILITY_CLASSES]; } void CopyTrainerCardData(struct TrainerCard *dst, u16 *src, u8 gameVersion) @@ -785,8 +816,8 @@ static void SetDataFromTrainerCard(void) sData->hasHofResult = FALSE; sData->hasLinkResults = FALSE; sData->hasBattleTowerWins = FALSE; - sData->var_E = 0; - sData->var_F = 0; + sData->unused_E = FALSE; + sData->unused_F = FALSE; sData->hasTrades = FALSE; memset(sData->badgeCount, 0, sizeof(sData->badgeCount)); if (sData->trainerCard.hasPokedex) @@ -804,7 +835,7 @@ static void SetDataFromTrainerCard(void) if (sData->trainerCard.battleTowerWins || sData->trainerCard.battleTowerStraightWins) sData->hasBattleTowerWins++; - for (i = 0, badgeFlag = FLAG_BADGE01_GET; badgeFlag <= FLAG_BADGE08_GET; badgeFlag++, i++) + for (i = 0, badgeFlag = FLAG_BADGE01_GET; badgeFlag < FLAG_BADGE01_GET + NUM_BADGES; badgeFlag++, i++) { if (FlagGet(badgeFlag)) sData->badgeCount[i]++; @@ -830,14 +861,15 @@ static void HandleGpuRegs(void) EnableInterrupts(INTR_FLAG_VBLANK | INTR_FLAG_HBLANK); } +// Part of animating card flip static void sub_80C32EC(u16 arg0) { s8 quotient = (arg0 + 40) / 10; if (quotient <= 4) quotient = 0; - sData->var_528 = quotient; - SetGpuReg(REG_OFFSET_BLDY, sData->var_528); + sData->flipBlendY = quotient; + SetGpuReg(REG_OFFSET_BLDY, sData->flipBlendY); SetGpuReg(REG_OFFSET_WIN0V, (sData->var_7CA8 * 256) | (160 - sData->var_7CA8)); } @@ -855,7 +887,7 @@ static void ResetGpuRegs(void) static void InitBgsAndWindows(void) { ResetBgsAndClearDma3BusyFlags(0); - InitBgsFromTemplates(0, gUnknown_0856FAB4, ARRAY_COUNT(gUnknown_0856FAB4)); + InitBgsFromTemplates(0, sTrainerCardBgTemplates, ARRAY_COUNT(sTrainerCardBgTemplates)); ChangeBgX(0, 0, 0); ChangeBgY(0, 0, 0); ChangeBgX(1, 0, 0); @@ -864,9 +896,9 @@ static void InitBgsAndWindows(void) ChangeBgY(2, 0, 0); ChangeBgX(3, 0, 0); ChangeBgY(3, 0, 0); - InitWindows(gUnknown_0856FAC4); + InitWindows(sTrainerCardWindowTemplates); DeactivateAllTextPrinters(); - sub_81973A4(); + LoadMessageBoxAndBorderGfx(); } static void SetTrainerCardCb2(void) @@ -874,21 +906,21 @@ static void SetTrainerCardCb2(void) SetMainCallback2(CB2_TrainerCard); } -static void sub_80C3414(void) +static void SetUpTrainerCardTask(void) { ResetTasks(); ScanlineEffect_Stop(); - CreateTask(sub_80C2760, 0); - sub_80C4EE4(); + CreateTask(Task_TrainerCard, 0); + InitTrainerCardData(); SetDataFromTrainerCard(); } -static bool8 PrintAllOnCardPage1(void) +static bool8 PrintAllOnCardFront(void) { switch (sData->printState) { case 0: - PrintNameOnCard(); + PrintNameOnCardFront(); break; case 1: PrintIdOnCard(); @@ -913,18 +945,18 @@ static bool8 PrintAllOnCardPage1(void) return FALSE; } -static bool8 PrintStringsOnCardPage2(void) +static bool8 PrintAllOnCardBack(void) { switch (sData->printState) { case 0: - sub_80C3B50(); + PrintNameOnCardBack(); break; case 1: - PrintHofDebutStringOnCard(); + PrintHofDebutTimeOnCard(); break; case 2: - PrintWinsLossesStringOnCard(); + PrintLinkBattleResultsOnCard(); break; case 3: PrintTradesStringOnCard(); @@ -938,11 +970,11 @@ static bool8 PrintStringsOnCardPage2(void) PrintContestStringOnCard(); break; case 6: - TrainerCard_PrintPokemonIconsOnCard(); + PrintPokemonIconsOnCard(); PrintBattleFacilityStringOnCard(); break; case 7: - sub_80C42A4(); + PrintStickersOnCard(); break; default: sData->printState = 0; @@ -952,20 +984,20 @@ static bool8 PrintStringsOnCardPage2(void) return FALSE; } -static void PrintAllVariableNumsOnCardPage2(void) +static void BufferTextsVarsForCardPage2(void) { - PrintNameOnCard2(); - PrintHofTimeOnCard(); - PrintLinkResultsNumsOnCard(); - PrintTradesNumOnCard(); - PrintBerryCrushNumOnCard(); - PrintUnionNumOnCard(); - PrintPokeblocksNumOnCard(); - PrintContestNumOnCard(); - PrintBattleFacilityNumsOnCard(); + BufferNameForCardBack(); + BufferHofDebutTime(); + BufferLinkBattleResults(); + BufferNumTrades(); + BufferBerryCrushPoints(); + BufferUnionRoomStats(); + BufferLinkPokeblocksNum(); + BufferLinkContestNum(); + BufferBattleFacilityStats(); } -static void PrintNameOnCard(void) +static void PrintNameOnCardFront(void) { u8 buffer[32]; u8* txtPtr; @@ -1058,14 +1090,14 @@ static void PrintPokedexOnCard(void) } } -static const u8 *const gUnknown_0856FB40[] = {sTrainerCardTextColors, gUnknown_0856FB12}; +static const u8 *const sTimeColonTextColors[] = {sTrainerCardTextColors, sTimeColonInvisibleTextColors}; static void PrintTimeOnCard(void) { u16 hours; u16 minutes; s32 width; - u32 r7, r4, r10; + u32 x, y, totalWidth; if (!sData->isHoenn) AddTextPrinterParameterized3(1, 1, 20, 88, sTrainerCardTextColors, TEXT_SPEED_FF, gText_TrainerCardTime); @@ -1091,175 +1123,180 @@ static void PrintTimeOnCard(void) if (!sData->isHoenn) { - r7 = 144; - r4 = 88; + x = 144; + y = 88; } else { - r7 = 128; - r4 = 89; + x = 128; + y = 89; } - r10 = width + 30; - r7 -= r10; + totalWidth = width + 30; + x -= totalWidth; - FillWindowPixelRect(1, PIXEL_FILL(0), r7, r4, r10, 15); + FillWindowPixelRect(1, PIXEL_FILL(0), x, y, totalWidth, 15); ConvertIntToDecimalStringN(gStringVar4, hours, STR_CONV_MODE_RIGHT_ALIGN, 3); - AddTextPrinterParameterized3(1, 1, r7, r4, sTrainerCardTextColors, TEXT_SPEED_FF, gStringVar4); - r7 += 18; - AddTextPrinterParameterized3(1, 1, r7, r4, gUnknown_0856FB40[sData->var_7], TEXT_SPEED_FF, gText_Colon2); - r7 += width; + AddTextPrinterParameterized3(1, 1, x, y, sTrainerCardTextColors, TEXT_SPEED_FF, gStringVar4); + x += 18; + AddTextPrinterParameterized3(1, 1, x, y, sTimeColonTextColors[sData->timeColonInvisible], TEXT_SPEED_FF, gText_Colon2); + x += width; ConvertIntToDecimalStringN(gStringVar4, minutes, STR_CONV_MODE_LEADING_ZEROS, 2); - AddTextPrinterParameterized3(1, 1, r7, r4, sTrainerCardTextColors, TEXT_SPEED_FF, gStringVar4); + AddTextPrinterParameterized3(1, 1, x, y, sTrainerCardTextColors, TEXT_SPEED_FF, gStringVar4); } -static const u8 gUnknown_0856FB48[] = {0x71, 0x68}; -static const u8 gUnknown_0856FB4A[] = {0x81, 0x78}; - static void PrintProfilePhraseOnCard(void) { + static const u8 yOffsetsLine1[] = {113, 104}; + static const u8 yOffsetsLine2[] = {129, 120}; + if (sData->isLink) { - AddTextPrinterParameterized3(1, 1, 8, gUnknown_0856FB48[sData->isHoenn], sTrainerCardTextColors, TEXT_SPEED_FF, sData->var_19[0]); - AddTextPrinterParameterized3(1, 1, GetStringWidth(1, sData->var_19[0], 0) + 14, gUnknown_0856FB48[sData->isHoenn], sTrainerCardTextColors, TEXT_SPEED_FF, sData->var_19[1]); - AddTextPrinterParameterized3(1, 1, 8, gUnknown_0856FB4A[sData->isHoenn], sTrainerCardTextColors, TEXT_SPEED_FF, sData->var_19[2]); - AddTextPrinterParameterized3(1, 1, GetStringWidth(1, sData->var_19[2], 0) + 14, gUnknown_0856FB4A[sData->isHoenn], sTrainerCardTextColors, TEXT_SPEED_FF, sData->var_19[3]); + AddTextPrinterParameterized3(1, 1, 8, yOffsetsLine1[sData->isHoenn], sTrainerCardTextColors, TEXT_SPEED_FF, sData->easyChatProfile[0]); + AddTextPrinterParameterized3(1, 1, GetStringWidth(1, sData->easyChatProfile[0], 0) + 14, yOffsetsLine1[sData->isHoenn], sTrainerCardTextColors, TEXT_SPEED_FF, sData->easyChatProfile[1]); + AddTextPrinterParameterized3(1, 1, 8, yOffsetsLine2[sData->isHoenn], sTrainerCardTextColors, TEXT_SPEED_FF, sData->easyChatProfile[2]); + AddTextPrinterParameterized3(1, 1, GetStringWidth(1, sData->easyChatProfile[2], 0) + 14, yOffsetsLine2[sData->isHoenn], sTrainerCardTextColors, TEXT_SPEED_FF, sData->easyChatProfile[3]); } } -static void PrintNameOnCard2(void) +static void BufferNameForCardBack(void) { - StringCopy(sData->var_4D, sData->trainerCard.playerName); - ConvertInternationalString(sData->var_4D, sData->language); + StringCopy(sData->textPlayersCard, sData->trainerCard.playerName); + ConvertInternationalString(sData->textPlayersCard, sData->language); if (sData->cardType != CARD_TYPE_FRLG) { - StringCopy(gStringVar1, sData->var_4D); - StringExpandPlaceholders(sData->var_4D, gText_Var1sTrainerCard); + StringCopy(gStringVar1, sData->textPlayersCard); + StringExpandPlaceholders(sData->textPlayersCard, gText_Var1sTrainerCard); } } -static void sub_80C3B50(void) +static void PrintNameOnCardBack(void) { if (!sData->isHoenn) - AddTextPrinterParameterized3(1, 1, 136, 9, sTrainerCardTextColors, TEXT_SPEED_FF, sData->var_4D); + AddTextPrinterParameterized3(1, 1, 136, 9, sTrainerCardTextColors, TEXT_SPEED_FF, sData->textPlayersCard); else - AddTextPrinterParameterized3(1, 1, GetStringRightAlignXOffset(1, sData->var_4D, 216), 9, sTrainerCardTextColors, TEXT_SPEED_FF, sData->var_4D); + AddTextPrinterParameterized3(1, 1, GetStringRightAlignXOffset(1, sData->textPlayersCard, 216), 9, sTrainerCardTextColors, TEXT_SPEED_FF, sData->textPlayersCard); } -static const u8 gUnknown_0856FB4C[] = {0xfd, 0x02, 0xf0, 0xfd, 0x03, 0xf0, 0xfd, 0x04, 0xff}; +static const u8 sText_HofTime[] = _("{STR_VAR_1}:{STR_VAR_2}:{STR_VAR_3}"); -static void PrintHofTimeOnCard(void) +static void BufferHofDebutTime(void) { if (sData->hasHofResult) { ConvertIntToDecimalStringN(gStringVar1, sData->trainerCard.hofDebutHours, STR_CONV_MODE_RIGHT_ALIGN, 3); ConvertIntToDecimalStringN(gStringVar2, sData->trainerCard.hofDebutMinutes, STR_CONV_MODE_LEADING_ZEROS, 2); ConvertIntToDecimalStringN(gStringVar3, sData->trainerCard.hofDebutSeconds, STR_CONV_MODE_LEADING_ZEROS, 2); - StringExpandPlaceholders(sData->var_93, gUnknown_0856FB4C); + StringExpandPlaceholders(sData->textHofTime, sText_HofTime); } } -static const u8 gUnknown_0856FB55[] = {0x08, 0x10}; -static const u8 gUnknown_0856FB57[] = {0xd8, 0xd8}; - -static void PrintString(u8 top, const u8* str1, u8* str2, const u8* color) +static void PrintStatOnBackOfCard(u8 top, const u8* statName, u8* stat, const u8* color) { - AddTextPrinterParameterized3(1, 1, gUnknown_0856FB55[sData->isHoenn], top * 16 + 33, sTrainerCardTextColors, TEXT_SPEED_FF, str1); - AddTextPrinterParameterized3(1, 1, GetStringRightAlignXOffset(1, str2, gUnknown_0856FB57[sData->isHoenn]), top * 16 + 33, color, TEXT_SPEED_FF, str2); + static const u8 xOffsets[] = {8, 16}; + static const u8 widths[] = {216, 216}; + + AddTextPrinterParameterized3(1, 1, xOffsets[sData->isHoenn], top * 16 + 33, sTrainerCardTextColors, TEXT_SPEED_FF, statName); + AddTextPrinterParameterized3(1, 1, GetStringRightAlignXOffset(1, stat, widths[sData->isHoenn]), top * 16 + 33, color, TEXT_SPEED_FF, stat); } -static void PrintHofDebutStringOnCard(void) +static void PrintHofDebutTimeOnCard(void) { if (sData->hasHofResult) - PrintString(0, gText_HallOfFameDebut, sData->var_93, sTrainerCardStatColors); + PrintStatOnBackOfCard(0, gText_HallOfFameDebut, sData->textHofTime, sTrainerCardStatColors); } -static const u8 *const gUnknown_0856FB5C[] = {gText_LinkBattles, gText_LinkCableBattles, gText_LinkBattles}; +static const u8 *const sLinkBattleTexts[] = +{ + [CARD_TYPE_FRLG] = gText_LinkBattles, + [CARD_TYPE_RS] = gText_LinkCableBattles, + [CARD_TYPE_EMERALD] = gText_LinkBattles +}; -static void PrintLinkResultsNumsOnCard(void) +static void BufferLinkBattleResults(void) { if (sData->hasLinkResults) { - StringCopy(sData->var_D9, gUnknown_0856FB5C[sData->cardType]); - ConvertIntToDecimalStringN(sData->var_165, sData->trainerCard.linkBattleWins, STR_CONV_MODE_LEFT_ALIGN, 4); - ConvertIntToDecimalStringN(sData->var_1AB, sData->trainerCard.linkBattleLosses, STR_CONV_MODE_LEFT_ALIGN, 4); + StringCopy(sData->textLinkBattleType, sLinkBattleTexts[sData->cardType]); + ConvertIntToDecimalStringN(sData->textLinkBattleWins, sData->trainerCard.linkBattleWins, STR_CONV_MODE_LEFT_ALIGN, 4); + ConvertIntToDecimalStringN(sData->textLinkBattleLosses, sData->trainerCard.linkBattleLosses, STR_CONV_MODE_LEFT_ALIGN, 4); } } -static void PrintWinsLossesStringOnCard(void) +static void PrintLinkBattleResultsOnCard(void) { if (sData->hasLinkResults) { - StringCopy(gStringVar1, sData->var_165); - StringCopy(gStringVar2, sData->var_1AB); + StringCopy(gStringVar1, sData->textLinkBattleWins); + StringCopy(gStringVar2, sData->textLinkBattleLosses); StringExpandPlaceholders(gStringVar4, gText_WinsLosses); - PrintString(1, sData->var_D9, gStringVar4, sTrainerCardTextColors); + PrintStatOnBackOfCard(1, sData->textLinkBattleType, gStringVar4, sTrainerCardTextColors); } } -static void PrintTradesNumOnCard(void) +static void BufferNumTrades(void) { if (sData->hasTrades) - ConvertIntToDecimalStringN(sData->var_237, sData->trainerCard.pokemonTrades, STR_CONV_MODE_RIGHT_ALIGN, 5); + ConvertIntToDecimalStringN(sData->textNumTrades, sData->trainerCard.pokemonTrades, STR_CONV_MODE_RIGHT_ALIGN, 5); } static void PrintTradesStringOnCard(void) { if (sData->hasTrades) - PrintString(2, gText_PokemonTrades, sData->var_237, sTrainerCardStatColors); + PrintStatOnBackOfCard(2, gText_PokemonTrades, sData->textNumTrades, sTrainerCardStatColors); } -static void PrintBerryCrushNumOnCard(void) +static void BufferBerryCrushPoints(void) { if (sData->cardType == CARD_TYPE_FRLG && sData->trainerCard.berryCrushPoints) - ConvertIntToDecimalStringN(sData->var_2C3, sData->trainerCard.berryCrushPoints, STR_CONV_MODE_RIGHT_ALIGN, 5); + ConvertIntToDecimalStringN(sData->textBerryCrushPts, sData->trainerCard.berryCrushPoints, STR_CONV_MODE_RIGHT_ALIGN, 5); } static void PrintBerryCrushStringOnCard(void) { if (sData->cardType == CARD_TYPE_FRLG && sData->trainerCard.berryCrushPoints) - PrintString(4, gText_BerryCrush, sData->var_2C3, sTrainerCardStatColors); + PrintStatOnBackOfCard(4, gText_BerryCrush, sData->textBerryCrushPts, sTrainerCardStatColors); } -static void PrintUnionNumOnCard(void) +static void BufferUnionRoomStats(void) { if (sData->cardType == CARD_TYPE_FRLG && sData->trainerCard.unionRoomNum) - ConvertIntToDecimalStringN(sData->var_34F, sData->trainerCard.unionRoomNum, STR_CONV_MODE_RIGHT_ALIGN, 5); + ConvertIntToDecimalStringN(sData->textUnionRoomStats, sData->trainerCard.unionRoomNum, STR_CONV_MODE_RIGHT_ALIGN, 5); } static void PrintUnionStringOnCard(void) { if (sData->cardType == CARD_TYPE_FRLG && sData->trainerCard.unionRoomNum) - PrintString(3, gText_UnionTradesAndBattles, sData->var_34F, sTrainerCardStatColors); + PrintStatOnBackOfCard(3, gText_UnionTradesAndBattles, sData->textUnionRoomStats, sTrainerCardStatColors); } -static void PrintPokeblocksNumOnCard(void) +static void BufferLinkPokeblocksNum(void) { if (sData->cardType != CARD_TYPE_FRLG && sData->trainerCard.pokeblocksWithFriends) { ConvertIntToDecimalStringN(gStringVar1, sData->trainerCard.pokeblocksWithFriends, STR_CONV_MODE_RIGHT_ALIGN, 5); - StringExpandPlaceholders(sData->var_395, gText_Var1DarkGreyShadowLightGrey); + StringExpandPlaceholders(sData->textNumLinkPokeblocks, gText_NumPokeblocks); } } static void PrintPokeblockStringOnCard(void) { if (sData->cardType != CARD_TYPE_FRLG && sData->trainerCard.pokeblocksWithFriends) - PrintString(3, gText_PokeblocksWithFriends, sData->var_395, sTrainerCardStatColors); + PrintStatOnBackOfCard(3, gText_PokeblocksWithFriends, sData->textNumLinkPokeblocks, sTrainerCardStatColors); } -static void PrintContestNumOnCard(void) +static void BufferLinkContestNum(void) { if (sData->cardType != CARD_TYPE_FRLG && sData->trainerCard.contestsWithFriends) - ConvertIntToDecimalStringN(sData->var_3DB, sData->trainerCard.contestsWithFriends, STR_CONV_MODE_RIGHT_ALIGN, 5); + ConvertIntToDecimalStringN(sData->textNumLinkContests, sData->trainerCard.contestsWithFriends, STR_CONV_MODE_RIGHT_ALIGN, 5); } static void PrintContestStringOnCard(void) { if (sData->cardType != CARD_TYPE_FRLG && sData->trainerCard.contestsWithFriends) - PrintString(4, gText_WonContestsWFriends, sData->var_3DB, sTrainerCardStatColors); + PrintStatOnBackOfCard(4, gText_WonContestsWFriends, sData->textNumLinkContests, sTrainerCardStatColors); } -static void PrintBattleFacilityNumsOnCard(void) +static void BufferBattleFacilityStats(void) { switch (sData->cardType) { @@ -1268,14 +1305,14 @@ static void PrintBattleFacilityNumsOnCard(void) { ConvertIntToDecimalStringN(gStringVar1, sData->trainerCard.battleTowerWins, STR_CONV_MODE_RIGHT_ALIGN, 4); ConvertIntToDecimalStringN(gStringVar2, sData->trainerCard.battleTowerStraightWins, STR_CONV_MODE_RIGHT_ALIGN, 4); - StringExpandPlaceholders(sData->var_421, gText_WSlashStraightSlash); + StringExpandPlaceholders(sData->textBattleFacilityStat, gText_WinsStraight); } break; case CARD_TYPE_EMERALD: if (sData->trainerCard.frontierBP) { ConvertIntToDecimalStringN(gStringVar1, sData->trainerCard.frontierBP, STR_CONV_MODE_RIGHT_ALIGN, 5); - StringExpandPlaceholders(sData->var_421, gText_Var1DarkLightGreyBP); + StringExpandPlaceholders(sData->textBattleFacilityStat, gText_NumBP); } break; case CARD_TYPE_FRLG: @@ -1289,90 +1326,90 @@ static void PrintBattleFacilityStringOnCard(void) { case CARD_TYPE_RS: if (sData->hasBattleTowerWins) - PrintString(5, gText_BattleTower, sData->var_421, sTrainerCardTextColors); + PrintStatOnBackOfCard(5, gText_BattleTower, sData->textBattleFacilityStat, sTrainerCardTextColors); break; case CARD_TYPE_EMERALD: if (sData->trainerCard.frontierBP) - PrintString(5, gText_BattlePtsWon, sData->var_421, sTrainerCardStatColors); + PrintStatOnBackOfCard(5, gText_BattlePtsWon, sData->textBattleFacilityStat, sTrainerCardStatColors); break; case CARD_TYPE_FRLG: break; } } -static void TrainerCard_PrintPokemonIconsOnCard(void) +static void PrintPokemonIconsOnCard(void) { u8 i; - u8 buffer[] = {0x05, 0x06, 0x07, 0x08, 0x09, 0x0a}; - u8 buffer2[] = {0x00, 0x04, 0x08, 0x0c, 0x10, 0x14}; + u8 paletteSlots[PARTY_SIZE] = {5, 6, 7, 8, 9, 10}; + u8 xOffsets[PARTY_SIZE] = {0, 4, 8, 12, 16, 20}; if (sData->cardType == CARD_TYPE_FRLG) { - for (i = 0; i < 6; i++) + for (i = 0; i < PARTY_SIZE; i++) { if (sData->trainerCard.monSpecies[i]) { u8 monSpecies = GetMonIconPaletteIndexFromSpecies(sData->trainerCard.monSpecies[i]); - WriteSequenceToBgTilemapBuffer(3, 16 * i + 224, buffer2[i] + 3, 15, 4, 4, buffer[monSpecies], 1); + WriteSequenceToBgTilemapBuffer(3, 16 * i + 224, xOffsets[i] + 3, 15, 4, 4, paletteSlots[monSpecies], 1); } } } } -static void sub_80C41D8(void) +static void LoadMonIconGfx(void) { u8 i; - CpuSet(gMonIconPalettes, sData->var_468, 0x60); - switch (sData->trainerCard.var_4E) + CpuSet(gMonIconPalettes, sData->monIconPal, 0x60); + switch (sData->trainerCard.monIconTint) { - case 0: + case MON_ICON_TINT_NORMAL: break; - case 1: - TintPalette_CustomTone(sData->var_468, 96, 0, 0, 0); + case MON_ICON_TINT_BLACK: + TintPalette_CustomTone(sData->monIconPal, 96, 0, 0, 0); break; - case 2: - TintPalette_CustomTone(sData->var_468, 96, 500, 330, 310); + case MON_ICON_TINT_PINK: + TintPalette_CustomTone(sData->monIconPal, 96, 500, 330, 310); break; - case 3: - TintPalette_SepiaTone(sData->var_468, 96); + case MON_ICON_TINT_SEPIA: + TintPalette_SepiaTone(sData->monIconPal, 96); break; } - LoadPalette(sData->var_468, 80, 192); + LoadPalette(sData->monIconPal, 80, 192); - for (i = 0; i < 6; i++) + for (i = 0; i < PARTY_SIZE; i++) { if (sData->trainerCard.monSpecies[i]) LoadBgTiles(3, GetMonIconTiles(sData->trainerCard.monSpecies[i], 0), 512, 16 * i + 32); } } -static void sub_80C42A4(void) +static void PrintStickersOnCard(void) { u8 i; - u8 buffer[4] = {0x0b, 0x0c, 0x0d, 0x0e}; + u8 paletteSlots[4] = {11, 12, 13, 14}; - if (sData->cardType == CARD_TYPE_FRLG && sData->trainerCard.var_4C == 1) + if (sData->cardType == CARD_TYPE_FRLG && sData->trainerCard.shouldDrawStickers == TRUE) { - for (i = 0; i < 3; i++) + for (i = 0; i < TRAINER_CARD_STICKER_TYPES; i++) { - u8 var_50 = sData->trainerCard.var_50[i]; - if (sData->trainerCard.var_50[i]) - WriteSequenceToBgTilemapBuffer(3, i * 4 + 320, i * 3 + 2, 2, 2, 2, buffer[var_50 - 1], 1); + u8 sticker = sData->trainerCard.stickers[i]; + if (sData->trainerCard.stickers[i]) + WriteSequenceToBgTilemapBuffer(3, i * 4 + 320, i * 3 + 2, 2, 2, 2, paletteSlots[sticker - 1], 1); } } } -static void sub_80C4330(void) +static void LoadStickerGfx(void) { - LoadPalette(gUnknown_0856F54C, 176, 32); - LoadPalette(gUnknown_0856F56C, 192, 32); - LoadPalette(gUnknown_0856F58C, 208, 32); - LoadPalette(gUnknown_0856F5AC, 224, 32); - LoadBgTiles(3, sData->var_17A8, 1024, 128); + LoadPalette(sTrainerCardSticker1_Pal, 176, 32); + LoadPalette(sTrainerCardSticker2_Pal, 192, 32); + LoadPalette(sTrainerCardSticker3_Pal, 208, 32); + LoadPalette(sTrainerCardSticker4_Pal, 224, 32); + LoadBgTiles(3, sData->stickerTiles, 1024, 128); } -static void sub_80C438C(u8 windowId) +static void DrawTrainerCardWindow(u8 windowId) { PutWindowTilemap(windowId); CopyWindowToVram(windowId, 3); @@ -1383,31 +1420,31 @@ static u8 SetCardBgsAndPals(void) switch (sData->bgPalLoadState) { case 0: - LoadBgTiles(3, sData->var_13A8, 1024, 0); + LoadBgTiles(3, sData->badgeTiles, ARRAY_COUNT(sData->badgeTiles), 0); break; case 1: - LoadBgTiles(0, sData->var_19A8, 6144, 0); + LoadBgTiles(0, sData->cardTiles, 0x1800, 0); break; case 2: if (sData->cardType != CARD_TYPE_FRLG) { - LoadPalette(gEmeraldTrainerCardStarPals[sData->trainerCard.stars], 0, 96); - LoadPalette(sEmeraldTrainerCardBadges_Pal, 48, 32); - if (sData->trainerCard.gender) - LoadPalette(sEmeraldTrainerCardFemaleBackground_Pal, 16, 32); + LoadPalette(sHoennTrainerCardStarPals[sData->trainerCard.stars], 0, 96); + LoadPalette(sHoennTrainerCardBadges_Pal, 48, 32); + if (sData->trainerCard.gender != MALE) + LoadPalette(sHoennTrainerCardFemaleBg_Pal, 16, 32); } else { - LoadPalette(gFireRedTrainerCardStarPals[sData->trainerCard.stars], 0, 96); - LoadPalette(sFireRedTrainerCardBadges_Pal, 48, 32); - if (sData->trainerCard.gender) - LoadPalette(sFireRedTrainerCardFemaleBackground_Pal, 16, 32); + LoadPalette(sKantoTrainerCardStarPals[sData->trainerCard.stars], 0, 96); + LoadPalette(sKantoTrainerCardBadges_Pal, 48, 32); + if (sData->trainerCard.gender != MALE) + LoadPalette(sKantoTrainerCardFemaleBg_Pal, 16, 32); } - LoadPalette(gUnknown_0856F52C, 64, 32); + LoadPalette(sTrainerCardGold_Pal, 64, 32); break; case 3: - SetBgTilemapBuffer(0, sData->var_3CA8); - SetBgTilemapBuffer(2, sData->var_5CA8); + SetBgTilemapBuffer(0, sData->cardTilemapBuffer); + SetBgTilemapBuffer(2, sData->bgTilemapBuffer); break; case 4: FillBgTilemapBufferRect_Palette0(0, 0, 0, 0, 32, 32); @@ -1420,10 +1457,10 @@ static u8 SetCardBgsAndPals(void) return 0; } -static void sub_80C4550(u16 *ptr) +static void DrawCardScreenBackground(u16 *ptr) { s16 i, j; - u16 *dst = sData->var_5CA8; + u16 *dst = sData->bgTilemapBuffer; for (i = 0; i < 20; i++) { @@ -1438,10 +1475,10 @@ static void sub_80C4550(u16 *ptr) CopyBgTilemapBufferToVram(2); } -static void sub_80C45C0(u16* ptr) +static void DrawCardFrontOrBack(u16* ptr) { s16 i, j; - u16 *dst = sData->var_3CA8; + u16 *dst = sData->cardTilemapBuffer; for (i = 0; i < 20; i++) { @@ -1456,19 +1493,19 @@ static void sub_80C45C0(u16* ptr) CopyBgTilemapBufferToVram(0); } -static const u8 gUnknown_0856FB78[] = {7, 7}; - -static void TrainerCard_PrintStarsAndBadgesOnCard(void) +static void DrawStarsAndBadgesOnCard(void) { + static const u8 yOffsets[] = {7, 7}; + s16 i, x; u16 tileNum = 192; u8 palNum = 3; - FillBgTilemapBufferRect(3, 143, 15, gUnknown_0856FB78[sData->isHoenn], sData->trainerCard.stars, 1, 4); + FillBgTilemapBufferRect(3, 143, 15, yOffsets[sData->isHoenn], sData->trainerCard.stars, 1, 4); if (!sData->isLink) { x = 4; - for (i = 0; i < 8; i++, tileNum += 2, x += 3) + for (i = 0; i < NUM_BADGES; i++, tileNum += 2, x += 3) { if (sData->badgeCount[i]) { @@ -1482,7 +1519,7 @@ static void TrainerCard_PrintStarsAndBadgesOnCard(void) CopyBgTilemapBufferToVram(3); } -static void sub_80C474C(void) +static void DrawCardBackStats(void) { if (sData->cardType == CARD_TYPE_FRLG) { @@ -1525,13 +1562,13 @@ static void sub_80C474C(void) CopyBgTilemapBufferToVram(3); } -static void sub_80C48C8(void) +static void BlinkTimeColon(void) { - if (++sData->var_6 > 60) + if (++sData->timeColonBlinkTimer > 60) { - sData->var_6 = 0; - sData->var_7 ^= 1; - sData->var_529 = 1; + sData->timeColonBlinkTimer = 0; + sData->timeColonInvisible ^= 1; + sData->timeColonNeedDraw = TRUE; } } @@ -1541,28 +1578,30 @@ u8 GetTrainerCardStars(u8 cardId) return trainerCards[cardId].stars; } -static void sub_80C4918(void) +#define tFlipState data[0] + +static void FlipTrainerCard(void) { - u8 taskId = CreateTask(sub_80C4960, 0); - sub_80C4960(taskId); + u8 taskId = CreateTask(Task_DoCardFlipTask, 0); + Task_DoCardFlipTask(taskId); SetHBlankCallback(HblankCb_TrainerCard); } -static bool8 sub_80C4940(void) +static bool8 IsCardFlipTaskActive(void) { - if (FindTaskIdByFunc(sub_80C4960) == 0xFF) + if (FindTaskIdByFunc(Task_DoCardFlipTask) == 0xFF) return TRUE; else return FALSE; } -static void sub_80C4960(u8 taskId) +static void Task_DoCardFlipTask(u8 taskId) { - while(gUnknown_0856FB28[gTasks[taskId].data[0]](&gTasks[taskId])) + while(sTrainerCardFlipTasks[gTasks[taskId].tFlipState](&gTasks[taskId])) ; } -static bool8 sub_80C4998(struct Task* task) +static bool8 Task_BeginCardFlip(struct Task* task) { u32 i; @@ -1572,11 +1611,11 @@ static bool8 sub_80C4998(struct Task* task) ScanlineEffect_Clear(); for (i = 0; i < 160; i++) gScanlineEffectRegBuffers[1][i] = 0; - task->data[0]++; + task->tFlipState++; return FALSE; } -static bool8 sub_80C49D8(struct Task* task) +static bool8 Task_AnimateCardFlipDown(struct Task* task) { u32 r4, r5, r10, r7, r6, var_24, r9, var; s16 i; @@ -1617,12 +1656,12 @@ static bool8 sub_80C49D8(struct Task* task) sData->allowDMACopy = TRUE; if (task->data[1] >= 77) - task->data[0]++; + task->tFlipState++; return FALSE; } -static bool8 sub_80C4B08(struct Task* task) +static bool8 Task_DrawFlippedCardSide(struct Task* task) { sData->allowDMACopy = FALSE; if (sub_8087598() == TRUE) @@ -1630,71 +1669,73 @@ static bool8 sub_80C4B08(struct Task* task) do { - switch (sData->var_4) + switch (sData->flipDrawState) { case 0: FillWindowPixelBuffer(1, PIXEL_FILL(0)); FillBgTilemapBufferRect_Palette0(3, 0, 0, 0, 0x20, 0x20); break; case 1: - if (!sData->var_8) + if (!sData->onBack) { - if (!PrintStringsOnCardPage2()) + if (!PrintAllOnCardBack()) return FALSE; } else { - if (!PrintAllOnCardPage1()) + if (!PrintAllOnCardFront()) return FALSE; } break; case 2: - if (!sData->var_8) - sub_80C45C0(sData->var_A48); + if (!sData->onBack) + DrawCardFrontOrBack(sData->backTilemap); else - sub_80C438C(1); + DrawTrainerCardWindow(1); break; case 3: - if (!sData->var_8) - sub_80C474C(); + if (!sData->onBack) + DrawCardBackStats(); else FillWindowPixelBuffer(2, PIXEL_FILL(0)); break; case 4: - if (sData->var_8) - sub_80C4FF0(); + if (sData->onBack) + CreateTrainerCardTrainerPic(); break; default: - task->data[0]++; + task->tFlipState++; sData->allowDMACopy = TRUE; - sData->var_4 = 0; + sData->flipDrawState = 0; return FALSE; } - sData->var_4++; + sData->flipDrawState++; } while (gReceivedRemoteLinkPlayers == 0); return FALSE; } -static bool8 sub_80C4C1C(struct Task* task) +static bool8 Task_SetCardFlipped(struct Task* task) { sData->allowDMACopy = FALSE; - if (sData->var_8) + + // If on back of card, draw front of card because its being flipped + if (sData->onBack) { - sub_80C438C(2); - sub_80C4550(sData->var_EF8); - sub_80C45C0(sData->var_598); - TrainerCard_PrintStarsAndBadgesOnCard(); + DrawTrainerCardWindow(2); + DrawCardScreenBackground(sData->bgTilemap); + DrawCardFrontOrBack(sData->frontTilemap); + DrawStarsAndBadgesOnCard(); } - sub_80C438C(1); - sData->var_8 ^= 1; - task->data[0]++; + DrawTrainerCardWindow(1); + sData->onBack ^= 1; + task->tFlipState++; sData->allowDMACopy = TRUE; PlaySE(SE_RG_CARD2); return FALSE; } -static bool8 sub_80C4C84(struct Task* task) +static bool8 Task_AnimateCardFlipUp(struct Task* task) { u32 r4, r5, r10, r7, r6, var_24, r9, var; s16 i; @@ -1735,17 +1776,17 @@ static bool8 sub_80C4C84(struct Task* task) sData->allowDMACopy = TRUE; if (task->data[1] <= 0) - task->data[0]++; + task->tFlipState++; return FALSE; } -static bool8 sub_80C4DB0(struct Task *task) +static bool8 Task_EndCardFlip(struct Task *task) { ShowBg(1); ShowBg(3); SetHBlankCallback(NULL); - DestroyTask(FindTaskIdByFunc(sub_80C4960)); + DestroyTask(FindTaskIdByFunc(Task_DoCardFlipTask)); return FALSE; } @@ -1754,9 +1795,9 @@ void ShowPlayerTrainerCard(void (*callback)(void)) sData = AllocZeroed(sizeof(*sData)); sData->callback2 = callback; if (callback == CB2_ReshowFrontierPass) - sData->var_52C = 0x7FFF; + sData->blendColor = RGB_WHITE; else - sData->var_52C = 0; + sData->blendColor = RGB_BLACK; if (InUnionRoom() == TRUE) sData->isLink = TRUE; @@ -1778,18 +1819,18 @@ void ShowTrainerCardInLink(u8 cardId, void (*callback)(void)) SetMainCallback2(CB2_InitTrainerCard); } -static void sub_80C4EE4(void) +static void InitTrainerCardData(void) { u8 i; - sData->var_0 = 0; - sData->var_6 = gSaveBlock2Ptr->playTimeVBlanks; - sData->var_7 = 0; - sData->var_8 = 0; - sData->var_528 = 0; + sData->mainState = 0; + sData->timeColonBlinkTimer = gSaveBlock2Ptr->playTimeVBlanks; + sData->timeColonInvisible = FALSE; + sData->onBack = FALSE; + sData->flipBlendY = 0; sData->cardType = GetSetCardType(); - for (i = 0; i < 4; i++) - CopyEasyChatWord(sData->var_19[i], sData->trainerCard.var_28[i]); + for (i = 0; i < TRAINER_CARD_PROFILE_LENGTH; i++) + CopyEasyChatWord(sData->easyChatProfile[i], sData->trainerCard.easyChatProfile[i]); } static u8 GetSetCardType(void) @@ -1833,23 +1874,23 @@ static u8 VersionToCardType(u8 version) return CARD_TYPE_RS; } -static void sub_80C4FF0(void) +static void CreateTrainerCardTrainerPic(void) { if (InUnionRoom() == TRUE && gReceivedRemoteLinkPlayers == 1) { - sub_818D938(FacilityClassToPicIndex(sData->trainerCard.var_4F), + CreateTrainerCardTrainerPicSprite(FacilityClassToPicIndex(sData->trainerCard.facilityClass), TRUE, - gUnknown_0856FB18[sData->isHoenn][sData->trainerCard.gender][0], - gUnknown_0856FB18[sData->isHoenn][sData->trainerCard.gender][1], + sTrainerPicOffset[sData->isHoenn][sData->trainerCard.gender][0], + sTrainerPicOffset[sData->isHoenn][sData->trainerCard.gender][1], 8, 2); } else { - sub_818D938(FacilityClassToPicIndex(gUnknown_0856FB20[sData->cardType][sData->trainerCard.gender]), + CreateTrainerCardTrainerPicSprite(FacilityClassToPicIndex(sTrainerPicFacilityClass[sData->cardType][sData->trainerCard.gender]), TRUE, - gUnknown_0856FB18[sData->isHoenn][sData->trainerCard.gender][0], - gUnknown_0856FB18[sData->isHoenn][sData->trainerCard.gender][1], + sTrainerPicOffset[sData->isHoenn][sData->trainerCard.gender][0], + sTrainerPicOffset[sData->isHoenn][sData->trainerCard.gender][1], 8, 2); } diff --git a/src/trainer_pokemon_sprites.c b/src/trainer_pokemon_sprites.c index 99a3fd4c5..d2cb634f0 100644 --- a/src/trainer_pokemon_sprites.c +++ b/src/trainer_pokemon_sprites.c @@ -331,7 +331,7 @@ static u16 sub_818D65C(u16 species, u32 otId, u32 personality, bool8 isFrontPic, return 0; } -static u16 sub_818D6CC(u16 species, u32 otId, u32 personality, bool8 isFrontPic, u16 destX, u16 destY, u8 paletteSlot, u8 windowId, bool8 isTrainer) +static u16 CreateTrainerCardSprite(u16 species, u32 otId, u32 personality, bool8 isFrontPic, u16 destX, u16 destY, u8 paletteSlot, u8 windowId, bool8 isTrainer) { u8 *framePics; @@ -366,9 +366,10 @@ u16 sub_818D834(u16 species, u32 otId, u32 personality, bool8 isFrontPic, u8 pal return sub_818D65C(species, otId, personality, isFrontPic, paletteSlot, windowId, FALSE); } -u16 sub_818D864(u16 species, u32 otId, u32 personality, bool8 isFrontPic, u16 destX, u16 destY, u8 paletteSlot, u8 windowId) +// Unused, FRLG only +u16 CreateTrainerCardMonIconSprite(u16 species, u32 otId, u32 personality, bool8 isFrontPic, u16 destX, u16 destY, u8 paletteSlot, u8 windowId) { - return sub_818D6CC(species, otId, personality, isFrontPic, destX, destY, paletteSlot, windowId, FALSE); + return CreateTrainerCardSprite(species, otId, personality, isFrontPic, destX, destY, paletteSlot, windowId, FALSE); } u16 CreateTrainerPicSprite(u16 species, bool8 isFrontPic, s16 x, s16 y, u8 paletteSlot, u16 paletteTag) @@ -386,9 +387,9 @@ u16 sub_818D904(u16 species, bool8 isFrontPic, u8 paletteSlot, u8 windowId) return sub_818D65C(species, 0, 0, isFrontPic, paletteSlot, windowId, TRUE); } -u16 sub_818D938(u16 species, bool8 isFrontPic, u16 destX, u16 destY, u8 paletteSlot, u8 windowId) +u16 CreateTrainerCardTrainerPicSprite(u16 species, bool8 isFrontPic, u16 destX, u16 destY, u8 paletteSlot, u8 windowId) { - return sub_818D6CC(species, 0, 0, isFrontPic, destX, destY, paletteSlot, windowId, TRUE); + return CreateTrainerCardSprite(species, 0, 0, isFrontPic, destX, destY, paletteSlot, windowId, TRUE); } u16 PlayerGenderToFrontTrainerPicId_Debug(u8 gender, bool8 getClass) diff --git a/src/tv.c b/src/tv.c index 2e9254253..ab726548d 100644 --- a/src/tv.c +++ b/src/tv.c @@ -1943,7 +1943,7 @@ void sub_80EDB44(void) show = &gSaveBlock1Ptr->tvShows[sCurTVShowSlot]; show->rivalTrainer.kind = TVSHOW_TODAYS_RIVAL_TRAINER; show->rivalTrainer.active = FALSE; - for (i = FLAG_BADGE01_GET, nBadges = 0; i < FLAG_BADGE01_GET + 8; i ++) + for (i = FLAG_BADGE01_GET, nBadges = 0; i < FLAG_BADGE01_GET + NUM_BADGES; i ++) { if (FlagGet(i)) { diff --git a/src/union_room.c b/src/union_room.c index 6098ce349..fbc9ff3f9 100644 --- a/src/union_room.c +++ b/src/union_room.c @@ -3376,7 +3376,7 @@ u8 sub_8016FF0(struct UnkStruct_Main4 * a0, u32 a1) bool32 sub_8017020(const u8 *src) { - sub_81973A4(); + LoadMessageBoxAndBorderGfx(); DrawDialogueFrame(0, 1); StringExpandPlaceholders(gStringVar4, src); AddTextPrinterWithCustomSpeedForMessage(FALSE, 1); @@ -3400,7 +3400,7 @@ bool8 PrintOnTextbox(u8 *textState, const u8 *str) switch (*textState) { case 0: - sub_81973A4(); + LoadMessageBoxAndBorderGfx(); DrawDialogueFrame(0, 1); StringExpandPlaceholders(gStringVar4, str); AddTextPrinterForMessage_2(TRUE); @@ -4316,9 +4316,9 @@ void sub_8018220(u8 *unused, struct UnkStruct_URoom *arg1, bool8 arg2) ConvertIntToDecimalStringN(arg1->field_C0[2], trainerCard->pokemonTrades, STR_CONV_MODE_LEFT_ALIGN, 5); DynamicPlaceholderTextUtil_SetPlaceholderPtr(3, arg1->field_C0[2]); - for (i = 0; i < 4; i++) + for (i = 0; i < TRAINER_CARD_PROFILE_LENGTH; i++) { - CopyEasyChatWord(arg1->field_C0[i + 3], trainerCard->var_28[i]); + CopyEasyChatWord(arg1->field_C0[i + 3], trainerCard->easyChatProfile[i]); DynamicPlaceholderTextUtil_SetPlaceholderPtr(i + 4, arg1->field_C0[i + 3]); } -- cgit v1.2.3 From 689acd3613cdd1fa4da24d28e211a228ce7f9c23 Mon Sep 17 00:00:00 2001 From: GriffinR Date: Sun, 9 Feb 2020 14:17:31 -0500 Subject: Move slot machine data to src --- src/data/graphics/slot_machine.h | 3 + src/graphics.c | 4 - src/slot_machine.c | 2375 ++++++++++++++++++++++++++++++++++++-- 3 files changed, 2266 insertions(+), 116 deletions(-) (limited to 'src') diff --git a/src/data/graphics/slot_machine.h b/src/data/graphics/slot_machine.h index 3f351f7ba..a94f2b622 100644 --- a/src/data/graphics/slot_machine.h +++ b/src/data/graphics/slot_machine.h @@ -58,3 +58,6 @@ const u8 gSlotMachineReelTimeExplosion1[] = INCBIN_U8("graphics/slot_machine/ree const u8 gSlotMachineReelTimeShadow[] = INCBIN_U8("graphics/slot_machine/shadow.4bpp"); const u8 gSlotMachineReelTimePikaAura[] = INCBIN_U8("graphics/slot_machine/pika_aura.4bpp"); + +const u8 gUnknown_08DD19F8[] = INCBIN_U8("graphics/unknown/unknown_DD19F8.bin"); +const u8 gUnknown_08DD1A18[] = INCBIN_U8("graphics/unknown/unknown_DD1A18.4bpp"); diff --git a/src/graphics.c b/src/graphics.c index d6f590158..f6a064d57 100644 --- a/src/graphics.c +++ b/src/graphics.c @@ -1418,10 +1418,6 @@ const u16 gUsePokeblockNatureWin_Pal[] = INCBIN_U16("graphics/pokeblock/use_scre #include "data/graphics/slot_machine.h" -const u16 gUnknown_08DD19F8[] = INCBIN_U16("graphics/unknown/unknown_DD19F8.bin"); - -const u8 gUnknown_08DD1A18[] = INCBIN_U8("graphics/unknown/unknown_DD1A18.4bpp"); - // trainer card const u16 gHoennTrainerCard0Star_Pal[] = INCBIN_U16("graphics/trainer_card/0star.gbapal"); diff --git a/src/slot_machine.c b/src/slot_machine.c index db1291ceb..8f117431a 100644 --- a/src/slot_machine.c +++ b/src/slot_machine.c @@ -319,6 +319,35 @@ static void sub_812F958(void); static void sub_812F968(void); static void LoadSlotMachineWheelOverlay(void); static u8 sub_8105BB4(u8 templateIdx, u8 cbAndCoordsIdx, s16 a2); +static void sub_8105C64(struct Sprite *sprite); +static void sub_8105F54(struct Sprite *sprite); +static void sub_8105F9C(struct Sprite *sprite); +static void sub_8105EB4(struct Sprite *sprite); +static void sub_8105C6C(struct Sprite *sprite); +static void sub_8105CF0(struct Sprite *sprite); +static void sub_8105D08(struct Sprite *sprite); +static void sub_8105D20(struct Sprite *sprite); +static void sub_8105D3C(struct Sprite *sprite); +static void sub_8105DA4(struct Sprite *sprite); +static void sub_8105E08(struct Sprite *sprite); +static void sub_8106058(struct Sprite *sprite); +static void sub_81060FC(struct Sprite *sprite); +static void sub_81061C8(struct Sprite *sprite); +static void sub_8106230(struct Sprite *sprite); +static void sub_810639C(void); +static void sub_8106364(void); +static void sub_8106370(void); +static void nullsub_70(void); +static void sub_8104F18(struct Sprite *sprite); +static void sub_810506C(struct Sprite *sprite); +static void sub_8105170(struct Sprite *sprite); +static void sub_810535C(struct Sprite *sprite); +static void sub_810562C(struct Sprite *sprite); +static void sub_8105784(struct Sprite *sprite); +static void sub_8105894(struct Sprite *sprite); +static void sub_810594C(struct Sprite *sprite); +static void sub_8105A38(struct Sprite *sprite); +static void sub_8105B70(struct Sprite *sprite); // Ewram variables static EWRAM_DATA u16 *sUnknown_0203AAC8 = NULL; @@ -354,56 +383,73 @@ static EWRAM_DATA struct SlotMachineEwramStruct *sSlotMachine = NULL; static struct SpriteFrameImage *gUnknown_03001188[26]; // Const rom data. -extern const struct UnkStruct1 *const gUnknown_083ED048[]; -extern const u16 gPalette_83EDE24[]; -extern const u8 gLuckyRoundProbabilities[][3]; -extern const u8 gBiasTags[]; -extern const u16 gLuckyFlagSettings_Top3[]; -extern const u16 gLuckyFlagSettings_NotTop3[]; -extern const s16 gUnknown_083ECE7E[][2]; -extern const SpriteCallback gUnknown_083ECF0C[]; -extern const struct SpriteTemplate *const gUnknown_083EDB5C[]; -extern const struct SubspriteTable *const gUnknown_083EDBC4[]; -extern const struct SpriteTemplate gSpriteTemplate_83ED6CC; -extern const struct SpriteTemplate gSpriteTemplate_83ED564; -extern const struct SpriteTemplate gSpriteTemplate_83ED54C; -extern const struct SpriteTemplate gSpriteTemplate_83ED534; -extern const u8 gUnknown_083ECC58[2]; -extern const struct SpriteTemplate gSpriteTemplate_83ED51C; -extern const u16 gProbabilityTable_SkipToReeltimeAction14[]; -extern const u16 *const gUnknown_083EDE10[]; -extern const u16 gReelIncrementTable[][2]; -extern const u16 gReelTimeBonusIncrementTable[]; -extern const u16 gSlotMatchFlags[]; -extern const u16 gSlotPayouts[]; -extern const u8 *const gUnknown_083EDCE4; -extern const u8 *const gUnknown_083EDCDC; -extern const u32 gReelTimeGfx[]; -extern const struct SpriteSheet gSlotMachineSpriteSheets[]; -extern const struct SpritePalette gSlotMachineSpritePalettes[]; -extern const u16 *const gUnknown_083EDE20; -extern const s16 gInitialReelPositions[][2]; -extern const struct BgTemplate gUnknown_085A7424[4]; -extern const struct WindowTemplate gUnknown_085A7434[]; -extern const u8 gLuckyFlagProbabilities_Top3[][6]; -extern const u8 gLuckyFlagProbabilities_NotTop3[][6]; -extern const u8 gReeltimeProbabilities_UnluckyGame[][17]; -extern const u8 gReelTimeProbabilities_LuckyGame[][17]; -extern const u8 gSym2Match[]; -extern const u8 gReelTimeTags[]; -extern const u8 gReelSymbols[][REEL_NUM_TAGS]; -extern const u16 *const gUnknown_083EDD08[]; -extern const u16 *const gUnknown_083EDD1C[]; -extern const u8 gUnknown_083EDD30[]; -extern const u8 gBettingTilesId[][2]; -extern const u8 gNumberBettingTiles[]; -extern const u16 *const gUnknown_083EDDA0[]; -extern const u16 *const gUnknown_083EDDAC; -extern const u16 gReelTimeWindowTilemap[]; -extern const u16 gUnknown_085A9898[]; -extern void (*const gUnknown_083ED064[])(void); - -const struct BgTemplate gUnknown_085A7424[] = +static const struct UnkStruct1 *const gUnknown_083ED048[]; +static const u16 gPalette_83EDE24[]; +static const u8 gLuckyRoundProbabilities[][3]; +static const u8 gBiasTags[]; +static const u16 gLuckyFlagSettings_Top3[]; +static const u16 gLuckyFlagSettings_NotTop3[]; +static const s16 gUnknown_083ECE7E[][2]; +static const SpriteCallback gUnknown_083ECF0C[]; +static const struct SpriteTemplate *const gUnknown_083EDB5C[]; +static const struct SubspriteTable *const gUnknown_083EDBC4[]; +static const struct SpriteTemplate gSpriteTemplate_83ED6CC; +static const struct SpriteTemplate gSpriteTemplate_83ED564; +static const struct SpriteTemplate gSpriteTemplate_83ED54C; +static const struct SpriteTemplate gSpriteTemplate_83ED534; +static const u8 gUnknown_083ECC58[2]; +static const struct SpriteTemplate gSpriteTemplate_83ED51C; +static const u16 gProbabilityTable_SkipToReeltimeAction14[]; +static const u16 *const gUnknown_083EDE10[]; +static const u16 gReelIncrementTable[][2]; +static const u16 gReelTimeBonusIncrementTable[]; +static const u16 gSlotMatchFlags[]; +static const u16 gSlotPayouts[]; +static const u8 *const gUnknown_083EDCE4; +static const u8 *const gUnknown_083EDCDC; +static const u32 gReelTimeGfx[]; +static const struct SpriteSheet gSlotMachineSpriteSheets[]; +static const struct SpritePalette gSlotMachineSpritePalettes[]; +static const u16 *const gUnknown_083EDE20; +static const s16 gInitialReelPositions[][2]; +static const struct BgTemplate gUnknown_085A7424[4]; +static const struct WindowTemplate gUnknown_085A7434[]; +static const u8 gLuckyFlagProbabilities_Top3[][6]; +static const u8 gLuckyFlagProbabilities_NotTop3[][6]; +static const u8 gReeltimeProbabilities_UnluckyGame[][17]; +static const u8 gReelTimeProbabilities_LuckyGame[][17]; +static const u8 gSym2Match[]; +static const u8 gReelTimeTags[]; +static const u8 gReelSymbols[][REEL_NUM_TAGS]; +static const u8 *const gUnknown_083EDD08[]; +static const u16 *const gUnknown_083EDD1C[]; +static const u8 gUnknown_083EDD30[]; +static const u8 gBettingTilesId[][2]; +static const u8 gNumberBettingTiles[]; +static const u16 *const gUnknown_083EDDA0[]; +static const u16 *const gUnknown_083EDDAC; +static const u16 gReelTimeWindowTilemap[]; +static const u16 gUnknown_085A9898[]; +static void (*const gUnknown_083ED064[])(void); +static const struct SpriteTemplate gSpriteTemplate_83ED504; +static const struct SpriteTemplate gSpriteTemplate_83ED4EC; +static const struct SpriteTemplate gSpriteTemplate_83ED4D4; +static const struct SpriteTemplate gSpriteTemplate_83ED4BC; +static const struct SpriteTemplate gSpriteTemplate_83ED4A4; +static const struct SpriteTemplate gSpriteTemplate_83ED474; +static const struct SpriteTemplate gSpriteTemplate_83ED48C; +static const struct SpriteTemplate gSpriteTemplate_83ED444; +static const struct SpriteTemplate gSpriteTemplate_83ED42C; +static const struct SpriteTemplate gSpriteTemplate_83ED414; +static const struct SpriteTemplate gSpriteTemplate_83ED45C; +static const struct SubspriteTable gSubspriteTables_83ED7D4[]; +static const struct SubspriteTable gSubspriteTables_83ED7B4[]; +static const struct SubspriteTable gSubspriteTables_83ED78C[]; +static const struct SubspriteTable gSubspriteTables_83ED73C[]; +static const struct SubspriteTable gSubspriteTables_83ED75C[]; +static const struct SubspriteTable gSubspriteTables_83ED704[]; + +static const struct BgTemplate gUnknown_085A7424[] = { { .bg = 0, @@ -443,13 +489,13 @@ const struct BgTemplate gUnknown_085A7424[] = }, }; -const struct WindowTemplate gUnknown_085A7434[] = +static const struct WindowTemplate gUnknown_085A7434[] = { {0, 2, 15, 0x1B, 4, 15, 0x194}, DUMMY_WIN_TEMPLATE }; -const struct WindowTemplate gUnknown_085A7444 = +static const struct WindowTemplate gUnknown_085A7444 = { 0, 1, 3, 20, 13, 13, 1 }; @@ -633,23 +679,8 @@ void (*const gUnknown_083ECC54[])(struct Task *task) = nullsub_69, }; -extern const struct SpriteTemplate gSpriteTemplate_83ED504; -extern const struct SpriteTemplate gSpriteTemplate_83ED4EC; -extern const struct SubspriteTable gSubspriteTables_83ED7D4[]; -extern const struct SpriteTemplate gSpriteTemplate_83ED4D4; -extern const struct SubspriteTable gSubspriteTables_83ED7B4[]; -extern const struct SpriteTemplate gSpriteTemplate_83ED4BC; -extern const struct SpriteTemplate gSpriteTemplate_83ED4A4; -extern const struct SubspriteTable gSubspriteTables_83ED78C[]; -extern const struct SpriteTemplate gSpriteTemplate_83ED474; -extern const struct SpriteTemplate gSpriteTemplate_83ED48C; -extern const struct SubspriteTable gSubspriteTables_83ED73C[]; -extern const struct SubspriteTable gSubspriteTables_83ED75C[]; -extern const struct SpriteTemplate gSpriteTemplate_83ED444; -extern const struct SubspriteTable gSubspriteTables_83ED704[]; -extern const struct SpriteTemplate gSpriteTemplate_83ED42C; -extern const struct SpriteTemplate gSpriteTemplate_83ED414; -extern const struct SpriteTemplate gSpriteTemplate_83ED45C; + + // code #define tState data[0] @@ -3278,7 +3309,7 @@ static void sub_8104EA8(void) } } -/*static */void sub_8104F18(struct Sprite *sprite) +static void sub_8104F18(struct Sprite *sprite) { sprite->data[2] = sSlotMachine->reelPixelOffsets[sprite->data[0]] + sprite->data[1]; sprite->data[2] %= 120; @@ -3308,7 +3339,7 @@ static void sub_8104FF4(s16 x, s16 y, u8 a2, s16 a3) sprite->data[3] = -1; } -/*static */void sub_810506C(struct Sprite *sprite) +static void sub_810506C(struct Sprite *sprite) { u16 tag = sSlotMachine->coins; if (sprite->data[0]) @@ -3364,7 +3395,7 @@ static void sub_810514C(void) FREE_AND_SET_NULL(sUnknown_0203AAE4); } -/*static */void sub_8105170(struct Sprite *sprite) +static void sub_8105170(struct Sprite *sprite) { sprite->pos2.y = sprite->pos2.x = 0; if (sprite->animNum == 4) @@ -3446,7 +3477,7 @@ static void sub_81052EC(void) } } -/*static */void sub_810535C(struct Sprite *sprite) +static void sub_810535C(struct Sprite *sprite) { s16 r0 = (u16)(sSlotMachine->reeltimePixelOffset + sprite->data[7]); r0 %= 40; @@ -3535,7 +3566,7 @@ static void CreateReelTimeSprites1(void) sprite->data[7] = 0x20; } -/*static */void sub_810562C(struct Sprite *sprite) +static void sub_810562C(struct Sprite *sprite) { if (sprite->data[0] != 0) { @@ -3587,7 +3618,7 @@ static void CreateReelTimeSprite2(void) sSlotMachine->reelTimeSprites2[1] = spriteId; } -/*static */void sub_8105784(struct Sprite *sprite) +static void sub_8105784(struct Sprite *sprite) { u8 sp[] = {16, 0}; if (sprite->data[0] && --sprite->data[6] <= 0) @@ -3619,7 +3650,7 @@ static void sub_8105854(void) sSlotMachine->unk41 = spriteId; } -/*static */void sub_8105894(struct Sprite *sprite) +static void sub_8105894(struct Sprite *sprite) { sprite->pos2.y = gSpriteCoordOffsetY; } @@ -3644,7 +3675,7 @@ static void sub_81058C4(void) } } -/*static */void sub_810594C(struct Sprite *sprite) +static void sub_810594C(struct Sprite *sprite) { sprite->data[0] -= 2; sprite->data[0] &= 0xff; @@ -3681,7 +3712,7 @@ static void sub_81059E8(void) sSlotMachine->unk43 = spriteId; } -/*static */void sub_8105A38(struct Sprite *sprite) +static void sub_8105A38(struct Sprite *sprite) { if (sprite->data[0] == 0) { @@ -3730,7 +3761,7 @@ static u8 sub_8105B1C(s16 x, s16 y) return spriteId; } -/*static */void sub_8105B70(struct Sprite *sprite) +static void sub_8105B70(struct Sprite *sprite) { if (sprite->affineAnimEnded) sprite->data[7] = 1; @@ -4189,11 +4220,6 @@ static void sub_8106404(void) LoadSpriteSheet(sUnknown_0203AB2C); } -extern const u32 gSlotMachineMenu_Gfx[]; -extern const u16 gSlotMachineMenu_Tilemap[]; -extern const u16 gUnknown_08DCEC70[]; -extern const u16 gSlotMachineMenu_Pal[]; - static void sub_8106448(void) { sUnknown_0203AAC8 = Alloc(0x2200); @@ -4358,7 +4384,7 @@ static void SlotMachineSetup_8_0(void) sUnknown_0203AB28[1].size = 0x180; } -const u8 gReelSymbols[][REEL_NUM_TAGS] = +static const u8 gReelSymbols[][REEL_NUM_TAGS] = { { SLOT_MACHINE_TAG_7_RED, @@ -4431,17 +4457,17 @@ const u8 gReelSymbols[][REEL_NUM_TAGS] = }, }; -const u8 gReelTimeTags[] = { +static const u8 gReelTimeTags[] = { 1, 0, 5, 4, 3, 2 }; -const s16 gInitialReelPositions[][2] = { +static const s16 gInitialReelPositions[][2] = { {0, 6}, {0, 10}, {0, 2} }; -const u8 gLuckyRoundProbabilities[][3] = { +static const u8 gLuckyRoundProbabilities[][3] = { {1, 1, 12}, {1, 1, 14}, {2, 2, 14}, @@ -4450,13 +4476,13 @@ const u8 gLuckyRoundProbabilities[][3] = { {3, 3, 16} }; -const u8 gLuckyFlagProbabilities_Top3[][6] = { +static const u8 gLuckyFlagProbabilities_Top3[][6] = { {25, 25, 30, 40, 40, 50}, {25, 25, 30, 30, 35, 35}, {25, 25, 30, 25, 25, 30} }; -const u8 gLuckyFlagProbabilities_NotTop3[][6] = { +static const u8 gLuckyFlagProbabilities_NotTop3[][6] = { {20, 25, 25, 20, 25, 25}, {12, 15, 15, 18, 19, 22}, {25, 25, 25, 30, 30, 40}, @@ -4464,7 +4490,7 @@ const u8 gLuckyFlagProbabilities_NotTop3[][6] = { {40, 40, 35, 35, 40, 40} }; -const u8 gReeltimeProbabilities_UnluckyGame[][17] = { +static const u8 gReeltimeProbabilities_UnluckyGame[][17] = { {243, 243, 243, 80, 80, 80, 80, 40, 40, 40, 40, 40, 40, 5, 5, 5, 5}, { 5, 5, 5, 150, 150, 150, 150, 130, 130, 130, 130, 130, 130, 100, 100, 100, 5}, { 4, 4, 4, 20, 20, 20, 20, 80, 80, 80, 80, 80, 80, 100, 100, 100, 40}, @@ -4473,7 +4499,7 @@ const u8 gReeltimeProbabilities_UnluckyGame[][17] = { { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 6} }; -const u8 gReelTimeProbabilities_LuckyGame[][17] = { +static const u8 gReelTimeProbabilities_LuckyGame[][17] = { { 243, 243, 243, 200, 200, 200, 200, 160, 160, 160, 160, 160, 160, 70, 70, 70, 5}, { 5, 5, 5, 25, 25, 25, 25, 5, 5, 5, 5, 5, 5, 2, 2, 2, 6}, { 4, 4, 4, 25, 25, 25, 25, 30, 30, 30, 30, 30, 30, 40, 40, 40, 35}, @@ -4482,11 +4508,11 @@ const u8 gReelTimeProbabilities_LuckyGame[][17] = { { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 4, 4, 4, 60} }; -const u16 gProbabilityTable_SkipToReeltimeAction14[] = { +static const u16 gProbabilityTable_SkipToReeltimeAction14[] = { 128, 175, 200, 225, 256 }; -const u16 gReelIncrementTable[][2] = { +static const u16 gReelIncrementTable[][2] = { {10, 5}, {10, 10}, {10, 15}, @@ -4494,24 +4520,24 @@ const u16 gReelIncrementTable[][2] = { {10, 35} }; -const u16 gReelTimeBonusIncrementTable[] = { +static const u16 gReelTimeBonusIncrementTable[] = { 0, 5, 10, 15, 20 }; // tentative name -const u8 gBiasTags[] = { +static const u8 gBiasTags[] = { SLOT_MACHINE_TAG_REPLAY, SLOT_MACHINE_TAG_CHERRY, SLOT_MACHINE_TAG_LOTAD, SLOT_MACHINE_TAG_AZURILL, SLOT_MACHINE_TAG_POWER, SLOT_MACHINE_TAG_7_RED, SLOT_MACHINE_TAG_7_RED, SLOT_MACHINE_TAG_7_RED }; -const u16 gLuckyFlagSettings_Top3[] = { +static const u16 gLuckyFlagSettings_Top3[] = { LUCKY_BIAS_777, LUCKY_BIAS_REELTIME, LUCKY_BIAS_MIXED_777 }; -const u16 gLuckyFlagSettings_NotTop3[] = { +static const u16 gLuckyFlagSettings_NotTop3[] = { LUCKY_BIAS_POWER, LUCKY_BIAS_AZURILL, LUCKY_BIAS_LOTAD, LUCKY_BIAS_CHERRY, LUCKY_BIAS_REPLAY }; -const u8 gSym2Match[] = { +static const u8 gSym2Match[] = { SLOT_MACHINE_MATCHED_777_RED, SLOT_MACHINE_MATCHED_777_BLUE, SLOT_MACHINE_MATCHED_AZURILL, @@ -4521,7 +4547,7 @@ const u8 gSym2Match[] = { SLOT_MACHINE_MATCHED_REPLAY }; -const u16 gSlotMatchFlags[] = { +static const u16 gSlotMatchFlags[] = { 1 << SLOT_MACHINE_MATCHED_1CHERRY, 1 << SLOT_MACHINE_MATCHED_2CHERRY, 1 << SLOT_MACHINE_MATCHED_REPLAY, @@ -4533,11 +4559,11 @@ const u16 gSlotMatchFlags[] = { 1 << SLOT_MACHINE_MATCHED_777_BLUE }; -const u16 gSlotPayouts[] = { +static const u16 gSlotPayouts[] = { 2, 4, 0, 6, 12, 3, 90, 300, 300 }; -const s16 gUnknown_083ECE7E[][2] = { +static const s16 gUnknown_083ECE7E[][2] = { { 0xd0, 0x38}, { 0xb8, 0x00}, { 0xc8, 0x08}, @@ -4575,7 +4601,7 @@ const s16 gUnknown_083ECE7E[][2] = { { 0x00, 0x00} }; -const SpriteCallback gUnknown_083ECF0C[] = { +static const SpriteCallback gUnknown_083ECF0C[] = { sub_8105C64, sub_8105F54, sub_8105F54, @@ -4613,14 +4639,14 @@ const SpriteCallback gUnknown_083ECF0C[] = { sub_8106230 }; -const struct UnkStruct1 Unknown_83ECF98[] = { +static const struct UnkStruct1 Unknown_83ECF98[] = { {25, 34, 0}, {2, 0, 0}, {9, 16, 0}, {255, 0, 0} }; -const struct UnkStruct1 Unknown_83ECFA8[] = { +static const struct UnkStruct1 Unknown_83ECFA8[] = { {10, 1, 0}, {11, 2, 0}, {12, 3, 0}, @@ -4630,13 +4656,13 @@ const struct UnkStruct1 Unknown_83ECFA8[] = { {255, 0, 0} }; -const struct UnkStruct1 Unknown_83ECFC4[] = { +static const struct UnkStruct1 Unknown_83ECFC4[] = { {3, 7, 0}, {8, 17, 0}, {255, 0, 0} }; -const struct UnkStruct1 Unknown_83ECFD0[] = { +static const struct UnkStruct1 Unknown_83ECFD0[] = { {4, 8, 0}, {6, 9, 0}, {6, 10, 1}, @@ -4645,14 +4671,14 @@ const struct UnkStruct1 Unknown_83ECFD0[] = { {255, 0, 0} }; -const struct UnkStruct1 Unknown_83ECFE8[] = { +static const struct UnkStruct1 Unknown_83ECFE8[] = { {0, 13, 0}, {1, 14, 0}, {7, 15, 0}, {255, 0, 0} }; -const struct UnkStruct1 Unknown_83ECFF8[] = { +static const struct UnkStruct1 Unknown_83ECFF8[] = { {19, 26, 0}, {20, 27, 1}, {21, 28, 2}, @@ -4665,7 +4691,7 @@ const struct UnkStruct1 Unknown_83ECFF8[] = { {255, 0, 0} }; -const struct UnkStruct1 Unknown_83ED020[] = { +static const struct UnkStruct1 Unknown_83ED020[] = { {22, 18, 0}, {23, 19, 1}, {24, 20, 2}, @@ -4678,7 +4704,7 @@ const struct UnkStruct1 Unknown_83ED020[] = { {255, 0, 0} }; -const struct UnkStruct1 *const gUnknown_083ED048[] = { +static const struct UnkStruct1 *const gUnknown_083ED048[] = { Unknown_83ECF98, Unknown_83ECFA8, Unknown_83ECFC4, @@ -4688,7 +4714,7 @@ const struct UnkStruct1 *const gUnknown_083ED048[] = { Unknown_83ECFF8 }; -void (*const gUnknown_083ED064[])(void) = { +static void (*const gUnknown_083ED064[])(void) = { sub_810639C, sub_8106364, sub_8106370, @@ -4697,3 +4723,2128 @@ void (*const gUnknown_083ED064[])(void) = { sub_8106370, sub_8106370 }; + +static const struct OamData gUnknown_085A7A3C = +{ + .y = 0, + .affineMode = ST_OAM_AFFINE_OFF, + .objMode = ST_OAM_OBJ_NORMAL, + .mosaic = 0, + .bpp = ST_OAM_4BPP, + .shape = SPRITE_SHAPE(8x8), + .x = 0, + .matrixNum = 0, + .size = SPRITE_SIZE(8x8), + .tileNum = 0, + .priority = 0, + .paletteNum = 0, + .affineParam = 0, +}; + +static const struct OamData gUnknown_085A7A44 = +{ + .y = 0, + .affineMode = ST_OAM_AFFINE_OFF, + .objMode = ST_OAM_OBJ_NORMAL, + .mosaic = 0, + .bpp = ST_OAM_4BPP, + .shape = SPRITE_SHAPE(8x16), + .x = 0, + .matrixNum = 0, + .size = SPRITE_SIZE(8x16), + .tileNum = 0, + .priority = 0, + .paletteNum = 0, + .affineParam = 0, +}; + +static const struct OamData gUnknown_085A7A4C = +{ + .y = 0, + .affineMode = ST_OAM_AFFINE_OFF, + .objMode = ST_OAM_OBJ_NORMAL, + .mosaic = 0, + .bpp = ST_OAM_4BPP, + .shape = SPRITE_SHAPE(16x16), + .x = 0, + .matrixNum = 0, + .size = SPRITE_SIZE(16x16), + .tileNum = 0, + .priority = 0, + .paletteNum = 0, + .affineParam = 0, +}; + +static const struct OamData gUnknown_085A7A54 = +{ + .y = 0, + .affineMode = ST_OAM_AFFINE_OFF, + .objMode = ST_OAM_OBJ_NORMAL, + .mosaic = 0, + .bpp = ST_OAM_4BPP, + .shape = SPRITE_SHAPE(16x32), + .x = 0, + .matrixNum = 0, + .size = SPRITE_SIZE(16x32), + .tileNum = 0, + .priority = 0, + .paletteNum = 0, + .affineParam = 0, +}; + +static const struct OamData gUnknown_085A7A5C = +{ + .y = 0, + .affineMode = ST_OAM_AFFINE_OFF, + .objMode = ST_OAM_OBJ_NORMAL, + .mosaic = 0, + .bpp = ST_OAM_4BPP, + .shape = SPRITE_SHAPE(32x32), + .x = 0, + .matrixNum = 0, + .size = SPRITE_SIZE(32x32), + .tileNum = 0, + .priority = 0, + .paletteNum = 0, + .affineParam = 0, +}; + +static const struct OamData gUnknown_085A7A64 = +{ + .y = 0, + .affineMode = ST_OAM_AFFINE_OFF, + .objMode = ST_OAM_OBJ_NORMAL, + .mosaic = 0, + .bpp = ST_OAM_4BPP, + .shape = SPRITE_SHAPE(32x64), + .x = 0, + .matrixNum = 0, + .size = SPRITE_SIZE(32x64), + .tileNum = 0, + .priority = 0, + .paletteNum = 0, + .affineParam = 0, +}; + +static const struct OamData gUnknown_085A7A6C = +{ + .y = 0, + .affineMode = ST_OAM_AFFINE_OFF, + .objMode = ST_OAM_OBJ_NORMAL, + .mosaic = 0, + .bpp = ST_OAM_4BPP, + .shape = SPRITE_SHAPE(64x32), + .x = 0, + .matrixNum = 0, + .size = SPRITE_SIZE(64x32), + .tileNum = 0, + .priority = 0, + .paletteNum = 0, + .affineParam = 0, +}; + +static const struct OamData gUnknown_085A7A74 = +{ + .y = 0, + .affineMode = ST_OAM_AFFINE_OFF, + .objMode = ST_OAM_OBJ_NORMAL, + .mosaic = 0, + .bpp = ST_OAM_4BPP, + .shape = SPRITE_SHAPE(64x64), + .x = 0, + .matrixNum = 0, + .size = SPRITE_SIZE(64x64), + .tileNum = 0, + .priority = 0, + .paletteNum = 0, + .affineParam = 0, +}; + +static const struct SpriteFrameImage gUnknown_085A7A7C[] = +{ + { gSlotMachineReelTimeNumber0, 0x80 }, + { gSlotMachineReelTimeNumber1, 0x80 }, + { gSlotMachineReelTimeNumber2, 0x80 }, + { gSlotMachineReelTimeNumber3, 0x80 }, + { gSlotMachineReelTimeNumber4, 0x80 }, + { gSlotMachineReelTimeNumber5, 0x80 }, +}; + +static const struct SpriteFrameImage gUnknown_085A7AAC[] = { gSlotMachineReelTimeShadow, 0x200 }; +static const struct SpriteFrameImage gUnknown_085A7AB4[] = { gUnknown_08DD1A18, 0x40 }; + +static const struct SpriteFrameImage gUnknown_085A7ABC[] = +{ + { gSlotMachineReelTimeLargeBolt0, 0x100 }, + { gSlotMachineReelTimeLargeBolt1, 0x100 }, +}; + +static const struct SpriteFrameImage gUnknown_085A7ACC[] = { gSlotMachineReelTimePikaAura, 0x400 }; + +static const struct SpriteFrameImage gUnknown_085A7AD4[] = +{ + { gSlotMachineReelTimeExplosion0, 0x200 }, + { gSlotMachineReelTimeExplosion1, 0x200 }, +}; + +static const struct SpriteFrameImage gUnknown_085A7AE4[] = { gSlotMachineReelTimeDuck, 0x20}; +static const struct SpriteFrameImage gUnknown_085A7AEC[] = { gSlotMachineReelTimeSmoke, 0x80}; +static const struct SpriteFrameImage gUnknown_085A7AF4[] = { gSlotMachineReelTimeBolt, 0x20}; + +static const union AnimCmd gUnknown_085A7AFC[] = +{ + ANIMCMD_FRAME(0, 1), + ANIMCMD_END +}; + +static const union AnimCmd gUnknown_085A7B04[] = +{ + ANIMCMD_FRAME(0, 1), + ANIMCMD_JUMP(0) +}; + +static const union AnimCmd gUnknown_085A7B0C[] = +{ + ANIMCMD_FRAME(0, 16), + ANIMCMD_END +}; + +static const union AnimCmd gUnknown_085A7B14[] = +{ + ANIMCMD_FRAME(1, 16), + ANIMCMD_FRAME(0, 16), + ANIMCMD_JUMP(0) +}; + +static const union AnimCmd gUnknown_085A7B20[] = +{ + ANIMCMD_FRAME(1, 8), + ANIMCMD_FRAME(0, 8), + ANIMCMD_JUMP(0) +}; + +static const union AnimCmd gUnknown_085A7B2C[] = +{ + ANIMCMD_FRAME(1, 4), + ANIMCMD_FRAME(0, 4), + ANIMCMD_JUMP(0) +}; + +static const union AnimCmd gUnknown_085A7B38[] = +{ + ANIMCMD_FRAME(2, 32), + ANIMCMD_FRAME(3, 32), + ANIMCMD_JUMP(0) +}; + +static const union AnimCmd gUnknown_085A7B44[] = +{ + ANIMCMD_FRAME(4, 1), + ANIMCMD_END +}; + +static const union AnimCmd gUnknown_085A7B4C[] = +{ + ANIMCMD_FRAME(0, 1), + ANIMCMD_END +}; + +static const union AnimCmd gUnknown_085A7B54[] = +{ + ANIMCMD_FRAME(1, 1), + ANIMCMD_END +}; + +static const union AnimCmd gUnknown_085A7B5C[] = +{ + ANIMCMD_FRAME(2, 1), + ANIMCMD_END +}; + +static const union AnimCmd gUnknown_085A7B64[] = +{ + ANIMCMD_FRAME(3, 1), + ANIMCMD_END +}; + +static const union AnimCmd gUnknown_085A7B6C[] = +{ + ANIMCMD_FRAME(4, 1), + ANIMCMD_END +}; + +static const union AnimCmd gUnknown_085A7B74[] = +{ + ANIMCMD_FRAME(5, 1), + ANIMCMD_END +}; + + +static const union AnimCmd gUnknown_085A7B7C[] = +{ + ANIMCMD_FRAME(0, 4), + ANIMCMD_FRAME(1, 4), + ANIMCMD_JUMP(0) +}; + +static const union AnimCmd gUnknown_085A7B88[] = +{ + ANIMCMD_FRAME(0, 16), + ANIMCMD_FRAME(1, 16), + ANIMCMD_JUMP(0) +}; + +static const union AnimCmd gUnknown_085A7B94[] = +{ + ANIMCMD_FRAME(0, 30), + ANIMCMD_FRAME(1, 30), + ANIMCMD_JUMP(0) +}; + +static const union AnimCmd gUnknown_085A7BA0[] = +{ + ANIMCMD_FRAME(1, 1), + ANIMCMD_END +}; + +static const union AnimCmd gUnknown_085A7BA8[] = +{ + ANIMCMD_FRAME(0, 30), + ANIMCMD_FRAME(1, 30), + ANIMCMD_JUMP(0) +}; + +static const union AnimCmd gUnknown_085A7BB4[] = +{ + ANIMCMD_FRAME(0, 16), + ANIMCMD_FRAME(1, 16), + ANIMCMD_FRAME(0, 16), + ANIMCMD_FRAME(1, 16, .hFlip = TRUE), + ANIMCMD_JUMP(0) +}; + +static const union AnimCmd gUnknown_085A7BC8[] = +{ + ANIMCMD_FRAME(0, 1), + ANIMCMD_END +}; + +static const union AnimCmd gUnknown_085A7BD0[] = +{ + ANIMCMD_FRAME(0, 1), + ANIMCMD_END +}; + +static const union AnimCmd gUnknown_085A7BD8[] = +{ + ANIMCMD_FRAME(1, 1), + ANIMCMD_END +}; + +static const union AnimCmd gUnknown_085A7BE0[] = +{ + ANIMCMD_FRAME(2, 1), + ANIMCMD_END +}; + +static const union AnimCmd gUnknown_085A7BE8[] = +{ + ANIMCMD_FRAME(3, 1), + ANIMCMD_END +}; + +static const union AnimCmd gUnknown_085A7BF0[] = +{ + ANIMCMD_FRAME(4, 1), + ANIMCMD_END +}; + +static const union AnimCmd *const gUnknown_085A7BF8[] = +{ + gUnknown_085A7AFC +}; + +static const union AnimCmd *const gUnknown_085A7BFC[] = +{ + gUnknown_085A7B04 +}; + +static const union AnimCmd *const gUnknown_085A7C00[] = +{ + gUnknown_085A7B0C, + gUnknown_085A7B14, + gUnknown_085A7B20, + gUnknown_085A7B2C, + gUnknown_085A7B38, + gUnknown_085A7B44 +}; + +static const union AnimCmd *const gUnknown_085A7C18[] = +{ + gUnknown_085A7B4C, + gUnknown_085A7B54, + gUnknown_085A7B5C, + gUnknown_085A7B64, + gUnknown_085A7B6C, + gUnknown_085A7B74 +}; + +static const union AnimCmd *const gUnknown_085A7C30[] = +{ + gUnknown_085A7B7C +}; + +static const union AnimCmd *const gUnknown_085A7C34[] = +{ + gUnknown_085A7B88 +}; + +static const union AnimCmd *const gUnknown_085A7C38[] = +{ + gUnknown_085A7B94, + gUnknown_085A7BA0 +}; + +static const union AnimCmd *const gUnknown_085A7C40[] = +{ + gUnknown_085A7BA8 +}; + +static const union AnimCmd *const gUnknown_085A7C44[] = +{ + gUnknown_085A7BB4, + gUnknown_085A7BC8 +}; + +static const union AnimCmd *const gUnknown_085A7C4C[] = +{ + gUnknown_085A7BD0, + gUnknown_085A7BD8, + gUnknown_085A7BE0, + gUnknown_085A7BE8, + gUnknown_085A7BF0 +}; + + +static const union AffineAnimCmd gUnknown_085A7C60[] = +{ + AFFINEANIMCMD_FRAME(16, 16, 0, 0), + AFFINEANIMCMD_LOOP(0), + AFFINEANIMCMD_FRAME(1, 1, 0, 1), + AFFINEANIMCMD_LOOP(0xFF), + AFFINEANIMCMD_END +}; + +static const union AffineAnimCmd *const gUnknown_085A7C88[] = +{ + gUnknown_085A7C60 +}; + +static const union AffineAnimCmd gUnknown_085A7C8C[] = +{ + AFFINEANIMCMD_FRAME(0, 0, 8, 32), + AFFINEANIMCMD_FRAME(0, 0, 6, 32), + AFFINEANIMCMD_FRAME(0, 0, 4, 16), + AFFINEANIMCMD_FRAME(0, 0, 12, 2), + AFFINEANIMCMD_FRAME(0, 0, -12, 4), + AFFINEANIMCMD_FRAME(0, 0, 12, 2), + AFFINEANIMCMD_FRAME(0, 0, 12, 2), + AFFINEANIMCMD_FRAME(0, 0, -12, 4), + AFFINEANIMCMD_FRAME(0, 0, 12, 2), + AFFINEANIMCMD_END +}; + +static const union AffineAnimCmd *const gUnknown_085A7CDC[] = +{ + gUnknown_085A7C8C +}; + +static const struct SpriteTemplate gSpriteTemplate_83ED414 = +{ + .tileTag = 0, + .paletteTag = 0, + .oam = &gUnknown_085A7A5C, + .anims = gUnknown_085A7BF8, + .images = NULL, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = sub_8104F18 +}; + +static const struct SpriteTemplate gSpriteTemplate_83ED42C = +{ + .tileTag = 7, + .paletteTag = 4, + .oam = &gUnknown_085A7A44, + .anims = gUnknown_085A7BF8, + .images = NULL, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = sub_810506C +}; + +static const struct SpriteTemplate gSpriteTemplate_83ED444 = +{ + .tileTag = 17, + .paletteTag = 0, + .oam = &gUnknown_085A7A74, + .anims = gUnknown_085A7BF8, + .images = NULL, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = SpriteCallbackDummy +}; + +static const struct SpriteTemplate gSpriteTemplate_83ED45C = +{ + .tileTag = 0xFFFF, + .paletteTag = 1, + .oam = &gUnknown_085A7A74, + .anims = gUnknown_085A7C00, + .images = NULL, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = sub_8105170 +}; + +static const struct SpriteTemplate gSpriteTemplate_83ED474 = +{ + .tileTag = 0xFFFF, + .paletteTag = 2, + .oam = &gUnknown_085A7A44, + .anims = gUnknown_085A7BF8, + .images = NULL, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = SpriteCallbackDummy +}; + +static const struct SpriteTemplate gSpriteTemplate_83ED48C = +{ + .tileTag = 0xFFFF, + .paletteTag = 3, + .oam = &gUnknown_085A7A44, + .anims = gUnknown_085A7BF8, + .images = NULL, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = SpriteCallbackDummy +}; + +static const struct SpriteTemplate gSpriteTemplate_83ED4A4 = +{ + .tileTag = 0xFFFF, + .paletteTag = 3, + .oam = &gUnknown_085A7A44, + .anims = gUnknown_085A7BF8, + .images = NULL, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = SpriteCallbackDummy +}; + +static const struct SpriteTemplate gSpriteTemplate_83ED4BC = +{ + .tileTag = 0xFFFF, + .paletteTag = 4, + .oam = &gUnknown_085A7A4C, + .anims = gUnknown_085A7C18, + .images = gUnknown_085A7A7C, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = sub_810535C +}; + +static const struct SpriteTemplate gSpriteTemplate_83ED4D4 = +{ + .tileTag = 0xFFFF, + .paletteTag = 4, + .oam = &gUnknown_085A7A4C, + .anims = gUnknown_085A7BF8, + .images = gUnknown_085A7AAC, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = SpriteCallbackDummy +}; + +static const struct SpriteTemplate gSpriteTemplate_83ED4EC = +{ + .tileTag = 0xFFFF, + .paletteTag = 4, + .oam = &gUnknown_085A7A4C, + .anims = gUnknown_085A7BF8, + .images = gUnknown_085A7AB4, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = SpriteCallbackDummy +}; + +static const struct SpriteTemplate gSpriteTemplate_83ED504 = +{ + .tileTag = 0xFFFF, + .paletteTag = 4, + .oam = &gUnknown_085A7A54, + .anims = gUnknown_085A7C30, + .images = gUnknown_085A7ABC, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = sub_810562C +}; + +static const struct SpriteTemplate gSpriteTemplate_83ED51C = +{ + .tileTag = 0xFFFF, + .paletteTag = 7, + .oam = &gUnknown_085A7A64, + .anims = gUnknown_085A7BF8, + .images = gUnknown_085A7ACC, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = sub_8105784 +}; + +static const struct SpriteTemplate gSpriteTemplate_83ED534 = +{ + .tileTag = 0xFFFF, + .paletteTag = 5, + .oam = &gUnknown_085A7A5C, + .anims = gUnknown_085A7C34, + .images = gUnknown_085A7AD4, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = sub_8105894 +}; + +static const struct SpriteTemplate gSpriteTemplate_83ED54C = +{ + .tileTag = 0xFFFF, + .paletteTag = 4, + .oam = &gUnknown_085A7A3C, + .anims = gUnknown_085A7BFC, + .images = gUnknown_085A7AE4, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = sub_810594C +}; + +static const struct SpriteTemplate gSpriteTemplate_83ED564 = +{ + .tileTag = 0xFFFF, + .paletteTag = 4, + .oam = &gUnknown_085A7A4C, + .anims = gUnknown_085A7BF8, + .images = gUnknown_085A7AEC, + .affineAnims = gUnknown_085A7C88, + .callback = sub_8105A38 +}; + +static const struct SpriteTemplate gUnknown_085A7E48 = +{ + .tileTag = 0xFFFF, + .paletteTag = 6, + .oam = &gUnknown_085A7A3C, + .anims = gUnknown_085A7BF8, + .images = NULL, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = SpriteCallbackDummy +}; + +static const struct SpriteTemplate gUnknown_085A7E60 = +{ + .tileTag = 0xFFFF, + .paletteTag = 6, + .oam = &gUnknown_085A7A3C, + .anims = gUnknown_085A7BF8, + .images = NULL, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = SpriteCallbackDummy +}; + +static const struct SpriteTemplate gUnknown_085A7E78 = +{ + .tileTag = 0xFFFF, + .paletteTag = 6, + .oam = &gUnknown_085A7A3C, + .anims = gUnknown_085A7BF8, + .images = NULL, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = SpriteCallbackDummy +}; + +static const struct SpriteTemplate gUnknown_085A7E90 = +{ + .tileTag = 18, + .paletteTag = 6, + .oam = &gUnknown_085A7A3C, + .anims = gUnknown_085A7BF8, + .images = NULL, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = SpriteCallbackDummy +}; + +static const struct SpriteTemplate gUnknown_085A7EA8 = +{ + .tileTag = 0xFFFF, + .paletteTag = 6, + .oam = &gUnknown_085A7A6C, + .anims = gUnknown_085A7BF8, + .images = NULL, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = SpriteCallbackDummy +}; + +static const struct SpriteTemplate gUnknown_085A7EC0 = +{ + .tileTag = 0xFFFF, + .paletteTag = 6, + .oam = &gUnknown_085A7A6C, + .anims = gUnknown_085A7BF8, + .images = NULL, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = SpriteCallbackDummy +}; + +static const struct SpriteTemplate gUnknown_085A7ED8 = +{ + .tileTag = 19, + .paletteTag = 6, + .oam = &gUnknown_085A7A3C, + .anims = gUnknown_085A7BF8, + .images = NULL, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = SpriteCallbackDummy +}; + +static const struct SpriteTemplate gUnknown_085A7EF0 = +{ + .tileTag = 20, + .paletteTag = 6, + .oam = &gUnknown_085A7A3C, + .anims = gUnknown_085A7BF8, + .images = NULL, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = SpriteCallbackDummy +}; + +static const struct SpriteTemplate gUnknown_085A7F08 = +{ + .tileTag = 21, + .paletteTag = 6, + .oam = &gUnknown_085A7A3C, + .anims = gUnknown_085A7BF8, + .images = NULL, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = SpriteCallbackDummy +}; + +static const struct SpriteTemplate gUnknown_085A7F20 = +{ + .tileTag = 0xFFFF, + .paletteTag = 6, + .oam = &gUnknown_085A7A5C, + .anims = gUnknown_085A7C38, + .images = NULL, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = SpriteCallbackDummy +}; + +static const struct SpriteTemplate gUnknown_085A7F38 = +{ + .tileTag = 0xFFFF, + .paletteTag = 6, + .oam = &gUnknown_085A7A3C, + .anims = gUnknown_085A7BF8, + .images = NULL, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = SpriteCallbackDummy +}; + +static const struct SpriteTemplate gUnknown_085A7F50 = +{ + .tileTag = 0xFFFF, + .paletteTag = 6, + .oam = &gUnknown_085A7A4C, + .anims = gUnknown_085A7C4C, + .images = NULL, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = SpriteCallbackDummy +}; + +static const struct SpriteTemplate gUnknown_085A7F68 = +{ + .tileTag = 0xFFFF, + .paletteTag = 6, + .oam = &gUnknown_085A7A3C, + .anims = gUnknown_085A7C44, + .images = NULL, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = SpriteCallbackDummy +}; + +static const struct SpriteTemplate gUnknown_085A7F80 = +{ + .tileTag = 0xFFFF, + .paletteTag = 6, + .oam = &gUnknown_085A7A3C, + .anims = gUnknown_085A7C40, + .images = NULL, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = SpriteCallbackDummy +}; + +static const struct SpriteTemplate gSpriteTemplate_83ED6CC = +{ + .tileTag = 0xFFFF, + .paletteTag = 4, + .oam = &gUnknown_085A7A3C, + .anims = gUnknown_085A7BF8, + .images = gUnknown_085A7AF4, + .affineAnims = gUnknown_085A7CDC, + .callback = sub_8105B70 +}; + +static const struct Subsprite gUnknown_085A7FB0[] = +{ + { + .x = -64, + .y = -64, + .shape = SPRITE_SHAPE(64x64), + .size = SPRITE_SIZE(64x64), + .tileOffset = 0, + .priority = 3, + }, + { + .x = 0, + .y = -64, + .shape = SPRITE_SHAPE(64x64), + .size = SPRITE_SIZE(64x64), + .tileOffset = 0, + .priority = 3, + }, + { + .x = -64, + .y = 0, + .shape = SPRITE_SHAPE(64x64), + .size = SPRITE_SIZE(64x64), + .tileOffset = 0, + .priority = 3, + }, + { + .x = 0, + .y = 0, + .shape = SPRITE_SHAPE(64x64), + .size = SPRITE_SIZE(64x64), + .tileOffset = 0, + .priority = 3, + } +}; + +static const struct SubspriteTable gSubspriteTables_83ED704[] = +{ + ARRAY_COUNT(gUnknown_085A7FB0), gUnknown_085A7FB0 +}; + +static const struct Subsprite gUnknown_085A7FC8[] = +{ + { + .x = -32, + .y = -12, + .shape = SPRITE_SHAPE(32x8), + .size = SPRITE_SIZE(32x8), + .tileOffset = 0, + .priority = 1, + }, + { + .x = 0, + .y = -12, + .shape = SPRITE_SHAPE(32x8), + .size = SPRITE_SIZE(32x8), + .tileOffset = 4, + .priority = 1, + }, + { + .x = -32, + .y = -4, + .shape = SPRITE_SHAPE(32x8), + .size = SPRITE_SIZE(32x8), + .tileOffset = 8, + .priority = 1, + }, + { + .x = 0, + .y = -4, + .shape = SPRITE_SHAPE(32x8), + .size = SPRITE_SIZE(32x8), + .tileOffset = 12, + .priority = 1, + }, + { + .x = -32, + .y = 4, + .shape = SPRITE_SHAPE(32x8), + .size = SPRITE_SIZE(32x8), + .tileOffset = 16, + .priority = 1, + }, + { + .x = 0, + .y = 4, + .shape = SPRITE_SHAPE(32x8), + .size = SPRITE_SIZE(32x8), + .tileOffset = 20, + .priority = 1 + } +}; + +static const struct SubspriteTable gSubspriteTables_83ED73C[] = +{ + ARRAY_COUNT(gUnknown_085A7FC8), gUnknown_085A7FC8 +}; + +static const struct Subsprite gUnknown_085A7FE8[] = +{ + { + .x = -32, + .y = -20, + .shape = SPRITE_SHAPE(64x32), + .size = SPRITE_SIZE(64x32), + .tileOffset = 0, + .priority = 1, + }, + { + .x = -32, + .y = 12, + .shape = SPRITE_SHAPE(32x8), + .size = SPRITE_SIZE(32x8), + .tileOffset = 32, + .priority = 1, + }, + { + .x = 0, + .y = 12, + .shape = SPRITE_SHAPE(32x8), + .size = SPRITE_SIZE(32x8), + .tileOffset = 36, + .priority = 1, + } +}; + +static const struct SubspriteTable gSubspriteTables_83ED75C[] = +{ + ARRAY_COUNT(gUnknown_085A7FE8), gUnknown_085A7FE8 +}; + +static const struct Subsprite gUnknown_085A7FFC[] = +{ + { + .x = -32, + .y = -24, + .shape = SPRITE_SHAPE(64x32), + .size = SPRITE_SIZE(64x32), + .tileOffset = 0, + .priority = 1, + }, + { + .x = -32, + .y = 8, + .shape = SPRITE_SHAPE(32x8), + .size = SPRITE_SIZE(32x8), + .tileOffset = 32, + .priority = 1, + }, + { + .x = 0, + .y = 8, + .shape = SPRITE_SHAPE(32x8), + .size = SPRITE_SIZE(32x8), + .tileOffset = 36, + .priority = 1, + }, + { + .x = -32, + .y = 16, + .shape = SPRITE_SHAPE(32x8), + .size = SPRITE_SIZE(32x8), + .tileOffset = 40, + .priority = 1, + }, + { + .x = 0, + .y = 16, + .shape = SPRITE_SHAPE(32x8), + .size = SPRITE_SIZE(32x8), + .tileOffset = 44, + .priority = 1, + } +}; + +static const struct SubspriteTable gSubspriteTables_83ED78C[] = +{ + ARRAY_COUNT(gUnknown_085A7FFC), gUnknown_085A7FFC +}; + +static const struct Subsprite gUnknown_085A8018[] = +{ + { + .x = -32, + .y = -8, + .shape = SPRITE_SHAPE(32x8), + .size = SPRITE_SIZE(32x8), + .tileOffset = 0, + .priority = 1, + }, + { + .x = 0, + .y = -8, + .shape = SPRITE_SHAPE(32x8), + .size = SPRITE_SIZE(32x8), + .tileOffset = 4, + .priority = 1, + }, + { + .x = -32, + .y = 0, + .shape = SPRITE_SHAPE(32x8), + .size = SPRITE_SIZE(32x8), + .tileOffset = 8, + .priority = 1, + }, + { + .x = 0, + .y = 0, + .shape = SPRITE_SHAPE(32x8), + .size = SPRITE_SIZE(32x8), + .tileOffset = 12, + .priority = 1, + } +}; + +static const struct SubspriteTable gSubspriteTables_83ED7B4[] = +{ + ARRAY_COUNT(gUnknown_085A8018), gUnknown_085A8018 +}; + +static const struct Subsprite gUnknown_085A8030[] = +{ + { + .x = -8, + .y = -12, + .shape = SPRITE_SHAPE(16x8), + .size = SPRITE_SIZE(16x8), + .tileOffset = 0, + .priority = 1, + }, + { + .x = -8, + .y = -4, + .shape = SPRITE_SHAPE(16x8), + .size = SPRITE_SIZE(16x8), + .tileOffset = 0, + .priority = 1, + }, + { + .x = -8, + .y = 4, + .shape = SPRITE_SHAPE(16x8), + .size = SPRITE_SIZE(16x8), + .tileOffset = 0, + .priority = 1, + } +}; + +static const struct SubspriteTable gSubspriteTables_83ED7D4[] = +{ + ARRAY_COUNT(gUnknown_085A8030), gUnknown_085A8030 +}; + +static const struct Subsprite gUnknown_085A8044[] = +{ + { + .x = -32, + .y = -24, + .shape = SPRITE_SHAPE(64x32), + .size = SPRITE_SIZE(64x32), + .tileOffset = 0, + .priority = 3, + }, + { + .x = -32, + .y = 8, + .shape = SPRITE_SHAPE(32x8), + .size = SPRITE_SIZE(32x8), + .tileOffset = 32, + .priority = 3, + }, + { + .x = 0, + .y = 8, + .shape = SPRITE_SHAPE(32x8), + .size = SPRITE_SIZE(32x8), + .tileOffset = 36, + .priority = 3, + }, + { + .x = -32, + .y = 16, + .shape = SPRITE_SHAPE(32x8), + .size = SPRITE_SIZE(32x8), + .tileOffset = 40, + .priority = 3, + }, + { + .x = 0, + .y = 16, + .shape = SPRITE_SHAPE(32x8), + .size = SPRITE_SIZE(32x8), + .tileOffset = 44, + .priority = 3, + } +}; + +static const struct SubspriteTable gUnknown_085A8058[] = +{ + ARRAY_COUNT(gUnknown_085A8044), gUnknown_085A8044 +}; + +static const struct Subsprite gUnknown_085A8060[] = +{ + { + .x = -32, + .y = -8, + .shape = SPRITE_SHAPE(32x8), + .size = SPRITE_SIZE(32x8), + .tileOffset = 0, + .priority = 3, + }, + { + .x = 0, + .y = -8, + .shape = SPRITE_SHAPE(32x8), + .size = SPRITE_SIZE(32x8), + .tileOffset = 4, + .priority = 3, + }, + { + .x = -32, + .y = 0, + .shape = SPRITE_SHAPE(32x8), + .size = SPRITE_SIZE(32x8), + .tileOffset = 8, + .priority = 3, + }, + { + .x = 0, + .y = 0, + .shape = SPRITE_SHAPE(32x8), + .size = SPRITE_SIZE(32x8), + .tileOffset = 12, + .priority = 3, + } +}; + +static const struct SubspriteTable gUnknown_085A8070[] = +{ + ARRAY_COUNT(gUnknown_085A8060), gUnknown_085A8060 +}; + +static const struct Subsprite gUnknown_085A8078[] = +{ + { + .x = -32, + .y = -8, + .shape = SPRITE_SHAPE(32x8), + .size = SPRITE_SIZE(32x8), + .tileOffset = 0, + .priority = 3, + }, + { + .x = 0, + .y = -8, + .shape = SPRITE_SHAPE(32x8), + .size = SPRITE_SIZE(32x8), + .tileOffset = 4, + .priority = 3, + }, + { + .x = -32, + .y = 0, + .shape = SPRITE_SHAPE(32x8), + .size = SPRITE_SIZE(32x8), + .tileOffset = 8, + .priority = 3, + }, + { + .x = 0, + .y = 0, + .shape = SPRITE_SHAPE(32x8), + .size = SPRITE_SIZE(32x8), + .tileOffset = 12, + .priority = 3, + } +}; + +static const struct SubspriteTable gUnknown_085A8088[] = +{ + ARRAY_COUNT(gUnknown_085A8078), gUnknown_085A8078 +}; + +static const struct Subsprite gUnknown_085A8090[] = +{ + { + .x = -32, + .y = -8, + .shape = SPRITE_SHAPE(32x8), + .size = SPRITE_SIZE(32x8), + .tileOffset = 0, + .priority = 3, + }, + { + .x = 0, + .y = -8, + .shape = SPRITE_SHAPE(32x8), + .size = SPRITE_SIZE(32x8), + .tileOffset = 4, + .priority = 3, + }, + { + .x = -32, + .y = 0, + .shape = SPRITE_SHAPE(32x8), + .size = SPRITE_SIZE(32x8), + .tileOffset = 8, + .priority = 3, + }, + { + .x = 0, + .y = 0, + .shape = SPRITE_SHAPE(32x8), + .size = SPRITE_SIZE(32x8), + .tileOffset = 12, + .priority = 3, + } +}; + +static const struct SubspriteTable gUnknown_085A80A0[] = +{ + ARRAY_COUNT(gUnknown_085A8090), gUnknown_085A8090 +}; + +static const struct Subsprite gUnknown_085A80A8[] = +{ + { + .x = -32, + .y = -12, + .shape = SPRITE_SHAPE(32x8), + .size = SPRITE_SIZE(32x8), + .tileOffset = 0, + .priority = 3, + }, + { + .x = 0, + .y = -12, + .shape = SPRITE_SHAPE(32x8), + .size = SPRITE_SIZE(32x8), + .tileOffset = 4, + .priority = 3, + }, + { + .x = -32, + .y = -4, + .shape = SPRITE_SHAPE(32x8), + .size = SPRITE_SIZE(32x8), + .tileOffset = 8, + .priority = 3, + }, + { + .x = 0, + .y = -4, + .shape = SPRITE_SHAPE(32x8), + .size = SPRITE_SIZE(32x8), + .tileOffset = 12, + .priority = 3, + }, + { + .x = -32, + .y = 4, + .shape = SPRITE_SHAPE(32x8), + .size = SPRITE_SIZE(32x8), + .tileOffset = 16, + .priority = 3, + }, + { + .x = 0, + .y = 4, + .shape = SPRITE_SHAPE(32x8), + .size = SPRITE_SIZE(32x8), + .tileOffset = 20, + .priority = 3, + } +}; + +static const struct SubspriteTable gUnknown_085A80C0[] = +{ + ARRAY_COUNT(gUnknown_085A80A8), gUnknown_085A80A8 +}; + +static const struct Subsprite gUnknown_085A80C8[] = +{ + { + .x = -16, + .y = -16, + .shape = SPRITE_SHAPE(32x32), + .size = SPRITE_SIZE(32x32), + .tileOffset = 0, + .priority = 3, + } +}; + +static const struct Subsprite gUnknown_085A80CC[] = +{ + { + .x = -8, + .y = -8, + .shape = SPRITE_SHAPE(16x16), + .size = SPRITE_SIZE(16x16), + .tileOffset = 16, + .priority = 3, + } +}; + +static const struct SubspriteTable gUnknown_085A80D0[] = +{ + ARRAY_COUNT(gUnknown_085A80C8), gUnknown_085A80C8 +}; + +static const struct SubspriteTable gUnknown_085A80D8[] = +{ + ARRAY_COUNT(gUnknown_085A80CC), gUnknown_085A80CC +}; + +static const struct Subsprite gUnknown_085A80E0[] = +{ + { + .x = -24, + .y = -24, + .shape = SPRITE_SHAPE(32x8), + .size = SPRITE_SIZE(32x8), + .tileOffset = 0, + .priority = 3, + }, + { + .x = 8, + -24, + .shape = SPRITE_SHAPE(16x8), + .size = SPRITE_SIZE(16x8), + .tileOffset = 4, + .priority = 3, + }, + { + .x = -24, + .y = -16, + .shape = SPRITE_SHAPE(32x8), + .size = SPRITE_SIZE(32x8), + .tileOffset = 6, + .priority = 3, + }, + { + .x = 8, + .y = -16, + .shape = SPRITE_SHAPE(16x8), + .size = SPRITE_SIZE(16x8), + .tileOffset = 10, + .priority = 3, + }, + { + .x = -24, + .y = -8, + .shape = SPRITE_SHAPE(32x8), + .size = SPRITE_SIZE(32x8), + .tileOffset = 12, + .priority = 3, + }, + { + .x = 8, + .y = -8, + .shape = SPRITE_SHAPE(16x8), + .size = SPRITE_SIZE(16x8), + .tileOffset = 16, + .priority = 3, + }, + { + .x = -24, + .y = 0, + .shape = SPRITE_SHAPE(32x8), + .size = SPRITE_SIZE(32x8), + .tileOffset = 18, + .priority = 3, + }, + { + .x = 8, + .y = 0, + .shape = SPRITE_SHAPE(16x8), + .size = SPRITE_SIZE(16x8), + .tileOffset = 22, + .priority = 3, + }, + { + .x = -24, + .y = 8, + .shape = SPRITE_SHAPE(32x8), + .size = SPRITE_SIZE(32x8), + .tileOffset = 24, + .priority = 3, + }, + { + .x = 8, + .y = 8, + .shape = SPRITE_SHAPE(16x8), + .size = SPRITE_SIZE(16x8), + .tileOffset = 28, + .priority = 3, + }, + { + .x = -24, + .y = 16, + .shape = SPRITE_SHAPE(32x8), + .size = SPRITE_SIZE(32x8), + .tileOffset = 30, + .priority = 3, + }, + { + .x = 8, + .y = 16, + .shape = SPRITE_SHAPE(16x8), + .size = SPRITE_SIZE(16x8), + .tileOffset = 34, + .priority = 3, + } +}; + +static const struct SubspriteTable gUnknown_085A8110[] = +{ + ARRAY_COUNT(gUnknown_085A80E0), gUnknown_085A80E0 +}; + +static const struct Subsprite gUnknown_085A8118[] = +{ + { + .x = -16, + .y = -12, + .shape = SPRITE_SHAPE(32x16), + .size = SPRITE_SIZE(32x16), + .tileOffset = 0, + .priority = 3, + }, + { + .x = -16, + .y = 4, + .shape = SPRITE_SHAPE(16x8), + .size = SPRITE_SIZE(16x8), + .tileOffset = 8, + .priority = 3, + }, + { + .x = 0, + .y = 4, + .shape = SPRITE_SHAPE(16x8), + .size = SPRITE_SIZE(16x8), + .tileOffset = 10, + .priority = 3, + } +}; + +static const struct SubspriteTable gUnknown_085A8124[] = +{ + ARRAY_COUNT(gUnknown_085A8118), gUnknown_085A8118 +}; + +static const struct Subsprite gUnknown_085A812C[] = +{ + { + .x = -8, + .y = -8, + .shape = SPRITE_SHAPE(16x8), + .size = SPRITE_SIZE(16x8), + .tileOffset = 0, + .priority = 3, + }, + { + .x = -8, + .y = 0, + .shape = SPRITE_SHAPE(16x8), + .size = SPRITE_SIZE(16x8), + .tileOffset = 8, + .priority = 3, + } +}; + +static const struct SubspriteTable gUnknown_085A8134[] = +{ + ARRAY_COUNT(gUnknown_085A812C), gUnknown_085A812C +}; + +static const struct Subsprite gUnknown_085A813C[] = +{ + { + .x = -8, + .y = -8, + .shape = SPRITE_SHAPE(16x8), + .size = SPRITE_SIZE(16x8), + .tileOffset = 2, + .priority = 3, + }, + { + .x = -8, + .y = 0, + .shape = SPRITE_SHAPE(16x8), + .size = SPRITE_SIZE(16x8), + .tileOffset = 10, + .priority = 3, + } +}; + +static const struct SubspriteTable gUnknown_085A8144[] = +{ + ARRAY_COUNT(gUnknown_085A813C), gUnknown_085A813C +}; + +static const struct Subsprite gUnknown_085A814C[] = +{ + { + .x = -8, + .y = -8, + .shape = SPRITE_SHAPE(16x8), + .size = SPRITE_SIZE(16x8), + .tileOffset = 4, + .priority = 3, + }, + { + .x = -8, + .y = 0, + .shape = SPRITE_SHAPE(16x8), + .size = SPRITE_SIZE(16x8), + .tileOffset = 12, + .priority = 3, + } +}; + +static const struct SubspriteTable gUnknown_085A8154[] = +{ + ARRAY_COUNT(gUnknown_085A814C), gUnknown_085A814C +}; + +static const struct Subsprite gUnknown_085A815C[] = +{ + { + .x = -8, + .y = -8, + .shape = SPRITE_SHAPE(16x8), + .size = SPRITE_SIZE(16x8), + .tileOffset = 6, + .priority = 3, + }, + { + .x = -8, + .y = 0, + .shape = SPRITE_SHAPE(16x8), + .size = SPRITE_SIZE(16x8), + .tileOffset = 14, + .priority = 3, + } +}; + +static const struct SubspriteTable gUnknown_085A8164[] = +{ + ARRAY_COUNT(gUnknown_085A815C), gUnknown_085A815C +}; + +static const struct Subsprite gUnknown_085A816C[] = +{ + { + .x = -8, + .y = -8, + .shape = SPRITE_SHAPE(16x8), + .size = SPRITE_SIZE(16x8), + .tileOffset = 0, + .priority = 3, + }, + { + .x = -8, + .y = 0, + .shape = SPRITE_SHAPE(16x8), + .size = SPRITE_SIZE(16x8), + .tileOffset = 8, + .priority = 3, + } +}; + +static const struct SubspriteTable gUnknown_085A8174[] = +{ + ARRAY_COUNT(gUnknown_085A816C), gUnknown_085A816C +}; + +static const struct Subsprite gUnknown_085A817C[] = +{ + { + .x = -4, + .y = -8, + .shape = SPRITE_SHAPE(8x8), + .size = SPRITE_SIZE(8x8), + .tileOffset = 2, + .priority = 3, + }, + { + .x = -4, + .y = 0, + .shape = SPRITE_SHAPE(8x8), + .size = SPRITE_SIZE(8x8), + .tileOffset = 10, + .priority = 3, + } +}; + +static const struct SubspriteTable gUnknown_085A8184[] = +{ + ARRAY_COUNT(gUnknown_085A817C), gUnknown_085A817C +}; + +static const struct Subsprite gUnknown_085A818C[] = +{ + { + .x = -8, + .y = -8, + .shape = SPRITE_SHAPE(16x8), + .size = SPRITE_SIZE(16x8), + .tileOffset = 3, + .priority = 3, + }, + { + .x = -8, + .y = 0, + .shape = SPRITE_SHAPE(16x8), + .size = SPRITE_SIZE(16x8), + .tileOffset = 11, + .priority = 3, + } +}; + +static const struct SubspriteTable gUnknown_085A8194[] = +{ + ARRAY_COUNT(gUnknown_085A818C), gUnknown_085A818C +}; + +static const struct Subsprite gUnknown_085A819C[] = +{ + { + .x = -4, + .y = -8, + .shape = SPRITE_SHAPE(8x8), + .size = SPRITE_SIZE(8x8), + .tileOffset = 5, + .priority = 3, + }, + { + .x = -4, + .y = 0, + .shape = SPRITE_SHAPE(8x8), + .size = SPRITE_SIZE(8x8), + .tileOffset = 13, + .priority = 3, + } +}; + +static const struct SubspriteTable gUnknown_085A81A4[] = +{ + ARRAY_COUNT(gUnknown_085A819C), gUnknown_085A819C +}; + +static const struct Subsprite gUnknown_085A81AC[] = +{ + { + .x = -8, + .y = -8, + .shape = SPRITE_SHAPE(16x8), + .size = SPRITE_SIZE(16x8), + .tileOffset = 6, + .priority = 3, + }, + { + .x = -8, + .y = 0, + .shape = SPRITE_SHAPE(16x8), + .size = SPRITE_SIZE(16x8), + .tileOffset = 14, + .priority = 3, + } +}; + +static const struct SubspriteTable gUnknown_085A81B4[] = +{ + ARRAY_COUNT(gUnknown_085A81AC), gUnknown_085A81AC +}; + +static const struct Subsprite gUnknown_085A81BC[] = +{ + { + .x = -12, + .y = -12, + .shape = SPRITE_SHAPE(16x8), + .size = SPRITE_SIZE(16x8), + .tileOffset = 0, + .priority = 3, + }, + { + .x = 4, + .y = -12, + .shape = SPRITE_SHAPE(8x8), + .size = SPRITE_SIZE(8x8), + .tileOffset = 2, + .priority = 3, + }, + { + .x = -12, + .y = -4, + .shape = SPRITE_SHAPE(16x8), + .size = SPRITE_SIZE(16x8), + .tileOffset = 8, + .priority = 3, + }, + { + .x = 4, + .y = -4, + .shape = SPRITE_SHAPE(8x8), + .size = SPRITE_SIZE(8x8), + .tileOffset = 10, + .priority = 3, + }, + { + .x = -12, + .y = 4, + .shape = SPRITE_SHAPE(16x8), + .size = SPRITE_SIZE(16x8), + .tileOffset = 16, + .priority = 3, + }, + { + .x = 4, + .y = 4, + .shape = SPRITE_SHAPE(8x8), + .size = SPRITE_SIZE(8x8), + .tileOffset = 18, + .priority = 3, + } +}; + +static const struct SubspriteTable gUnknown_085A81D4[] = +{ + ARRAY_COUNT(gUnknown_085A81BC), gUnknown_085A81BC +}; + +static const struct Subsprite gUnknown_085A81DC[] = +{ + { + .x = -8, + .y = -12, + .shape = SPRITE_SHAPE(16x8), + .size = SPRITE_SIZE(16x8), + .tileOffset = 3, + .priority = 3, + }, + { + .x = -8, + .y = -4, + .shape = SPRITE_SHAPE(16x8), + .size = SPRITE_SIZE(16x8), + .tileOffset = 11, + .priority = 3, + }, + { + .x = -8, + .y = 4, + .shape = SPRITE_SHAPE(16x8), + .size = SPRITE_SIZE(16x8), + .tileOffset = 19, + .priority = 3, + } +}; + +static const struct SubspriteTable gUnknown_085A81E8[] = +{ + ARRAY_COUNT(gUnknown_085A81DC), gUnknown_085A81DC +}; + +static const struct Subsprite gUnknown_085A81F0[] = +{ + { + .x = -12, + .y = -12, + .shape = SPRITE_SHAPE(16x8), + .size = SPRITE_SIZE(16x8), + .tileOffset = 5, + .priority = 3, + }, + { + .x = 4, + .y = -12, + .shape = SPRITE_SHAPE(8x8), + .size = SPRITE_SIZE(8x8), + .tileOffset = 7, + .priority = 3, + }, + { + .x = -12, + .y = -4, + .shape = SPRITE_SHAPE(16x8), + .size = SPRITE_SIZE(16x8), + .tileOffset = 13, + .priority = 3, + }, + { + .x = 4, + .y = -4, + .shape = SPRITE_SHAPE(8x8), + .size = SPRITE_SIZE(8x8), + .tileOffset = 15, + .priority = 3, + }, + { + .x = -12, + .y = 4, + .shape = SPRITE_SHAPE(16x8), + .size = SPRITE_SIZE(16x8), + .tileOffset = 21, + .priority = 3, + }, + { + .x = 4, + .y = 4, + .shape = SPRITE_SHAPE(8x8), + .size = SPRITE_SIZE(8x8), + .tileOffset = 23, + .priority = 3, + } +}; + +static const struct SubspriteTable gUnknown_085A8208[] = +{ + ARRAY_COUNT(gUnknown_085A81F0), gUnknown_085A81F0 +}; + +static const struct Subsprite gUnknown_085A8210[] = +{ + { + .x = -12, + .y = -12, + .shape = SPRITE_SHAPE(16x8), + .size = SPRITE_SIZE(16x8), + .tileOffset = 0, + .priority = 3, + }, + { + .x = 4, + .y = -12, + .shape = SPRITE_SHAPE(8x8), + .size = SPRITE_SIZE(8x8), + .tileOffset = 2, + .priority = 3, + }, + { + .x = -12, + .y = -4, + .shape = SPRITE_SHAPE(16x8), + .size = SPRITE_SIZE(16x8), + .tileOffset = 8, + .priority = 3, + }, + { + .x = 4, + .y = -4, + .shape = SPRITE_SHAPE(8x8), + .size = SPRITE_SIZE(8x8), + .tileOffset = 10, + .priority = 3, + }, + { + .x = -12, + .y = 4, + .shape = SPRITE_SHAPE(16x8), + .size = SPRITE_SIZE(16x8), + .tileOffset = 16, + .priority = 3, + }, + { + .x = 4, + .y = 4, + .shape = SPRITE_SHAPE(8x8), + .size = SPRITE_SIZE(8x8), + .tileOffset = 18, + .priority = 3, + } +}; + +static const struct SubspriteTable gUnknown_085A8228[] = +{ + ARRAY_COUNT(gUnknown_085A8210), gUnknown_085A8210 +}; + +static const struct Subsprite gUnknown_085A822C[] = +{ + { + .x = -8, + .y = -12, + .shape = SPRITE_SHAPE(16x8), + .size = SPRITE_SIZE(16x8), + .tileOffset = 3, + .priority = 3, + }, + { + .x = -8, + .y = -4, + .shape = SPRITE_SHAPE(16x8), + .size = SPRITE_SIZE(16x8), + .tileOffset = 11, + .priority = 3, + }, + { + .x = -8, + .y = 4, + .shape = SPRITE_SHAPE(16x8), + .size = SPRITE_SIZE(16x8), + .tileOffset = 19, + .priority = 3, + } +}; + +static const struct SubspriteTable gUnknown_085A823C[] = +{ + ARRAY_COUNT(gUnknown_085A822C), gUnknown_085A822C +}; + +static const struct Subsprite gUnknown_085A8244[] = +{ + { + .x = -12, + .y = -12, + .shape = SPRITE_SHAPE(16x8), + .size = SPRITE_SIZE(16x8), + .tileOffset = 5, + .priority = 3, + }, + { + .x = 4, + .y = -12, + .shape = SPRITE_SHAPE(8x8), + .size = SPRITE_SIZE(8x8), + .tileOffset = 7, + .priority = 3, + }, + { + .x = -12, + .y = -4, + .shape = SPRITE_SHAPE(16x8), + .size = SPRITE_SIZE(16x8), + .tileOffset = 13, + .priority = 3, + }, + { + .x = 4, + .y = -4, + .shape = SPRITE_SHAPE(8x8), + .size = SPRITE_SIZE(8x8), + .tileOffset = 15, + .priority = 3, + }, + { + .x = -12, + .y = 4, + .shape = SPRITE_SHAPE(16x8), + .size = SPRITE_SIZE(16x8), + .tileOffset = 21, + .priority = 3, + }, + { + .x = 4, + .y = 4, + .shape = SPRITE_SHAPE(8x8), + .size = SPRITE_SIZE(8x8), + .tileOffset = 23, + .priority = 3, + } +}; + +static const struct SubspriteTable gUnknown_085A825C[] = +{ + ARRAY_COUNT(gUnknown_085A8244), gUnknown_085A8244 +}; + +static const struct SpriteTemplate *const gUnknown_083EDB5C[] = +{ + &gUnknown_085A7E48, + &gUnknown_085A7E60, + &gUnknown_085A7E78, + &gUnknown_085A7EA8, + &gUnknown_085A7EC0, + &gUnknown_085A7F20, + &gUnknown_085A7F38, + &gUnknown_085A7F50, + &gUnknown_085A7F68, + &gUnknown_085A7F80, + &gUnknown_085A7E90, + &gUnknown_085A7E90, + &gUnknown_085A7E90, + &gUnknown_085A7E90, + &gUnknown_085A7ED8, + &gUnknown_085A7ED8, + &gUnknown_085A7ED8, + &gUnknown_085A7ED8, + &gUnknown_085A7ED8, + &gUnknown_085A7EF0, + &gUnknown_085A7EF0, + &gUnknown_085A7EF0, + &gUnknown_085A7F08, + &gUnknown_085A7F08, + &gUnknown_085A7F08, + &gDummySpriteTemplate +}; + +static const struct SubspriteTable *const gUnknown_083EDBC4[] = +{ + gUnknown_085A8058, + gUnknown_085A8070, + gUnknown_085A8088, + gUnknown_085A80C0, + NULL, + NULL, + gUnknown_085A80D0, + NULL, + gUnknown_085A8110, + gUnknown_085A8124, + gUnknown_085A8134, + gUnknown_085A8144, + gUnknown_085A8154, + gUnknown_085A8164, + gUnknown_085A8174, + gUnknown_085A8184, + gUnknown_085A8194, + gUnknown_085A81A4, + gUnknown_085A81B4, + gUnknown_085A81D4, + gUnknown_085A81E8, + gUnknown_085A8208, + gUnknown_085A8228, + gUnknown_085A823C, + gUnknown_085A825C, + NULL +}; + +static const struct SpriteSheet gSlotMachineSpriteSheets[] = +{ + { .data = gSlotMachineReelSymbol1Tiles, .size = 0x200, .tag = 0 }, + { .data = gSlotMachineReelSymbol2Tiles, .size = 0x200, .tag = 1 }, + { .data = gSlotMachineReelSymbol3Tiles, .size = 0x200, .tag = 2 }, + { .data = gSlotMachineReelSymbol4Tiles, .size = 0x200, .tag = 3 }, + { .data = gSlotMachineReelSymbol5Tiles, .size = 0x200, .tag = 4 }, + { .data = gSlotMachineReelSymbol6Tiles, .size = 0x200, .tag = 5 }, + { .data = gSlotMachineReelSymbol7Tiles, .size = 0x200, .tag = 6 }, + { .data = gSlotMachineNumber0Tiles, .size = 0x40, .tag = 7 }, + { .data = gSlotMachineNumber1Tiles, .size = 0x40, .tag = 8 }, + { .data = gSlotMachineNumber2Tiles, .size = 0x40, .tag = 9 }, + { .data = gSlotMachineNumber3Tiles, .size = 0x40, .tag = 10 }, + { .data = gSlotMachineNumber4Tiles, .size = 0x40, .tag = 11 }, + { .data = gSlotMachineNumber5Tiles, .size = 0x40, .tag = 12 }, + { .data = gSlotMachineNumber6Tiles, .size = 0x40, .tag = 13 }, + { .data = gSlotMachineNumber7Tiles, .size = 0x40, .tag = 14 }, + { .data = gSlotMachineNumber8Tiles, .size = 0x40, .tag = 15 }, + { .data = gSlotMachineNumber9Tiles, .size = 0x40, .tag = 16 }, +}; + +static const u8 sUnused1[][8] = +{ + {0, 0, 0, 0, 0, 2, 18}, + {0, 0, 0, 0, 0, 2, 19}, + {0, 0, 0, 0, 0, 3, 20}, + {0, 0, 0, 0, 0, 3, 21}, + {0, 0, 0, 0, 0, 0, 0} +}; + +static const u8 *const gUnknown_083EDCDC = gUnknown_08DD19F8; + +static const u8 sUnused2[][2] = +{ + {0x7B, 0x6F}, + {0x68, 0x69}, + {0xAB, 0x36}, + {0xFF, 0x7F}, + {0x50, 0x57}, + {0xC0, 0x7E}, + {0xBA, 2}, + {0xBA, 2}, + {0xFD, 1}, + {0xFD, 1} +}; + +static const u8 gUnknown_085A83FC[] = {0x91, 0x7F}; +static const u8 gUnknown_085A83FE[] = {0xBF, 0x43}; +static const u8 gUnknown_085A8400[] = {0xBF, 0x43}; +static const u8 gUnknown_085A8402[] = {0xBF, 0x4A}; +static const u8 gUnknown_085A8404[] = {0xBF, 0x4A}; + +static const u8 *const gUnknown_083EDD08[] = +{ + gUnknown_085A83FC, + gUnknown_085A83FE, + gUnknown_085A8400, + gUnknown_085A8402, + gUnknown_085A8404, +}; + +static const u16 *const gUnknown_083EDD1C[] = +{ + gSlotMachineMenu_Pal + 0x4A, + gSlotMachineMenu_Pal + 0x4B, + gSlotMachineMenu_Pal + 0x4C, + gSlotMachineMenu_Pal + 0x4D, + gSlotMachineMenu_Pal + 0x4E, +}; + +static const u8 gUnknown_083EDD30[] = {0x4A, 0x4B, 0x4C, 0x4E, 0x4D}; + +static const u8 gBettingTilesId[][2] = +{ + {0, 0}, + {1, 2}, + {3, 4}, +}; + +static const u8 gNumberBettingTiles[] = { 1, 2, 2 }; + +static const u16 gUnknown_085A843E[] = INCBIN_U16("graphics/slot_machine/85A843E.gbapal"); +static const u16 gUnknown_085A845E[] = INCBIN_U16("graphics/slot_machine/85A845E.gbapal"); +static const u16 gUnknown_085A847E[] = INCBIN_U16("graphics/slot_machine/85A847E.gbapal"); + +static const u16 *const gUnknown_083EDDA0[] = +{ + gUnknown_085A843E, + gUnknown_085A845E, + gUnknown_085A847E, +}; + +static const u16 *const gUnknown_083EDDAC = {gSlotMachineMenu_Pal + 0x10}; + +static const u16 gUnknown_085A84B0[] = INCBIN_U16("graphics/slot_machine/85A84B0.gbapal"); +static const u16 gUnknown_085A84D0[] = INCBIN_U16("graphics/slot_machine/85A84D0.gbapal"); +static const u16 gUnknown_085A84F0[] = INCBIN_U16("graphics/slot_machine/85A84F0.gbapal"); + +static const u16 *const gUnknown_083EDE10[] = +{ + gUnknown_085A84B0, + gUnknown_085A84D0, + gUnknown_085A84F0, + gUnknown_08DCF230, +}; + +static const u16 *const gUnknown_083EDE20 = gUnknown_08DCF230; +static const u16 gPalette_83EDE24[] = INCBIN_U16("graphics/slot_machine/85A8524.bin"); + +static const struct SpritePalette gSlotMachineSpritePalettes[] = +{ + { .data = gUnknown_08DCF170, .tag = 0}, + { .data = gUnknown_08DCF190, .tag = 1}, + { .data = gUnknown_08DCF1B0, .tag = 2}, + { .data = gSlotMachineReelTime_Pal, .tag = 3}, + { .data = gUnknown_08DCF1F0, .tag = 4}, + { .data = gUnknown_08DCF210, .tag = 5}, + { .data = gUnknown_08DCF230, .tag = 6}, + { .data = gUnknown_08DCF1F0, .tag = 7}, + {} +}; + +static const u32 gReelTimeGfx[] = INCBIN_U32("graphics/slot_machine/reel_time_gfx.4bpp.lz"); +static const u16 gReelTimeWindowTilemap[] = INCBIN_U16("graphics/slot_machine/85A96E0.bin"); +static const u16 gUnknown_085A9898[] = {0}; -- cgit v1.2.3