diff options
author | PikalaxALT <PikalaxALT@users.noreply.github.com> | 2019-07-08 08:07:53 -0400 |
---|---|---|
committer | GitHub <noreply@github.com> | 2019-07-08 08:07:53 -0400 |
commit | 39d68ebd445be5657a916dec1b4872717e9c40d3 (patch) | |
tree | 4394601f49f220e3c32d9879a3c26284c9c92771 /src | |
parent | 7980c4aa071685983f84861cc7dc69d6daf30a90 (diff) | |
parent | 122f1395823cfa3dfd96842c61411ad29700f8de (diff) |
Merge pull request #77 from jiangzhengwenjz/misc
corrected sprite.h + finished safari_zone, list_menu, menu_indicators, field_poison, buy_menu_helpers, dynamic_placeholder_text_util
Diffstat (limited to 'src')
-rw-r--r-- | src/buy_menu_helpers.c | 216 | ||||
-rw-r--r-- | src/daycare.c | 6 | ||||
-rw-r--r-- | src/dynamic_placeholder_text_util.c | 70 | ||||
-rw-r--r-- | src/fame_checker.c | 6 | ||||
-rw-r--r-- | src/field_poison.c | 117 | ||||
-rw-r--r-- | src/intro.c | 24 | ||||
-rw-r--r-- | src/item_pc.c | 14 | ||||
-rw-r--r-- | src/list_menu.c | 786 | ||||
-rw-r--r-- | src/menu_indicators.c | 659 | ||||
-rw-r--r-- | src/mevent_8145654.c | 2 | ||||
-rw-r--r-- | src/pokemon.c | 4 | ||||
-rw-r--r-- | src/quest_log.c | 206 | ||||
-rw-r--r-- | src/safari_zone.c | 80 | ||||
-rw-r--r-- | src/scrcmd.c | 2 | ||||
-rw-r--r-- | src/seagallop.c | 4 | ||||
-rw-r--r-- | src/teachy_tv.c | 4 | ||||
-rw-r--r-- | src/text.c | 4 | ||||
-rw-r--r-- | src/tm_case.c | 24 | ||||
-rw-r--r-- | src/trainer_tower.c | 2 | ||||
-rw-r--r-- | src/wireless_communication_status_screen.c | 6 |
20 files changed, 2082 insertions, 154 deletions
diff --git a/src/buy_menu_helpers.c b/src/buy_menu_helpers.c new file mode 100644 index 000000000..4febb8209 --- /dev/null +++ b/src/buy_menu_helpers.c @@ -0,0 +1,216 @@ +#include "global.h" +#include "task.h" +#include "text.h" +#include "window.h" +#include "text_window.h" +#include "money.h" +#include "menu_helpers.h" +#include "new_menu_helpers.h" +#include "menu.h" +#include "shop.h" + +static const struct WindowTemplate sShopBuyMenuWindowTemplatesNormal[] = +{ + { + .bg = 0x0, + .tilemapLeft = 0x1, + .tilemapTop = 0x1, + .width = 0x8, + .height = 0x3, + .paletteNum = 0xF, + .baseBlock = 0x27, + }, + { + .bg = 0x0, + .tilemapLeft = 0x1, + .tilemapTop = 0xB, + .width = 0xD, + .height = 0x2, + .paletteNum = 0xF, + .baseBlock = 0x3F, + }, + { + .bg = 0x0, + .tilemapLeft = 0x2, + .tilemapTop = 0xF, + .width = 0x1A, + .height = 0x4, + .paletteNum = 0xE, + .baseBlock = 0x59, + }, + { + .bg = 0x0, + .tilemapLeft = 0x11, + .tilemapTop = 0x9, + .width = 0xC, + .height = 0x4, + .paletteNum = 0xE, + .baseBlock = 0xC1, + }, + { + .bg = 0x0, + .tilemapLeft = 0xB, + .tilemapTop = 0x1, + .width = 0x11, + .height = 0xC, + .paletteNum = 0xE, + .baseBlock = 0xF1, + }, + { + .bg = 0x0, + .tilemapLeft = 0x5, + .tilemapTop = 0xE, + .width = 0x19, + .height = 0x6, + .paletteNum = 0xF, + .baseBlock = 0x1BD, + }, + DUMMY_WIN_TEMPLATE, +}; + +// firered uses different layout when selling TMs +static const struct WindowTemplate sShopBuyMenuWindowTemplatesTM[] = +{ + { + .bg = 0x0, + .tilemapLeft = 0x1, + .tilemapTop = 0x1, + .width = 0x8, + .height = 0x3, + .paletteNum = 0xF, + .baseBlock = 0x27, + }, + { + .bg = 0x0, + .tilemapLeft = 0x1, + .tilemapTop = 0xB, + .width = 0xD, + .height = 0x2, + .paletteNum = 0xF, + .baseBlock = 0x3F, + }, + { + .bg = 0x0, + .tilemapLeft = 0x2, + .tilemapTop = 0xF, + .width = 0x1A, + .height = 0x4, + .paletteNum = 0xE, + .baseBlock = 0x59, + }, + { + .bg = 0x0, + .tilemapLeft = 0x11, + .tilemapTop = 0x9, + .width = 0xC, + .height = 0x4, + .paletteNum = 0xE, + .baseBlock = 0xC1, + }, + { + .bg = 0x0, + .tilemapLeft = 0xB, + .tilemapTop = 0x1, + .width = 0x11, + .height = 0xA, + .paletteNum = 0xE, + .baseBlock = 0xF1, + }, + { + .bg = 0x0, + .tilemapLeft = 0xC, + .tilemapTop = 0xC, + .width = 0x12, + .height = 0x8, + .paletteNum = 0xE, + .baseBlock = 0x19B, + }, + { + .bg = 0x0, + .tilemapLeft = 0x1, + .tilemapTop = 0xE, + .width = 0xA, + .height = 0x4, + .paletteNum = 0xE, + .baseBlock = 0x22B, + }, + DUMMY_WIN_TEMPLATE, +}; + +static const struct WindowTemplate sShopBuyMenuYesNoWindowTemplate = +{ + .bg = 0x0, + .tilemapLeft = 0x15, + .tilemapTop = 0x9, + .width = 0x6, + .height = 0x4, + .paletteNum = 0xE, + .baseBlock = 0xC1, +}; + +static const struct TextColor sShopBuyMenuTextColors[] = +{ + { + .fgColor = 0, + .bgColor = 1, + .shadowColor = 2, + }, + { + .fgColor = 0, + .bgColor = 2, + .shadowColor = 3, + }, + { + .fgColor = 0, + .bgColor = 3, + .shadowColor = 2, + }, +}; + +void BuyMenuInitWindows(bool32 isSellingTM) +{ + if (isSellingTM != TRUE) + InitWindows(sShopBuyMenuWindowTemplatesNormal); + else + InitWindows(sShopBuyMenuWindowTemplatesTM); + DeactivateAllTextPrinters(); + TextWindow_SetUserSelectedFrame(0, 0x1, 0xD0); + TextWindow_LoadResourcesStdFrame0(0, 0x13, 0xE0); + TextWindow_SetStdFrame0_WithPal(0, 0xA, 0xF0); + PutWindowTilemap(0); + PutWindowTilemap(4); + PutWindowTilemap(5); + if (isSellingTM == TRUE) + PutWindowTilemap(6); +} + +void BuyMenuDrawMoneyBox(void) +{ + PrintMoneyAmountInMoneyBoxWithBorder(0, 0xA, 0xF, GetMoney(&gSaveBlock1Ptr->money)); +} + +void BuyMenuPrint(u8 windowId, u8 font, const u8 *text, u8 x, u8 y, u8 letterSpacing, u8 lineSpacing, s8 speed, u8 color) +{ + AddTextPrinterParameterized4(windowId, font, x, y, letterSpacing, lineSpacing, &sShopBuyMenuTextColors[color], speed, text); +} + +void BuyMenuDisplayMessage(u8 taskId, const u8 *text, TaskFunc callback) +{ + DisplayMessageAndContinueTask(taskId, 2, 0x13, 0xE, sub_809B56C(), GetTextSpeedSetting(), text, callback); + ScheduleBgCopyTilemapToVram(0); +} + +void BuyMenuQuantityBoxNormalBorder(u8 windowId, bool8 copyToVram) +{ + SetWindowBorderStyle(windowId, copyToVram, 0x1, 0xD); +} + +void BuyMenuQuantityBoxThinBorder(u8 windowId, bool8 copyToVram) +{ + SetWindowBorderStyle(windowId, copyToVram, 0xA, 0xF); +} + +void BuyMenuConfirmPurchase(u8 taskId, const struct YesNoFuncTable *yesNo) +{ + CreateYesNoMenuWithCallbacks(taskId, &sShopBuyMenuYesNoWindowTemplate, 2, 0, 2, 1, 0xD, yesNo); +} diff --git a/src/daycare.c b/src/daycare.c index 7a2cb0698..abc3b23ca 100644 --- a/src/daycare.c +++ b/src/daycare.c @@ -1533,7 +1533,7 @@ static void DaycarePrintMonInfo(u8 windowId, s32 daycareSlotId, u8 y) static void Task_HandleDaycareLevelMenuInput(u8 taskId) { - u32 input = ListMenuHandleInput(gTasks[taskId].tMenuListTaskId); + u32 input = ListMenu_ProcessInput(gTasks[taskId].tMenuListTaskId); if (gMain.newKeys & A_BUTTON) { @@ -1547,7 +1547,7 @@ static void Task_HandleDaycareLevelMenuInput(u8 taskId) gSpecialVar_Result = 2; break; } - DestroyListMenu(gTasks[taskId].tMenuListTaskId, NULL, NULL); + DestroyListMenuTask(gTasks[taskId].tMenuListTaskId, NULL, NULL); ClearStdWindowAndFrame(gTasks[taskId].tWindowId, TRUE); RemoveWindow(gTasks[taskId].tWindowId); DestroyTask(taskId); @@ -1556,7 +1556,7 @@ static void Task_HandleDaycareLevelMenuInput(u8 taskId) else if (gMain.newKeys & B_BUTTON) { gSpecialVar_Result = 2; - DestroyListMenu(gTasks[taskId].tMenuListTaskId, NULL, NULL); + DestroyListMenuTask(gTasks[taskId].tMenuListTaskId, NULL, NULL); ClearStdWindowAndFrame(gTasks[taskId].tWindowId, TRUE); RemoveWindow(gTasks[taskId].tWindowId); DestroyTask(taskId); diff --git a/src/dynamic_placeholder_text_util.c b/src/dynamic_placeholder_text_util.c new file mode 100644 index 000000000..6909fea30 --- /dev/null +++ b/src/dynamic_placeholder_text_util.c @@ -0,0 +1,70 @@ +#include "global.h" +#include "text.h" +#include "dynamic_placeholder_text_util.h" +#include "string_util.h" + +static EWRAM_DATA const u8 *sStringPointers[8] = {0}; + +static const u8 sTextColorTable[] = +{ + 0, 0, 0, 16, 17, 17, 17, 16, 16, 0, 0, 17, 1, 0, 17, 16, + 0, 16, 16, 0, 1, 1, 1, 1, 1, 1, 0, 0, 0, 1, 0, 0, + 17, 1, 0, 0, 0, 16, 17, 0, 16, 16, 16, 0, 1, 0, 51, 51, + 51, 51, 51, 51, 51, 51, 35, 34, 34, 34, 34, 34, 34, 34, 34, 34, + 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 50, +}; + +void DynamicPlaceholderTextUtil_Reset(void) +{ + const u8 **ptr = sStringPointers; + u8 *fillval = NULL; + const u8 **ptr2 = ptr + (NELEMS(sStringPointers) - 1); + + do + { + *ptr2-- = fillval; + } + while ((intptr_t)ptr2 >= (intptr_t)ptr); +} + +void DynamicPlaceholderTextUtil_SetPlaceholderPtr(u8 idx, const u8 *ptr) +{ + if (idx < NELEMS(sStringPointers)) + sStringPointers[idx] = ptr; +} + +u8 *DynamicPlaceholderTextUtil_ExpandPlaceholders(u8 *dest, const u8 *src) +{ + while (*src != EOS) + { + if (*src != CHAR_SPECIAL_F7) + { + *dest++ = *src++; + } + else + { + src++; + if (sStringPointers[*src] != NULL) + dest = StringCopy(dest, sStringPointers[*src]); + src++; + } + } + *dest = EOS; + return dest; +} + +const u8 *DynamicPlaceholderTextUtil_GetPlaceholderPtr(u8 idx) +{ + return sStringPointers[idx]; +} + +u8 GetColorFromTextColorTable(u16 graphicId) +{ + u32 test = graphicId >> 1; + u32 shift = (graphicId & 1) << 2; + + if (test > 0x4B) + return 3; + else + return (sTextColorTable[graphicId >> 1] >> shift) & 0xF; +} diff --git a/src/fame_checker.c b/src/fame_checker.c index bf99bdf56..aa1684981 100644 --- a/src/fame_checker.c +++ b/src/fame_checker.c @@ -580,7 +580,7 @@ static void Task_TopMenuHandleInput(u8 taskId) } else if (JOY_NEW(A_BUTTON)) { - cursorPos = ListMenuHandleInput(0); + cursorPos = ListMenu_ProcessInput(0); if (cursorPos == sFameCheckerData->numUnlockedPersons - 1) // CANCEL task->func = Task_StartToCloseFameChecker; else if (sFameCheckerData->inPickMode) @@ -615,7 +615,7 @@ static void Task_TopMenuHandleInput(u8 taskId) task->func = Task_StartToCloseFameChecker; } else - ListMenuHandleInput(0); + ListMenu_ProcessInput(0); } } @@ -853,7 +853,7 @@ static void Task_DestroyAssetsAndCloseFameChecker(u8 taskId) FreeQuestionMarkSpriteResources(); FreeListMenuSelectorArrowPairResources(); SetMainCallback2(sFameCheckerData->savedCallback); - DestroyListMenu(sFameCheckerData->listMenuTaskId, NULL, NULL); + DestroyListMenuTask(sFameCheckerData->listMenuTaskId, NULL, NULL); Free(sBg3TilemapBuffer); Free(sBg1TilemapBuffer); Free(sBg2TilemapBuffer); diff --git a/src/field_poison.c b/src/field_poison.c new file mode 100644 index 000000000..474fbcd69 --- /dev/null +++ b/src/field_poison.c @@ -0,0 +1,117 @@ +#include "global.h" +#include "strings.h" +#include "task.h" +#include "field_message_box.h" +#include "script.h" +#include "string_util.h" +#include "event_data.h" +#include "fldeff.h" +#include "party_menu.h" +#include "field_poison.h" +#include "constants/species.h" +#include "constants/battle.h" + +static bool32 IsMonValidSpecies(struct Pokemon *pokemon) +{ + u16 species = GetMonData(pokemon, MON_DATA_SPECIES2); + if (species == SPECIES_NONE || species == SPECIES_EGG) + return FALSE; + return TRUE; +} + +static bool32 AllMonsFainted(void) +{ + int i; + + struct Pokemon *pokemon = gPlayerParty; + for (i = 0; i < PARTY_SIZE; i++, pokemon++) + if (IsMonValidSpecies(pokemon) && GetMonData(pokemon, MON_DATA_HP)) + return FALSE; + return TRUE; +} + +static void FaintFromFieldPoison(u8 partyIdx) +{ + struct Pokemon *pokemon = gPlayerParty + partyIdx; + u32 status = STATUS1_NONE; + AdjustFriendship(pokemon, 8); + SetMonData(pokemon, MON_DATA_STATUS, &status); + GetMonData(pokemon, MON_DATA_NICKNAME, gStringVar1); + StringGetEnd10(gStringVar1); +} + +static bool32 MonFaintedFromPoison(u8 partyIdx) +{ + struct Pokemon *pokemon = gPlayerParty + partyIdx; + if (IsMonValidSpecies(pokemon) && !GetMonData(pokemon, MON_DATA_HP) && pokemon_ailments_get_primary(GetMonData(pokemon, MON_DATA_STATUS)) == AILMENT_PSN) + return TRUE; + return FALSE; +} + +static void Task_WhiteOut(u8 taskId) +{ + s16 *data = gTasks[taskId].data; + switch (data[0]) + { + case 0: + for (; data[1] < PARTY_SIZE; data[1]++) + { + if (MonFaintedFromPoison(data[1])) + { + FaintFromFieldPoison(data[1]); + ShowFieldMessage(gText_PkmnFainted3); + data[0]++; + return; + } + } + data[0] = 2; + break; + case 1: + if (IsFieldMessageBoxHidden()) + data[0]--; + break; + case 2: + if (AllMonsFainted()) + gSpecialVar_Result = 1; + else + gSpecialVar_Result = 0; + EnableBothScriptContexts(); + DestroyTask(taskId); + break; + } +} + +void ExecuteWhiteOut(void) +{ + CreateTask(Task_WhiteOut, 80); + ScriptContext1_Stop(); +} + +s32 DoPoisonFieldEffect(void) +{ + int i; + u32 hp; + + struct Pokemon *pokemon = gPlayerParty; + u32 numPoisoned = 0; + u32 numFainted = 0; + for (i = 0; i < PARTY_SIZE; i++) + { + if (GetMonData(pokemon, MON_DATA_SANITY_HAS_SPECIES) && pokemon_ailments_get_primary(GetMonData(pokemon, MON_DATA_STATUS)) == AILMENT_PSN) + { + hp = GetMonData(pokemon, MON_DATA_HP); + if (hp == 0 || --hp == 0) + numFainted++; + SetMonData(pokemon, MON_DATA_HP, &hp); + numPoisoned++; + } + pokemon++; + } + if (numFainted || numPoisoned) + FldEffPoison_Start(); + if (numFainted) + return FLDPSN_FNT; + if (numPoisoned) + return FLDPSN_PSN; + return FLDPSN_NONE; +} diff --git a/src/intro.c b/src/intro.c index 0ebf71a8d..bb7242f2f 100644 --- a/src/intro.c +++ b/src/intro.c @@ -142,13 +142,13 @@ static const u8 gUnknown_8402650[] = INCBIN_U8("graphics/intro/unk_8402650.4bpp. static const u8 gUnknown_8402668[] = INCBIN_U8("graphics/intro/unk_8402668.bin.lz"); static const u16 gUnknown_840270C[] = INCBIN_U16("graphics/intro/unk_840270C.gbapal"); static const u8 gUnknown_840272C[] = INCBIN_U8("graphics/intro/unk_840272C.4bpp.lz"); -static const u8 gUnknown_84028F8[] = INCBIN_U8("graphics/intro/unk_84028F8.bin.lz"); +static const u32 gUnknown_84028F8[] = INCBIN_U32("graphics/intro/unk_84028F8.bin.lz"); static const u16 gUnknown_8402A44[] = INCBIN_U16("graphics/intro/unk_8402A64.gbapal"); -static const u8 gUnknown_8402A64[] = INCBIN_U8("graphics/intro/unk_8402A64.4bpp.lz"); +static const u32 gUnknown_8402A64[] = INCBIN_U32("graphics/intro/unk_8402A64.4bpp.lz"); static const u16 gUnknown_8402ABC[] = INCBIN_U16("graphics/intro/unk_8402ADC.gbapal"); -static const u8 gUnknown_8402ADC[] = INCBIN_U8("graphics/intro/unk_8402ADC.4bpp.lz"); -static const u8 gUnknown_8402B2C[] = INCBIN_U8("graphics/intro/unk_8402B2C.4bpp.lz"); -static const u8 gUnknown_8402CD4[] = INCBIN_U8("graphics/intro/unk_8402CD4.4bpp.lz"); +static const u32 gUnknown_8402ADC[] = INCBIN_U32("graphics/intro/unk_8402ADC.4bpp.lz"); +static const u32 gUnknown_8402B2C[] = INCBIN_U32("graphics/intro/unk_8402B2C.4bpp.lz"); +static const u32 gUnknown_8402CD4[] = INCBIN_U32("graphics/intro/unk_8402CD4.4bpp.lz"); static const u16 gUnknown_8402D34[] = INCBIN_U16("graphics/intro/unk_8402D34.gbapal"); static const u8 gUnknown_8402D54[] = INCBIN_U8("graphics/intro/unk_8402D54.4bpp.lz"); static const u8 gUnknown_8403FE8[] = INCBIN_U8("graphics/intro/unk_8403FE8.bin.lz"); @@ -172,17 +172,17 @@ static const u8 gUnknown_8407470[] = INCBIN_U8("graphics/intro/unk_8407470.4bpp. static const u8 gUnknown_8407A50[] = INCBIN_U8("graphics/intro/unk_8407A50.bin.lz"); static const u8 gUnknown_8407B9C[] = INCBIN_U8("graphics/intro/unk_8407B9C.4bpp.lz"); static const u8 gUnknown_8408D98[] = INCBIN_U8("graphics/intro/unk_8408D98.bin.lz"); -static const u8 gUnknown_840926C[] = INCBIN_U8("graphics/intro/unk_840926C.4bpp.lz"); +static const u32 gUnknown_840926C[] = INCBIN_U32("graphics/intro/unk_840926C.4bpp.lz"); static const u16 gUnknown_84096AC[] = INCBIN_U16("graphics/intro/unk_84096AC.gbapal"); -static const u8 gUnknown_84096CC[] = INCBIN_U8("graphics/intro/unk_84096CC.4bpp.lz"); +static const u32 gUnknown_84096CC[] = INCBIN_U32("graphics/intro/unk_84096CC.4bpp.lz"); static const u16 gUnknown_8409A1C[] = INCBIN_U16("graphics/intro/unk_8409A1C.gbapal"); -static const u8 gUnknown_8409A3C[] = INCBIN_U8("graphics/intro/unk_8409A3C.4bpp.lz"); -static const u8 gUnknown_8409D20[] = INCBIN_U8("graphics/intro/unk_8409D20.4bpp.lz"); -static const u8 gUnknown_840A3E4[] = INCBIN_U8("graphics/intro/unk_840A3E4.4bpp.lz"); +static const u32 gUnknown_8409A3C[] = INCBIN_U32("graphics/intro/unk_8409A3C.4bpp.lz"); +static const u32 gUnknown_8409D20[] = INCBIN_U32("graphics/intro/unk_8409D20.4bpp.lz"); +static const u32 gUnknown_840A3E4[] = INCBIN_U32("graphics/intro/unk_840A3E4.4bpp.lz"); static const u16 gUnknown_840B834[] = INCBIN_U16("graphics/intro/unk_840B834.gbapal"); static const u16 gUnknown_840B854[] = INCBIN_U16("graphics/intro/unk_840B854.gbapal"); -static const u8 gUnknown_840B874[] = INCBIN_U8("graphics/intro/unk_840B874.4bpp.lz"); -static const u8 gUnknown_840BAE0[] = INCBIN_U8("graphics/intro/unk_840BAE0.4bpp.lz"); +static const u32 gUnknown_840B874[] = INCBIN_U32("graphics/intro/unk_840B874.4bpp.lz"); +static const u32 gUnknown_840BAE0[] = INCBIN_U32("graphics/intro/unk_840BAE0.4bpp.lz"); static const struct BgTemplate gUnknown_840BB80[] = { { 3, 3, 31, 0, 0, 3, 0x000 }, diff --git a/src/item_pc.c b/src/item_pc.c index 2d30416c9..abafaa8d9 100644 --- a/src/item_pc.c +++ b/src/item_pc.c @@ -653,7 +653,7 @@ static void Task_ItemPcTurnOff2(u8 taskId) if (!gPaletteFade.active && !sub_80A0AAC()) { - DestroyListMenu(data[0], &sListMenuState.scroll, &sListMenuState.row); + DestroyListMenuTask(data[0], &sListMenuState.scroll, &sListMenuState.row); if (sStateDataPtr->savedCallback != NULL) SetMainCallback2(sStateDataPtr->savedCallback); else @@ -737,7 +737,7 @@ static void Task_ItemPcMain(u8 taskId) return; } } - input = ListMenuHandleInput(data[0]); + input = ListMenu_ProcessInput(data[0]); ListMenuGetScrollAndRow(data[0], &sListMenuState.scroll, &sListMenuState.row); switch (input) { @@ -772,7 +772,7 @@ static void ItemPc_MoveItemModeInit(u8 taskId, s16 pos) { s16 * data = gTasks[taskId].data; - sub_8107BD0(data[0], 16, 1); + ListMenuSetUnkIndicatorsStructField(data[0], 16, 1); data[1] = pos; sStateDataPtr->moveModeOrigPos = pos; StringCopy(gStringVar1, ItemId_GetName(ItemPc_GetItemIdBySlotId(data[1]))); @@ -789,7 +789,7 @@ static void Task_ItemPcMoveItemModeRun(u8 taskId) { s16 * data = gTasks[taskId].data; - ListMenuHandleInput(data[0]); + ListMenu_ProcessInput(data[0]); ListMenuGetScrollAndRow(data[0], &sListMenuState.scroll, &sListMenuState.row); sub_80986A8(-32, ListMenuGetYCoordForPrintingArrowCursor(data[0])); if (JOY_NEW(A_BUTTON | SELECT_BUTTON)) @@ -814,7 +814,7 @@ static void ItemPc_InsertItemIntoNewSlot(u8 taskId, u32 pos) else { ItemMenu_MoveItemSlotToNewPositionInArray(gSaveBlock1Ptr->pcItems, data[1], pos); - DestroyListMenu(data[0], &sListMenuState.scroll, &sListMenuState.row); + DestroyListMenuTask(data[0], &sListMenuState.scroll, &sListMenuState.row); if (data[1] < pos) sListMenuState.row--; ItemPc_BuildListMenuTemplate(); @@ -828,7 +828,7 @@ static void ItemPc_MoveItemModeCancel(u8 taskId, u32 pos) { s16 * data = gTasks[taskId].data; - DestroyListMenu(data[0], &sListMenuState.scroll, &sListMenuState.row); + DestroyListMenuTask(data[0], &sListMenuState.scroll, &sListMenuState.row); if (data[1] < pos) sListMenuState.row--; ItemPc_BuildListMenuTemplate(); @@ -947,7 +947,7 @@ static void Task_ItemPcCleanUpWithdraw(u8 taskId) ItemPc_DestroySubwindow(2); PutWindowTilemap(1); - DestroyListMenu(data[0], &sListMenuState.scroll, &sListMenuState.row); + DestroyListMenuTask(data[0], &sListMenuState.scroll, &sListMenuState.row); ItemPc_CountPcItems(); ItemPc_SetCursorPosition(); ItemPc_BuildListMenuTemplate(); diff --git a/src/list_menu.c b/src/list_menu.c new file mode 100644 index 000000000..5f2bd02b3 --- /dev/null +++ b/src/list_menu.c @@ -0,0 +1,786 @@ +#include "global.h" +#include "menu.h" +#include "list_menu.h" +#include "menu_indicators.h" +#include "new_menu_helpers.h" +#include "window.h" +#include "text_window.h" +#include "main.h" +#include "task.h" +#include "graphics.h" +#include "decompress.h" +#include "palette.h" +#include "malloc.h" +#include "strings.h" +#include "sound.h" +#include "pokemon_icon.h" +#include "constants/songs.h" + +struct UnkIndicatorsStruct +{ + u8 field_0; + u16 *field_4; + u16 field_8; + u16 field_A; + u16 field_C; + u16 field_E; + u8 field_10; + u8 field_11; + u8 field_12; + u8 field_13; + u8 field_14_0:4; + u8 field_14_1:4; + u8 field_15_0:4; + u8 field_15_1:4; + u8 field_16_0:3; + u8 field_16_1:3; + u8 field_16_2:2; + u8 field_17_0:6; + u8 field_17_1:2; +}; + +struct MysteryGiftLinkMenuStruct +{ + s32 currItemId; + u8 state; + u8 windowId; + u8 listTaskId; +}; + +struct ListMenuOverride +{ + u8 cursorPal:4; + u8 fillValue:4; + u8 cursorShadowPal:4; + u8 lettersSpacing:6; + u8 field_2_2:6; // unused + u8 fontId:7; + bool8 enabled:1; +}; + +struct MoveMenuInfoIcon +{ + u8 width; + u8 height; + u16 offset; +}; + +static EWRAM_DATA struct MysteryGiftLinkMenuStruct sMysteryGiftLinkMenu = {0}; + +struct ListMenuOverride gListMenuOverride; +struct ListMenuTemplate gMultiuseListMenuTemplate; + +static u8 ListMenuInitInternal(struct ListMenuTemplate *listMenuTemplate, u16 scrollOffset, u16 selectedRow); +static bool8 ListMenuChangeSelection(struct ListMenu *list, bool8 updateCursorAndCallCallback, u8 count, bool8 movingDown); +static void ListMenuPrintEntries(struct ListMenu *list, u16 startIndex, u16 yOffset, u16 count); +static void ListMenuDrawCursor(struct ListMenu *list); +static void ListMenuCallSelectionChangedCallback(struct ListMenu *list, u8 onInit); +static u8 ListMenuAddCursorObject(struct ListMenu *list, u32 cursorKind); + +const struct MoveMenuInfoIcon gMoveMenuInfoIcons[] = +{ + { 12, 12, 0x00 }, // Unused + { 32, 12, 0x20 }, // Normal icon + { 32, 12, 0x64 }, // Fight icon + { 32, 12, 0x60 }, // Flying icon + { 32, 12, 0x80 }, // Poison icon + { 32, 12, 0x48 }, // Ground icon + { 32, 12, 0x44 }, // Rock icon + { 32, 12, 0x6C }, // Bug icon + { 32, 12, 0x68 }, // Ghost icon + { 32, 12, 0x88 }, // Steel icon + { 32, 12, 0xA4 }, // ??? (Mystery) icon + { 32, 12, 0x24 }, // Fire icon + { 32, 12, 0x28 }, // Water icon + { 32, 12, 0x2C }, // Grass icon + { 32, 12, 0x40 }, // Electric icon + { 32, 12, 0x84 }, // Psychic icon + { 32, 12, 0x4C }, // Ice icon + { 32, 12, 0xA0 }, // Dragon icon + { 32, 12, 0x8C }, // Dark icon + { 40, 12, 0xA8 }, // -Type- icon + { 40, 12, 0xC0 }, // -Power- icon + { 40, 12, 0xC8 }, // -Accuracy- icon + { 40, 12, 0xE0 }, // -PP- icon + { 40, 12, 0xE8 }, // -Effect- icon +}; + +static void ListMenuDummyTask(u8 taskId) +{ +} + +s32 DoMysteryGiftListMenu(const struct WindowTemplate *windowTemplate, const struct ListMenuTemplate *listMenuTemplate, u8 arg2, u16 tileNum, u16 palNum) +{ + switch (sMysteryGiftLinkMenu.state) + { + case 0: + default: + sMysteryGiftLinkMenu.windowId = AddWindow(windowTemplate); + switch (arg2) + { + case 2: + TextWindow_SetUserSelectedFrame(sMysteryGiftLinkMenu.windowId, tileNum, palNum); + case 1: + DrawTextBorderOuter(sMysteryGiftLinkMenu.windowId, tileNum, palNum / 16); + break; + } + gMultiuseListMenuTemplate = *listMenuTemplate; + gMultiuseListMenuTemplate.windowId = sMysteryGiftLinkMenu.windowId; + sMysteryGiftLinkMenu.listTaskId = ListMenuInit(&gMultiuseListMenuTemplate, 0, 0); + CopyWindowToVram(sMysteryGiftLinkMenu.windowId, 1); + sMysteryGiftLinkMenu.state = 1; + break; + case 1: + sMysteryGiftLinkMenu.currItemId = ListMenu_ProcessInput(sMysteryGiftLinkMenu.listTaskId); + if (JOY_NEW(A_BUTTON)) + { + sMysteryGiftLinkMenu.state = 2; + } + if (JOY_NEW(B_BUTTON)) + { + sMysteryGiftLinkMenu.currItemId = LIST_CANCEL; + sMysteryGiftLinkMenu.state = 2; + } + if (sMysteryGiftLinkMenu.state == 2) + { + if (!arg2) + { + ClearWindowTilemap(sMysteryGiftLinkMenu.windowId); + } + else + { + switch (arg2) + { + case 0: // can never be reached, because of the if statement above + ClearStdWindowAndFrame(sMysteryGiftLinkMenu.windowId, FALSE); + break; + case 2: + case 1: + ClearStdWindowAndFrame(sMysteryGiftLinkMenu.windowId, FALSE); + break; + } + } + CopyWindowToVram(sMysteryGiftLinkMenu.windowId, 1); + } + break; + case 2: + DestroyListMenuTask(sMysteryGiftLinkMenu.listTaskId, NULL, NULL); + RemoveWindow(sMysteryGiftLinkMenu.windowId); + sMysteryGiftLinkMenu.state = 0; + return sMysteryGiftLinkMenu.currItemId; + } + return LIST_NOTHING_CHOSEN; +} + +u8 ListMenuInit(struct ListMenuTemplate *listMenuTemplate, u16 scrollOffset, u16 selectedRow) +{ + u8 taskId = ListMenuInitInternal(listMenuTemplate, scrollOffset, selectedRow); + PutWindowTilemap(listMenuTemplate->windowId); + CopyWindowToVram(listMenuTemplate->windowId, 2); + return taskId; +} + +u8 ListMenuInitInRect(struct ListMenuTemplate *listMenuTemplate, struct ListMenuWindowRect *rect, u16 scrollOffset, u16 selectedRow) +{ + s32 i; + u8 taskId = ListMenuInitInternal(listMenuTemplate, scrollOffset, selectedRow); + + for (i = 0; rect[i].palNum != 0xFF; i++) + PutWindowRectTilemapOverridePalette(listMenuTemplate->windowId, rect[i].x, rect[i].y, rect[i].width, rect[i].height, rect[i].palNum); + CopyWindowToVram(listMenuTemplate->windowId, 2); + return taskId; +} + +s32 ListMenu_ProcessInput(u8 listTaskId) +{ + struct ListMenu *list = (struct ListMenu *)gTasks[listTaskId].data; + + if (JOY_NEW(A_BUTTON)) + { + return list->template.items[list->scrollOffset + list->selectedRow].index; + } + else if (JOY_NEW(B_BUTTON)) + { + return LIST_CANCEL; + } + else if (gMain.newAndRepeatedKeys & DPAD_UP) + { + ListMenuChangeSelection(list, TRUE, 1, FALSE); + return LIST_NOTHING_CHOSEN; + } + else if (gMain.newAndRepeatedKeys & DPAD_DOWN) + { + ListMenuChangeSelection(list, TRUE, 1, TRUE); + return LIST_NOTHING_CHOSEN; + } + else // try to move by one window scroll + { + bool16 rightButton, leftButton; + switch (list->template.scrollMultiple) + { + case LIST_NO_MULTIPLE_SCROLL: + default: + leftButton = FALSE; + rightButton = FALSE; + break; + case LIST_MULTIPLE_SCROLL_DPAD: + leftButton = gMain.newAndRepeatedKeys & DPAD_LEFT; + rightButton = gMain.newAndRepeatedKeys & DPAD_RIGHT; + break; + case LIST_MULTIPLE_SCROLL_L_R: + leftButton = gMain.newAndRepeatedKeys & L_BUTTON; + rightButton = gMain.newAndRepeatedKeys & R_BUTTON; + break; + } + if (leftButton) + { + ListMenuChangeSelection(list, TRUE, list->template.maxShowed, FALSE); + return LIST_NOTHING_CHOSEN; + } + else if (rightButton) + { + ListMenuChangeSelection(list, TRUE, list->template.maxShowed, TRUE); + return LIST_NOTHING_CHOSEN; + } + else + { + return LIST_NOTHING_CHOSEN; + } + } +} + +void DestroyListMenuTask(u8 listTaskId, u16 *scrollOffset, u16 *selectedRow) +{ + struct ListMenu *list = (struct ListMenu *)gTasks[listTaskId].data; + + if (scrollOffset != NULL) + *scrollOffset = list->scrollOffset; + if (selectedRow != NULL) + *selectedRow = list->selectedRow; + + if (list->taskId != TASK_NONE) + ListMenuRemoveCursorObject(list->taskId, list->template.cursorKind - 2); + + DestroyTask(listTaskId); +} + +void RedrawListMenu(u8 listTaskId) +{ + struct ListMenu *list = (struct ListMenu *)gTasks[listTaskId].data; + + FillWindowPixelBuffer(list->template.windowId, PIXEL_FILL(list->template.fillValue)); + ListMenuPrintEntries(list, list->scrollOffset, 0, list->template.maxShowed); + ListMenuDrawCursor(list); + CopyWindowToVram(list->template.windowId, 2); +} + +static void ChangeListMenuPals(u8 listTaskId, u8 cursorPal, u8 fillValue, u8 cursorShadowPal) +{ + struct ListMenu *list = (struct ListMenu *)gTasks[listTaskId].data; + + list->template.cursorPal = cursorPal; + list->template.fillValue = fillValue; + list->template.cursorShadowPal = cursorShadowPal; +} + +static void ChangeListMenuCoords(u8 listTaskId, u8 x, u8 y) +{ + struct ListMenu *list = (struct ListMenu *)gTasks[listTaskId].data; + + SetWindowAttribute(list->template.windowId, WINDOW_TILEMAP_LEFT, x); + SetWindowAttribute(list->template.windowId, WINDOW_TILEMAP_TOP, y); +} + +static s32 ListMenuTestInput(struct ListMenuTemplate *template, u32 scrollOffset, u32 selectedRow, u16 keys, u16 *newScrollOffset, u16 *newSelectedRow) +{ + struct ListMenu list; + + list.template = *template; + list.scrollOffset = scrollOffset; + list.selectedRow = selectedRow; + list.unk_1C = 0; + list.unk_1D = 0; + if (keys == DPAD_UP) + ListMenuChangeSelection(&list, FALSE, 1, FALSE); + if (keys == DPAD_DOWN) + ListMenuChangeSelection(&list, FALSE, 1, TRUE); + + if (newScrollOffset != NULL) + *newScrollOffset = list.scrollOffset; + if (newSelectedRow != NULL) + *newSelectedRow = list.selectedRow; + return LIST_NOTHING_CHOSEN; +} + +static void ListMenuGetCurrentItemArrayId(u8 listTaskId, u16 *arrayId) +{ + struct ListMenu *list = (struct ListMenu *)gTasks[listTaskId].data; + + if (arrayId != NULL) + *arrayId = list->scrollOffset + list->selectedRow; +} + +void ListMenuGetScrollAndRow(u8 listTaskId, u16 *scrollOffset, u16 *selectedRow) +{ + struct ListMenu *list = (struct ListMenu *)gTasks[listTaskId].data; + + if (scrollOffset != NULL) + *scrollOffset = list->scrollOffset; + if (selectedRow != NULL) + *selectedRow = list->selectedRow; +} + +u16 ListMenuGetYCoordForPrintingArrowCursor(u8 listTaskId) +{ + struct ListMenu *list = (struct ListMenu *)gTasks[listTaskId].data; + u8 yMultiplier = GetFontAttribute(list->template.fontId, FONTATTR_MAX_LETTER_HEIGHT) + list->template.itemVerticalPadding; + + return list->selectedRow * yMultiplier + list->template.upText_Y; +} + +static u8 ListMenuInitInternal(struct ListMenuTemplate *listMenuTemplate, u16 scrollOffset, u16 selectedRow) +{ + u8 listTaskId = CreateTask(ListMenuDummyTask, 0); + struct ListMenu *list = (struct ListMenu *)gTasks[listTaskId].data; + + list->template = *listMenuTemplate; + list->scrollOffset = scrollOffset; + list->selectedRow = selectedRow; + list->unk_1C = 0; + list->unk_1D = 0; + list->taskId = TASK_NONE; + list->unk_1F = 0; + gListMenuOverride.cursorPal = list->template.cursorPal; + gListMenuOverride.fillValue = list->template.fillValue; + gListMenuOverride.cursorShadowPal = list->template.cursorShadowPal; + gListMenuOverride.lettersSpacing = list->template.lettersSpacing; + gListMenuOverride.fontId = list->template.fontId; + gListMenuOverride.enabled = FALSE; + if (list->template.totalItems < list->template.maxShowed) + list->template.maxShowed = list->template.totalItems; + FillWindowPixelBuffer(list->template.windowId, PIXEL_FILL(list->template.fillValue)); + ListMenuPrintEntries(list, list->scrollOffset, 0, list->template.maxShowed); + ListMenuDrawCursor(list); + ListMenuCallSelectionChangedCallback(list, TRUE); + + return listTaskId; +} + +static void ListMenuPrint(struct ListMenu *list, const u8 *str, u8 x, u8 y) +{ + struct TextColor colors; + if (gListMenuOverride.enabled) + { + colors.fgColor = gListMenuOverride.fillValue; + colors.bgColor = gListMenuOverride.cursorPal; + colors.shadowColor = gListMenuOverride.cursorShadowPal; + AddTextPrinterParameterized4(list->template.windowId, gListMenuOverride.fontId, x, y, gListMenuOverride.lettersSpacing, 0, &colors, TEXT_SPEED_FF, str); + gListMenuOverride.enabled = FALSE; + } + else + { + colors.fgColor = list->template.fillValue; + colors.bgColor = list->template.cursorPal; + colors.shadowColor = list->template.cursorShadowPal; + AddTextPrinterParameterized4(list->template.windowId, list->template.fontId, x, y, list->template.lettersSpacing, 0, &colors, TEXT_SPEED_FF, str); + } +} + +static void ListMenuPrintEntries(struct ListMenu *list, u16 startIndex, u16 yOffset, u16 count) +{ + s32 i; + u8 x, y; + u8 yMultiplier = GetFontAttribute(list->template.fontId, FONTATTR_MAX_LETTER_HEIGHT) + list->template.itemVerticalPadding; + + for (i = 0; i < count; i++) + { + if (list->template.items[startIndex].index != LIST_HEADER) + x = list->template.item_X; + else + x = list->template.header_X; + y = (yOffset + i) * yMultiplier + list->template.upText_Y; + if (list->template.itemPrintFunc != NULL) + list->template.itemPrintFunc(list->template.windowId, list->template.items[startIndex].index, y); + ListMenuPrint(list, list->template.items[startIndex].label, x, y); + startIndex++; + } +} + +static void ListMenuDrawCursor(struct ListMenu *list) +{ + u8 yMultiplier = GetFontAttribute(list->template.fontId, FONTATTR_MAX_LETTER_HEIGHT) + list->template.itemVerticalPadding; + u8 x = list->template.cursor_X; + u8 y = list->selectedRow * yMultiplier + list->template.upText_Y; + + switch (list->template.cursorKind) + { + case 0: + ListMenuPrint(list, gFameCheckerText_ListMenuCursor, x, y); + break; + case 1: + break; + case 2: + if (list->taskId == TASK_NONE) + list->taskId = ListMenuAddCursorObject(list, 0); + ListMenuUpdateCursorObject(list->taskId, GetWindowAttribute(list->template.windowId, WINDOW_TILEMAP_LEFT) * 8 - 1, GetWindowAttribute(list->template.windowId, WINDOW_TILEMAP_TOP) * 8 + y - 1, 0); + break; + case 3: + if (list->taskId == TASK_NONE) + list->taskId = ListMenuAddCursorObject(list, 1); + ListMenuUpdateCursorObject(list->taskId, GetWindowAttribute(list->template.windowId, WINDOW_TILEMAP_LEFT) * 8 + x, GetWindowAttribute(list->template.windowId, WINDOW_TILEMAP_TOP) * 8 + y, 1); + break; + } +} + +static u8 ListMenuAddCursorObject(struct ListMenu *list, u32 cursorKind) +{ + struct CursorStruct cursor; + + cursor.left = 0; + cursor.top = 160; + cursor.rowWidth = GetWindowAttribute(list->template.windowId, WINDOW_WIDTH) * 8 + 2; + cursor.rowHeight = GetFontAttribute(list->template.fontId, FONTATTR_MAX_LETTER_HEIGHT) + 2; + cursor.tileTag = 0x4000; + cursor.palTag = SPRITE_INVALID_TAG; + cursor.palNum = 15; + return ListMenuAddCursorObjectInternal(&cursor, cursorKind); +} + +static void ListMenuErasePrintedCursor(struct ListMenu *list, u16 selectedRow) +{ + u8 cursorKind = list->template.cursorKind; + if (cursorKind == 0) + { + u8 yMultiplier = GetFontAttribute(list->template.fontId, FONTATTR_MAX_LETTER_HEIGHT) + list->template.itemVerticalPadding; + u8 width = GetMenuCursorDimensionByFont(list->template.fontId, 0); + u8 height = GetMenuCursorDimensionByFont(list->template.fontId, 1); + FillWindowPixelRect(list->template.windowId, + PIXEL_FILL(list->template.fillValue), + list->template.cursor_X, + selectedRow * yMultiplier + list->template.upText_Y, + width, + height); + } +} + +static u8 ListMenuUpdateSelectedRowIndexAndScrollOffset(struct ListMenu *list, bool8 movingDown) +{ + u16 selectedRow = list->selectedRow; + u16 scrollOffset = list->scrollOffset; + u16 newRow; + u32 newScroll; + + if (!movingDown) + { + if (list->template.maxShowed == 1) + newRow = 0; + else + newRow = list->template.maxShowed - ((list->template.maxShowed / 2) + (list->template.maxShowed % 2)) - 1; + + if (scrollOffset == 0) + { + while (selectedRow != 0) + { + selectedRow--; + if (list->template.items[scrollOffset + selectedRow].index != LIST_HEADER) + { + list->selectedRow = selectedRow; + return 1; + } + } + return 0; + } + else + { + while (selectedRow > newRow) + { + selectedRow--; + if (list->template.items[scrollOffset + selectedRow].index != LIST_HEADER) + { + list->selectedRow = selectedRow; + return 1; + } + } + newScroll = scrollOffset - 1; + } + } + else + { + if (list->template.maxShowed == 1) + newRow = 0; + else + newRow = ((list->template.maxShowed / 2) + (list->template.maxShowed % 2)); + + if (scrollOffset == list->template.totalItems - list->template.maxShowed) + { + while (selectedRow < list->template.maxShowed - 1) + { + selectedRow++; + if (list->template.items[scrollOffset + selectedRow].index != LIST_HEADER) + { + list->selectedRow = selectedRow; + return 1; + } + } + return 0; + } + else + { + while (selectedRow < newRow) + { + selectedRow++; + if (list->template.items[scrollOffset + selectedRow].index != LIST_HEADER) + { + list->selectedRow = selectedRow; + return 1; + } + } + newScroll = scrollOffset + 1; + } + } + list->selectedRow = newRow; + list->scrollOffset = newScroll; + return 2; +} + +static void ListMenuScroll(struct ListMenu *list, u8 count, bool8 movingDown) +{ + if (count >= list->template.maxShowed) + { + FillWindowPixelBuffer(list->template.windowId, PIXEL_FILL(list->template.fillValue)); + ListMenuPrintEntries(list, list->scrollOffset, 0, list->template.maxShowed); + } + else + { + u8 yMultiplier = GetFontAttribute(list->template.fontId, FONTATTR_MAX_LETTER_HEIGHT) + list->template.itemVerticalPadding; + + if (!movingDown) + { + u16 y, width, height; + + ScrollWindow(list->template.windowId, 1, count * yMultiplier, PIXEL_FILL(list->template.fillValue)); + ListMenuPrintEntries(list, list->scrollOffset, 0, count); + + y = (list->template.maxShowed * yMultiplier) + list->template.upText_Y; + width = GetWindowAttribute(list->template.windowId, WINDOW_WIDTH) * 8; + height = (GetWindowAttribute(list->template.windowId, WINDOW_HEIGHT) * 8) - y; + FillWindowPixelRect(list->template.windowId, + PIXEL_FILL(list->template.fillValue), + 0, y, width, height); + } + else + { + u16 width; + + ScrollWindow(list->template.windowId, 0, count * yMultiplier, PIXEL_FILL(list->template.fillValue)); + ListMenuPrintEntries(list, list->scrollOffset + (list->template.maxShowed - count), list->template.maxShowed - count, count); + + width = GetWindowAttribute(list->template.windowId, WINDOW_WIDTH) * 8; + FillWindowPixelRect(list->template.windowId, + PIXEL_FILL(list->template.fillValue), + 0, 0, width, list->template.upText_Y); + } + } +} + +static bool8 ListMenuChangeSelection(struct ListMenu *list, bool8 updateCursorAndCallCallback, u8 count, bool8 movingDown) +{ + u16 oldSelectedRow; + u8 selectionChange, i, cursorCount; + + oldSelectedRow = list->selectedRow; + cursorCount = 0; + selectionChange = 0; + for (i = 0; i < count; i++) + { + do + { + u8 ret = ListMenuUpdateSelectedRowIndexAndScrollOffset(list, movingDown); + + selectionChange |= ret; + if (ret != 2) + break; + cursorCount++; + } + while (list->template.items[list->scrollOffset + list->selectedRow].index == LIST_HEADER); + } + + if (updateCursorAndCallCallback) + { + switch (selectionChange) + { + case 0: + default: + return TRUE; + case 1: + ListMenuErasePrintedCursor(list, oldSelectedRow); + ListMenuDrawCursor(list); + ListMenuCallSelectionChangedCallback(list, FALSE); + CopyWindowToVram(list->template.windowId, 2); + break; + case 2: + case 3: + ListMenuErasePrintedCursor(list, oldSelectedRow); + ListMenuScroll(list, cursorCount, movingDown); + ListMenuDrawCursor(list); + ListMenuCallSelectionChangedCallback(list, FALSE); + CopyWindowToVram(list->template.windowId, 2); + break; + } + } + return FALSE; +} + +static void ListMenuCallSelectionChangedCallback(struct ListMenu *list, u8 onInit) +{ + if (list->template.moveCursorFunc != NULL) + list->template.moveCursorFunc(list->template.items[list->scrollOffset + list->selectedRow].index, onInit, list); +} + +void ListMenuOverrideSetColors(u8 cursorPal, u8 fillValue, u8 cursorShadowPal) +{ + gListMenuOverride.cursorPal = cursorPal; + gListMenuOverride.fillValue = fillValue; + gListMenuOverride.cursorShadowPal = cursorShadowPal; + gListMenuOverride.enabled = TRUE; +} + +void ListMenuDefaultCursorMoveFunc(s32 itemIndex, bool8 onInit, struct ListMenu *list) +{ + if (!onInit) + PlaySE(SE_SELECT); +} + +static s32 ListMenuGetUnkIndicatorsStructFields(u8 taskId, u8 field) +{ + struct UnkIndicatorsStruct *data = (struct UnkIndicatorsStruct *)gTasks[taskId].data; + + switch (field) + { + case 0: + case 1: + return (s32)(data->field_4); + case 2: + return data->field_C; + case 3: + return data->field_E; + case 4: + return data->field_10; + case 5: + return data->field_11; + case 6: + return data->field_12; + case 7: + return data->field_13; + case 8: + return data->field_14_0; + case 9: + return data->field_14_1; + case 10: + return data->field_15_0; + case 11: + return data->field_15_1; + case 12: + return data->field_16_0; + case 13: + return data->field_16_1; + case 14: + return data->field_16_2; + case 15: + return data->field_17_0; + case 16: + return data->field_17_1; + default: + return -1; + } +} + +void ListMenuSetUnkIndicatorsStructField(u8 taskId, u8 field, s32 value) +{ + struct UnkIndicatorsStruct *data = (struct UnkIndicatorsStruct *)gTasks[taskId].data; + + switch (field) + { + case 0: + case 1: + data->field_4 = (void *)value; + break; + case 2: + data->field_C = value; + break; + case 3: + data->field_E = value; + break; + case 4: + data->field_10 = value; + break; + case 5: + data->field_11 = value; + break; + case 6: + data->field_12 = value; + break; + case 7: + data->field_13 = value; + break; + case 8: + data->field_14_0 = value; + break; + case 9: + data->field_14_1 = value; + break; + case 10: + data->field_15_0 = value; + break; + case 11: + data->field_15_1 = value; + break; + case 12: + data->field_16_0 = value; + break; + case 13: + data->field_16_1 = value; + break; + case 14: + data->field_16_2 = value; + break; + case 15: + data->field_17_0 = value; + break; + case 16: + data->field_17_1 = value; + break; + } +} + +void sub_8107CD8(u8 palOffset, u16 speciesId) +{ + LoadPalette(GetValidMonIconPalettePtr(speciesId), palOffset, 0x20); +} + +void sub_8107CF8(u8 windowId, u16 speciesId, u32 personality, u16 x, u16 y) +{ + BlitBitmapToWindow(windowId, GetMonIconPtr(speciesId, personality, 1), x, y, 32, 32); +} + +void sub_8107D38(u8 palOffset, u8 palId) +{ + const u16 *palette; + + switch (palId) + { + case 0: + default: + palette = gFireRedMenuElements1_Pal; + break; + case 1: + palette = gFireRedMenuElements2_Pal; + break; + } + LoadPalette(palette, palOffset, 0x20); +} + +void BlitMoveInfoIcon(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); +} diff --git a/src/menu_indicators.c b/src/menu_indicators.c new file mode 100644 index 000000000..1d6589fb0 --- /dev/null +++ b/src/menu_indicators.c @@ -0,0 +1,659 @@ +#include "global.h" +#include "malloc.h" +#include "task.h" +#include "decompress.h" +#include "palette.h" +#include "strings.h" +#include "sprite.h" +#include "trig.h" +#include "list_menu.h" +#include "menu_indicators.h" + +struct ScrollIndicatorPair +{ + u8 field_0; + u16 *scrollOffset; + u16 fullyUpThreshold; + u16 fullyDownThreshold; + u8 topSpriteId; + u8 bottomSpriteId; + u16 tileTag; + u16 palTag; +}; + +struct RedOutlineCursor +{ + struct SubspriteTable subspriteTable; + struct Subsprite *subspritesPtr; + u8 spriteId; + u16 tileTag; + u16 palTag; +}; + +struct RedArrowCursor +{ + u8 spriteId; + u16 tileTag; + u16 palTag; +}; + +struct ScrollIndicatorTemplate +{ + u8 animNum:4; + u8 bounceDir:4; + u8 multiplier; + s16 frequency; +}; + +static EWRAM_DATA struct ScrollArrowsTemplate sTempScrollArrowTemplate = {0}; + +static void SpriteCallback_ScrollIndicatorArrow(struct Sprite *sprite); +static void SpriteCallback_RedArrowCursor(struct Sprite *sprite); +static void Task_ScrollIndicatorArrowPair(u8 taskId); +static u8 ListMenuAddRedArrowCursorObject(struct CursorStruct *cursor); +static void ListMenuUpdateRedArrowCursorObject(u8 taskId, u16 x, u16 y); +static void ListMenuRemoveRedArrowCursorObject(u8 taskId); + +static const struct ScrollIndicatorTemplate sScrollIndicatorTemplates[] = +{ + { + .animNum = 0, + .bounceDir = 0, + .multiplier = 2, + .frequency = 8, + }, + { + .animNum = 1, + .bounceDir = 0, + .multiplier = 2, + .frequency = -8, + }, + { + .animNum = 2, + .bounceDir = 1, + .multiplier = 2, + .frequency = 8, + }, + { + .animNum = 3, + .bounceDir = 1, + .multiplier = 2, + .frequency = -8, + }, +}; + +static const struct OamData sOamData_ScrollArrowIndicator = +{ + .y = 0, + .affineMode = 0, + .objMode = 0, + .mosaic = 0, + .bpp = 0, + .shape = SPRITE_SHAPE(16x16), + .x = 0, + .matrixNum = 0, + .size = SPRITE_SIZE(16x16), + .tileNum = 0, + .priority = 0, + .paletteNum = 0, + .affineParam = 0, +}; + +static const union AnimCmd sSpriteAnim_ScrollArrowIndicator0[] = +{ + ANIMCMD_FRAME(0, 30), + ANIMCMD_END, +}; + +static const union AnimCmd sSpriteAnim_ScrollArrowIndicator1[] = +{ + ANIMCMD_FRAME(0, 30, 1, 0), + ANIMCMD_END, +}; + +static const union AnimCmd sSpriteAnim_ScrollArrowIndicator2[] = +{ + ANIMCMD_FRAME(4, 30), + ANIMCMD_END, +}; + +static const union AnimCmd sSpriteAnim_ScrollArrowIndicator3[] = +{ + ANIMCMD_FRAME(4, 30, 0, 1), + ANIMCMD_END, +}; + +static const union AnimCmd *const sSpriteAnimTable_ScrollArrowIndicator[] = +{ + sSpriteAnim_ScrollArrowIndicator0, + sSpriteAnim_ScrollArrowIndicator1, + sSpriteAnim_ScrollArrowIndicator2, + sSpriteAnim_ScrollArrowIndicator3, +}; + +static const struct SpriteTemplate sSpriteTemplate_ScrollArrowIndicator = +{ + .tileTag = 0, + .paletteTag = 0, + .oam = &sOamData_ScrollArrowIndicator, + .anims = sSpriteAnimTable_ScrollArrowIndicator, + .images = NULL, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = SpriteCallback_ScrollIndicatorArrow, +}; + +static const struct Subsprite sSubsprite_RedOutline1 = +{ + .x = 0, + .y = 0, + .shape = SPRITE_SHAPE(8x8), + .size = SPRITE_SIZE(8x8), + .tileOffset = 0, + .priority = 0, +}; + +static const struct Subsprite sSubsprite_RedOutline2 = +{ + .x = 0, + .y = 0, + .shape = SPRITE_SHAPE(8x8), + .size = SPRITE_SIZE(8x8), + .tileOffset = 1, + .priority = 0, +}; + +static const struct Subsprite sSubsprite_RedOutline3 = +{ + .x = 0, + .y = 0, + .shape = SPRITE_SHAPE(8x8), + .size = SPRITE_SIZE(8x8), + .tileOffset = 2, + .priority = 0, +}; + +static const struct Subsprite sSubsprite_RedOutline4 = +{ + .x = 0, + .y = 0, + .shape = SPRITE_SHAPE(8x8), + .size = SPRITE_SIZE(8x8), + .tileOffset = 3, + .priority = 0, +}; + +static const struct Subsprite sSubsprite_RedOutline5 = +{ + .x = 0, + .y = 0, + .shape = SPRITE_SHAPE(8x8), + .size = SPRITE_SIZE(8x8), + .tileOffset = 4, + .priority = 0, +}; + +static const struct Subsprite sSubsprite_RedOutline6 = +{ + .x = 0, + .y = 0, + .shape = SPRITE_SHAPE(8x8), + .size = SPRITE_SIZE(8x8), + .tileOffset = 5, + .priority = 0, +}; + +static const struct Subsprite sSubsprite_RedOutline7 = +{ + .x = 0, + .y = 0, + .shape = SPRITE_SHAPE(8x8), + .size = SPRITE_SIZE(8x8), + .tileOffset = 6, + .priority = 0, +}; + +static const struct Subsprite sSubsprite_RedOutline8 = +{ + .x = 0, + .y = 0, + .shape = SPRITE_SHAPE(8x8), + .size = SPRITE_SIZE(8x8), + .tileOffset = 7, + .priority = 0, +}; + +static const struct OamData sOamData_RedArrowCursor = +{ + .y = 0, + .affineMode = 0, + .objMode = 0, + .mosaic = 0, + .bpp = 0, + .shape = SPRITE_SHAPE(16x16), + .x = 0, + .matrixNum = 0, + .size = SPRITE_SIZE(16x16), + .tileNum = 0, + .priority = 0, + .paletteNum = 0, + .affineParam = 0, +}; + +static const union AnimCmd sSpriteAnim_RedArrowCursor[] = +{ + ANIMCMD_FRAME(0, 30), + ANIMCMD_END, +}; + +static const union AnimCmd *const sSpriteAnimTable_RedArrowCursor[] = { sSpriteAnim_RedArrowCursor }; + +static const struct SpriteTemplate sSpriteTemplate_RedArrowCursor = +{ + .tileTag = 0, + .paletteTag = 0, + .oam = &sOamData_RedArrowCursor, + .anims = sSpriteAnimTable_RedArrowCursor, + .images = NULL, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = SpriteCallback_RedArrowCursor, +}; + +static const u16 sRedArrowPal[] = INCBIN_U16("graphics/interface/red_arrow.gbapal"); +static const u32 sRedArrowOtherGfx[] = INCBIN_U32("graphics/interface/red_arrow_other.4bpp.lz"); +static const u32 sSelectorOutlineGfx[] = INCBIN_U32("graphics/interface/selector_outline.4bpp.lz"); +static const u32 sRedArrowGfx[] = INCBIN_U32("graphics/interface/red_arrow.4bpp.lz"); + +#define tState data[0] +#define tAnimNum data[1] +#define tBounceDir data[2] +#define tMultiplier data[3] +#define tFrequency data[4] +#define tSinePos data[5] + +static void SpriteCallback_ScrollIndicatorArrow(struct Sprite *sprite) +{ + s32 multiplier; + + switch (sprite->tState) + { + case 0: + StartSpriteAnim(sprite, sprite->tAnimNum); + sprite->tState++; + break; + case 1: + switch (sprite->tBounceDir) + { + case 0: + multiplier = sprite->tMultiplier; + sprite->pos2.x = (gSineTable[(u8)(sprite->tSinePos)] * multiplier) / 256; + break; + case 1: + multiplier = sprite->tMultiplier; + sprite->pos2.y = (gSineTable[(u8)(sprite->tSinePos)] * multiplier) / 256; + break; + } + sprite->tSinePos += sprite->tFrequency; + break; + } +} + +static u8 AddScrollIndicatorArrowObject(u8 arrowDir, u8 x, u8 y, u16 tileTag, u16 palTag) +{ + u8 spriteId; + struct SpriteTemplate spriteTemplate; + + spriteTemplate = sSpriteTemplate_ScrollArrowIndicator; + spriteTemplate.tileTag = tileTag; + spriteTemplate.paletteTag = palTag; + spriteId = CreateSprite(&spriteTemplate, x, y, 0); + gSprites[spriteId].invisible = TRUE; + gSprites[spriteId].tState = 0; + gSprites[spriteId].tAnimNum = sScrollIndicatorTemplates[arrowDir].animNum; + gSprites[spriteId].tBounceDir = sScrollIndicatorTemplates[arrowDir].bounceDir; + gSprites[spriteId].tMultiplier = sScrollIndicatorTemplates[arrowDir].multiplier; + gSprites[spriteId].tFrequency = sScrollIndicatorTemplates[arrowDir].frequency; + gSprites[spriteId].tSinePos = 0; + return spriteId; +} + +#undef tState +#undef tAnimNum +#undef tBounceDir +#undef tMultiplier +#undef tFrequency +#undef tSinePos + +u8 AddScrollIndicatorArrowPair(const struct ScrollArrowsTemplate *arrowInfo, u16 *scrollOffset) +{ + struct CompressedSpriteSheet spriteSheet; + struct SpritePalette spritePal; + struct ScrollIndicatorPair *data; + u8 taskId; + + spriteSheet.data = sRedArrowOtherGfx; + spriteSheet.size = 0x100; + spriteSheet.tag = arrowInfo->tileTag; + LoadCompressedSpriteSheet(&spriteSheet); + if (arrowInfo->palTag == SPRITE_INVALID_TAG) + { + LoadPalette(sRedArrowPal, (16 * arrowInfo->palNum) + 0x100, 0x20); + } + else + { + spritePal.data = sRedArrowPal; + spritePal.tag = arrowInfo->palTag; + LoadSpritePalette(&spritePal); + } + taskId = CreateTask(Task_ScrollIndicatorArrowPair, 0); + data = (struct ScrollIndicatorPair *)gTasks[taskId].data; + + data->field_0 = 0; + data->scrollOffset = scrollOffset; + data->fullyUpThreshold = arrowInfo->fullyUpThreshold; + data->fullyDownThreshold = arrowInfo->fullyDownThreshold; + data->tileTag = arrowInfo->tileTag; + data->palTag = arrowInfo->palTag; + data->topSpriteId = AddScrollIndicatorArrowObject(arrowInfo->firstArrowType, arrowInfo->firstX, arrowInfo->firstY, arrowInfo->tileTag, arrowInfo->palTag); + data->bottomSpriteId = AddScrollIndicatorArrowObject(arrowInfo->secondArrowType, arrowInfo->secondX, arrowInfo->secondY, arrowInfo->tileTag, arrowInfo->palTag); + + if (arrowInfo->palTag == SPRITE_INVALID_TAG) + { + gSprites[data->topSpriteId].oam.paletteNum = arrowInfo->palNum; + gSprites[data->bottomSpriteId].oam.paletteNum = arrowInfo->palNum; + } + return taskId; +} + +u8 AddScrollIndicatorArrowPairParameterized(u32 arrowType, s32 commonPos, s32 firstPos, s32 secondPos, s32 fullyDownThreshold, s32 tileTag, s32 palTag, u16 *scrollOffset) +{ + if (arrowType == SCROLL_ARROW_UP || arrowType == SCROLL_ARROW_DOWN) + { + sTempScrollArrowTemplate.firstArrowType = SCROLL_ARROW_UP; + sTempScrollArrowTemplate.firstX = commonPos; + sTempScrollArrowTemplate.firstY = firstPos; + sTempScrollArrowTemplate.secondArrowType = SCROLL_ARROW_DOWN; + sTempScrollArrowTemplate.secondX = commonPos; + sTempScrollArrowTemplate.secondY = secondPos; + } + else + { + sTempScrollArrowTemplate.firstArrowType = SCROLL_ARROW_LEFT; + sTempScrollArrowTemplate.firstX = firstPos; + sTempScrollArrowTemplate.firstY = commonPos; + sTempScrollArrowTemplate.secondArrowType = SCROLL_ARROW_RIGHT; + sTempScrollArrowTemplate.secondX = secondPos; + sTempScrollArrowTemplate.secondY = commonPos; + } + sTempScrollArrowTemplate.fullyUpThreshold = 0; + sTempScrollArrowTemplate.fullyDownThreshold = fullyDownThreshold; + sTempScrollArrowTemplate.tileTag = tileTag; + sTempScrollArrowTemplate.palTag = palTag; + sTempScrollArrowTemplate.palNum = 0; + + return AddScrollIndicatorArrowPair(&sTempScrollArrowTemplate, scrollOffset); +} + +static void Task_ScrollIndicatorArrowPair(u8 taskId) +{ + struct ScrollIndicatorPair *data = (struct ScrollIndicatorPair *)gTasks[taskId].data; + u16 currItem = (*data->scrollOffset); + + if (currItem == data->fullyUpThreshold) + gSprites[data->topSpriteId].invisible = TRUE; + else + gSprites[data->topSpriteId].invisible = FALSE; + + if (currItem == data->fullyDownThreshold) + gSprites[data->bottomSpriteId].invisible = TRUE; + else + gSprites[data->bottomSpriteId].invisible = FALSE; +} + +void RemoveScrollIndicatorArrowPair(u8 taskId) +{ + struct ScrollIndicatorPair *data = (struct ScrollIndicatorPair *)gTasks[taskId].data; + + if (data->tileTag != SPRITE_INVALID_TAG) + FreeSpriteTilesByTag(data->tileTag); + if (data->palTag != SPRITE_INVALID_TAG) + FreeSpritePaletteByTag(data->palTag); + DestroySprite(&gSprites[data->topSpriteId]); + DestroySprite(&gSprites[data->bottomSpriteId]); + DestroyTask(taskId); +} + +u8 ListMenuAddCursorObjectInternal(struct CursorStruct *cursor, u32 cursorKind) +{ + switch (cursorKind) + { + case 0: + default: + return ListMenuAddRedOutlineCursorObject(cursor); + case 1: + return ListMenuAddRedArrowCursorObject(cursor); + } +} + +void ListMenuUpdateCursorObject(u8 taskId, u16 x, u16 y, u32 cursorKind) +{ + switch (cursorKind) + { + case 0: + ListMenuUpdateRedOutlineCursorObject(taskId, x, y); + break; + case 1: + ListMenuUpdateRedArrowCursorObject(taskId, x, y); + break; + } +} + +void ListMenuRemoveCursorObject(u8 taskId, u32 cursorKind) +{ + switch (cursorKind) + { + case 0: + ListMenuRemoveRedOutlineCursorObject(taskId); + break; + case 1: + ListMenuRemoveRedArrowCursorObject(taskId); + break; + } +} + +void Task_RedOutlineCursor(u8 taskId) +{ +} + +u8 ListMenuGetRedOutlineCursorSpriteCount(u16 rowWidth, u16 rowHeight) +{ + s32 i, count = 4; + + if (rowWidth > 16) + for (i = 8; i < (rowWidth - 8); i += 8) + count += 2; + if (rowHeight > 16) + for (i = 8; i < (rowHeight - 8); i += 8) + count += 2; + return count; +} + +void ListMenuSetUpRedOutlineCursorSpriteOamTable(u16 rowWidth, u16 rowHeight, struct Subsprite *subsprites) +{ + s32 i, j, id = 0; + + subsprites[id] = sSubsprite_RedOutline1; + subsprites[id].x = 136; + subsprites[id].y = 136; + id++; + subsprites[id] = sSubsprite_RedOutline2; + subsprites[id].x = rowWidth + 128; + subsprites[id].y = 136; + id++; + subsprites[id] = sSubsprite_RedOutline7; + subsprites[id].x = 136; + subsprites[id].y = rowHeight + 128; + id++; + subsprites[id] = sSubsprite_RedOutline8; + subsprites[id].x = rowWidth + 128; + subsprites[id].y = rowHeight + 128; + id++; + if (rowWidth > 16) + { + for (i = 8; i < rowWidth - 8; i += 8) + { + subsprites[id] = sSubsprite_RedOutline3; + subsprites[id].x = i - 120; + subsprites[id].y = 136; + id++; + + subsprites[id] = sSubsprite_RedOutline6; + subsprites[id].x = i - 120; + subsprites[id].y = rowHeight + 128; + id++; + } + } + if (rowHeight > 16) + { + for (j = 8; j < rowHeight - 8; j += 8) + { + subsprites[id] = sSubsprite_RedOutline4; + subsprites[id].x = 136; + subsprites[id].y = j - 120; + id++; + subsprites[id] = sSubsprite_RedOutline5; + subsprites[id].x = rowWidth + 128; + subsprites[id].y = j - 120; + id++; + } + } +} + +u8 ListMenuAddRedOutlineCursorObject(struct CursorStruct *cursor) +{ + struct CompressedSpriteSheet spriteSheet; + struct SpritePalette spritePal; + struct RedOutlineCursor *data; + struct SpriteTemplate spriteTemplate; + u8 taskId; + + spriteSheet.data = sSelectorOutlineGfx; + spriteSheet.size = 0x100; + spriteSheet.tag = cursor->tileTag; + LoadCompressedSpriteSheet(&spriteSheet); + if (cursor->palTag == SPRITE_INVALID_TAG) + { + LoadPalette(sRedArrowPal, (16 * cursor->palNum) + 0x100, 0x20); + } + else + { + spritePal.data = sRedArrowPal; + spritePal.tag = cursor->palTag; + LoadSpritePalette(&spritePal); + } + taskId = CreateTask(Task_RedOutlineCursor, 0); + data = (struct RedOutlineCursor *)gTasks[taskId].data; + data->tileTag = cursor->tileTag; + data->palTag = cursor->palTag; + data->subspriteTable.subspriteCount = ListMenuGetRedOutlineCursorSpriteCount(cursor->rowWidth, cursor->rowHeight); + data->subspriteTable.subsprites = data->subspritesPtr = Alloc(data->subspriteTable.subspriteCount * 4); + ListMenuSetUpRedOutlineCursorSpriteOamTable(cursor->rowWidth, cursor->rowHeight, data->subspritesPtr); + spriteTemplate = gDummySpriteTemplate; + spriteTemplate.tileTag = cursor->tileTag; + spriteTemplate.paletteTag = cursor->palTag; + data->spriteId = CreateSprite(&spriteTemplate, cursor->left + 120, cursor->top + 120, 0); + SetSubspriteTables(&gSprites[data->spriteId], &data->subspriteTable); + gSprites[data->spriteId].oam.priority = 0; + gSprites[data->spriteId].subpriority = 0; + gSprites[data->spriteId].subspriteTableNum = 0; + if (cursor->palTag == SPRITE_INVALID_TAG) + gSprites[data->spriteId].oam.paletteNum = cursor->palNum; + return taskId; +} + +void ListMenuUpdateRedOutlineCursorObject(u8 taskId, u16 x, u16 y) +{ + struct RedOutlineCursor *data = (struct RedOutlineCursor *)gTasks[taskId].data; + + gSprites[data->spriteId].pos1.x = x + 120; + gSprites[data->spriteId].pos1.y = y + 120; +} + +void ListMenuRemoveRedOutlineCursorObject(u8 taskId) +{ + struct RedOutlineCursor *data = (struct RedOutlineCursor *)gTasks[taskId].data; + + Free(data->subspritesPtr); + if (data->tileTag != SPRITE_INVALID_TAG) + FreeSpriteTilesByTag(data->tileTag); + if (data->palTag != SPRITE_INVALID_TAG) + FreeSpritePaletteByTag(data->palTag); + DestroySprite(&gSprites[data->spriteId]); + DestroyTask(taskId); +} + +static void SpriteCallback_RedArrowCursor(struct Sprite *sprite) +{ + sprite->pos2.x = gSineTable[(u8)(sprite->data[0])] / 64; + sprite->data[0] += 8; +} + +static void Task_RedArrowCursor(u8 taskId) +{ +} + +static u8 ListMenuAddRedArrowCursorObject(struct CursorStruct *cursor) +{ + struct CompressedSpriteSheet spriteSheet; + struct SpritePalette spritePal; + struct RedArrowCursor *data; + struct SpriteTemplate spriteTemplate; + u8 taskId; + + spriteSheet.data = sRedArrowGfx; + spriteSheet.size = 0x80; + spriteSheet.tag = cursor->tileTag; + LoadCompressedSpriteSheet(&spriteSheet); + if (cursor->palTag == SPRITE_INVALID_TAG) + { + LoadPalette(sRedArrowPal, (16 * cursor->palNum) + 0x100, 0x20); + } + else + { + spritePal.data = sRedArrowPal; + spritePal.tag = cursor->palTag; + LoadSpritePalette(&spritePal); + } + taskId = CreateTask(Task_RedArrowCursor, 0); + data = (struct RedArrowCursor *)gTasks[taskId].data; + data->tileTag = cursor->tileTag; + data->palTag = cursor->palTag; + spriteTemplate = sSpriteTemplate_RedArrowCursor; + spriteTemplate.tileTag = cursor->tileTag; + spriteTemplate.paletteTag = cursor->palTag; + data->spriteId = CreateSprite(&spriteTemplate, cursor->left, cursor->top, 0); + gSprites[data->spriteId].pos2.x = 8; + gSprites[data->spriteId].pos2.y = 8; + if (cursor->palTag == SPRITE_INVALID_TAG) + gSprites[data->spriteId].oam.paletteNum = cursor->palNum; + return taskId; +} + +static void ListMenuUpdateRedArrowCursorObject(u8 taskId, u16 x, u16 y) +{ + struct RedArrowCursor *data = (struct RedArrowCursor *)gTasks[taskId].data; + + gSprites[data->spriteId].pos1.x = x; + gSprites[data->spriteId].pos1.y = y; +} + +static void ListMenuRemoveRedArrowCursorObject(u8 taskId) +{ + struct RedArrowCursor *data = (struct RedArrowCursor *)gTasks[taskId].data; + + if (data->tileTag != SPRITE_INVALID_TAG) + FreeSpriteTilesByTag(data->tileTag); + if (data->palTag != SPRITE_INVALID_TAG) + FreeSpritePaletteByTag(data->palTag); + DestroySprite(&gSprites[data->spriteId]); + DestroyTask(taskId); +} diff --git a/src/mevent_8145654.c b/src/mevent_8145654.c index abd29ca11..de6e1caa5 100644 --- a/src/mevent_8145654.c +++ b/src/mevent_8145654.c @@ -97,7 +97,7 @@ const u16 gUnknown_8467E74[] = INCBIN_U16("data/graphics/mevent/pal_467E74.gbapa const u16 gUnknown_8467E94[] = INCBIN_U16("data/graphics/mevent/pal_467E94.gbapal"); const u16 gUnknown_8467EB4[] = INCBIN_U16("data/graphics/mevent/pal_467EB4.gbapal"); const u16 gUnknown_8467ED4[] = INCBIN_U16("data/graphics/mevent/pal_467ED4.gbapal"); -const u8 gUnknown_8467EF4[] = INCBIN_U8("data/graphics/mevent/gfx_467EF4.4bpp.lz"); +const u32 gUnknown_8467EF4[] = INCBIN_U32("data/graphics/mevent/gfx_467EF4.4bpp.lz"); const struct CompressedSpriteSheet gUnknown_8467F58 = { gUnknown_8467EF4, 0x100, 0x8000 diff --git a/src/pokemon.c b/src/pokemon.c index 906b97cae..b9b5e6d76 100644 --- a/src/pokemon.c +++ b/src/pokemon.c @@ -5423,7 +5423,7 @@ void PlayMapChosenOrBattleBGM(u16 songId) PlayNewMapMusic(GetMUS_ForBattle()); } -const u8 *GetMonFrontSpritePal(struct Pokemon *mon) +const u32 *GetMonFrontSpritePal(struct Pokemon *mon) { u16 species = GetMonData(mon, MON_DATA_SPECIES2, 0); u32 otId = GetMonData(mon, MON_DATA_OT_ID, 0); @@ -5431,7 +5431,7 @@ const u8 *GetMonFrontSpritePal(struct Pokemon *mon) return GetFrontSpritePalFromSpeciesAndPersonality(species, otId, personality); } -const u8 *GetFrontSpritePalFromSpeciesAndPersonality(u16 species, u32 otId, u32 personality) +const u32 *GetFrontSpritePalFromSpeciesAndPersonality(u16 species, u32 otId, u32 personality) { u32 shinyValue; diff --git a/src/quest_log.c b/src/quest_log.c index fe83f67e9..d08724a56 100644 --- a/src/quest_log.c +++ b/src/quest_log.c @@ -11,7 +11,7 @@ #include "menu_helpers.h" #include "window.h" #include "text_window.h" -#include "unk_text_util.h" +#include "dynamic_placeholder_text_util.h" #include "event_data.h" #include "event_scripts.h" #include "string_util.h" @@ -996,7 +996,7 @@ void sub_8111368(void) else { sub_8111274(gUnknown_203ADF8, 1); - warp_in(); + WarpIntoMap(); gFieldCallback2 = sub_8111000; SetMainCallback2(sub_805726C); } @@ -3656,9 +3656,9 @@ void QuestLog_AutoGetSpeciesName(u16 a0, u8 * a1, u8 a2) else { if (a0 != SPECIES_EGG) - UnkTextUtil_SetPtrI(a2, gSpeciesNames[a0]); + DynamicPlaceholderTextUtil_SetPlaceholderPtr(a2, gSpeciesNames[a0]); else - UnkTextUtil_SetPtrI(a2, gText_EggNickname); + DynamicPlaceholderTextUtil_SetPlaceholderPtr(a2, gText_EggNickname); } } @@ -3949,14 +3949,14 @@ u16 * sub_81144EC(u16 * a0, const u16 * a1) const u16 * sub_8114518(const u16 * a0) { - UnkTextUtil_Reset(); + DynamicPlaceholderTextUtil_Reset(); memset(gStringVar1, EOS, 8); memcpy(gStringVar1, (const u8 *)a0 + 5, 7); sub_8115834(gStringVar1); - UnkTextUtil_SetPtrI(0, gStringVar1); - UnkTextUtil_SetPtrI(1, gUnknown_8456AE4[((const u8 *)a0)[4]]); - UnkTextUtil_StringExpandPlaceholders(gStringVar4, gUnknown_841A422); + DynamicPlaceholderTextUtil_SetPlaceholderPtr(0, gStringVar1); + DynamicPlaceholderTextUtil_SetPlaceholderPtr(1, gUnknown_8456AE4[((const u8 *)a0)[4]]); + DynamicPlaceholderTextUtil_ExpandPlaceholders(gStringVar4, gUnknown_841A422); a0 += 6; return a0; } @@ -3973,14 +3973,14 @@ u16 * sub_8114578(u16 * a0, const u16 * a1) const u16 * sub_81145A4(const u16 * a0) { - UnkTextUtil_Reset(); + DynamicPlaceholderTextUtil_Reset(); memset(gStringVar1, EOS, 8); memcpy(gStringVar1, (const u8 *)a0 + 5, 7); sub_8115834(gStringVar1); - UnkTextUtil_SetPtrI(0, gStringVar1); - UnkTextUtil_SetPtrI(1, gUnknown_8456AE4[((const u8 *)a0)[4]]); - UnkTextUtil_StringExpandPlaceholders(gStringVar4, gUnknown_841A477); + DynamicPlaceholderTextUtil_SetPlaceholderPtr(0, gStringVar1); + DynamicPlaceholderTextUtil_SetPlaceholderPtr(1, gUnknown_8456AE4[((const u8 *)a0)[4]]); + DynamicPlaceholderTextUtil_ExpandPlaceholders(gStringVar4, gUnknown_841A477); a0 += 6; return a0; } @@ -3999,7 +3999,7 @@ u16 * sub_8114604(u16 * a0, const u16 * a1) const u16 * sub_811464C(const u16 * a0) { - UnkTextUtil_Reset(); + DynamicPlaceholderTextUtil_Reset(); memset(gStringVar1, EOS, 8); memset(gStringVar2, EOS, 8); @@ -4010,12 +4010,12 @@ const u16 * sub_811464C(const u16 * a0) sub_8115834(gStringVar1); sub_8115834(gStringVar2); sub_8115834(gStringVar3); - UnkTextUtil_SetPtrI(0, gSaveBlock2Ptr->playerName); - UnkTextUtil_SetPtrI(1, gStringVar1); - UnkTextUtil_SetPtrI(2, gStringVar2); - UnkTextUtil_SetPtrI(3, gStringVar3); - UnkTextUtil_SetPtrI(4, gUnknown_8456AE4[((const u8 *)a0)[4]]); - UnkTextUtil_StringExpandPlaceholders(gStringVar4, gUnknown_841A4C6); + DynamicPlaceholderTextUtil_SetPlaceholderPtr(0, gSaveBlock2Ptr->playerName); + DynamicPlaceholderTextUtil_SetPlaceholderPtr(1, gStringVar1); + DynamicPlaceholderTextUtil_SetPlaceholderPtr(2, gStringVar2); + DynamicPlaceholderTextUtil_SetPlaceholderPtr(3, gStringVar3); + DynamicPlaceholderTextUtil_SetPlaceholderPtr(4, gUnknown_8456AE4[((const u8 *)a0)[4]]); + DynamicPlaceholderTextUtil_ExpandPlaceholders(gStringVar4, gUnknown_841A4C6); a0 += 13; return a0; } @@ -4111,12 +4111,12 @@ const u16 * sub_81148BC(const u16 * a0) const u8 * boxIdxs; a0 = sub_8113E88(20, a0); boxIdxs = (const u8 *)a0 + 4; - UnkTextUtil_Reset(); - UnkTextUtil_SetPtrI(0, GetBoxNamePtr(boxIdxs[0])); + DynamicPlaceholderTextUtil_Reset(); + DynamicPlaceholderTextUtil_SetPlaceholderPtr(0, GetBoxNamePtr(boxIdxs[0])); QuestLog_AutoGetSpeciesName(a0[0], NULL, 1); - UnkTextUtil_SetPtrI(2, GetBoxNamePtr(boxIdxs[1])); + DynamicPlaceholderTextUtil_SetPlaceholderPtr(2, GetBoxNamePtr(boxIdxs[1])); QuestLog_AutoGetSpeciesName(a0[1], NULL, 3); - UnkTextUtil_StringExpandPlaceholders(gStringVar4, gUnknown_841A566); + DynamicPlaceholderTextUtil_ExpandPlaceholders(gStringVar4, gUnknown_841A566); return a0 + 3; } @@ -4136,11 +4136,11 @@ const u16 * sub_8114944(const u16 * a0) const u8 * boxIdxs; a0 = sub_8113E88(21, a0); boxIdxs = (const u8 *)a0 + 4; - UnkTextUtil_Reset(); - UnkTextUtil_SetPtrI(0, GetBoxNamePtr(boxIdxs[0])); + DynamicPlaceholderTextUtil_Reset(); + DynamicPlaceholderTextUtil_SetPlaceholderPtr(0, GetBoxNamePtr(boxIdxs[0])); QuestLog_AutoGetSpeciesName(a0[0], NULL, 1); QuestLog_AutoGetSpeciesName(a0[1], NULL, 2); - UnkTextUtil_StringExpandPlaceholders(gStringVar4, gUnknown_841A5D9); + DynamicPlaceholderTextUtil_ExpandPlaceholders(gStringVar4, gUnknown_841A5D9); return a0 + 3; } @@ -4172,11 +4172,11 @@ const u16 * sub_81149D0(const u16 * a0) const u8 * boxIdxs; a0 = sub_8113E88(22, a0); boxIdxs = (const u8 *)a0 + 4; - UnkTextUtil_Reset(); - UnkTextUtil_SetPtrI(0, GetBoxNamePtr(boxIdxs[0])); + DynamicPlaceholderTextUtil_Reset(); + DynamicPlaceholderTextUtil_SetPlaceholderPtr(0, GetBoxNamePtr(boxIdxs[0])); QuestLog_AutoGetSpeciesName(a0[0], NULL, 1); QuestLog_AutoGetSpeciesName(a0[1], NULL, 2); - UnkTextUtil_StringExpandPlaceholders(gStringVar4, gUnknown_841A60A); + DynamicPlaceholderTextUtil_ExpandPlaceholders(gStringVar4, gUnknown_841A60A); return a0 + 3; } @@ -4199,11 +4199,11 @@ const u16 * sub_8114A4C(const u16 * a0) const u8 * boxIdxs; a0 = sub_8113E88(23, a0); boxIdxs = (const u8 *)a0 + 2; - UnkTextUtil_Reset(); - UnkTextUtil_SetPtrI(0, GetBoxNamePtr(boxIdxs[0])); + DynamicPlaceholderTextUtil_Reset(); + DynamicPlaceholderTextUtil_SetPlaceholderPtr(0, GetBoxNamePtr(boxIdxs[0])); QuestLog_AutoGetSpeciesName(a0[0], NULL, 1); - UnkTextUtil_SetPtrI(2, GetBoxNamePtr(boxIdxs[1])); - UnkTextUtil_StringExpandPlaceholders(gStringVar4, gUnknown_841A59C); + DynamicPlaceholderTextUtil_SetPlaceholderPtr(2, GetBoxNamePtr(boxIdxs[1])); + DynamicPlaceholderTextUtil_ExpandPlaceholders(gStringVar4, gUnknown_841A59C); return (const u16 *)boxIdxs + 1; } @@ -4223,10 +4223,10 @@ const u16 * sub_8114AC8(const u16 * a0) const u8 * boxIdxs; a0 = sub_8113E88(24, a0); boxIdxs = (const u8 *)a0 + 2; - UnkTextUtil_Reset(); - UnkTextUtil_SetPtrI(0, GetBoxNamePtr(boxIdxs[0])); + DynamicPlaceholderTextUtil_Reset(); + DynamicPlaceholderTextUtil_SetPlaceholderPtr(0, GetBoxNamePtr(boxIdxs[0])); QuestLog_AutoGetSpeciesName(a0[0], NULL, 1); - UnkTextUtil_StringExpandPlaceholders(gStringVar4, gUnknown_841A5FA); + DynamicPlaceholderTextUtil_ExpandPlaceholders(gStringVar4, gUnknown_841A5FA); return (const u16 *)boxIdxs + 1; } @@ -4246,10 +4246,10 @@ const u16 * sub_8114B34(const u16 * a0) const u8 * boxIdxs; a0 = sub_8113E88(25, a0); boxIdxs = (const u8 *)a0 + 2; - UnkTextUtil_Reset(); - UnkTextUtil_SetPtrI(0, GetBoxNamePtr(boxIdxs[0])); + DynamicPlaceholderTextUtil_Reset(); + DynamicPlaceholderTextUtil_SetPlaceholderPtr(0, GetBoxNamePtr(boxIdxs[0])); QuestLog_AutoGetSpeciesName(a0[0], NULL, 1); - UnkTextUtil_StringExpandPlaceholders(gStringVar4, gUnknown_841A632); + DynamicPlaceholderTextUtil_ExpandPlaceholders(gStringVar4, gUnknown_841A632); return (const u16 *)boxIdxs + 1; } @@ -4269,10 +4269,10 @@ const u16 * sub_8114BA0(const u16 * a0) const u8 * boxIdxs; a0 = sub_8113E88(26, a0); boxIdxs = (const u8 *)a0 + 2; - UnkTextUtil_Reset(); + DynamicPlaceholderTextUtil_Reset(); QuestLog_AutoGetSpeciesName(a0[0], NULL, 0); - UnkTextUtil_SetPtrI(1, GetBoxNamePtr(boxIdxs[0])); - UnkTextUtil_StringExpandPlaceholders(gStringVar4, gUnknown_841A64F); + DynamicPlaceholderTextUtil_SetPlaceholderPtr(1, GetBoxNamePtr(boxIdxs[0])); + DynamicPlaceholderTextUtil_ExpandPlaceholders(gStringVar4, gUnknown_841A64F); return (const u16 *)boxIdxs + 1; } @@ -4290,13 +4290,13 @@ u16 * sub_8114BE4(u16 * a0, const u16 * a1) const u16 * sub_8114C0C(const u16 * a0) { const u16 *r4 = sub_8113E88(27, a0); - UnkTextUtil_Reset(); - UnkTextUtil_SetPtrI(0, GetBoxNamePtr(*((const u8 *)r4 + 0))); + DynamicPlaceholderTextUtil_Reset(); + DynamicPlaceholderTextUtil_SetPlaceholderPtr(0, GetBoxNamePtr(*((const u8 *)r4 + 0))); if (*((const u8 *)r4 + 0) == *((const u8 *)r4 + 1)) - UnkTextUtil_SetPtrI(1, gUnknown_841A694); + DynamicPlaceholderTextUtil_SetPlaceholderPtr(1, gUnknown_841A694); else - UnkTextUtil_SetPtrI(1, GetBoxNamePtr(*((const u8 *)r4 + 1))); - UnkTextUtil_StringExpandPlaceholders(gStringVar4, gUnknown_841A66E); + DynamicPlaceholderTextUtil_SetPlaceholderPtr(1, GetBoxNamePtr(*((const u8 *)r4 + 1))); + DynamicPlaceholderTextUtil_ExpandPlaceholders(gStringVar4, gUnknown_841A66E); return r4 + 1; } @@ -4358,14 +4358,14 @@ const u16 * sub_8114D68(const u16 * a0) const u8 * r6; a0 = sub_8113E88(30, a0); r6 = (const u8 *)a0 + 6; - UnkTextUtil_Reset(); + DynamicPlaceholderTextUtil_Reset(); sub_80C4DF8(gStringVar1, r6[0]); - UnkTextUtil_SetPtrI(0, gStringVar1); - UnkTextUtil_SetPtrI(1, gTrainers[a0[2]].trainerName); + DynamicPlaceholderTextUtil_SetPlaceholderPtr(0, gStringVar1); + DynamicPlaceholderTextUtil_SetPlaceholderPtr(1, gTrainers[a0[2]].trainerName); QuestLog_AutoGetSpeciesName(a0[0], 0, 2); QuestLog_AutoGetSpeciesName(a0[1], 0, 3); - UnkTextUtil_SetPtrI(4, gUnknown_8456ACC[r6[1]]); - UnkTextUtil_StringExpandPlaceholders(gStringVar4, gUnknown_841AF0C); + DynamicPlaceholderTextUtil_SetPlaceholderPtr(4, gUnknown_8456ACC[r6[1]]); + DynamicPlaceholderTextUtil_ExpandPlaceholders(gStringVar4, gUnknown_841AF0C); return a0 + 4; } @@ -4399,43 +4399,43 @@ const u16 * sub_8114E68(const u16 * a0) return NULL; r6 = (const u8 *)a0 + 8; - UnkTextUtil_Reset(); + DynamicPlaceholderTextUtil_Reset(); sub_80C4DF8(gStringVar1, r6[2]); - UnkTextUtil_SetPtrI(0, gStringVar1); + DynamicPlaceholderTextUtil_SetPlaceholderPtr(0, gStringVar1); QuestLog_AutoGetSpeciesName(a0[2], NULL, 1); ConvertIntToDecimalStringN(gStringVar2, r6[0], STR_CONV_MODE_LEFT_ALIGN, 3); - UnkTextUtil_SetPtrI(2, gStringVar2); + DynamicPlaceholderTextUtil_SetPlaceholderPtr(2, gStringVar2); QuestLog_AutoGetSpeciesName(a0[3], NULL, 3); ConvertIntToDecimalStringN(gStringVar3, r6[1], STR_CONV_MODE_LEFT_ALIGN, 3); - UnkTextUtil_SetPtrI(4, gStringVar3); - UnkTextUtil_SetPtrI(5, gSaveBlock2Ptr->playerName); + DynamicPlaceholderTextUtil_SetPlaceholderPtr(4, gStringVar3); + DynamicPlaceholderTextUtil_SetPlaceholderPtr(5, gSaveBlock2Ptr->playerName); if (r6[0] == 0) { if (r6[1] == 1) - UnkTextUtil_StringExpandPlaceholders(gStringVar4, gUnknown_841AA01); + DynamicPlaceholderTextUtil_ExpandPlaceholders(gStringVar4, gUnknown_841AA01); else - UnkTextUtil_StringExpandPlaceholders(gStringVar4, gUnknown_841AA2B); + DynamicPlaceholderTextUtil_ExpandPlaceholders(gStringVar4, gUnknown_841AA2B); } else if (r6[1] == 0) { if (r6[0] == 1) - UnkTextUtil_StringExpandPlaceholders(gStringVar4, gUnknown_841A9A9); + DynamicPlaceholderTextUtil_ExpandPlaceholders(gStringVar4, gUnknown_841A9A9); else - UnkTextUtil_StringExpandPlaceholders(gStringVar4, gUnknown_841A9D4); + DynamicPlaceholderTextUtil_ExpandPlaceholders(gStringVar4, gUnknown_841A9D4); } else if (r6[0] == 1) { if (r6[1] == 1) - UnkTextUtil_StringExpandPlaceholders(gStringVar4, gUnknown_841AA76); + DynamicPlaceholderTextUtil_ExpandPlaceholders(gStringVar4, gUnknown_841AA76); else - UnkTextUtil_StringExpandPlaceholders(gStringVar4, gUnknown_841AAAA); + DynamicPlaceholderTextUtil_ExpandPlaceholders(gStringVar4, gUnknown_841AAAA); } else { if (r6[1] == 1) - UnkTextUtil_StringExpandPlaceholders(gStringVar4, gUnknown_841AAEC); + DynamicPlaceholderTextUtil_ExpandPlaceholders(gStringVar4, gUnknown_841AAEC); else - UnkTextUtil_StringExpandPlaceholders(gStringVar4, gUnknown_841AB29); + DynamicPlaceholderTextUtil_ExpandPlaceholders(gStringVar4, gUnknown_841AB29); } return (const u16 *)(r6 + 4); } @@ -4464,12 +4464,12 @@ const u16 * sub_811500C(const u16 * a0) const u8 * r5; a0 = sub_8113E88(32, a0); r5 = (const u8 *)a0 + 6; - UnkTextUtil_Reset(); - UnkTextUtil_SetPtrI(0, gTrainers[a0[2]].trainerName); + DynamicPlaceholderTextUtil_Reset(); + DynamicPlaceholderTextUtil_SetPlaceholderPtr(0, gTrainers[a0[2]].trainerName); QuestLog_AutoGetSpeciesName(a0[0], NULL, 1); QuestLog_AutoGetSpeciesName(a0[1], NULL, 2); - UnkTextUtil_SetPtrI(3, gUnknown_8456ACC[r5[1]]); - UnkTextUtil_StringExpandPlaceholders(gStringVar4, gUnknown_841AF3E); + DynamicPlaceholderTextUtil_SetPlaceholderPtr(3, gUnknown_8456ACC[r5[1]]); + DynamicPlaceholderTextUtil_ExpandPlaceholders(gStringVar4, gUnknown_841AF3E); return a0 + 4; } @@ -4493,25 +4493,25 @@ const u16 * sub_81150CC(const u16 * a0) return NULL; r5 = (const u8 *)a0 + 8; - UnkTextUtil_Reset(); + DynamicPlaceholderTextUtil_Reset(); switch (gUnknown_203B044.unk_2) { case 0: - UnkTextUtil_SetPtrI(0, gSaveBlock2Ptr->playerName); - UnkTextUtil_SetPtrI(1, gSaveBlock1Ptr->rivalName); - UnkTextUtil_StringExpandPlaceholders(gStringVar4, gUnknown_841A2E1); + DynamicPlaceholderTextUtil_SetPlaceholderPtr(0, gSaveBlock2Ptr->playerName); + DynamicPlaceholderTextUtil_SetPlaceholderPtr(1, gSaveBlock1Ptr->rivalName); + DynamicPlaceholderTextUtil_ExpandPlaceholders(gStringVar4, gUnknown_841A2E1); break; case 1: - UnkTextUtil_SetPtrI(0, gSaveBlock1Ptr->rivalName); + DynamicPlaceholderTextUtil_SetPlaceholderPtr(0, gSaveBlock1Ptr->rivalName); QuestLog_AutoGetSpeciesName(a0[2], NULL, 1); - UnkTextUtil_SetPtrI(2, gSaveBlock2Ptr->playerName); + DynamicPlaceholderTextUtil_SetPlaceholderPtr(2, gSaveBlock2Ptr->playerName); QuestLog_AutoGetSpeciesName(a0[3], NULL, 3); - UnkTextUtil_StringExpandPlaceholders(gStringVar4, gUnknown_841A312); + DynamicPlaceholderTextUtil_ExpandPlaceholders(gStringVar4, gUnknown_841A312); break; case 2: - UnkTextUtil_SetPtrI(0, gUnknown_8456AD8[r5[0]]); - UnkTextUtil_StringExpandPlaceholders(gStringVar4, gUnknown_841A349); + DynamicPlaceholderTextUtil_SetPlaceholderPtr(0, gUnknown_8456AD8[r5[0]]); + DynamicPlaceholderTextUtil_ExpandPlaceholders(gStringVar4, gUnknown_841A349); break; } return (const u16 *)(r5 + 2); @@ -4527,21 +4527,21 @@ const u16 * sub_81151DC(const u16 * a0) { const u16 * r5 = sub_8113E88(34, a0); const u8 * r6 = (const u8 *)r5 + 6; - UnkTextUtil_Reset(); + DynamicPlaceholderTextUtil_Reset(); sub_80C4DF8(gStringVar1, r6[0]); - UnkTextUtil_SetPtrI(0, gStringVar1); + DynamicPlaceholderTextUtil_SetPlaceholderPtr(0, gStringVar1); if ( gTrainers[r5[2]].trainerClass == 0x51 || gTrainers[r5[2]].trainerClass == 0x59 || gTrainers[r5[2]].trainerClass == 0x5A ) - UnkTextUtil_SetPtrI(1, GetExpandedPlaceholder(6)); + DynamicPlaceholderTextUtil_SetPlaceholderPtr(1, GetExpandedPlaceholder(6)); else - UnkTextUtil_SetPtrI(1, gTrainers[r5[2]].trainerName); + DynamicPlaceholderTextUtil_SetPlaceholderPtr(1, gTrainers[r5[2]].trainerName); QuestLog_AutoGetSpeciesName(r5[0], NULL, 2); QuestLog_AutoGetSpeciesName(r5[1], NULL, 3); - UnkTextUtil_SetPtrI(4, gUnknown_8456ACC[r6[1]]); - UnkTextUtil_StringExpandPlaceholders(gStringVar4, gUnknown_841AF6D); + DynamicPlaceholderTextUtil_SetPlaceholderPtr(4, gUnknown_8456ACC[r6[1]]); + DynamicPlaceholderTextUtil_ExpandPlaceholders(gStringVar4, gUnknown_841AF6D); return (const u16 *)(r6 + 2); } @@ -4814,17 +4814,17 @@ const u16 * sub_8115518(const u16 * a0) const u16 * r4 = sub_8113E88(37, a0); const u8 * r7 = (const u8 *)r4 + 8; u32 r6 = (r4[2] << 16) + r4[3]; - UnkTextUtil_Reset(); + DynamicPlaceholderTextUtil_Reset(); sub_80C4DF8(gStringVar1, r7[0]); - UnkTextUtil_SetPtrI(0, gStringVar1); - UnkTextUtil_SetPtrI(1, ItemId_GetName(r4[0])); + DynamicPlaceholderTextUtil_SetPlaceholderPtr(0, gStringVar1); + DynamicPlaceholderTextUtil_SetPlaceholderPtr(1, ItemId_GetName(r4[0])); if (r4[1] < 2) - UnkTextUtil_StringExpandPlaceholders(gStringVar4, gUnknown_841A7DD); + DynamicPlaceholderTextUtil_ExpandPlaceholders(gStringVar4, gUnknown_841A7DD); else { ConvertIntToDecimalStringN(gStringVar2, r6, STR_CONV_MODE_LEFT_ALIGN, 6); - UnkTextUtil_SetPtrI(2, gStringVar2); - UnkTextUtil_StringExpandPlaceholders(gStringVar4, gUnknown_841A810); + DynamicPlaceholderTextUtil_SetPlaceholderPtr(2, gStringVar2); + DynamicPlaceholderTextUtil_ExpandPlaceholders(gStringVar4, gUnknown_841A810); } return (const u16 *)(r7 + 2); } @@ -4847,30 +4847,30 @@ const u16 * sub_81155E0(const u16 * a0) { const u16 *r5 = sub_8113E88(38, a0); const u8 *r7 = (const u8 *) r5 + 8; u32 r6 = (r5[2] << 16) + r5[3]; - UnkTextUtil_Reset(); + DynamicPlaceholderTextUtil_Reset(); sub_80C4DF8(gStringVar1, r7[0]); if (r7[1] == 0) { - UnkTextUtil_SetPtrI(0, gSaveBlock2Ptr->playerName); - UnkTextUtil_SetPtrI(1, gStringVar1); - UnkTextUtil_SetPtrI(2, ItemId_GetName(r5[0])); + DynamicPlaceholderTextUtil_SetPlaceholderPtr(0, gSaveBlock2Ptr->playerName); + DynamicPlaceholderTextUtil_SetPlaceholderPtr(1, gStringVar1); + DynamicPlaceholderTextUtil_SetPlaceholderPtr(2, ItemId_GetName(r5[0])); if (r5[1] == 1) - UnkTextUtil_SetPtrI(3, gUnknown_841A8D4); + DynamicPlaceholderTextUtil_SetPlaceholderPtr(3, gUnknown_841A8D4); else { ConvertIntToDecimalStringN(gStringVar2, r5[1], STR_CONV_MODE_LEFT_ALIGN, 3); - UnkTextUtil_SetPtrI(4, gStringVar2); - UnkTextUtil_StringExpandPlaceholders(gStringVar3, gUnknown_841A8DD); - UnkTextUtil_SetPtrI(3, gStringVar3); + DynamicPlaceholderTextUtil_SetPlaceholderPtr(4, gStringVar2); + DynamicPlaceholderTextUtil_ExpandPlaceholders(gStringVar3, gUnknown_841A8DD); + DynamicPlaceholderTextUtil_SetPlaceholderPtr(3, gStringVar3); } - UnkTextUtil_StringExpandPlaceholders(gStringVar4, gUnknown_841A858); + DynamicPlaceholderTextUtil_ExpandPlaceholders(gStringVar4, gUnknown_841A858); } else { - UnkTextUtil_SetPtrI(0, gStringVar1); - UnkTextUtil_SetPtrI(1, ItemId_GetName(r5[0])); + DynamicPlaceholderTextUtil_SetPlaceholderPtr(0, gStringVar1); + DynamicPlaceholderTextUtil_SetPlaceholderPtr(1, ItemId_GetName(r5[0])); ConvertIntToDecimalStringN(gStringVar2, r6, STR_CONV_MODE_LEFT_ALIGN, 6); - UnkTextUtil_SetPtrI(2, gStringVar2); - UnkTextUtil_StringExpandPlaceholders(gStringVar4, gUnknown_841A896); + DynamicPlaceholderTextUtil_SetPlaceholderPtr(2, gStringVar2); + DynamicPlaceholderTextUtil_ExpandPlaceholders(gStringVar4, gUnknown_841A896); } return (const u16 *)(r7 + 2); } diff --git a/src/safari_zone.c b/src/safari_zone.c new file mode 100644 index 000000000..cb0a58586 --- /dev/null +++ b/src/safari_zone.c @@ -0,0 +1,80 @@ +#include "global.h" +#include "battle.h" +#include "event_scripts.h" +#include "overworld.h" +#include "battle.h" +#include "script.h" +#include "event_data.h" +#include "field_screen_effect.h" + +EWRAM_DATA u8 gNumSafariBalls = 0; +EWRAM_DATA u16 gSafariZoneStepCounter = 0; + +bool32 GetSafariZoneFlag(void) +{ + return FlagGet(FLAG_SYS_SAFARI_MODE); +} + +void SetSafariZoneFlag(void) +{ + FlagSet(FLAG_SYS_SAFARI_MODE); +} + +void ResetSafariZoneFlag(void) +{ + FlagClear(FLAG_SYS_SAFARI_MODE); +} + +void EnterSafariMode(void) +{ + IncrementGameStat(GAME_STAT_ENTERED_SAFARI_ZONE); + SetSafariZoneFlag(); + gNumSafariBalls = 30; + gSafariZoneStepCounter = 600; +} + +void ExitSafariMode(void) +{ + ResetSafariZoneFlag(); + gNumSafariBalls = 0; + gSafariZoneStepCounter = 0; +} + +bool8 SafariZoneTakeStep(void) +{ + if (GetSafariZoneFlag() == FALSE) + return FALSE; + gSafariZoneStepCounter--; + if (gSafariZoneStepCounter == 0) + { + ScriptContext1_SetupScript(EventScript_SafariTimesUp); + return TRUE; + } + return FALSE; +} + +void SafariZoneRetirePrompt(void) +{ + ScriptContext1_SetupScript(EventScript_SafariRetire); +} + +void CB2_EndSafariBattle(void) +{ + if (gNumSafariBalls != 0) + { + SetMainCallback2(CB2_ReturnToField); + } + else if (gBattleOutcome == B_OUTCOME_NO_SAFARI_BALLS) + { + ScriptContext2_RunNewScript(EventScript_SafariWarpOut); + WarpIntoMap(); + gFieldCallback = sub_807E3EC; + SetMainCallback2(CB2_LoadMap); + } + else if (gBattleOutcome == B_OUTCOME_CAUGHT) + { + ScriptContext1_SetupScript(EventScript_SafariOutOfBalls); + ScriptContext1_Stop(); + SetMainCallback2(CB2_ReturnToFieldContinueScriptPlayMapMusic); + } +} diff --git a/src/scrcmd.c b/src/scrcmd.c index d317a78b5..cef1a1eb7 100644 --- a/src/scrcmd.c +++ b/src/scrcmd.c @@ -1984,7 +1984,7 @@ bool8 ScrCmd_playslotmachine(struct ScriptContext *ctx) { u8 slotMachineIndex = VarGet(ScriptReadHalfword(ctx)); - PlaySlotMachine(slotMachineIndex, c2_exit_to_overworld_1_continue_scripts_restart_music); + PlaySlotMachine(slotMachineIndex, CB2_ReturnToFieldContinueScriptPlayMapMusic); ScriptContext1_Stop(); return TRUE; } diff --git a/src/seagallop.c b/src/seagallop.c index ae880b2a3..e3333ef32 100644 --- a/src/seagallop.c +++ b/src/seagallop.c @@ -323,8 +323,8 @@ static void Task_SeaGallop_3(void) PlayRainStoppingSoundEffect(); PlaySE(SE_KAIDAN); gFieldCallback = sub_807DF64; - warp_in(); - SetMainCallback2(sub_805671C); + WarpIntoMap(); + SetMainCallback2(CB2_LoadMap); ResetInitialPlayerAvatarState(); FreeFerrySpriteResources(); Free(sBg3TilemapBuffer); diff --git a/src/teachy_tv.c b/src/teachy_tv.c index 1e3f42027..0b0e7b932 100644 --- a/src/teachy_tv.c +++ b/src/teachy_tv.c @@ -734,7 +734,7 @@ static void TeachyTvOptionListController(u8 taskId) TeachyTvBg2AnimController(); if (!gPaletteFade.active) { - input = ListMenuHandleInput(data[0]); + input = ListMenu_ProcessInput(data[0]); ListMenuGetScrollAndRow(data[0], &sStaticResources.scrollOffset, &sStaticResources.selectedRow); if ((JOY_NEW(SELECT_BUTTON) && sStaticResources.callback != ReturnToBagFromKeyItem)) { @@ -754,7 +754,7 @@ static void TeachyTvOptionListController(u8 taskId) default: PlaySE(SE_SELECT); sStaticResources.whichScript = input; - DestroyListMenu(data[0], &sStaticResources.scrollOffset, &sStaticResources.selectedRow); + DestroyListMenuTask(data[0], &sStaticResources.scrollOffset, &sStaticResources.selectedRow); TeachyTvClearWindowRegs(); ClearWindowTilemap(1); ScheduleBgCopyTilemapToVram(0); diff --git a/src/text.c b/src/text.c index c0fe6a444..d36a448ad 100644 --- a/src/text.c +++ b/src/text.c @@ -18,7 +18,7 @@ extern u8 GetKeypadIconWidth(u8 keypadIconId); extern void CopyWindowToVram(u8 windowId, u8 mode); extern s32 GetGlyphWidthFont6(u16 glyphId, bool32 isJapanese); extern void PlaySE(u16 songNum); -extern u8* UnkTextUtil_GetPtrI(u8 a1); +extern u8* DynamicPlaceholderTextUtil_GetPlaceholderPtr(u8 a1); TextFlags gTextFlags; @@ -1544,7 +1544,7 @@ s32 GetStringWidth(u8 fontId, const u8 *str, s16 letterSpacing) } case 0xF7: if (bufferPointer == NULL) - bufferPointer = UnkTextUtil_GetPtrI(*++str); + bufferPointer = DynamicPlaceholderTextUtil_GetPlaceholderPtr(*++str); while (*bufferPointer != 0xFF) { glyphWidth = func(*bufferPointer++, isJapanese); diff --git a/src/tm_case.c b/src/tm_case.c index 54c50cc71..0266f9c90 100644 --- a/src/tm_case.c +++ b/src/tm_case.c @@ -716,7 +716,7 @@ static void Task_FadeOutAndCloseTMCase(u8 taskId) if (!gPaletteFade.active) { - DestroyListMenu(data[0], &sTMCaseStaticResources.scrollOffset, &sTMCaseStaticResources.selectedRow); + DestroyListMenuTask(data[0], &sTMCaseStaticResources.scrollOffset, &sTMCaseStaticResources.selectedRow); if (sTMCaseDynamicResources->savedCallback != NULL) SetMainCallback2(sTMCaseDynamicResources->savedCallback); else @@ -736,7 +736,7 @@ static void Task_TMCaseMain(u8 taskId) { if (sub_80BF72C() != TRUE) { - input = ListMenuHandleInput(data[0]); + input = ListMenu_ProcessInput(data[0]); ListMenuGetScrollAndRow(data[0], &sTMCaseStaticResources.scrollOffset, &sTMCaseStaticResources.selectedRow); if (JOY_NEW(SELECT_BUTTON) && sTMCaseStaticResources.unk_05 == 1) { @@ -909,7 +909,7 @@ static void Subtask_CloseContextMenuAndReturnToMain(u8 taskId) { s16 * data = gTasks[taskId].data; - DestroyListMenu(data[0], &sTMCaseStaticResources.scrollOffset, &sTMCaseStaticResources.selectedRow); + DestroyListMenuTask(data[0], &sTMCaseStaticResources.scrollOffset, &sTMCaseStaticResources.selectedRow); data[0] = ListMenuInit(&gMultiuseListMenuTemplate, sTMCaseStaticResources.scrollOffset, sTMCaseStaticResources.selectedRow); PrintListMenuCursorByID_WithColorIdx(data[0], 1); ClearMenuWindow_BorderThickness2(6, 0); @@ -1108,7 +1108,7 @@ static void Task_DoSaleOfTMs(u8 taskId) RemoveBagItem(gSpecialVar_ItemId, data[8]); AddMoney(&gSaveBlock1Ptr->money, itemid_get_market_price(gSpecialVar_ItemId) / 2 * data[8]); sub_809C09C(gSpecialVar_ItemId, data[8], 2); - DestroyListMenu(data[0], &sTMCaseStaticResources.scrollOffset, &sTMCaseStaticResources.selectedRow); + DestroyListMenuTask(data[0], &sTMCaseStaticResources.scrollOffset, &sTMCaseStaticResources.selectedRow); TMCaseSetup_GetTMCount(); TMCaseSetup_InitListMenuPositions(); InitTMCaseListMenuItems(); @@ -1204,7 +1204,7 @@ static void Task_TMCaseDude_Playback(u8 taskId) { gMain.newKeys = 0; gMain.newAndRepeatedKeys = DPAD_DOWN; - ListMenuHandleInput(data[0]); + ListMenu_ProcessInput(data[0]); } data[9]++; if (data[9] > 0x65) @@ -1223,7 +1223,7 @@ static void Task_TMCaseDude_Playback(u8 taskId) { gMain.newKeys = 0; gMain.newAndRepeatedKeys = DPAD_UP; - ListMenuHandleInput(data[0]); + ListMenu_ProcessInput(data[0]); } data[9]++; if (data[9] > 0x65) @@ -1269,7 +1269,7 @@ static void Task_TMCaseDude_Playback(u8 taskId) { memcpy(gSaveBlock1Ptr->bagPocket_TMHM, sPokeDudePackBackup->bagPocket_TMHM, sizeof(gSaveBlock1Ptr->bagPocket_TMHM)); memcpy(gSaveBlock1Ptr->bagPocket_KeyItems, sPokeDudePackBackup->bagPocket_KeyItems, sizeof(gSaveBlock1Ptr->bagPocket_KeyItems)); - DestroyListMenu(data[0], NULL, NULL); + DestroyListMenuTask(data[0], NULL, NULL); sTMCaseStaticResources.selectedRow = sPokeDudePackBackup->unk_160; sTMCaseStaticResources.scrollOffset = sPokeDudePackBackup->unk_162; Free(sPokeDudePackBackup); @@ -1344,10 +1344,10 @@ static void PrintStringTMCaseOnWindow3(void) static void DrawMoveInfoUIMarkers(void) { - blit_move_info_icon(4, 19, 0, 0); - blit_move_info_icon(4, 20, 0, 12); - blit_move_info_icon(4, 21, 0, 24); - blit_move_info_icon(4, 22, 0, 36); + BlitMoveInfoIcon(4, 19, 0, 0); + BlitMoveInfoIcon(4, 20, 0, 12); + BlitMoveInfoIcon(4, 21, 0, 24); + BlitMoveInfoIcon(4, 22, 0, 36); CopyWindowToVram(4, 2); } @@ -1369,7 +1369,7 @@ static void TMCase_MoveCursor_UpdatePrintedTMInfo(u16 itemId) else { move = ItemIdToBattleMoveId(itemId); - blit_move_info_icon(5, gBattleMoves[move].type + 1, 0, 0); + BlitMoveInfoIcon(5, gBattleMoves[move].type + 1, 0, 0); if (gBattleMoves[move].power < 2) str = gText_ThreeHyphens; else diff --git a/src/trainer_tower.c b/src/trainer_tower.c index ef2a12ce0..65d825dfe 100644 --- a/src/trainer_tower.c +++ b/src/trainer_tower.c @@ -1106,7 +1106,7 @@ void sub_815E068(u8 battleType, u8 facilityClass) void sub_815E114(void) { - SetMainCallback2(c2_exit_to_overworld_1_continue_scripts_restart_music); + SetMainCallback2(CB2_ReturnToFieldContinueScriptPlayMapMusic); } void sub_815E124(u8 taskId) diff --git a/src/wireless_communication_status_screen.c b/src/wireless_communication_status_screen.c index 1eb29be1b..cc80d37b6 100644 --- a/src/wireless_communication_status_screen.c +++ b/src/wireless_communication_status_screen.c @@ -10,7 +10,7 @@ #include "scanline_effect.h" #include "m4a.h" #include "string_util.h" -#include "unk_text_util.h" +#include "dynamic_placeholder_text_util.h" #include "overworld.h" #include "sound.h" #include "menu.h" @@ -208,7 +208,7 @@ void sub_814F1E4(void) ChangeBgY(1, 0, 0); LoadPalette(gUnknown_846F4D0, 0, 0x20); Menu_LoadStdPalAt(0xf0); - UnkTextUtil_Reset(); + DynamicPlaceholderTextUtil_Reset(); FillBgTilemapBufferRect(0, 0x000, 0, 0, 32, 32, 0xF); CopyBgTilemapBufferToVram(1); SetMainCallback2(sub_814F19C); @@ -229,7 +229,7 @@ void sub_814F32C(void) Free(GetBgTilemapBuffer(i)); } Free(gUnknown_3002040); - SetMainCallback2(c2_exit_to_overworld_1_continue_scripts_restart_music); + SetMainCallback2(CB2_ReturnToFieldContinueScriptPlayMapMusic); } void sub_814F364(s16 * unk0, s16 * unk1) |