From 3a1994f7f790dd7d50ea6963c4f3bea833628f29 Mon Sep 17 00:00:00 2001 From: cbt6 <91667135+cbt6@users.noreply.github.com> Date: Sat, 3 Sep 2022 23:35:07 +0800 Subject: [PATCH] Rearrange Pokemon storage source files --- ...arty_pokemon_dropdown.h => tilemap_util.h} | 6 +- ld_script.txt | 28 +- src/pokemon_storage_system_6.c | 147 ----- src/pokemon_storage_system_7.c | 566 ------------------ ...stem_5.c => pokemon_storage_system_data.c} | 143 +++++ ..._4.c => pokemon_storage_system_graphics.c} | 0 ...stem_2.c => pokemon_storage_system_menu.c} | 0 ...stem_8.c => pokemon_storage_system_misc.c} | 563 +++++++++++++++++ ...tem_3.c => pokemon_storage_system_tasks.c} | 2 +- ...arty_pokemon_dropdown.c => tilemap_util.c} | 2 +- sym_bss.txt | 2 +- sym_ewram.txt | 11 +- 12 files changed, 729 insertions(+), 741 deletions(-) rename include/{box_party_pokemon_dropdown.h => tilemap_util.h} (75%) delete mode 100644 src/pokemon_storage_system_6.c delete mode 100644 src/pokemon_storage_system_7.c rename src/{pokemon_storage_system_5.c => pokemon_storage_system_data.c} (92%) rename src/{pokemon_storage_system_4.c => pokemon_storage_system_graphics.c} (100%) rename src/{pokemon_storage_system_2.c => pokemon_storage_system_menu.c} (100%) rename src/{pokemon_storage_system_8.c => pokemon_storage_system_misc.c} (61%) rename src/{pokemon_storage_system_3.c => pokemon_storage_system_tasks.c} (99%) rename src/{box_party_pokemon_dropdown.c => tilemap_util.c} (99%) diff --git a/include/box_party_pokemon_dropdown.h b/include/tilemap_util.h similarity index 75% rename from include/box_party_pokemon_dropdown.h rename to include/tilemap_util.h index 5e925e8a2..b8388c6f5 100644 --- a/include/box_party_pokemon_dropdown.h +++ b/include/tilemap_util.h @@ -1,5 +1,5 @@ -#ifndef GUARD_BOX_PARTY_POKEMON_DROPDOWN_H -#define GUARD_BOX_PARTY_POKEMON_DROPDOWN_H +#ifndef GUARD_TILEMAP_UTIL_H +#define GUARD_TILEMAP_UTIL_H void TilemapUtil_Init(u8 numTilemapIds); void TilemapUtil_Free(void); @@ -9,4 +9,4 @@ void TilemapUtil_SetRect(u8 tilemapId, u16 x, u16 y, u16 width, u16 height); void TilemapUtil_Move(u8 tilemapId, u8 mode, s8 param); void TilemapUtil_Update(u8 tilemapId); -#endif //GUARD_BOX_PARTY_POKEMON_DROPDOWN_H +#endif //GUARD_TILEMAP_UTIL_H diff --git a/ld_script.txt b/ld_script.txt index 21538a7ba..a97a5ac2a 100644 --- a/ld_script.txt +++ b/ld_script.txt @@ -130,13 +130,11 @@ SECTIONS { src/pokedex.o(.text); src/trainer_card.o(.text); src/pokemon_storage_system.o(.text); - src/pokemon_storage_system_2.o(.text); - src/pokemon_storage_system_3.o(.text); - src/pokemon_storage_system_4.o(.text); - src/pokemon_storage_system_5.o(.text); - src/pokemon_storage_system_6.o(.text); - src/pokemon_storage_system_7.o(.text); - src/pokemon_storage_system_8.o(.text); + src/pokemon_storage_system_menu.o(.text); + src/pokemon_storage_system_tasks.o(.text); + src/pokemon_storage_system_graphics.o(.text); + src/pokemon_storage_system_data.o(.text); + src/pokemon_storage_system_misc.o(.text); src/pokemon_icon.o(.text); src/script_movement.o(.text); src/fldeff_cut.o(.text); @@ -228,7 +226,7 @@ SECTIONS { src/evolution_graphics.o(.text); src/fldeff_teleport.o(.text); src/new_menu_helpers.o(.text); - src/box_party_pokemon_dropdown.o(.text); + src/tilemap_util.o(.text); src/save_menu_util.o(.text); src/map_preview_screen.o(.text); src/link_rfu_2.o(.text); @@ -452,13 +450,11 @@ SECTIONS { src/field_effect.o(.rodata); src/option_menu.o(.rodata); src/trainer_card.o(.rodata); - src/pokemon_storage_system_2.o(.rodata); - src/pokemon_storage_system_3.o(.rodata); - src/pokemon_storage_system_4.o(.rodata); - src/pokemon_storage_system_5.o(.rodata); - src/pokemon_storage_system_6.o(.rodata); - src/pokemon_storage_system_7.o(.rodata); - src/pokemon_storage_system_8.o(.rodata); + src/pokemon_storage_system_menu.o(.rodata); + src/pokemon_storage_system_tasks.o(.rodata); + src/pokemon_storage_system_graphics.o(.rodata); + src/pokemon_storage_system_data.o(.rodata); + src/pokemon_storage_system_misc.o(.rodata); src/pokemon_icon.o(.rodata); src/fldeff_cut.o(.rodata); src/map_name_popup.o(.rodata); @@ -524,7 +520,7 @@ SECTIONS { src/clear_save_data_screen.o(.rodata); src/evolution_graphics.o(.rodata); src/new_menu_helpers.o(.rodata); - src/box_party_pokemon_dropdown.o(.rodata); + src/tilemap_util.o(.rodata); src/map_preview_screen.o(.rodata); src/link_rfu_2.o(.rodata); src/link_rfu_3.o(.rodata); diff --git a/src/pokemon_storage_system_6.c b/src/pokemon_storage_system_6.c deleted file mode 100644 index b8fcc3e8b..000000000 --- a/src/pokemon_storage_system_6.c +++ /dev/null @@ -1,147 +0,0 @@ -#include "global.h" -#include "gflib.h" -#include "menu.h" -#include "new_menu_helpers.h" -#include "pokemon_storage_system_internal.h" -#include "strings.h" -#include "constants/songs.h" - -void InitMenu(void) -{ - gStorage->menuItemsCount = 0; - gStorage->menuWidth = 0; - gStorage->menuWindow.bg = 0; - gStorage->menuWindow.paletteNum = 15; - gStorage->menuWindow.baseBlock = 92; -} - -static const u8 *const sMenuTexts[] = { - [MENU_TEXT_CANCEL] = gPCText_Cancel, - [MENU_TEXT_STORE] = gPCText_Store, - [MENU_TEXT_WITHDRAW] = gPCText_Withdraw, - [MENU_TEXT_MOVE] = gPCText_Move, - [MENU_TEXT_SHIFT] = gPCText_Shift, - [MENU_TEXT_PLACE] = gPCText_Place, - [MENU_TEXT_SUMMARY] = gPCText_Summary, - [MENU_TEXT_RELEASE] = gPCText_Release, - [MENU_TEXT_MARK] = gPCText_Mark, - [MENU_TEXT_JUMP] = gPCText_Jump, - [MENU_TEXT_WALLPAPER] = gPCText_Wallpaper, - [MENU_TEXT_NAME] = gPCText_Name, - [MENU_TEXT_TAKE] = gPCText_Take, - [MENU_TEXT_GIVE] = gPCText_Give, - [MENU_TEXT_GIVE2] = gPCText_Give, - [MENU_TEXT_SWITCH] = gPCText_Switch, - [MENU_TEXT_BAG] = gPCText_Bag, - [MENU_TEXT_INFO] = gPCText_Info, - [MENU_TEXT_SCENERY_1] = gPCText_Scenery1, - [MENU_TEXT_SCENERY_2] = gPCText_Scenery2, - [MENU_TEXT_SCENERY_3] = gPCText_Scenery3, - [MENU_TEXT_ETCETERA] = gPCText_Etcetera, - [MENU_TEXT_FOREST] = gPCText_Forest, - [MENU_TEXT_CITY] = gPCText_City, - [MENU_TEXT_DESERT] = gPCText_Desert, - [MENU_TEXT_SAVANNA] = gPCText_Savanna, - [MENU_TEXT_CRAG] = gPCText_Crag, - [MENU_TEXT_VOLCANO] = gPCText_Volcano, - [MENU_TEXT_SNOW] = gPCText_Snow, - [MENU_TEXT_CAVE] = gPCText_Cave, - [MENU_TEXT_BEACH] = gPCText_Beach, - [MENU_TEXT_SEAFLOOR] = gPCText_Seafloor, - [MENU_TEXT_RIVER] = gPCText_River, - [MENU_TEXT_SKY] = gPCText_Sky, - [MENU_TEXT_POLKADOT] = gPCText_PolkaDot, - [MENU_TEXT_POKECENTER] = gPCText_Pokecenter, - [MENU_TEXT_MACHINE] = gPCText_Machine, - [MENU_TEXT_SIMPLE] = gPCText_Simple, -}; - -void SetMenuText(u8 textId) -{ - if (gStorage->menuItemsCount < ARRAY_COUNT(gStorage->menuItems)) - { - u8 len; - struct StorageMenu *menu = &gStorage->menuItems[gStorage->menuItemsCount]; - - menu->text = sMenuTexts[textId]; - menu->textId = textId; - len = StringLength(menu->text); - if (len > gStorage->menuWidth) - gStorage->menuWidth = len; - - gStorage->menuItemsCount++; - } -} - -s8 GetMenuItemTextId(u8 menuIndex) -{ - if (menuIndex >= gStorage->menuItemsCount) - return MENU_B_PRESSED; - else - return gStorage->menuItems[menuIndex].textId; -} - -void AddMenu(void) -{ - gStorage->menuWindow.width = gStorage->menuWidth + 2; - gStorage->menuWindow.height = 2 * gStorage->menuItemsCount; - gStorage->menuWindow.tilemapLeft = 29 - gStorage->menuWindow.width; - gStorage->menuWindow.tilemapTop = 15 - gStorage->menuWindow.height; - gStorage->menuWindowId = AddWindow(&gStorage->menuWindow); - ClearWindowTilemap(gStorage->menuWindowId); - DrawStdFrameWithCustomTileAndPalette(gStorage->menuWindowId, FALSE, 11, 14); - PrintTextArray(gStorage->menuWindowId, FONT_1, 8, 2, 16, gStorage->menuItemsCount, (void *)gStorage->menuItems); - Menu_InitCursor(gStorage->menuWindowId, FONT_1, 0, 2, 16, gStorage->menuItemsCount, 0); - ScheduleBgCopyTilemapToVram(0); - gStorage->menuUnusedField = 0; -} - -bool8 IsMenuLoading(void) -{ - // Possibly stubbed out debug code? - return FALSE; -} - -s16 HandleMenuInput(void) -{ - s32 input = MENU_NOTHING_CHOSEN; - - do - { - if (JOY_NEW(A_BUTTON)) - { - input = Menu_GetCursorPos(); - break; - } - else if (JOY_NEW(B_BUTTON)) - { - PlaySE(SE_SELECT); - input = MENU_B_PRESSED; - } - - if (JOY_NEW(DPAD_UP)) - { - PlaySE(SE_SELECT); - Menu_MoveCursor(-1); - } - else if (JOY_NEW(DPAD_DOWN)) - { - PlaySE(SE_SELECT); - Menu_MoveCursor(1); - } - } while (FALSE); - - if (input != MENU_NOTHING_CHOSEN) - RemoveMenu(); - - if (input >= 0) - input = gStorage->menuItems[input].textId; - - return input; -} - -void RemoveMenu(void) -{ - ClearStdWindowAndFrameToTransparent(gStorage->menuWindowId, TRUE); - RemoveWindow(gStorage->menuWindowId); -} diff --git a/src/pokemon_storage_system_7.c b/src/pokemon_storage_system_7.c deleted file mode 100644 index 573aa4b82..000000000 --- a/src/pokemon_storage_system_7.c +++ /dev/null @@ -1,566 +0,0 @@ -#include // to declare abs -#include "global.h" -#include "gflib.h" -#include "pokemon_icon.h" -#include "pokemon_storage_system_internal.h" -#include "text_window.h" - -static EWRAM_DATA struct -{ - u8 funcId; - u8 state; - u8 fromColumn; - u8 fromRow; - u8 toColumn; - u8 toRow; - u8 cursorColumn; - u8 cursorRow; - u8 minColumn; - u8 minRow; - u8 columnsTotal; - u8 rowsTotal; - u16 bgX; - u16 bgY; - u16 bgMoveSteps; - struct BoxPokemon boxMons[IN_BOX_COUNT]; -} *sMultiMove = NULL; - -static bool8 MultiMove_Function_Start(void); -static bool8 MultiMove_Function_Single(void); -static bool8 MultiMove_Function_ChangeSelection(void); -static bool8 MultiMove_Function_GrabSelection(void); -static bool8 MultiMove_Function_MoveMons(void); -static bool8 MultiMove_Function_PlaceMons(void); -static void MultiMove_UpdateSelectedIcons(void); -static void MultiMove_SelectColumn(u8 column, u8 minRow, u8 maxRow); -static void MultiMove_SelectRow(u8 row, u8 minColumn, u8 maxColumn); -static void MultiMove_DeselectColumn(u8 arg0, u8 minRow, u8 maxRow); -static void MultiMove_DeselectRow(u8 row, u8 minColumn, u8 maxColumn); -static void MultiMove_SetIconToBg(u8 x, u8 y); -static void MultiMove_ClearIconFromBg(u8 x, u8 y); -static void MultiMove_InitBg(u16 bgX, u16 bgY, u16 duration); -static u8 MultiMove_UpdateBg(void); -static void MultiMove_GetMonsFromSelection(void); -static void MultiMove_RemoveMonsFromBox(void); -static void MultiMove_CreatePlacedMonIcons(void); -static void MultiMove_SetPlacedMonData(void); -static void MultiMove_ResetBg(void); - -static const struct WindowTemplate sWindowTemplate_MultiMove = { - .bg = 0, - .tilemapLeft = 10, - .tilemapTop = 3, - .width = 20, - .height = 18, - .paletteNum = 9, - .baseBlock = 0x00a -}; - -bool8 MultiMove_Init(void) -{ - sMultiMove = Alloc(sizeof(*sMultiMove)); - if (sMultiMove != NULL) - { - gStorage->multiMoveWindowId = AddWindow8Bit(&sWindowTemplate_MultiMove); - if (gStorage->multiMoveWindowId != WINDOW_NONE) - { - FillWindowPixelBuffer(gStorage->multiMoveWindowId, PIXEL_FILL(0)); - return TRUE; - } - } - - return FALSE; -} - -void MultiMove_Free(void) -{ - if (sMultiMove != NULL) - Free(sMultiMove); -} - -void MultiMove_SetFunction(u8 funcId) -{ - sMultiMove->funcId = funcId; - sMultiMove->state = 0; -} - -bool8 MultiMove_RunFunction(void) -{ - switch (sMultiMove->funcId) - { - case MULTIMOVE_START: - return MultiMove_Function_Start(); - case MULTIMOVE_SINGLE: - return MultiMove_Function_Single(); - case MULTIMOVE_CHANGE_SELECTION: - return MultiMove_Function_ChangeSelection(); - case MULTIMOVE_GRAB_SELECTION: - return MultiMove_Function_GrabSelection(); - case MULTIMOVE_MOVE_MONS: - return MultiMove_Function_MoveMons(); - case MULTIMOVE_PLACE_MONS: - return MultiMove_Function_PlaceMons(); - } - - return FALSE; -} - -static bool8 MultiMove_Function_Start(void) -{ - switch (sMultiMove->state) - { - case 0: - HideBg(0); - LoadMonIconPalettesAt(0x80); - sMultiMove->state++; - break; - case 1: - GetCursorBoxColumnAndRow(&sMultiMove->fromColumn, &sMultiMove->fromRow); - sMultiMove->toColumn = sMultiMove->fromColumn; - sMultiMove->toRow = sMultiMove->fromRow; - ChangeBgX(0, -1024, BG_COORD_SET); - ChangeBgY(0, -1024, BG_COORD_SET); - FillBgTilemapBufferRect_Palette0(0, 0, 0, 0, 32, 32); - FillWindowPixelBuffer8Bit(gStorage->multiMoveWindowId, PIXEL_FILL(0)); - MultiMove_SetIconToBg(sMultiMove->fromColumn, sMultiMove->fromRow); - SetBgAttribute(0, BG_ATTR_PALETTEMODE, 1); - PutWindowTilemap(gStorage->multiMoveWindowId); - CopyWindowToVram8Bit(gStorage->multiMoveWindowId, COPYWIN_FULL); - BlendPalettes(0x3F00, 8, RGB_WHITE); - StartCursorAnim(CURSOR_ANIM_OPEN); - SetGpuRegBits(REG_OFFSET_BG0CNT, BGCNT_256COLOR); - sMultiMove->state++; - break; - case 2: - if (!IsDma3ManagerBusyWithBgCopy()) - { - ShowBg(0); - return FALSE; - } - break; - } - - return TRUE; -} - -static bool8 MultiMove_Function_Single(void) -{ - switch (sMultiMove->state) - { - case 0: - HideBg(0); - sMultiMove->state++; - break; - case 1: - MultiMove_ResetBg(); - StartCursorAnim(CURSOR_ANIM_BOUNCE); - sMultiMove->state++; - break; - case 2: - if (!IsDma3ManagerBusyWithBgCopy()) - { - SetCursorPriorityTo1(); - LoadPalette(stdpal_get(3), 0xD0, 0x20); - ShowBg(0); - return FALSE; - } - break; - } - - return TRUE; -} - -static bool8 MultiMove_Function_ChangeSelection(void) -{ - switch (sMultiMove->state) - { - case 0: - if (!UpdateCursorPos()) - { - GetCursorBoxColumnAndRow(&sMultiMove->cursorColumn, &sMultiMove->cursorRow); - MultiMove_UpdateSelectedIcons(); - sMultiMove->toColumn = sMultiMove->cursorColumn; - sMultiMove->toRow = sMultiMove->cursorRow; - CopyWindowToVram8Bit(gStorage->multiMoveWindowId, COPYWIN_GFX); - sMultiMove->state++; - } - break; - case 1: - return IsDma3ManagerBusyWithBgCopy(); - } - - return TRUE; -} - -static bool8 MultiMove_Function_GrabSelection(void) -{ - u8 movingBg, movingMon; - - switch (sMultiMove->state) - { - case 0: - MultiMove_GetMonsFromSelection(); - MultiMove_RemoveMonsFromBox(); - InitMultiMonPlaceChange(FALSE); - sMultiMove->state++; - break; - case 1: - if (!DoMonPlaceChange()) - { - StartCursorAnim(CURSOR_ANIM_FIST); - MultiMove_InitBg(0, 256, 8); - InitMultiMonPlaceChange(TRUE); - sMultiMove->state++; - } - break; - case 2: - movingBg = MultiMove_UpdateBg(); - movingMon = DoMonPlaceChange(); - if (!movingBg && !movingMon) - return FALSE; - break; - } - - return TRUE; -} - -static bool8 MultiMove_Function_MoveMons(void) -{ - u8 movingCursor = UpdateCursorPos(); - u8 movingBg = MultiMove_UpdateBg(); - - if (!movingCursor && !movingBg) - return FALSE; - else - return TRUE; -} - -static bool8 MultiMove_Function_PlaceMons(void) -{ - switch (sMultiMove->state) - { - case 0: - MultiMove_SetPlacedMonData(); - MultiMove_InitBg(0, -256, 8); - InitMultiMonPlaceChange(FALSE); - sMultiMove->state++; - break; - case 1: - if (!DoMonPlaceChange() && !MultiMove_UpdateBg()) - { - MultiMove_CreatePlacedMonIcons(); - StartCursorAnim(CURSOR_ANIM_OPEN); - InitMultiMonPlaceChange(TRUE); - HideBg(0); - sMultiMove->state++; - } - break; - case 2: - if (!DoMonPlaceChange()) - { - StartCursorAnim(CURSOR_ANIM_BOUNCE); - MultiMove_ResetBg(); - sMultiMove->state++; - } - break; - case 3: - if (!IsDma3ManagerBusyWithBgCopy()) - { - LoadPalette(stdpal_get(3), 0xD0, 0x20); - SetCursorPriorityTo1(); - ShowBg(0); - return FALSE; - } - break; - } - - return TRUE; -} - -bool8 MultiMove_TryMoveGroup(u8 dir) -{ - switch (dir) - { - case 0: // up - if (sMultiMove->minRow == 0) - return FALSE; - sMultiMove->minRow--; - MultiMove_InitBg(0, 1024, 6); - break; - case 1: // down - if (sMultiMove->minRow + sMultiMove->rowsTotal >= 5) - return FALSE; - sMultiMove->minRow++; - MultiMove_InitBg(0, -1024, 6); - break; - case 2: // left - if (sMultiMove->minColumn == 0) - return FALSE; - sMultiMove->minColumn--; - MultiMove_InitBg(1024, 0, 6); - break; - case 3: // right - if (sMultiMove->minColumn + sMultiMove->columnsTotal > 5) - return FALSE; - sMultiMove->minColumn++; - MultiMove_InitBg(-1024, 0, 6); - break; - } - - return TRUE; -} - -static void MultiMove_UpdateSelectedIcons(void) -{ - s16 columnChange = (abs(sMultiMove->fromColumn - sMultiMove->cursorColumn)) - (abs(sMultiMove->fromColumn - sMultiMove->toColumn)); - s16 rowChange = (abs(sMultiMove->fromRow - sMultiMove->cursorRow)) - (abs(sMultiMove->fromRow - sMultiMove->toRow)); - - if (columnChange > 0) - MultiMove_SelectColumn(sMultiMove->cursorColumn, sMultiMove->fromRow, sMultiMove->toRow); - - if (columnChange < 0) - { - MultiMove_DeselectColumn(sMultiMove->toColumn, sMultiMove->fromRow, sMultiMove->toRow); - MultiMove_SelectColumn(sMultiMove->cursorColumn, sMultiMove->fromRow, sMultiMove->toRow); - } - - if (rowChange > 0) - MultiMove_SelectRow(sMultiMove->cursorRow, sMultiMove->fromColumn, sMultiMove->toColumn); - - if (rowChange < 0) - { - MultiMove_DeselectRow(sMultiMove->toRow, sMultiMove->fromColumn, sMultiMove->toColumn); - MultiMove_SelectRow(sMultiMove->cursorRow, sMultiMove->fromColumn, sMultiMove->toColumn); - } -} - -static void MultiMove_SelectColumn(u8 column, u8 minRow, u8 maxRow) -{ - u8 tmp = minRow; - - if (minRow > maxRow) - { - minRow = maxRow; - maxRow = tmp; - } - - while (minRow <= maxRow) - MultiMove_SetIconToBg(column, minRow++); -} - -static void MultiMove_SelectRow(u8 row, u8 minColumn, u8 maxColumn) -{ - u8 tmp = minColumn; - - if (minColumn > maxColumn) - { - minColumn = maxColumn; - maxColumn = tmp; - } - - while (minColumn <= maxColumn) - MultiMove_SetIconToBg(minColumn++, row); -} - -static void MultiMove_DeselectColumn(u8 column, u8 minRow, u8 maxRow) -{ - u8 tmp = minRow; - - if (minRow > maxRow) - { - minRow = maxRow; - maxRow = tmp; - } - - while (minRow <= maxRow) - MultiMove_ClearIconFromBg(column, minRow++); -} - -static void MultiMove_DeselectRow(u8 row, u8 minColumn, u8 maxColumn) -{ - u8 tmp = minColumn; - - if (minColumn > maxColumn) - { - minColumn = maxColumn; - maxColumn = tmp; - } - - while (minColumn <= maxColumn) - MultiMove_ClearIconFromBg(minColumn++, row); -} - -static void MultiMove_SetIconToBg(u8 x, u8 y) -{ - u8 position = x + (IN_BOX_COLUMNS * y); - u16 species = GetCurrentBoxMonData(position, MON_DATA_SPECIES2); - u32 personality = GetCurrentBoxMonData(position, MON_DATA_PERSONALITY); - - if (species != SPECIES_NONE) - { - const u8 *iconGfx = GetMonIconPtr(species, personality, 1); - u8 palNum = GetValidMonIconPalIndex(species) + 8; - BlitBitmapRectToWindow4BitTo8Bit(gStorage->multiMoveWindowId, iconGfx, 0, 0, 32, 32, 24 * x, 24 * y, 32, 32, palNum); - } -} - -static void MultiMove_ClearIconFromBg(u8 x, u8 y) -{ - u8 position = x + (IN_BOX_COLUMNS * y); - u16 species = GetCurrentBoxMonData(position, MON_DATA_SPECIES2); - - if (species != SPECIES_NONE) - FillWindowPixelRect8Bit(gStorage->multiMoveWindowId, PIXEL_FILL(0), 24 * x, 24 * y, 32, 32); -} - -static void MultiMove_InitBg(u16 bgX, u16 bgY, u16 duration) -{ - sMultiMove->bgX = bgX; - sMultiMove->bgY = bgY; - sMultiMove->bgMoveSteps = duration; -} - -static u8 MultiMove_UpdateBg(void) -{ - if (sMultiMove->bgMoveSteps != 0) - { - ChangeBgX(0, sMultiMove->bgX, BG_COORD_ADD); - ChangeBgY(0, sMultiMove->bgY, BG_COORD_ADD); - sMultiMove->bgMoveSteps--; - } - - return sMultiMove->bgMoveSteps; -} - -static void MultiMove_GetMonsFromSelection(void) -{ - s32 i, j; - s32 columnCount, rowCount; - u8 boxId; - u8 monArrayId; - - sMultiMove->minColumn = min(sMultiMove->fromColumn, sMultiMove->toColumn); - sMultiMove->minRow = min(sMultiMove->fromRow, sMultiMove->toRow); - sMultiMove->columnsTotal = abs(sMultiMove->fromColumn - sMultiMove->toColumn) + 1; - sMultiMove->rowsTotal = abs(sMultiMove->fromRow - sMultiMove->toRow) + 1; - boxId = StorageGetCurrentBox(); - monArrayId = 0; - columnCount = sMultiMove->minColumn + sMultiMove->columnsTotal; - rowCount = sMultiMove->minRow + sMultiMove->rowsTotal; - for (i = sMultiMove->minRow; i < rowCount; i++) - { - u8 boxPosition = (IN_BOX_COLUMNS * i) + sMultiMove->minColumn; - for (j = sMultiMove->minColumn; j < columnCount; j++) - { - struct BoxPokemon *boxMon = GetBoxedMonPtr(boxId, boxPosition); - // UB: possible null dereference -#ifdef UBFIX - if (boxMon != NULL) - sMultiMove->boxMons[monArrayId] = *boxMon; -#else - sMultiMove->boxMons[monArrayId] = *boxMon; -#endif - monArrayId++; - boxPosition++; - } - } -} - -static void MultiMove_RemoveMonsFromBox(void) -{ - s32 i, j; - s32 columnCount = sMultiMove->minColumn + sMultiMove->columnsTotal; - s32 rowCount = sMultiMove->minRow + sMultiMove->rowsTotal; - u8 boxId = StorageGetCurrentBox(); - - for (i = sMultiMove->minRow; i < rowCount; i++) - { - u8 boxPosition = (IN_BOX_COLUMNS * i) + sMultiMove->minColumn; - for (j = sMultiMove->minColumn; j < columnCount; j++) - { - DestroyBoxMonIconAtPosition(boxPosition); - ZeroBoxMonAt(boxId, boxPosition); - boxPosition++; - } - } -} - -static void MultiMove_CreatePlacedMonIcons(void) -{ - s32 i, j; - s32 columnCount = sMultiMove->minColumn + sMultiMove->columnsTotal; - s32 rowCount = sMultiMove->minRow + sMultiMove->rowsTotal; - u8 monArrayId = 0; - - for (i = sMultiMove->minRow; i < rowCount; i++) - { - u8 boxPosition = (IN_BOX_COLUMNS * i) + sMultiMove->minColumn; - for (j = sMultiMove->minColumn; j < columnCount; j++) - { - if (GetBoxMonData(&sMultiMove->boxMons[monArrayId], MON_DATA_SANITY_HAS_SPECIES)) - CreateBoxMonIconAtPos(boxPosition); - monArrayId++; - boxPosition++; - } - } -} - -static void MultiMove_SetPlacedMonData(void) -{ - s32 i, j; - s32 columnCount = sMultiMove->minColumn + sMultiMove->columnsTotal; - s32 rowCount = sMultiMove->minRow + sMultiMove->rowsTotal; - u8 boxId = StorageGetCurrentBox(); - u8 monArrayId = 0; - - for (i = sMultiMove->minRow; i < rowCount; i++) - { - u8 boxPosition = (IN_BOX_COLUMNS * i) + sMultiMove->minColumn; - for (j = sMultiMove->minColumn; j < columnCount; j++) - { - if (GetBoxMonData(&sMultiMove->boxMons[monArrayId], MON_DATA_SANITY_HAS_SPECIES)) - SetBoxMonAt(boxId, boxPosition, &sMultiMove->boxMons[monArrayId]); - boxPosition++; - monArrayId++; - } - } -} - -static void MultiMove_ResetBg(void) -{ - ChangeBgX(0, 0, BG_COORD_SET); - ChangeBgY(0, 0, BG_COORD_SET); - SetBgAttribute(0, BG_ATTR_PALETTEMODE, 0); - ClearGpuRegBits(REG_OFFSET_BG0CNT, BGCNT_256COLOR); - FillBgTilemapBufferRect_Palette0(0, 0, 0, 0, 32, 32); - CopyBgTilemapBufferToVram(0); -} - -u8 MultiMove_GetOriginPosition(void) -{ - return (IN_BOX_COLUMNS * sMultiMove->fromRow) + sMultiMove->fromColumn; -} - -bool8 MultiMove_CanPlaceSelection(void) -{ - s32 i, j; - s32 columnCount = sMultiMove->minColumn + sMultiMove->columnsTotal; - s32 rowCount = sMultiMove->minRow + sMultiMove->rowsTotal; - u8 monArrayId = 0; - - for (i = sMultiMove->minRow; i < rowCount; i++) - { - u8 boxPosition = (IN_BOX_COLUMNS * i) + sMultiMove->minColumn; - for (j = sMultiMove->minColumn; j < columnCount; j++) - { - if (GetBoxMonData(&sMultiMove->boxMons[monArrayId], MON_DATA_SANITY_HAS_SPECIES) - && GetCurrentBoxMonData(boxPosition, MON_DATA_SANITY_HAS_SPECIES)) - return FALSE; - - monArrayId++; - boxPosition++; - } - } - - return TRUE; -} diff --git a/src/pokemon_storage_system_5.c b/src/pokemon_storage_system_data.c similarity index 92% rename from src/pokemon_storage_system_5.c rename to src/pokemon_storage_system_data.c index d3373f247..dfe34330a 100644 --- a/src/pokemon_storage_system_5.c +++ b/src/pokemon_storage_system_data.c @@ -3,11 +3,14 @@ #include "data.h" #include "item.h" #include "mail_data.h" +#include "menu.h" +#include "new_menu_helpers.h" #include "pokemon_storage_system_internal.h" #include "pokemon_summary_screen.h" #include "strings.h" #include "constants/items.h" #include "constants/moves.h" +#include "constants/songs.h" static EWRAM_DATA struct Pokemon sMonBeingCarried = {}; static EWRAM_DATA s8 sCursorArea = 0; @@ -2020,3 +2023,143 @@ void TryShowItemAtCursor(void) if (sCursorArea == CURSOR_AREA_IN_BOX) TryLoadItemIconAtPos(CURSOR_AREA_IN_BOX, sCursorPosition); } + +static const u8 *const sMenuTexts[] = { + [MENU_TEXT_CANCEL] = gPCText_Cancel, + [MENU_TEXT_STORE] = gPCText_Store, + [MENU_TEXT_WITHDRAW] = gPCText_Withdraw, + [MENU_TEXT_MOVE] = gPCText_Move, + [MENU_TEXT_SHIFT] = gPCText_Shift, + [MENU_TEXT_PLACE] = gPCText_Place, + [MENU_TEXT_SUMMARY] = gPCText_Summary, + [MENU_TEXT_RELEASE] = gPCText_Release, + [MENU_TEXT_MARK] = gPCText_Mark, + [MENU_TEXT_JUMP] = gPCText_Jump, + [MENU_TEXT_WALLPAPER] = gPCText_Wallpaper, + [MENU_TEXT_NAME] = gPCText_Name, + [MENU_TEXT_TAKE] = gPCText_Take, + [MENU_TEXT_GIVE] = gPCText_Give, + [MENU_TEXT_GIVE2] = gPCText_Give, + [MENU_TEXT_SWITCH] = gPCText_Switch, + [MENU_TEXT_BAG] = gPCText_Bag, + [MENU_TEXT_INFO] = gPCText_Info, + [MENU_TEXT_SCENERY_1] = gPCText_Scenery1, + [MENU_TEXT_SCENERY_2] = gPCText_Scenery2, + [MENU_TEXT_SCENERY_3] = gPCText_Scenery3, + [MENU_TEXT_ETCETERA] = gPCText_Etcetera, + [MENU_TEXT_FOREST] = gPCText_Forest, + [MENU_TEXT_CITY] = gPCText_City, + [MENU_TEXT_DESERT] = gPCText_Desert, + [MENU_TEXT_SAVANNA] = gPCText_Savanna, + [MENU_TEXT_CRAG] = gPCText_Crag, + [MENU_TEXT_VOLCANO] = gPCText_Volcano, + [MENU_TEXT_SNOW] = gPCText_Snow, + [MENU_TEXT_CAVE] = gPCText_Cave, + [MENU_TEXT_BEACH] = gPCText_Beach, + [MENU_TEXT_SEAFLOOR] = gPCText_Seafloor, + [MENU_TEXT_RIVER] = gPCText_River, + [MENU_TEXT_SKY] = gPCText_Sky, + [MENU_TEXT_POLKADOT] = gPCText_PolkaDot, + [MENU_TEXT_POKECENTER] = gPCText_Pokecenter, + [MENU_TEXT_MACHINE] = gPCText_Machine, + [MENU_TEXT_SIMPLE] = gPCText_Simple, +}; + +void InitMenu(void) +{ + gStorage->menuItemsCount = 0; + gStorage->menuWidth = 0; + gStorage->menuWindow.bg = 0; + gStorage->menuWindow.paletteNum = 15; + gStorage->menuWindow.baseBlock = 92; +} + +void SetMenuText(u8 textId) +{ + if (gStorage->menuItemsCount < ARRAY_COUNT(gStorage->menuItems)) + { + u8 len; + struct StorageMenu *menu = &gStorage->menuItems[gStorage->menuItemsCount]; + + menu->text = sMenuTexts[textId]; + menu->textId = textId; + len = StringLength(menu->text); + if (len > gStorage->menuWidth) + gStorage->menuWidth = len; + + gStorage->menuItemsCount++; + } +} + +s8 GetMenuItemTextId(u8 menuIndex) +{ + if (menuIndex >= gStorage->menuItemsCount) + return MENU_B_PRESSED; + else + return gStorage->menuItems[menuIndex].textId; +} + +void AddMenu(void) +{ + gStorage->menuWindow.width = gStorage->menuWidth + 2; + gStorage->menuWindow.height = 2 * gStorage->menuItemsCount; + gStorage->menuWindow.tilemapLeft = 29 - gStorage->menuWindow.width; + gStorage->menuWindow.tilemapTop = 15 - gStorage->menuWindow.height; + gStorage->menuWindowId = AddWindow(&gStorage->menuWindow); + ClearWindowTilemap(gStorage->menuWindowId); + DrawStdFrameWithCustomTileAndPalette(gStorage->menuWindowId, FALSE, 11, 14); + PrintTextArray(gStorage->menuWindowId, FONT_1, 8, 2, 16, gStorage->menuItemsCount, (void *)gStorage->menuItems); + Menu_InitCursor(gStorage->menuWindowId, FONT_1, 0, 2, 16, gStorage->menuItemsCount, 0); + ScheduleBgCopyTilemapToVram(0); + gStorage->menuUnusedField = 0; +} + +bool8 IsMenuLoading(void) +{ + // Possibly stubbed out debug code? + return FALSE; +} + +s16 HandleMenuInput(void) +{ + s32 input = MENU_NOTHING_CHOSEN; + + do + { + if (JOY_NEW(A_BUTTON)) + { + input = Menu_GetCursorPos(); + break; + } + else if (JOY_NEW(B_BUTTON)) + { + PlaySE(SE_SELECT); + input = MENU_B_PRESSED; + } + + if (JOY_NEW(DPAD_UP)) + { + PlaySE(SE_SELECT); + Menu_MoveCursor(-1); + } + else if (JOY_NEW(DPAD_DOWN)) + { + PlaySE(SE_SELECT); + Menu_MoveCursor(1); + } + } while (FALSE); + + if (input != MENU_NOTHING_CHOSEN) + RemoveMenu(); + + if (input >= 0) + input = gStorage->menuItems[input].textId; + + return input; +} + +void RemoveMenu(void) +{ + ClearStdWindowAndFrameToTransparent(gStorage->menuWindowId, TRUE); + RemoveWindow(gStorage->menuWindowId); +} diff --git a/src/pokemon_storage_system_4.c b/src/pokemon_storage_system_graphics.c similarity index 100% rename from src/pokemon_storage_system_4.c rename to src/pokemon_storage_system_graphics.c diff --git a/src/pokemon_storage_system_2.c b/src/pokemon_storage_system_menu.c similarity index 100% rename from src/pokemon_storage_system_2.c rename to src/pokemon_storage_system_menu.c diff --git a/src/pokemon_storage_system_8.c b/src/pokemon_storage_system_misc.c similarity index 61% rename from src/pokemon_storage_system_8.c rename to src/pokemon_storage_system_misc.c index 644aad1aa..2cfa98152 100644 --- a/src/pokemon_storage_system_8.c +++ b/src/pokemon_storage_system_misc.c @@ -1,3 +1,4 @@ +#include // to declare abs #include "global.h" #include "gflib.h" #include "decompress.h" @@ -5,10 +6,572 @@ #include "item_menu_icons.h" #include "menu.h" #include "new_menu_helpers.h" +#include "pokemon_icon.h" #include "pokemon_storage_system_internal.h" +#include "text_window.h" #include "trig.h" #include "constants/items.h" +static EWRAM_DATA struct +{ + u8 funcId; + u8 state; + u8 fromColumn; + u8 fromRow; + u8 toColumn; + u8 toRow; + u8 cursorColumn; + u8 cursorRow; + u8 minColumn; + u8 minRow; + u8 columnsTotal; + u8 rowsTotal; + u16 bgX; + u16 bgY; + u16 bgMoveSteps; + struct BoxPokemon boxMons[IN_BOX_COUNT]; +} *sMultiMove = NULL; + +static bool8 MultiMove_Function_Start(void); +static bool8 MultiMove_Function_Single(void); +static bool8 MultiMove_Function_ChangeSelection(void); +static bool8 MultiMove_Function_GrabSelection(void); +static bool8 MultiMove_Function_MoveMons(void); +static bool8 MultiMove_Function_PlaceMons(void); +static void MultiMove_UpdateSelectedIcons(void); +static void MultiMove_SelectColumn(u8 column, u8 minRow, u8 maxRow); +static void MultiMove_SelectRow(u8 row, u8 minColumn, u8 maxColumn); +static void MultiMove_DeselectColumn(u8 arg0, u8 minRow, u8 maxRow); +static void MultiMove_DeselectRow(u8 row, u8 minColumn, u8 maxColumn); +static void MultiMove_SetIconToBg(u8 x, u8 y); +static void MultiMove_ClearIconFromBg(u8 x, u8 y); +static void MultiMove_InitBg(u16 bgX, u16 bgY, u16 duration); +static u8 MultiMove_UpdateBg(void); +static void MultiMove_GetMonsFromSelection(void); +static void MultiMove_RemoveMonsFromBox(void); +static void MultiMove_CreatePlacedMonIcons(void); +static void MultiMove_SetPlacedMonData(void); +static void MultiMove_ResetBg(void); + +static const struct WindowTemplate sWindowTemplate_MultiMove = { + .bg = 0, + .tilemapLeft = 10, + .tilemapTop = 3, + .width = 20, + .height = 18, + .paletteNum = 9, + .baseBlock = 0x00a +}; + +bool8 MultiMove_Init(void) +{ + sMultiMove = Alloc(sizeof(*sMultiMove)); + if (sMultiMove != NULL) + { + gStorage->multiMoveWindowId = AddWindow8Bit(&sWindowTemplate_MultiMove); + if (gStorage->multiMoveWindowId != WINDOW_NONE) + { + FillWindowPixelBuffer(gStorage->multiMoveWindowId, PIXEL_FILL(0)); + return TRUE; + } + } + + return FALSE; +} + +void MultiMove_Free(void) +{ + if (sMultiMove != NULL) + Free(sMultiMove); +} + +void MultiMove_SetFunction(u8 funcId) +{ + sMultiMove->funcId = funcId; + sMultiMove->state = 0; +} + +bool8 MultiMove_RunFunction(void) +{ + switch (sMultiMove->funcId) + { + case MULTIMOVE_START: + return MultiMove_Function_Start(); + case MULTIMOVE_SINGLE: + return MultiMove_Function_Single(); + case MULTIMOVE_CHANGE_SELECTION: + return MultiMove_Function_ChangeSelection(); + case MULTIMOVE_GRAB_SELECTION: + return MultiMove_Function_GrabSelection(); + case MULTIMOVE_MOVE_MONS: + return MultiMove_Function_MoveMons(); + case MULTIMOVE_PLACE_MONS: + return MultiMove_Function_PlaceMons(); + } + + return FALSE; +} + +static bool8 MultiMove_Function_Start(void) +{ + switch (sMultiMove->state) + { + case 0: + HideBg(0); + LoadMonIconPalettesAt(0x80); + sMultiMove->state++; + break; + case 1: + GetCursorBoxColumnAndRow(&sMultiMove->fromColumn, &sMultiMove->fromRow); + sMultiMove->toColumn = sMultiMove->fromColumn; + sMultiMove->toRow = sMultiMove->fromRow; + ChangeBgX(0, -1024, BG_COORD_SET); + ChangeBgY(0, -1024, BG_COORD_SET); + FillBgTilemapBufferRect_Palette0(0, 0, 0, 0, 32, 32); + FillWindowPixelBuffer8Bit(gStorage->multiMoveWindowId, PIXEL_FILL(0)); + MultiMove_SetIconToBg(sMultiMove->fromColumn, sMultiMove->fromRow); + SetBgAttribute(0, BG_ATTR_PALETTEMODE, 1); + PutWindowTilemap(gStorage->multiMoveWindowId); + CopyWindowToVram8Bit(gStorage->multiMoveWindowId, COPYWIN_FULL); + BlendPalettes(0x3F00, 8, RGB_WHITE); + StartCursorAnim(CURSOR_ANIM_OPEN); + SetGpuRegBits(REG_OFFSET_BG0CNT, BGCNT_256COLOR); + sMultiMove->state++; + break; + case 2: + if (!IsDma3ManagerBusyWithBgCopy()) + { + ShowBg(0); + return FALSE; + } + break; + } + + return TRUE; +} + +static bool8 MultiMove_Function_Single(void) +{ + switch (sMultiMove->state) + { + case 0: + HideBg(0); + sMultiMove->state++; + break; + case 1: + MultiMove_ResetBg(); + StartCursorAnim(CURSOR_ANIM_BOUNCE); + sMultiMove->state++; + break; + case 2: + if (!IsDma3ManagerBusyWithBgCopy()) + { + SetCursorPriorityTo1(); + LoadPalette(stdpal_get(3), 0xD0, 0x20); + ShowBg(0); + return FALSE; + } + break; + } + + return TRUE; +} + +static bool8 MultiMove_Function_ChangeSelection(void) +{ + switch (sMultiMove->state) + { + case 0: + if (!UpdateCursorPos()) + { + GetCursorBoxColumnAndRow(&sMultiMove->cursorColumn, &sMultiMove->cursorRow); + MultiMove_UpdateSelectedIcons(); + sMultiMove->toColumn = sMultiMove->cursorColumn; + sMultiMove->toRow = sMultiMove->cursorRow; + CopyWindowToVram8Bit(gStorage->multiMoveWindowId, COPYWIN_GFX); + sMultiMove->state++; + } + break; + case 1: + return IsDma3ManagerBusyWithBgCopy(); + } + + return TRUE; +} + +static bool8 MultiMove_Function_GrabSelection(void) +{ + u8 movingBg, movingMon; + + switch (sMultiMove->state) + { + case 0: + MultiMove_GetMonsFromSelection(); + MultiMove_RemoveMonsFromBox(); + InitMultiMonPlaceChange(FALSE); + sMultiMove->state++; + break; + case 1: + if (!DoMonPlaceChange()) + { + StartCursorAnim(CURSOR_ANIM_FIST); + MultiMove_InitBg(0, 256, 8); + InitMultiMonPlaceChange(TRUE); + sMultiMove->state++; + } + break; + case 2: + movingBg = MultiMove_UpdateBg(); + movingMon = DoMonPlaceChange(); + if (!movingBg && !movingMon) + return FALSE; + break; + } + + return TRUE; +} + +static bool8 MultiMove_Function_MoveMons(void) +{ + u8 movingCursor = UpdateCursorPos(); + u8 movingBg = MultiMove_UpdateBg(); + + if (!movingCursor && !movingBg) + return FALSE; + else + return TRUE; +} + +static bool8 MultiMove_Function_PlaceMons(void) +{ + switch (sMultiMove->state) + { + case 0: + MultiMove_SetPlacedMonData(); + MultiMove_InitBg(0, -256, 8); + InitMultiMonPlaceChange(FALSE); + sMultiMove->state++; + break; + case 1: + if (!DoMonPlaceChange() && !MultiMove_UpdateBg()) + { + MultiMove_CreatePlacedMonIcons(); + StartCursorAnim(CURSOR_ANIM_OPEN); + InitMultiMonPlaceChange(TRUE); + HideBg(0); + sMultiMove->state++; + } + break; + case 2: + if (!DoMonPlaceChange()) + { + StartCursorAnim(CURSOR_ANIM_BOUNCE); + MultiMove_ResetBg(); + sMultiMove->state++; + } + break; + case 3: + if (!IsDma3ManagerBusyWithBgCopy()) + { + LoadPalette(stdpal_get(3), 0xD0, 0x20); + SetCursorPriorityTo1(); + ShowBg(0); + return FALSE; + } + break; + } + + return TRUE; +} + +bool8 MultiMove_TryMoveGroup(u8 dir) +{ + switch (dir) + { + case 0: // up + if (sMultiMove->minRow == 0) + return FALSE; + sMultiMove->minRow--; + MultiMove_InitBg(0, 1024, 6); + break; + case 1: // down + if (sMultiMove->minRow + sMultiMove->rowsTotal >= 5) + return FALSE; + sMultiMove->minRow++; + MultiMove_InitBg(0, -1024, 6); + break; + case 2: // left + if (sMultiMove->minColumn == 0) + return FALSE; + sMultiMove->minColumn--; + MultiMove_InitBg(1024, 0, 6); + break; + case 3: // right + if (sMultiMove->minColumn + sMultiMove->columnsTotal > 5) + return FALSE; + sMultiMove->minColumn++; + MultiMove_InitBg(-1024, 0, 6); + break; + } + + return TRUE; +} + +static void MultiMove_UpdateSelectedIcons(void) +{ + s16 columnChange = (abs(sMultiMove->fromColumn - sMultiMove->cursorColumn)) - (abs(sMultiMove->fromColumn - sMultiMove->toColumn)); + s16 rowChange = (abs(sMultiMove->fromRow - sMultiMove->cursorRow)) - (abs(sMultiMove->fromRow - sMultiMove->toRow)); + + if (columnChange > 0) + MultiMove_SelectColumn(sMultiMove->cursorColumn, sMultiMove->fromRow, sMultiMove->toRow); + + if (columnChange < 0) + { + MultiMove_DeselectColumn(sMultiMove->toColumn, sMultiMove->fromRow, sMultiMove->toRow); + MultiMove_SelectColumn(sMultiMove->cursorColumn, sMultiMove->fromRow, sMultiMove->toRow); + } + + if (rowChange > 0) + MultiMove_SelectRow(sMultiMove->cursorRow, sMultiMove->fromColumn, sMultiMove->toColumn); + + if (rowChange < 0) + { + MultiMove_DeselectRow(sMultiMove->toRow, sMultiMove->fromColumn, sMultiMove->toColumn); + MultiMove_SelectRow(sMultiMove->cursorRow, sMultiMove->fromColumn, sMultiMove->toColumn); + } +} + +static void MultiMove_SelectColumn(u8 column, u8 minRow, u8 maxRow) +{ + u8 tmp = minRow; + + if (minRow > maxRow) + { + minRow = maxRow; + maxRow = tmp; + } + + while (minRow <= maxRow) + MultiMove_SetIconToBg(column, minRow++); +} + +static void MultiMove_SelectRow(u8 row, u8 minColumn, u8 maxColumn) +{ + u8 tmp = minColumn; + + if (minColumn > maxColumn) + { + minColumn = maxColumn; + maxColumn = tmp; + } + + while (minColumn <= maxColumn) + MultiMove_SetIconToBg(minColumn++, row); +} + +static void MultiMove_DeselectColumn(u8 column, u8 minRow, u8 maxRow) +{ + u8 tmp = minRow; + + if (minRow > maxRow) + { + minRow = maxRow; + maxRow = tmp; + } + + while (minRow <= maxRow) + MultiMove_ClearIconFromBg(column, minRow++); +} + +static void MultiMove_DeselectRow(u8 row, u8 minColumn, u8 maxColumn) +{ + u8 tmp = minColumn; + + if (minColumn > maxColumn) + { + minColumn = maxColumn; + maxColumn = tmp; + } + + while (minColumn <= maxColumn) + MultiMove_ClearIconFromBg(minColumn++, row); +} + +static void MultiMove_SetIconToBg(u8 x, u8 y) +{ + u8 position = x + (IN_BOX_COLUMNS * y); + u16 species = GetCurrentBoxMonData(position, MON_DATA_SPECIES2); + u32 personality = GetCurrentBoxMonData(position, MON_DATA_PERSONALITY); + + if (species != SPECIES_NONE) + { + const u8 *iconGfx = GetMonIconPtr(species, personality, 1); + u8 palNum = GetValidMonIconPalIndex(species) + 8; + BlitBitmapRectToWindow4BitTo8Bit(gStorage->multiMoveWindowId, iconGfx, 0, 0, 32, 32, 24 * x, 24 * y, 32, 32, palNum); + } +} + +static void MultiMove_ClearIconFromBg(u8 x, u8 y) +{ + u8 position = x + (IN_BOX_COLUMNS * y); + u16 species = GetCurrentBoxMonData(position, MON_DATA_SPECIES2); + + if (species != SPECIES_NONE) + FillWindowPixelRect8Bit(gStorage->multiMoveWindowId, PIXEL_FILL(0), 24 * x, 24 * y, 32, 32); +} + +static void MultiMove_InitBg(u16 bgX, u16 bgY, u16 duration) +{ + sMultiMove->bgX = bgX; + sMultiMove->bgY = bgY; + sMultiMove->bgMoveSteps = duration; +} + +static u8 MultiMove_UpdateBg(void) +{ + if (sMultiMove->bgMoveSteps != 0) + { + ChangeBgX(0, sMultiMove->bgX, BG_COORD_ADD); + ChangeBgY(0, sMultiMove->bgY, BG_COORD_ADD); + sMultiMove->bgMoveSteps--; + } + + return sMultiMove->bgMoveSteps; +} + +static void MultiMove_GetMonsFromSelection(void) +{ + s32 i, j; + s32 columnCount, rowCount; + u8 boxId; + u8 monArrayId; + + sMultiMove->minColumn = min(sMultiMove->fromColumn, sMultiMove->toColumn); + sMultiMove->minRow = min(sMultiMove->fromRow, sMultiMove->toRow); + sMultiMove->columnsTotal = abs(sMultiMove->fromColumn - sMultiMove->toColumn) + 1; + sMultiMove->rowsTotal = abs(sMultiMove->fromRow - sMultiMove->toRow) + 1; + boxId = StorageGetCurrentBox(); + monArrayId = 0; + columnCount = sMultiMove->minColumn + sMultiMove->columnsTotal; + rowCount = sMultiMove->minRow + sMultiMove->rowsTotal; + for (i = sMultiMove->minRow; i < rowCount; i++) + { + u8 boxPosition = (IN_BOX_COLUMNS * i) + sMultiMove->minColumn; + for (j = sMultiMove->minColumn; j < columnCount; j++) + { + struct BoxPokemon *boxMon = GetBoxedMonPtr(boxId, boxPosition); + // UB: possible null dereference +#ifdef UBFIX + if (boxMon != NULL) + sMultiMove->boxMons[monArrayId] = *boxMon; +#else + sMultiMove->boxMons[monArrayId] = *boxMon; +#endif + monArrayId++; + boxPosition++; + } + } +} + +static void MultiMove_RemoveMonsFromBox(void) +{ + s32 i, j; + s32 columnCount = sMultiMove->minColumn + sMultiMove->columnsTotal; + s32 rowCount = sMultiMove->minRow + sMultiMove->rowsTotal; + u8 boxId = StorageGetCurrentBox(); + + for (i = sMultiMove->minRow; i < rowCount; i++) + { + u8 boxPosition = (IN_BOX_COLUMNS * i) + sMultiMove->minColumn; + for (j = sMultiMove->minColumn; j < columnCount; j++) + { + DestroyBoxMonIconAtPosition(boxPosition); + ZeroBoxMonAt(boxId, boxPosition); + boxPosition++; + } + } +} + +static void MultiMove_CreatePlacedMonIcons(void) +{ + s32 i, j; + s32 columnCount = sMultiMove->minColumn + sMultiMove->columnsTotal; + s32 rowCount = sMultiMove->minRow + sMultiMove->rowsTotal; + u8 monArrayId = 0; + + for (i = sMultiMove->minRow; i < rowCount; i++) + { + u8 boxPosition = (IN_BOX_COLUMNS * i) + sMultiMove->minColumn; + for (j = sMultiMove->minColumn; j < columnCount; j++) + { + if (GetBoxMonData(&sMultiMove->boxMons[monArrayId], MON_DATA_SANITY_HAS_SPECIES)) + CreateBoxMonIconAtPos(boxPosition); + monArrayId++; + boxPosition++; + } + } +} + +static void MultiMove_SetPlacedMonData(void) +{ + s32 i, j; + s32 columnCount = sMultiMove->minColumn + sMultiMove->columnsTotal; + s32 rowCount = sMultiMove->minRow + sMultiMove->rowsTotal; + u8 boxId = StorageGetCurrentBox(); + u8 monArrayId = 0; + + for (i = sMultiMove->minRow; i < rowCount; i++) + { + u8 boxPosition = (IN_BOX_COLUMNS * i) + sMultiMove->minColumn; + for (j = sMultiMove->minColumn; j < columnCount; j++) + { + if (GetBoxMonData(&sMultiMove->boxMons[monArrayId], MON_DATA_SANITY_HAS_SPECIES)) + SetBoxMonAt(boxId, boxPosition, &sMultiMove->boxMons[monArrayId]); + boxPosition++; + monArrayId++; + } + } +} + +static void MultiMove_ResetBg(void) +{ + ChangeBgX(0, 0, BG_COORD_SET); + ChangeBgY(0, 0, BG_COORD_SET); + SetBgAttribute(0, BG_ATTR_PALETTEMODE, 0); + ClearGpuRegBits(REG_OFFSET_BG0CNT, BGCNT_256COLOR); + FillBgTilemapBufferRect_Palette0(0, 0, 0, 0, 32, 32); + CopyBgTilemapBufferToVram(0); +} + +u8 MultiMove_GetOriginPosition(void) +{ + return (IN_BOX_COLUMNS * sMultiMove->fromRow) + sMultiMove->fromColumn; +} + +bool8 MultiMove_CanPlaceSelection(void) +{ + s32 i, j; + s32 columnCount = sMultiMove->minColumn + sMultiMove->columnsTotal; + s32 rowCount = sMultiMove->minRow + sMultiMove->rowsTotal; + u8 monArrayId = 0; + + for (i = sMultiMove->minRow; i < rowCount; i++) + { + u8 boxPosition = (IN_BOX_COLUMNS * i) + sMultiMove->minColumn; + for (j = sMultiMove->minColumn; j < columnCount; j++) + { + if (GetBoxMonData(&sMultiMove->boxMons[monArrayId], MON_DATA_SANITY_HAS_SPECIES) + && GetCurrentBoxMonData(boxPosition, MON_DATA_SANITY_HAS_SPECIES)) + return FALSE; + + monArrayId++; + boxPosition++; + } + } + + return TRUE; +} + // IDs for the item icon sprite callbacks enum { ITEM_CB_WAIT_ANIM, diff --git a/src/pokemon_storage_system_3.c b/src/pokemon_storage_system_tasks.c similarity index 99% rename from src/pokemon_storage_system_3.c rename to src/pokemon_storage_system_tasks.c index b7b4eaf4f..bad54118e 100644 --- a/src/pokemon_storage_system_3.c +++ b/src/pokemon_storage_system_tasks.c @@ -1,6 +1,5 @@ #include "global.h" #include "gflib.h" -#include "box_party_pokemon_dropdown.h" #include "data.h" #include "decompress.h" #include "dynamic_placeholder_text_util.h" @@ -21,6 +20,7 @@ #include "strings.h" #include "task.h" #include "text_window.h" +#include "tilemap_util.h" #include "trig.h" #include "constants/items.h" #include "constants/help_system.h" diff --git a/src/box_party_pokemon_dropdown.c b/src/tilemap_util.c similarity index 99% rename from src/box_party_pokemon_dropdown.c rename to src/tilemap_util.c index f4cf05bd8..fe2f34866 100644 --- a/src/box_party_pokemon_dropdown.c +++ b/src/tilemap_util.c @@ -1,6 +1,6 @@ #include "global.h" #include "bg.h" -#include "box_party_pokemon_dropdown.h" +#include "tilemap_util.h" #include "malloc.h" // Handles 3 particular tilemaps ("PKMN Data" text, party menu, close box diff --git a/sym_bss.txt b/sym_bss.txt index 63a52555c..9f50fd0a7 100644 --- a/sym_bss.txt +++ b/sym_bss.txt @@ -16,7 +16,7 @@ .include "src/tileset_anims.o" .include "src/sound.o" .include "src/field_effect.o" - .include "src/pokemon_storage_system_8.o" + .include "src/pokemon_storage_system_misc.o" .include "src/easy_chat.o" .include "src/link_rfu_2.o" .include "src/link_rfu_3.o" diff --git a/sym_ewram.txt b/sym_ewram.txt index a3766873e..ef48abffa 100644 --- a/sym_ewram.txt +++ b/sym_ewram.txt @@ -38,11 +38,10 @@ .include "src/scanline_effect.o" .include "src/option_menu.o" .include "src/trainer_card.o" - .include "src/pokemon_storage_system_2.o" - .include "src/pokemon_storage_system_3.o" - .include "src/pokemon_storage_system_5.o" - .include "src/pokemon_storage_system_7.o" - .include "src/pokemon_storage_system_8.o" + .include "src/pokemon_storage_system_menu.o" + .include "src/pokemon_storage_system_tasks.o" + .include "src/pokemon_storage_system_data.o" + .include "src/pokemon_storage_system_misc.o" .include "src/script_movement.o" .include "src/fldeff_cut.o" .include "src/item_menu_icons.o" @@ -84,7 +83,7 @@ .include "src/save_failed_screen.o" .include "src/clear_save_data_screen.o" .include "src/new_menu_helpers.o" - .include "src/box_party_pokemon_dropdown.o" + .include "src/tilemap_util.o" .include "src/map_preview_screen.o" .include "src/link_rfu_2.o" .include "src/link_rfu_3.o"