diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/decoration.c | 2 | ||||
-rw-r--r-- | src/frontier_pass.c | 676 | ||||
-rw-r--r-- | src/graphics.c | 14 | ||||
-rw-r--r-- | src/international_string_util.c | 4 | ||||
-rwxr-xr-x | src/item_menu.c | 4 | ||||
-rw-r--r-- | src/menu_helpers.c | 30 | ||||
-rw-r--r-- | src/menu_specialized.c | 92 | ||||
-rwxr-xr-x | src/party_menu.c | 2 | ||||
-rw-r--r-- | src/player_pc.c | 1173 | ||||
-rw-r--r-- | src/region_map.c | 24 | ||||
-rw-r--r-- | src/secret_base.c | 2 |
11 files changed, 1086 insertions, 937 deletions
diff --git a/src/decoration.c b/src/decoration.c index 62d1966bf..4d1c79982 100644 --- a/src/decoration.c +++ b/src/decoration.c @@ -862,7 +862,7 @@ static void InitDecorationItemsMenuLimits(void) static void InitDecorationItemsMenuScrollAndCursor(void) { - sub_812225C(&sDecorationsScrollOffset, &sDecorationsCursorPos, sDecorationItemsMenu->maxShownItems, sDecorationItemsMenu->numMenuItems); + SetCursorWithinListBounds(&sDecorationsScrollOffset, &sDecorationsCursorPos, sDecorationItemsMenu->maxShownItems, sDecorationItemsMenu->numMenuItems); } static void InitDecorationItemsMenuScrollAndCursor2(void) diff --git a/src/frontier_pass.c b/src/frontier_pass.c index 22a7695f2..e3e5ee1f2 100644 --- a/src/frontier_pass.c +++ b/src/frontier_pass.c @@ -38,14 +38,14 @@ enum WINDOW_BATTLE_RECORD, WINDOW_BATTLE_POINTS, WINDOW_DESCRIPTION, - WINDOW_4, + WINDOW_DUMMY, WINDOW_COUNT }; // Windows displayed in the facilities map view. enum { - MAP_WINDOW_0, + MAP_WINDOW_UNUSED, // Overlaps the "Battle Frontier" title area of the map MAP_WINDOW_NAME, MAP_WINDOW_DESCRIPTION, MAP_WINDOW_COUNT @@ -59,9 +59,39 @@ enum CURSOR_AREA_RECORD, CURSOR_AREA_CANCEL, CURSOR_AREA_POINTS, - CURSOR_AREA_EARNED_SYMBOLS, // The window. - CURSOR_AREA_SYMBOL, // All 7 symbols. - CURSOR_AREA_COUNT = CURSOR_AREA_SYMBOL + NUM_FRONTIER_FACILITIES, + CURSOR_AREA_EARNED_SYMBOLS, // The window containing the symbols + CURSOR_AREA_SYMBOL_TOWER, + CURSOR_AREA_SYMBOL_DOME, + CURSOR_AREA_SYMBOL_PALACE, + CURSOR_AREA_SYMBOL_ARENA, + CURSOR_AREA_SYMBOL_FACTORY, + CURSOR_AREA_SYMBOL_PIKE, + CURSOR_AREA_SYMBOL_PYRAMID, + CURSOR_AREA_COUNT +}; + +// Start of symbol cursor areas +#define CURSOR_AREA_SYMBOL CURSOR_AREA_SYMBOL_TOWER + +enum { + MAP_INDICATOR_RECTANGLE, + MAP_INDICATOR_SQUARE, +}; + +enum { + TAG_CURSOR, + TAG_MAP_INDICATOR, + TAG_MEDAL_SILVER, + TAG_MEDAL_GOLD, + TAG_HEAD_MALE, + TAG_HEAD_FEMALE, +}; + +// Error return codes. Never read +enum { + SUCCESS, + ERR_ALREADY_DONE, + ERR_ALLOC_FAILED, }; struct FrontierPassData @@ -73,25 +103,26 @@ struct FrontierPassData s16 cursorY; u8 cursorArea; u8 previousCursorArea; - u8 hasBattleRecord:1; - u8 unkE:3; + bool8 hasBattleRecord:1; + u8 areaToShow:3; u8 trainerStars:4; - u8 facilitySymbols[NUM_FRONTIER_FACILITIES]; + u8 facilitySymbols[NUM_FRONTIER_FACILITIES]; // 0: no symbol, 1: silver, 2: gold }; struct FrontierPassGfx { struct Sprite *cursorSprite; struct Sprite *symbolSprites[NUM_FRONTIER_FACILITIES]; - u8 *unk20; - u8 *unk24; - u8 *unk28; - bool8 setAffine; - s16 unk2E; - s16 unk30; - u8 tilemapBuff1[0x1000]; - u8 tilemapBuff2[0x1000]; - u8 tilemapBuff3[0x400]; + // These 3 tilemaps are used to overwrite the respective area when highlighted + u8 *mapAndCardZoomTilemap; + u8 *mapAndCardTilemap; + u8 *battleRecordTilemap; + bool8 zooming; + s16 scaleX; + s16 scaleY; + u8 tilemapBuff1[BG_SCREEN_SIZE * 2]; + u8 tilemapBuff2[BG_SCREEN_SIZE * 2]; + u8 tilemapBuff3[BG_SCREEN_SIZE / 2]; }; struct FrontierPassSaved @@ -109,9 +140,9 @@ struct FrontierMapData struct Sprite *mapIndicatorSprite; u8 cursorPos; u8 unused; - u8 tilemapBuff0[0x1000]; - u8 tilemapBuff1[0x1000]; - u8 tilemapBuff2[0x1000]; + u8 tilemapBuff0[BG_SCREEN_SIZE * 2]; + u8 tilemapBuff1[BG_SCREEN_SIZE * 2]; + u8 tilemapBuff2[BG_SCREEN_SIZE * 2]; }; static EWRAM_DATA struct FrontierPassData *sPassData = NULL; @@ -119,37 +150,39 @@ static EWRAM_DATA struct FrontierPassGfx *sPassGfx = NULL; static EWRAM_DATA struct FrontierMapData *sMapData = NULL; static EWRAM_DATA struct FrontierPassSaved sSavedPassData = {0}; -// This file's functions. static u32 AllocateFrontierPassData(void (*callback)(void)); static void ShowFrontierMap(void (*callback)(void)); static void CB2_InitFrontierPass(void); -static void sub_80C629C(void); +static void DrawFrontierPassBg(void); static void FreeCursorAndSymbolSprites(void); static void LoadCursorAndSymbolSprites(void); static u32 FreeFrontierPassData(void); static bool32 InitFrontierPass(void); static bool32 HideFrontierPass(void); -static void Task_HandleFrontierPassInput(u8 taskId); -static void Task_DoFadeEffect(u8 taskId); -static void sub_80C6104(u8 cursorArea, u8 previousCursorArea); -static void PrintAreaDescription(u8 cursorArea); -static void sub_80C5F58(bool8 arg0, bool8 arg1); -static void SpriteCb_Dummy(struct Sprite *sprite); - -// Const rom data. -static const u16 sMaleHeadPalette[] = INCBIN_U16("graphics/frontier_pass/map_heads.gbapal"); -static const u16 sFemaleHeadPalette[] = INCBIN_U16("graphics/frontier_pass/map_heads_female.gbapal"); -static const u32 gUnknown_0856FBBC[] = INCBIN_U32("graphics/frontier_pass/map_screen.4bpp.lz"); -static const u32 sCursorGfx[] = INCBIN_U32("graphics/frontier_pass/cursor.4bpp.lz"); -static const u32 sHeadsGfx[] = INCBIN_U32("graphics/frontier_pass/map_heads.4bpp.lz"); -static const u32 sMapCursorGfx[] = INCBIN_U32("graphics/frontier_pass/map_cursor.4bpp.lz"); -static const u32 gUnknown_08570E00[] = INCBIN_U32("graphics/frontier_pass/map_screen.bin.lz"); -static const u32 gUnknown_08571060[] = INCBIN_U32("graphics/frontier_pass/small_map_and_card.bin.lz"); -static const u32 gUnknown_08571298[] = INCBIN_U32("graphics/frontier_pass/unknown_571298.bin"); -static const u32 gUnknown_085712C0[] = INCBIN_U32("graphics/frontier_pass/record_frame.bin.lz"); -static const u32 gUnknown_085712F8[] = INCBIN_U32("graphics/frontier_pass/small_map_and_card_affine.bin.lz"); - -static const s16 gUnknown_085713E0[][2] = {{216, 32}, {216, 128}}; +static void Task_HandleFrontierPassInput(u8); +static void Task_PassAreaZoom(u8); +static void UpdateAreaHighlight(u8, u8); +static void PrintAreaDescription(u8); +static void ShowHideZoomingArea(bool8, bool8); +static void SpriteCB_PlayerHead(struct Sprite *); + +static const u16 sMaleHead_Pal[] = INCBIN_U16("graphics/frontier_pass/map_heads.gbapal"); +static const u16 sFemaleHead_Pal[] = INCBIN_U16("graphics/frontier_pass/map_heads_female.gbapal"); +static const u32 sMapScreen_Gfx[] = INCBIN_U32("graphics/frontier_pass/map_screen.4bpp.lz"); +static const u32 sCursor_Gfx[] = INCBIN_U32("graphics/frontier_pass/cursor.4bpp.lz"); +static const u32 sHeads_Gfx[] = INCBIN_U32("graphics/frontier_pass/map_heads.4bpp.lz"); +static const u32 sMapCursor_Gfx[] = INCBIN_U32("graphics/frontier_pass/map_cursor.4bpp.lz"); +static const u32 sMapScreen_Tilemap[] = INCBIN_U32("graphics/frontier_pass/map_screen.bin.lz"); +static const u32 sMapAndCard_ZoomedOut_Tilemap[] = INCBIN_U32("graphics/frontier_pass/small_map_and_card.bin.lz"); +static const u32 sUnusedData[] = INCBIN_U32("graphics/frontier_pass/unused.bin"); +static const u32 sBattleRecord_Tilemap[] = INCBIN_U32("graphics/frontier_pass/record_frame.bin.lz"); +static const u32 sMapAndCard_Zooming_Tilemap[] = INCBIN_U32("graphics/frontier_pass/small_map_and_card_affine.bin.lz"); + +static const s16 sBgAffineCoords[][2] = +{ + [CURSOR_AREA_MAP - 1] = {216, 32}, + [CURSOR_AREA_CARD - 1] = {216, 128} +}; static const struct BgTemplate sPassBgTemplates[] = { @@ -213,9 +246,9 @@ static const struct BgTemplate sMapBgTemplates[] = }, }; -static const struct WindowTemplate sPassWindowTemplates[] = +static const struct WindowTemplate sPassWindowTemplates[WINDOW_COUNT] = { - { + [WINDOW_EARNED_SYMBOLS] = { .bg = 0, .tilemapLeft = 2, .tilemapTop = 3, @@ -224,7 +257,7 @@ static const struct WindowTemplate sPassWindowTemplates[] = .paletteNum = 15, .baseBlock = 0x1, }, - { + [WINDOW_BATTLE_RECORD] = { .bg = 0, .tilemapLeft = 2, .tilemapTop = 10, @@ -233,7 +266,7 @@ static const struct WindowTemplate sPassWindowTemplates[] = .paletteNum = 15, .baseBlock = 0x26, }, - { + [WINDOW_BATTLE_POINTS] = { .bg = 0, .tilemapLeft = 2, .tilemapTop = 13, @@ -242,7 +275,7 @@ static const struct WindowTemplate sPassWindowTemplates[] = .paletteNum = 15, .baseBlock = 0x4B, }, - { + [WINDOW_DESCRIPTION] = { .bg = 0, .tilemapLeft = 0, .tilemapTop = 18, @@ -256,7 +289,7 @@ static const struct WindowTemplate sPassWindowTemplates[] = static const struct WindowTemplate sMapWindowTemplates[] = { - { + [MAP_WINDOW_UNUSED] = { .bg = 0, .tilemapLeft = 0, .tilemapTop = 1, @@ -265,7 +298,7 @@ static const struct WindowTemplate sMapWindowTemplates[] = .paletteNum = 15, .baseBlock = 0x1, }, - { + [MAP_WINDOW_NAME] = { .bg = 0, .tilemapLeft = 20, .tilemapTop = 1, @@ -274,7 +307,7 @@ static const struct WindowTemplate sMapWindowTemplates[] = .paletteNum = 15, .baseBlock = 0x4D, }, - { + [MAP_WINDOW_DESCRIPTION] = { .bg = 0, .tilemapLeft = 2, .tilemapTop = 16, @@ -300,159 +333,162 @@ struct s16 xStart; s16 xEnd; } -static const sPassAreasLayout[] = -{ - {28, 76, 132, 220}, - {84, 132, 132, 220}, - {80, 102, 20, 108}, - {0, 16, 152, 240}, - {108, 134, 20, 108}, - {24, 48, 20, 108}, - {50, 66, 20, 36}, - {66, 82, 32, 48}, - {50, 66, 44, 60}, - {66, 82, 56, 72}, - {50, 66, 68, 84}, - {66, 82, 80, 96}, - {50, 66, 92, 108}, +static const sPassAreasLayout[CURSOR_AREA_COUNT - 1] = +{ + [CURSOR_AREA_MAP - 1] = { 28, 76, 132, 220}, + [CURSOR_AREA_CARD - 1] = { 84, 132, 132, 220}, + [CURSOR_AREA_RECORD - 1] = { 80, 102, 20, 108}, + [CURSOR_AREA_CANCEL - 1] = { 0, 16, 152, 240}, + [CURSOR_AREA_POINTS - 1] = {108, 134, 20, 108}, + [CURSOR_AREA_EARNED_SYMBOLS - 1] = { 24, 48, 20, 108}, + [CURSOR_AREA_SYMBOL_TOWER - 1] = { 50, 66, 20, 36}, + [CURSOR_AREA_SYMBOL_DOME - 1] = { 66, 82, 32, 48}, + [CURSOR_AREA_SYMBOL_PALACE - 1] = { 50, 66, 44, 60}, + [CURSOR_AREA_SYMBOL_ARENA - 1] = { 66, 82, 56, 72}, + [CURSOR_AREA_SYMBOL_FACTORY - 1] = { 50, 66, 68, 84}, + [CURSOR_AREA_SYMBOL_PIKE - 1] = { 66, 82, 80, 96}, + [CURSOR_AREA_SYMBOL_PYRAMID - 1] = { 50, 66, 92, 108}, }; static const struct CompressedSpriteSheet sCursorSpriteSheets[] = { - {sCursorGfx, 0x100, 0}, - {sMapCursorGfx, 0x400, 1}, - {gFrontierPassMedals_Gfx, 0x380, 2}, + {sCursor_Gfx, 0x100, TAG_CURSOR}, + {sMapCursor_Gfx, 0x400, TAG_MAP_INDICATOR}, + {gFrontierPassMedals_Gfx, 0x380, TAG_MEDAL_SILVER}, }; static const struct CompressedSpriteSheet sHeadsSpriteSheet[] = { - {sHeadsGfx, 0x100, 4}, + {sHeads_Gfx, 0x100, TAG_HEAD_MALE}, {} }; static const struct SpritePalette sSpritePalettes[] = { - {gFrontierPassCursor_Pal, 0}, - {gFrontierPassMapCursor_Pal, 1}, - {gFrontierPassMedalsSilver_Pal, 2}, - {gFrontierPassMedalsGold_Pal, 3}, - {sMaleHeadPalette, 4}, - {sFemaleHeadPalette, 5}, + {gFrontierPassCursor_Pal, TAG_CURSOR}, + {gFrontierPassMapCursor_Pal, TAG_MAP_INDICATOR}, + {gFrontierPassMedalsSilver_Pal, TAG_MEDAL_SILVER}, + {gFrontierPassMedalsGold_Pal, TAG_MEDAL_GOLD}, + {sMaleHead_Pal, TAG_HEAD_MALE}, + {sFemaleHead_Pal, TAG_HEAD_FEMALE}, {} }; -static const union AnimCmd sSpriteAnim_857151C[] = +static const union AnimCmd sAnim_Frame1_Unused[] = { ANIMCMD_FRAME(0, 0), ANIMCMD_END }; -static const union AnimCmd sSpriteAnim_8571524[] = +static const union AnimCmd sAnim_Frame1[] = { ANIMCMD_FRAME(0, 0), ANIMCMD_END }; -static const union AnimCmd sSpriteAnim_857152C[] = +static const union AnimCmd sAnim_Frame2[] = { ANIMCMD_FRAME(4, 0), ANIMCMD_END }; -static const union AnimCmd sSpriteAnim_8571534[] = +static const union AnimCmd sAnim_Frame3[] = { ANIMCMD_FRAME(8, 0), ANIMCMD_END }; -static const union AnimCmd sSpriteAnim_857153C[] = +static const union AnimCmd sAnim_Frame4[] = { ANIMCMD_FRAME(12, 0), ANIMCMD_END }; -static const union AnimCmd sSpriteAnim_8571544[] = +static const union AnimCmd sAnim_Frame5[] = { ANIMCMD_FRAME(16, 0), ANIMCMD_END }; -static const union AnimCmd sSpriteAnim_857154C[] = +static const union AnimCmd sAnim_Frame6[] = { ANIMCMD_FRAME(20, 0), ANIMCMD_END }; -static const union AnimCmd sSpriteAnim_8571554[] = +static const union AnimCmd sAnim_Frame7[] = { ANIMCMD_FRAME(24, 0), ANIMCMD_END }; -static const union AnimCmd sSpriteAnim_857155C[] = +static const union AnimCmd sAnim_MapIndicatorCursor_Rectangle[] = { ANIMCMD_FRAME(0, 45), ANIMCMD_FRAME(8, 45), ANIMCMD_JUMP(0) }; -static const union AnimCmd sSpriteAnim_8571568[] = +static const union AnimCmd sAnim_MapIndicatorCursor_Square[] = { ANIMCMD_FRAME(16, 45), ANIMCMD_FRAME(24, 45), ANIMCMD_JUMP(0) }; -static const union AnimCmd *const sSpriteAnimTable_8571574[] = +// Used both by the cursor and the map head icons +static const union AnimCmd *const sAnims_TwoFrame[] = { - sSpriteAnim_8571524, - sSpriteAnim_857152C + sAnim_Frame1, + sAnim_Frame2 }; -static const union AnimCmd *const sSpriteAnimTable_857157C[] = +static const union AnimCmd *const sAnims_Medal[] = { - sSpriteAnim_8571524, - sSpriteAnim_857152C, - sSpriteAnim_8571534, - sSpriteAnim_857153C, - sSpriteAnim_8571544, - sSpriteAnim_857154C, - sSpriteAnim_8571554 + [CURSOR_AREA_SYMBOL_TOWER - CURSOR_AREA_SYMBOL] = sAnim_Frame1, + [CURSOR_AREA_SYMBOL_DOME - CURSOR_AREA_SYMBOL] = sAnim_Frame2, + [CURSOR_AREA_SYMBOL_PALACE - CURSOR_AREA_SYMBOL] = sAnim_Frame3, + [CURSOR_AREA_SYMBOL_ARENA - CURSOR_AREA_SYMBOL] = sAnim_Frame4, + [CURSOR_AREA_SYMBOL_FACTORY - CURSOR_AREA_SYMBOL] = sAnim_Frame5, + [CURSOR_AREA_SYMBOL_PIKE - CURSOR_AREA_SYMBOL] = sAnim_Frame6, + [CURSOR_AREA_SYMBOL_PYRAMID - CURSOR_AREA_SYMBOL] = sAnim_Frame7 }; -static const union AnimCmd *const sSpriteAnimTable_8571598[] = +static const union AnimCmd *const sAnims_MapIndicatorCursor[] = { - sSpriteAnim_857155C, - sSpriteAnim_8571568 + [MAP_INDICATOR_RECTANGLE] = sAnim_MapIndicatorCursor_Rectangle, + [MAP_INDICATOR_SQUARE] = sAnim_MapIndicatorCursor_Square }; -static const union AffineAnimCmd sSpriteAffineAnim_85715A0[] = +static const union AffineAnimCmd sAffineAnim_Unused[] = { AFFINEANIMCMD_FRAME(256, 256, 0, 0), AFFINEANIMCMD_END }; -static const union AffineAnimCmd *const sSpriteAffineAnimTable_85715B0[] = +static const union AffineAnimCmd *const sAffineAnims_Unused[] = { - sSpriteAffineAnim_85715A0 + sAffineAnim_Unused }; static const struct SpriteTemplate sSpriteTemplates_Cursors[] = { + // Triangular cursor { - .tileTag = 0, - .paletteTag = 0, + .tileTag = TAG_CURSOR, + .paletteTag = TAG_CURSOR, .oam = &gOamData_AffineOff_ObjNormal_16x16, - .anims = sSpriteAnimTable_8571574, + .anims = sAnims_TwoFrame, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = SpriteCallbackDummy, }, + // Map indicator cursor { - .tileTag = 1, - .paletteTag = 1, + .tileTag = TAG_MAP_INDICATOR, + .paletteTag = TAG_MAP_INDICATOR, .oam = &gOamData_AffineOff_ObjNormal_32x16, - .anims = sSpriteAnimTable_8571598, + .anims = sAnims_MapIndicatorCursor, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = SpriteCallbackDummy, @@ -461,43 +497,43 @@ static const struct SpriteTemplate sSpriteTemplates_Cursors[] = static const struct SpriteTemplate sSpriteTemplate_Medal = { - .tileTag = 2, - .paletteTag = 2, + .tileTag = TAG_MEDAL_SILVER, + .paletteTag = TAG_MEDAL_SILVER, .oam = &gOamData_AffineOff_ObjNormal_16x16, - .anims = sSpriteAnimTable_857157C, + .anims = sAnims_Medal, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = SpriteCallbackDummy, }; -static const struct SpriteTemplate sSpriteTemplate_Head = +static const struct SpriteTemplate sSpriteTemplate_PlayerHead = { - .tileTag = 4, - .paletteTag = 4, + .tileTag = TAG_HEAD_MALE, + .paletteTag = TAG_HEAD_MALE, .oam = &gOamData_AffineOff_ObjNormal_16x16, - .anims = sSpriteAnimTable_8571574, + .anims = sAnims_TwoFrame, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, - .callback = SpriteCb_Dummy, + .callback = SpriteCB_PlayerHead, }; -static const u8 *const sPassAreaDescriptions[] = -{ - gText_ThereIsNoBattleRecord, - gText_CheckFrontierMap, - gText_CheckTrainerCard, - gText_ViewRecordedBattle, - gText_PutAwayFrontierPass, - gText_CurrentBattlePoints, - gText_CollectedSymbols, - gText_BattleTowerAbilitySymbol, - gText_BattleDomeTacticsSymbol, - gText_BattlePalaceSpiritsSymbol, - gText_BattleArenaGutsSymbol, - gText_BattleFactoryKnowledgeSymbol, - gText_BattlePikeLuckSymbol, - gText_BattlePyramidBraveSymbol, - gText_EmptyString7, +static const u8 *const sPassAreaDescriptions[CURSOR_AREA_COUNT + 1] = +{ + [CURSOR_AREA_NOTHING] = gText_ThereIsNoBattleRecord, // NOTHING is re-used for CURSOR_AREA_RECORD when no Record is present + [CURSOR_AREA_MAP] = gText_CheckFrontierMap, + [CURSOR_AREA_CARD] = gText_CheckTrainerCard, + [CURSOR_AREA_RECORD] = gText_ViewRecordedBattle, + [CURSOR_AREA_CANCEL] = gText_PutAwayFrontierPass, + [CURSOR_AREA_POINTS] = gText_CurrentBattlePoints, + [CURSOR_AREA_EARNED_SYMBOLS] = gText_CollectedSymbols, + [CURSOR_AREA_SYMBOL_TOWER] = gText_BattleTowerAbilitySymbol, + [CURSOR_AREA_SYMBOL_DOME] = gText_BattleDomeTacticsSymbol, + [CURSOR_AREA_SYMBOL_PALACE] = gText_BattlePalaceSpiritsSymbol, + [CURSOR_AREA_SYMBOL_ARENA] = gText_BattleArenaGutsSymbol, + [CURSOR_AREA_SYMBOL_FACTORY] = gText_BattleFactoryKnowledgeSymbol, + [CURSOR_AREA_SYMBOL_PIKE] = gText_BattlePikeLuckSymbol, + [CURSOR_AREA_SYMBOL_PYRAMID] = gText_BattlePyramidBraveSymbol, + [CURSOR_AREA_COUNT] = gText_EmptyString7, }; struct @@ -507,18 +543,17 @@ struct s16 x; s16 y; u8 animNum; -} static const sMapLandmarks[] = -{ - {gText_BattleTower3, gText_BattleTowerDesc, 0x59, 0x28, 1}, - {gText_BattleDome2, gText_BattleDomeDesc, 0x21, 0x2A, 1}, - {gText_BattlePalace2, gText_BattlePalaceDesc, 0x78, 0x56, 0}, - {gText_BattleArena2, gText_BattleArenaDesc, 0x72, 0x3B, 0}, - {gText_BattleFactory2, gText_BattleFactoryDesc, 0x19, 0x43, 0}, - {gText_BattlePike2, gText_BattlePikeDesc, 0x39, 0x39, 1}, - {gText_BattlePyramid2, gText_BattlePyramidDesc, 0x86, 0x29, 1}, +} static const sMapLandmarks[NUM_FRONTIER_FACILITIES] = +{ + [FRONTIER_FACILITY_TOWER] = {gText_BattleTower3, gText_BattleTowerDesc, 89, 40, MAP_INDICATOR_SQUARE}, + [FRONTIER_FACILITY_DOME] = {gText_BattleDome2, gText_BattleDomeDesc, 33, 42, MAP_INDICATOR_SQUARE}, + [FRONTIER_FACILITY_PALACE] = {gText_BattlePalace2, gText_BattlePalaceDesc, 120, 86, MAP_INDICATOR_RECTANGLE}, + [FRONTIER_FACILITY_ARENA] = {gText_BattleArena2, gText_BattleArenaDesc, 114, 59, MAP_INDICATOR_RECTANGLE}, + [FRONTIER_FACILITY_FACTORY] = {gText_BattleFactory2, gText_BattleFactoryDesc, 25, 67, MAP_INDICATOR_RECTANGLE}, + [FRONTIER_FACILITY_PIKE] = {gText_BattlePike2, gText_BattlePikeDesc, 57, 57, MAP_INDICATOR_SQUARE}, + [FRONTIER_FACILITY_PYRAMID] = {gText_BattlePyramid2, gText_BattlePyramidDesc, 134, 41, MAP_INDICATOR_SQUARE}, }; -// code static void ResetGpuRegsAndBgs(void) { SetGpuReg(REG_OFFSET_DISPCNT, 0); @@ -564,30 +599,34 @@ static u32 AllocateFrontierPassData(void (*callback)(void)) u8 i; if (sPassData != NULL) - return 1; + return ERR_ALREADY_DONE; sPassData = AllocZeroed(sizeof(*sPassData)); if (sPassData == NULL) - return 2; + return ERR_ALLOC_FAILED; sPassData->callback = callback; i = GetCurrentRegionMapSectionId(); if (i != MAPSEC_BATTLE_FRONTIER && i != MAPSEC_ARTISAN_CAVE) { + // Player is not in the frontier, set + // cursor position to the Trainer Card sPassData->cursorX = 176; sPassData->cursorY = 104; } else { + // Player is in the frontier, set + // cursor position to the frontier map sPassData->cursorX = 176; sPassData->cursorY = 48; } sPassData->battlePoints = gSaveBlock2Ptr->frontier.battlePoints; sPassData->hasBattleRecord = CanCopyRecordedBattleSaveData(); - sPassData->unkE = 0; + sPassData->areaToShow = CURSOR_AREA_NOTHING; sPassData->trainerStars = CountPlayerTrainerStars(); - for (i = 0; i < 7; i++) + for (i = 0; i < NUM_FRONTIER_FACILITIES; i++) { if (FlagGet(FLAG_SYS_TOWER_SILVER + i * 2)) sPassData->facilitySymbols[i]++; @@ -595,60 +634,57 @@ static u32 AllocateFrontierPassData(void (*callback)(void)) sPassData->facilitySymbols[i]++; } - return 0; + return SUCCESS; } static u32 FreeFrontierPassData(void) { if (sPassData == NULL) - return 1; + return ERR_ALREADY_DONE; memset(sPassData, 0, sizeof(*sPassData)); // Why clear data, if it's going to be freed anyway? FREE_AND_SET_NULL(sPassData); - return 0; + return SUCCESS; } static u32 AllocateFrontierPassGfx(void) { if (sPassGfx != NULL) - return 1; + return ERR_ALREADY_DONE; sPassGfx = AllocZeroed(sizeof(*sPassGfx)); if (sPassGfx == NULL) - return 2; + return ERR_ALLOC_FAILED; - return 0; + return SUCCESS; } static u32 FreeFrontierPassGfx(void) { FreeAllWindowBuffers(); if (sPassGfx == NULL) - return 1; + return ERR_ALREADY_DONE; - if (sPassGfx->unk28 != NULL) - FREE_AND_SET_NULL(sPassGfx->unk28); - if (sPassGfx->unk24 != NULL) - FREE_AND_SET_NULL(sPassGfx->unk24); - if (sPassGfx->unk20 != NULL) - FREE_AND_SET_NULL(sPassGfx->unk20); + TRY_FREE_AND_SET_NULL(sPassGfx->battleRecordTilemap); + TRY_FREE_AND_SET_NULL(sPassGfx->mapAndCardTilemap); + TRY_FREE_AND_SET_NULL(sPassGfx->mapAndCardZoomTilemap); memset(sPassGfx, 0, sizeof(*sPassGfx)); // Why clear data, if it's going to be freed anyway? FREE_AND_SET_NULL(sPassGfx); - return 0; + return SUCCESS; } -static void VblankCb_FrontierPass(void) +static void VBlankCB_FrontierPass(void) { - if (sPassGfx->setAffine) + if (sPassGfx->zooming) { SetBgAffine(2, - gUnknown_085713E0[sPassData->unkE - 1][0] << 8, - gUnknown_085713E0[sPassData->unkE - 1][1] << 8, - gUnknown_085713E0[sPassData->unkE - 1][0], - gUnknown_085713E0[sPassData->unkE - 1][1], - sPassGfx->unk2E, - sPassGfx->unk30, + sBgAffineCoords[sPassData->areaToShow - 1][0] << 8, + sBgAffineCoords[sPassData->areaToShow - 1][1] << 8, + sBgAffineCoords[sPassData->areaToShow - 1][0], + sBgAffineCoords[sPassData->areaToShow - 1][1], + sPassGfx->scaleX, + sPassGfx->scaleY, 0); } LoadOam(); @@ -716,11 +752,11 @@ static bool32 InitFrontierPass(void) DeactivateAllTextPrinters(); break; case 6: - sPassGfx->unk20 = malloc_and_decompress(gUnknown_085712F8, &sizeOut); - sPassGfx->unk24 = malloc_and_decompress(gUnknown_08571060, &sizeOut); - sPassGfx->unk28 = malloc_and_decompress(gUnknown_085712C0, &sizeOut); - DecompressAndCopyTileDataToVram(1, gUnknown_08DE08C8, 0, 0, 0); - DecompressAndCopyTileDataToVram(2, gUnknown_08DE2084, 0, 0, 0); + sPassGfx->mapAndCardZoomTilemap = malloc_and_decompress(sMapAndCard_Zooming_Tilemap, &sizeOut); + sPassGfx->mapAndCardTilemap = malloc_and_decompress(sMapAndCard_ZoomedOut_Tilemap, &sizeOut); + sPassGfx->battleRecordTilemap = malloc_and_decompress(sBattleRecord_Tilemap, &sizeOut); + DecompressAndCopyTileDataToVram(1, gFrontierPassBg_Gfx, 0, 0, 0); + DecompressAndCopyTileDataToVram(2, gFrontierPassMapAndCard_Gfx, 0, 0, 0); break; case 7: if (FreeTempTileDataBuffersIfPossible()) @@ -733,12 +769,12 @@ static bool32 InitFrontierPass(void) CopyBgTilemapBufferToVram(2); break; case 8: - LoadPalette(gUnknown_08DE07C8[0], 0, 0x1A0); - LoadPalette(gUnknown_08DE07C8[1 + sPassData->trainerStars], 0x10, 0x20); + LoadPalette(gFrontierPassBg_Pal[0], 0, 0x1A0); + LoadPalette(gFrontierPassBg_Pal[1 + sPassData->trainerStars], 0x10, 0x20); LoadPalette(GetTextWindowPalette(0), 0xF0, 0x20); - sub_80C629C(); - sub_80C6104(sPassData->cursorArea, sPassData->previousCursorArea); - if (sPassData->unkE == 1 || sPassData->unkE == 2) + DrawFrontierPassBg(); + UpdateAreaHighlight(sPassData->cursorArea, sPassData->previousCursorArea); + if (sPassData->areaToShow == CURSOR_AREA_MAP || sPassData->areaToShow == CURSOR_AREA_CARD) { sPassData->state = 0; return TRUE; @@ -750,9 +786,9 @@ static bool32 InitFrontierPass(void) ShowBg(1); ShowBg(2); LoadCursorAndSymbolSprites(); - SetVBlankCallback(VblankCb_FrontierPass); - BlendPalettes(PALETTES_ALL, 0x10, RGB_BLACK); - BeginNormalPaletteFade(PALETTES_ALL, 0, 0x10, 0, RGB_BLACK); + SetVBlankCallback(VBlankCB_FrontierPass); + BlendPalettes(PALETTES_ALL, 16, RGB_BLACK); + BeginNormalPaletteFade(PALETTES_ALL, 0, 16, 0, RGB_BLACK); break; case 10: AnimateSprites(); @@ -773,9 +809,9 @@ static bool32 HideFrontierPass(void) switch (sPassData->state) { case 0: - if (sPassData->unkE != 1 && sPassData->unkE != 2) + if (sPassData->areaToShow != CURSOR_AREA_MAP && sPassData->areaToShow != CURSOR_AREA_CARD) { - BeginNormalPaletteFade(PALETTES_ALL, 0, 0, 0x10, RGB_BLACK); + BeginNormalPaletteFade(PALETTES_ALL, 0, 0, 16, RGB_BLACK); } else { @@ -822,11 +858,11 @@ static u8 GetCursorAreaFromCoords(s16 x, s16 y) { u8 i; - // Minus/Plus 1, because the table doesn't take into account the nothing field. + // Minus/Plus 1, because the table doesn't take CURSOR_AREA_NOTHING into account. for (i = 0; i < CURSOR_AREA_COUNT - 1; i++) { if (sPassAreasLayout[i].yStart <= y && sPassAreasLayout[i].yEnd >= y - && sPassAreasLayout[i].xStart <= x && sPassAreasLayout[i].xEnd >= x) + && sPassAreasLayout[i].xStart <= x && sPassAreasLayout[i].xEnd >= x) { if (i >= CURSOR_AREA_SYMBOL - 1 && sPassData->facilitySymbols[i - CURSOR_AREA_SYMBOL + 1] == 0) break; @@ -835,9 +871,12 @@ static u8 GetCursorAreaFromCoords(s16 x, s16 y) } } - return 0; + return CURSOR_AREA_NOTHING; } +// For Task_PassAreaZoom +#define tZoomOut data[0] + void CB2_ReshowFrontierPass(void) { u8 taskId; @@ -845,16 +884,16 @@ void CB2_ReshowFrontierPass(void) if (!InitFrontierPass()) return; - switch (sPassData->unkE) + switch (sPassData->areaToShow) { - case 1: - case 2: - taskId = CreateTask(Task_DoFadeEffect, 0); - gTasks[taskId].data[0] = TRUE; + case CURSOR_AREA_MAP: + case CURSOR_AREA_CARD: + taskId = CreateTask(Task_PassAreaZoom, 0); + gTasks[taskId].tZoomOut = TRUE; break; - case 3: + case CURSOR_AREA_RECORD: default: - sPassData->unkE = 0; + sPassData->areaToShow = CURSOR_AREA_NOTHING; taskId = CreateTask(Task_HandleFrontierPassInput, 0); break; } @@ -889,19 +928,19 @@ static void CB2_ShowFrontierPassFeature(void) if (!HideFrontierPass()) return; - switch (sPassData->unkE) + switch (sPassData->areaToShow) { - case 1: + case CURSOR_AREA_MAP: ShowFrontierMap(CB2_ReshowFrontierPass); break; - case 3: + case CURSOR_AREA_RECORD: sSavedPassData.callback = sPassData->callback; sSavedPassData.cursorX = sPassData->cursorX; sSavedPassData.cursorY = sPassData->cursorY; FreeFrontierPassData(); PlayRecordedBattle(CB2_ReturnFromRecord); break; - case 2: + case CURSOR_AREA_CARD: ShowPlayerTrainerCard(CB2_ReshowFrontierPass); break; } @@ -914,15 +953,15 @@ static bool32 TryCallPassAreaFunction(u8 taskId, u8 cursorArea) case CURSOR_AREA_RECORD: if (!sPassData->hasBattleRecord) return FALSE; - sPassData->unkE = 3; + sPassData->areaToShow = CURSOR_AREA_RECORD; DestroyTask(taskId); SetMainCallback2(CB2_ShowFrontierPassFeature); break; case CURSOR_AREA_MAP: case CURSOR_AREA_CARD: - sPassData->unkE = cursorArea; - gTasks[taskId].func = Task_DoFadeEffect; - gTasks[taskId].data[0] = FALSE; + sPassData->areaToShow = cursorArea; + gTasks[taskId].func = Task_PassAreaZoom; + gTasks[taskId].tZoomOut = FALSE; break; default: return FALSE; @@ -1004,77 +1043,92 @@ static void Task_HandleFrontierPassInput(u8 taskId) PrintAreaDescription(var); sPassData->previousCursorArea = sPassData->cursorArea; sPassData->cursorArea = var; - sub_80C6104(sPassData->cursorArea, sPassData->previousCursorArea); + UpdateAreaHighlight(sPassData->cursorArea, sPassData->previousCursorArea); } } } -static void Task_DoFadeEffect(u8 taskId) +#define tScaleX data[1] +#define tScaleY data[2] +#define tScaleSpeedX data[3] +#define tScaleSpeedY data[4] + +// Zoom in/out for the Frontier map or the trainer card +static void Task_PassAreaZoom(u8 taskId) { s16 *data = gTasks[taskId].data; switch (sPassData->state) { case 0: - if (!data[0]) + // Initialize the zoom, start fading in/out + if (!tZoomOut) { - sub_80C5F58(TRUE, FALSE); - data[1] = Q_8_8(1); - data[2] = Q_8_8(1); - data[3] = 0x15; - data[4] = 0x15; - BeginNormalPaletteFade(PALETTES_ALL, 0, 0, 0x10, RGB_WHITE); + // Zooming in to map/card screen + ShowHideZoomingArea(TRUE, FALSE); + tScaleX = Q_8_8(1); + tScaleY = Q_8_8(1); + tScaleSpeedX = 0x15; + tScaleSpeedY = 0x15; + BeginNormalPaletteFade(PALETTES_ALL, 0, 0, 16, RGB_WHITE); } else { - data[1] = Q_8_8(1.984375); // 1 and 63/64 - data[2] = Q_8_8(1.984375); - data[3] = -0x15; - data[4] = -0x15; + // Zooming out of map/card screen back to frontier pass + tScaleX = Q_8_8(1.984375); // 1 and 63/64 + tScaleY = Q_8_8(1.984375); + tScaleSpeedX = -0x15; + tScaleSpeedY = -0x15; SetGpuReg(REG_OFFSET_DISPCNT, DISPCNT_OBJ_ON | DISPCNT_OBJ_1D_MAP); ShowBg(0); ShowBg(1); ShowBg(2); LoadCursorAndSymbolSprites(); - SetVBlankCallback(VblankCb_FrontierPass); - BlendPalettes(PALETTES_ALL, 0x10, RGB_WHITE); - BeginNormalPaletteFade(PALETTES_ALL, 0, 0x10, 0, RGB_WHITE); + SetVBlankCallback(VBlankCB_FrontierPass); + BlendPalettes(PALETTES_ALL, 16, RGB_WHITE); + BeginNormalPaletteFade(PALETTES_ALL, 0, 16, 0, RGB_WHITE); } - sPassGfx->setAffine = TRUE; - sPassGfx->unk2E = MathUtil_Inv16(data[1]); - sPassGfx->unk30 = MathUtil_Inv16(data[2]); + sPassGfx->zooming = TRUE; + sPassGfx->scaleX = MathUtil_Inv16(tScaleX); + sPassGfx->scaleY = MathUtil_Inv16(tScaleY); break; case 1: + // Update the fade and zoom UpdatePaletteFade(); - data[1] += data[3]; - data[2] += data[4]; - sPassGfx->unk2E = MathUtil_Inv16(data[1]); - sPassGfx->unk30 = MathUtil_Inv16(data[2]); - if (!data[0]) + tScaleX += tScaleSpeedX; + tScaleY += tScaleSpeedY; + sPassGfx->scaleX = MathUtil_Inv16(tScaleX); + sPassGfx->scaleY = MathUtil_Inv16(tScaleY); + + // Check if zoom hasn't reached target + if (!tZoomOut) { - if (data[1] <= Q_8_8(1.984375)) + if (tScaleX <= Q_8_8(1.984375)) return; } else { - if (data[1] != Q_8_8(1)) + if (tScaleX != Q_8_8(1)) return; } break; case 2: - if (sPassGfx->setAffine) // Nonsensical check. - sPassGfx->setAffine = FALSE; + if (sPassGfx->zooming) + sPassGfx->zooming = FALSE; if (UpdatePaletteFade()) return; - if (!data[0]) + + if (!tZoomOut) { + // Zoomed in and faded out, switch to map or trainer card DestroyTask(taskId); SetMainCallback2(CB2_ShowFrontierPassFeature); } else { - sub_80C5F58(FALSE, FALSE); - sPassData->unkE = 0; + // Zoomed out and faded in, return to frontier pass + ShowHideZoomingArea(FALSE, FALSE); + sPassData->areaToShow = CURSOR_AREA_NOTHING; gTasks[taskId].func = Task_HandleFrontierPassInput; } SetBgAttribute(2, BG_ATTR_WRAPAROUND, 0); @@ -1120,8 +1174,9 @@ static void ShowAndPrintWindows(void) static void PrintAreaDescription(u8 cursorArea) { FillWindowPixelBuffer(WINDOW_DESCRIPTION, PIXEL_FILL(0)); + if (cursorArea == CURSOR_AREA_RECORD && !sPassData->hasBattleRecord) - AddTextPrinterParameterized3(WINDOW_DESCRIPTION, 1, 2, 0, sTextColors[1], 0, sPassAreaDescriptions[0]); + AddTextPrinterParameterized3(WINDOW_DESCRIPTION, 1, 2, 0, sTextColors[1], 0, sPassAreaDescriptions[CURSOR_AREA_NOTHING]); else if (cursorArea != CURSOR_AREA_NOTHING) AddTextPrinterParameterized3(WINDOW_DESCRIPTION, 1, 2, 0, sTextColors[1], 0, sPassAreaDescriptions[cursorArea]); @@ -1129,19 +1184,19 @@ static void PrintAreaDescription(u8 cursorArea) CopyBgTilemapBufferToVram(0); } -static void sub_80C5F58(bool8 arg0, bool8 arg1) +static void ShowHideZoomingArea(bool8 show, bool8 zoomedIn) { - switch (sPassData->unkE) + switch (sPassData->areaToShow) { - case 1: - if (arg0) - CopyToBgTilemapBufferRect_ChangePalette(2, sPassGfx->unk20, 16, 3, 12, 7, 16); + case CURSOR_AREA_MAP: + if (show) + CopyToBgTilemapBufferRect_ChangePalette(2, sPassGfx->mapAndCardZoomTilemap, 16, 3, 12, 7, 16); else FillBgTilemapBufferRect(2, 0, 16, 3, 12, 7, 16); break; - case 2: - if (arg0) - CopyToBgTilemapBufferRect_ChangePalette(2, sPassGfx->unk20 + 84, 16, 10, 12, 7, 16); + case CURSOR_AREA_CARD: + if (show) + CopyToBgTilemapBufferRect_ChangePalette(2, sPassGfx->mapAndCardZoomTilemap + 84, 16, 10, 12, 7, 16); else FillBgTilemapBufferRect(2, 0, 16, 10, 12, 7, 16); break; @@ -1150,13 +1205,13 @@ static void sub_80C5F58(bool8 arg0, bool8 arg1) } CopyBgTilemapBufferToVram(2); - if (arg1) + if (zoomedIn) { SetBgAffine(2, - gUnknown_085713E0[sPassData->unkE - 1][0] << 8, - gUnknown_085713E0[sPassData->unkE - 1][1] << 8, - gUnknown_085713E0[sPassData->unkE - 1][0], - gUnknown_085713E0[sPassData->unkE - 1][1], + sBgAffineCoords[sPassData->areaToShow - 1][0] << 8, + sBgAffineCoords[sPassData->areaToShow - 1][1] << 8, + sBgAffineCoords[sPassData->areaToShow - 1][0], + sBgAffineCoords[sPassData->areaToShow - 1][1], MathUtil_Inv16(Q_8_8(1.984375)), // 1 and 63/64 MathUtil_Inv16(Q_8_8(1.984375)), 0); @@ -1164,71 +1219,75 @@ static void sub_80C5F58(bool8 arg0, bool8 arg1) else { SetBgAffine(2, - gUnknown_085713E0[sPassData->unkE - 1][0] << 8, - gUnknown_085713E0[sPassData->unkE - 1][1] << 8, - gUnknown_085713E0[sPassData->unkE - 1][0], - gUnknown_085713E0[sPassData->unkE - 1][1], + sBgAffineCoords[sPassData->areaToShow - 1][0] << 8, + sBgAffineCoords[sPassData->areaToShow - 1][1] << 8, + sBgAffineCoords[sPassData->areaToShow - 1][0], + sBgAffineCoords[sPassData->areaToShow - 1][1], MathUtil_Inv16(Q_8_8(1)), MathUtil_Inv16(Q_8_8(1)), 0); } } -static void sub_80C6104(u8 cursorArea, u8 previousCursorArea) +static void UpdateAreaHighlight(u8 cursorArea, u8 previousCursorArea) { + #define NON_HIGHLIGHT_AREA(area)((area) == CURSOR_AREA_NOTHING || (area) > CURSOR_AREA_CANCEL) + + // If moving off highlightable area, unhighlight it switch (previousCursorArea) { case CURSOR_AREA_MAP: - CopyToBgTilemapBufferRect_ChangePalette(1, sPassGfx->unk24, 16, 3, 12, 7, 17); + CopyToBgTilemapBufferRect_ChangePalette(1, sPassGfx->mapAndCardTilemap, 16, 3, 12, 7, 17); break; case CURSOR_AREA_CARD: - CopyToBgTilemapBufferRect_ChangePalette(1, sPassGfx->unk24 + 336, 16, 10, 12, 7, 17); + CopyToBgTilemapBufferRect_ChangePalette(1, sPassGfx->mapAndCardTilemap + 336, 16, 10, 12, 7, 17); break; case CURSOR_AREA_RECORD: if (sPassData->hasBattleRecord) - CopyToBgTilemapBufferRect_ChangePalette(1, sPassGfx->unk28, 2, 10, 12, 3, 17); - else if (cursorArea == CURSOR_AREA_NOTHING || cursorArea > CURSOR_AREA_CANCEL) + CopyToBgTilemapBufferRect_ChangePalette(1, sPassGfx->battleRecordTilemap, 2, 10, 12, 3, 17); + else if (NON_HIGHLIGHT_AREA(cursorArea)) return; break; case CURSOR_AREA_CANCEL: - CopyToBgTilemapBufferRect_ChangePalette(1, gUnknown_08DE3350, 21, 0, 9, 2, 17); + CopyToBgTilemapBufferRect_ChangePalette(1, gFrontierPassCancelButton_Tilemap, 21, 0, 9, 2, 17); break; default: - if (cursorArea == CURSOR_AREA_NOTHING || cursorArea > CURSOR_AREA_CANCEL) + if (NON_HIGHLIGHT_AREA(cursorArea)) return; break; } + // If moving on to highlightable area, highlight it switch (cursorArea) { case CURSOR_AREA_MAP: - CopyToBgTilemapBufferRect_ChangePalette(1, sPassGfx->unk24 + 168, 16, 3, 12, 7, 17); + CopyToBgTilemapBufferRect_ChangePalette(1, sPassGfx->mapAndCardTilemap + 168, 16, 3, 12, 7, 17); break; case CURSOR_AREA_CARD: - CopyToBgTilemapBufferRect_ChangePalette(1, sPassGfx->unk24 + 504, 16, 10, 12, 7, 17); + CopyToBgTilemapBufferRect_ChangePalette(1, sPassGfx->mapAndCardTilemap + 504, 16, 10, 12, 7, 17); break; case CURSOR_AREA_RECORD: if (sPassData->hasBattleRecord) - CopyToBgTilemapBufferRect_ChangePalette(1, sPassGfx->unk28 + 72, 2, 10, 12, 3, 17); + CopyToBgTilemapBufferRect_ChangePalette(1, sPassGfx->battleRecordTilemap + 72, 2, 10, 12, 3, 17); else return; - break; //needed to match + break; case CURSOR_AREA_CANCEL: - CopyToBgTilemapBufferRect_ChangePalette(1, gUnknown_08DE3374, 21, 0, 9, 2, 17); + CopyToBgTilemapBufferRect_ChangePalette(1, gFrontierPassCancelButtonHighlighted_Tilemap, 21, 0, 9, 2, 17); break; default: - if (previousCursorArea == CURSOR_AREA_NOTHING || previousCursorArea > CURSOR_AREA_CANCEL) + if (NON_HIGHLIGHT_AREA(previousCursorArea)) return; } CopyBgTilemapBufferToVram(1); } -static void sub_80C629C(void) +static void DrawFrontierPassBg(void) { - CopyToBgTilemapBuffer(1, gUnknown_08DE3060, 0, 0); - sub_80C6104(sPassData->cursorArea, sPassData->previousCursorArea); - sub_80C5F58(TRUE, sPassData->unkE); + CopyToBgTilemapBuffer(1, gFrontierPassBg_Tilemap, 0, 0); + UpdateAreaHighlight(sPassData->cursorArea, sPassData->previousCursorArea); + ShowHideZoomingArea(TRUE, sPassData->areaToShow); // If returning to frontier pass from map/card (areaToShow will be != 0) ShowAndPrintWindows(); CopyBgTilemapBufferToVram(1); } @@ -1253,7 +1312,7 @@ static void LoadCursorAndSymbolSprites(void) { struct SpriteTemplate sprite = sSpriteTemplate_Medal; - sprite.paletteTag += sPassData->facilitySymbols[i] - 1; + sprite.paletteTag += sPassData->facilitySymbols[i] - 1; // Adds 1 if gold for TAG_MEDAL_GOLD spriteId = CreateSprite(&sprite, sPassAreasLayout[i + CURSOR_AREA_SYMBOL - 1].xStart + 8, sPassAreasLayout[i + CURSOR_AREA_SYMBOL - 1].yStart + 6, i + 1); sPassGfx->symbolSprites[i] = &gSprites[spriteId]; sPassGfx->symbolSprites[i]->oam.priority = 2; @@ -1277,11 +1336,11 @@ static void FreeCursorAndSymbolSprites(void) } } FreeAllSpritePalettes(); - FreeSpriteTilesByTag(2); - FreeSpriteTilesByTag(0); + FreeSpriteTilesByTag(TAG_MEDAL_SILVER); + FreeSpriteTilesByTag(TAG_CURSOR); } -static void SpriteCb_Dummy(struct Sprite *sprite) +static void SpriteCB_PlayerHead(struct Sprite *sprite) { } @@ -1349,14 +1408,14 @@ static bool32 InitFrontierMap(void) InitWindows(sMapWindowTemplates); DeactivateAllTextPrinters(); PrintOnFrontierMap(); - DecompressAndCopyTileDataToVram(1, gUnknown_0856FBBC, 0, 0, 0); + DecompressAndCopyTileDataToVram(1, sMapScreen_Gfx, 0, 0, 0); break; case 5: if (FreeTempTileDataBuffersIfPossible()) return FALSE; - LoadPalette(gUnknown_08DE07C8[0], 0, 0x1A0); + LoadPalette(gFrontierPassBg_Pal[0], 0, 0x1A0); LoadPalette(GetTextWindowPalette(0), 0xF0, 0x20); - CopyToBgTilemapBuffer(2, gUnknown_08570E00, 0, 0); + CopyToBgTilemapBuffer(2, sMapScreen_Tilemap, 0, 0); CopyBgTilemapBufferToVram(2); break; case 6: @@ -1365,9 +1424,9 @@ static bool32 InitFrontierMap(void) ShowBg(1); ShowBg(2); InitFrontierMapSprites(); - SetVBlankCallback(VblankCb_FrontierPass); - BlendPalettes(PALETTES_ALL, 0x10, RGB_WHITE); - BeginNormalPaletteFade(PALETTES_ALL, 0, 0x10, 0, RGB_WHITE); + SetVBlankCallback(VBlankCB_FrontierPass); + BlendPalettes(PALETTES_ALL, 16, RGB_WHITE); + BeginNormalPaletteFade(PALETTES_ALL, 0, 16, 0, RGB_WHITE); break; case 7: if (UpdatePaletteFade()) @@ -1385,7 +1444,7 @@ static bool32 ExitFrontierMap(void) switch (sPassData->state) { case 0: - BeginNormalPaletteFade(PALETTES_ALL, 0, 0, 0x10, RGB_WHITE); + BeginNormalPaletteFade(PALETTES_ALL, 0, 0, 16, RGB_WHITE); break; case 1: if (UpdatePaletteFade()) @@ -1404,17 +1463,17 @@ static bool32 ExitFrontierMap(void) if (sMapData->cursorSprite != NULL) { DestroySprite(sMapData->cursorSprite); - FreeSpriteTilesByTag(0); + FreeSpriteTilesByTag(TAG_CURSOR); } if (sMapData->mapIndicatorSprite != NULL) { DestroySprite(sMapData->mapIndicatorSprite); - FreeSpriteTilesByTag(1); + FreeSpriteTilesByTag(TAG_MAP_INDICATOR); } if (sMapData->playerHeadSprite != NULL) { DestroySprite(sMapData->playerHeadSprite); - FreeSpriteTilesByTag(4); + FreeSpriteTilesByTag(TAG_HEAD_MALE); } FreeAllWindowBuffers(); break; @@ -1435,11 +1494,14 @@ static bool32 ExitFrontierMap(void) return FALSE; } +#define tState data[0] +#define tMoveSteps data[1] + static void Task_HandleFrontierMap(u8 taskId) { s16 *data = gTasks[taskId].data; - switch (data[0]) + switch (tState) { case 0: if (InitFrontierMap()) @@ -1449,47 +1511,47 @@ static void Task_HandleFrontierMap(u8 taskId) if (JOY_NEW(B_BUTTON)) { PlaySE(SE_PC_OFF); - data[0] = 4; + tState = 4; } else if (JOY_NEW(DPAD_DOWN)) { if (sMapData->cursorPos >= NUM_FRONTIER_FACILITIES - 1) HandleFrontierMapCursorMove(0); else - data[0] = 2; + tState = 2; } else if (JOY_NEW(DPAD_UP)) { if (sMapData->cursorPos == 0) HandleFrontierMapCursorMove(1); else - data[0] = 3; + tState = 3; } return; case 2: - if (data[1] > 3) + if (tMoveSteps > 3) { HandleFrontierMapCursorMove(0); - data[1] = 0; - data[0] = 1; + tMoveSteps = 0; + tState = 1; } else { sMapData->cursorSprite->y += 4; - data[1]++; + tMoveSteps++; } return; case 3: - if (data[1] > 3) + if (tMoveSteps > 3) { HandleFrontierMapCursorMove(1); - data[1] = 0; - data[0] = 1; + tMoveSteps = 0; + tState = 1; } else { sMapData->cursorSprite->y -= 4; - data[1]++; + tMoveSteps++; } return; case 4: @@ -1502,31 +1564,42 @@ static void Task_HandleFrontierMap(u8 taskId) return; } - data[0]++; + tState++; } static u8 MapNumToFrontierFacilityId(u16 mapNum) // id + 1, zero means not a frontier map number { + // In Battle Tower if ((mapNum >= MAP_NUM(BATTLE_FRONTIER_BATTLE_TOWER_LOBBY) && mapNum <= MAP_NUM(BATTLE_FRONTIER_BATTLE_TOWER_BATTLE_ROOM)) - || (mapNum >= MAP_NUM(BATTLE_FRONTIER_BATTLE_TOWER_MULTI_PARTNER_ROOM) && mapNum <= MAP_NUM(BATTLE_FRONTIER_BATTLE_TOWER_MULTI_BATTLE_ROOM))) + || (mapNum >= MAP_NUM(BATTLE_FRONTIER_BATTLE_TOWER_MULTI_PARTNER_ROOM) && mapNum <= MAP_NUM(BATTLE_FRONTIER_BATTLE_TOWER_MULTI_BATTLE_ROOM))) return FRONTIER_FACILITY_TOWER + 1; + + // In Battle Dome else if (mapNum == MAP_NUM(BATTLE_FRONTIER_BATTLE_DOME_LOBBY) || mapNum == MAP_NUM(BATTLE_FRONTIER_BATTLE_DOME_CORRIDOR) || mapNum == MAP_NUM(BATTLE_FRONTIER_BATTLE_DOME_PRE_BATTLE_ROOM) || mapNum == MAP_NUM(BATTLE_FRONTIER_BATTLE_DOME_BATTLE_ROOM)) return FRONTIER_FACILITY_DOME + 1; + + // In Battle Palace else if (mapNum == MAP_NUM(BATTLE_FRONTIER_BATTLE_PALACE_LOBBY) || mapNum == MAP_NUM(BATTLE_FRONTIER_BATTLE_PALACE_CORRIDOR) || mapNum == MAP_NUM(BATTLE_FRONTIER_BATTLE_PALACE_BATTLE_ROOM)) return FRONTIER_FACILITY_PALACE + 1; + + // In Battle Arena else if (mapNum == MAP_NUM(BATTLE_FRONTIER_BATTLE_ARENA_LOBBY) || mapNum == MAP_NUM(BATTLE_FRONTIER_BATTLE_ARENA_CORRIDOR) || mapNum == MAP_NUM(BATTLE_FRONTIER_BATTLE_ARENA_BATTLE_ROOM)) return FRONTIER_FACILITY_ARENA + 1; + + // In Battle Factory else if (mapNum == MAP_NUM(BATTLE_FRONTIER_BATTLE_FACTORY_LOBBY) || mapNum == MAP_NUM(BATTLE_FRONTIER_BATTLE_FACTORY_PRE_BATTLE_ROOM) || mapNum == MAP_NUM(BATTLE_FRONTIER_BATTLE_FACTORY_BATTLE_ROOM)) return FRONTIER_FACILITY_FACTORY + 1; + + // In Battle Pike else if (mapNum == MAP_NUM(BATTLE_FRONTIER_BATTLE_PIKE_LOBBY) || mapNum == MAP_NUM(BATTLE_FRONTIER_BATTLE_PIKE_CORRIDOR) || mapNum == MAP_NUM(BATTLE_FRONTIER_BATTLE_PIKE_THREE_PATH_ROOM) @@ -1534,10 +1607,13 @@ static u8 MapNumToFrontierFacilityId(u16 mapNum) // id + 1, zero means not a fro || mapNum == MAP_NUM(BATTLE_FRONTIER_BATTLE_PIKE_ROOM_FINAL) || mapNum == MAP_NUM(BATTLE_FRONTIER_BATTLE_PIKE_ROOM_WILD_MONS)) return FRONTIER_FACILITY_PIKE + 1; + + // In Battle Pyramid else if (mapNum == MAP_NUM(BATTLE_FRONTIER_BATTLE_PYRAMID_LOBBY) || mapNum == MAP_NUM(BATTLE_FRONTIER_BATTLE_PYRAMID_FLOOR) || mapNum == MAP_NUM(BATTLE_FRONTIER_BATTLE_PYRAMID_TOP)) return FRONTIER_FACILITY_PYRAMID + 1; + else return 0; } @@ -1606,8 +1682,8 @@ static void InitFrontierMapSprites(void) } LoadCompressedSpriteSheet(sHeadsSpriteSheet); - sprite = sSpriteTemplate_Head; - sprite.paletteTag = gSaveBlock2Ptr->playerGender + 4; + sprite = sSpriteTemplate_PlayerHead; + sprite.paletteTag = gSaveBlock2Ptr->playerGender + TAG_HEAD_MALE; // TAG_HEAD_FEMALE if gender is FEMALE if (id != 0) { spriteId = CreateSprite(&sprite, x, y, 0); @@ -1678,7 +1754,7 @@ static void HandleFrontierMapCursorMove(u8 direction) FillWindowPixelBuffer(MAP_WINDOW_DESCRIPTION, PIXEL_FILL(0)); AddTextPrinterParameterized3(MAP_WINDOW_DESCRIPTION, 1, 4, 0, sTextColors[0], 0, sMapLandmarks[sMapData->cursorPos].description); - for (i = 0; i < 3; i++) + for (i = 0; i < MAP_WINDOW_COUNT; i++) CopyWindowToVram(i, 3); CopyBgTilemapBufferToVram(0); diff --git a/src/graphics.c b/src/graphics.c index c3ac6c2df..37d953313 100644 --- a/src/graphics.c +++ b/src/graphics.c @@ -1533,14 +1533,12 @@ const u32 gTitleScreenPressStartGfx[] = INCBIN_U32("graphics/title_screen/press_ const u32 gUnknown_08DE0644[] = INCBIN_U32("graphics/title_screen/title_screen2.bin.lz"); -// more trainer card stuff - -const u16 gUnknown_08DE07C8[][16] = INCBIN_U16("graphics/frontier_pass/tiles.gbapal");// size in LoadPalette calls is reported as 0xD0 << 1, which is 0x1A0, but palette is only 0x100 bytes long so it loads garbage as well -const u32 gUnknown_08DE08C8[] = INCBIN_U32("graphics/frontier_pass/tiles.4bpp.lz"); -const u32 gUnknown_08DE2084[] = INCBIN_U32("graphics/frontier_pass/tiles2.8bpp.lz"); -const u32 gUnknown_08DE3060[] = INCBIN_U32("graphics/frontier_pass/tiles.bin.lz"); -const u16 gUnknown_08DE3350[] = INCBIN_U16("graphics/frontier_pass/tilemap1.bin"); -const u16 gUnknown_08DE3374[] = INCBIN_U16("graphics/frontier_pass/tilemap2.bin"); +const u16 gFrontierPassBg_Pal[][16] = INCBIN_U16("graphics/frontier_pass/bg.gbapal");// size in LoadPalette calls is reported as 0xD0 << 1, which is 0x1A0, but palette is only 0x100 bytes long so it loads garbage as well +const u32 gFrontierPassBg_Gfx[] = INCBIN_U32("graphics/frontier_pass/bg.4bpp.lz"); +const u32 gFrontierPassMapAndCard_Gfx[] = INCBIN_U32("graphics/frontier_pass/map_and_card.8bpp.lz"); +const u32 gFrontierPassBg_Tilemap[] = INCBIN_U32("graphics/frontier_pass/bg.bin.lz"); +const u16 gFrontierPassCancelButton_Tilemap[] = INCBIN_U16("graphics/frontier_pass/cancel.bin"); +const u16 gFrontierPassCancelButtonHighlighted_Tilemap[] = INCBIN_U16("graphics/frontier_pass/cancel_highlighted.bin"); // Berry Crush const u16 gBerryCrush_Crusher_Pal[] = INCBIN_U16("graphics/berry_crush/crusher.gbapal"); diff --git a/src/international_string_util.c b/src/international_string_util.c index ab812de89..eb2ec16e7 100644 --- a/src/international_string_util.c +++ b/src/international_string_util.c @@ -34,11 +34,11 @@ int GetStringWidthDifference(int fontId, const u8 *str, int totalWidth, int lett return 0; } -int GetMaxWidthInMenuTable(const struct MenuAction *str, int arg1) +int GetMaxWidthInMenuTable(const struct MenuAction *str, int numActions) { int i, var; - for (var = 0, i = 0; i < arg1; i++) + for (var = 0, i = 0; i < numActions; i++) { int stringWidth = GetStringWidth(1, str[i].text, 0); if (stringWidth > var) diff --git a/src/item_menu.c b/src/item_menu.c index 39abf883a..4fc7cc06c 100755 --- a/src/item_menu.c +++ b/src/item_menu.c @@ -551,7 +551,7 @@ void CB2_GoToSellMenu(void) void CB2_GoToItemDepositMenu(void) { - GoToBagMenu(ITEMMENULOCATION_ITEMPC, POCKETS_COUNT, sub_816B31C); + GoToBagMenu(ITEMMENULOCATION_ITEMPC, POCKETS_COUNT, CB2_PlayerPCExitBagMenu); } void ApprenticeOpenBagMenu(void) @@ -1077,7 +1077,7 @@ void All_CalculateNItemsAndMaxShowed(void) void SetInitialScrollAndCursorPositions(u8 pocketId) { - sub_812225C(&gBagPositionStruct.scrollPosition[pocketId], &gBagPositionStruct.cursorPosition[pocketId], gBagMenu->numShownItems[pocketId], gBagMenu->numItemStacks[pocketId]); + SetCursorWithinListBounds(&gBagPositionStruct.scrollPosition[pocketId], &gBagPositionStruct.cursorPosition[pocketId], gBagMenu->numShownItems[pocketId], gBagMenu->numItemStacks[pocketId]); } static void SetPocketListPositions(void) diff --git a/src/menu_helpers.c b/src/menu_helpers.c index dce00e51e..c5cbcddb6 100644 --- a/src/menu_helpers.c +++ b/src/menu_helpers.c @@ -323,36 +323,38 @@ bool8 MenuHelpers_CallLinkSomething(void) return TRUE; } -void sub_812220C(struct ItemSlot *slots, u8 count, u8 *arg2, u8 *usedSlotsCount, u8 maxUsedSlotsCount) +void SetItemListPerPageCount(struct ItemSlot *slots, u8 slotsCount, u8 *pageItems, u8 *totalItems, u8 maxPerPage) { u16 i; struct ItemSlot *slots_ = slots; - (*usedSlotsCount) = 0; - for (i = 0; i < count; i++) + // Count the number of non-empty item slots + *totalItems = 0; + for (i = 0; i < slotsCount; i++) { if (slots_[i].itemId != ITEM_NONE) - (*usedSlotsCount)++; + (*totalItems)++; } + (*totalItems)++; // + 1 for 'Cancel' - (*usedSlotsCount)++; - if ((*usedSlotsCount) > maxUsedSlotsCount) - *arg2 = maxUsedSlotsCount; + // Set number of items per page + if (*totalItems > maxPerPage) + *pageItems = maxPerPage; else - *arg2 = (*usedSlotsCount); + *pageItems = *totalItems; } -void sub_812225C(u16 *scrollOffset, u16 *cursorPos, u8 maxShownItems, u8 numItems) +void SetCursorWithinListBounds(u16 *scrollOffset, u16 *cursorPos, u8 maxShownItems, u8 totalItems) { - if (*scrollOffset != 0 && *scrollOffset + maxShownItems > numItems) - *scrollOffset = numItems - maxShownItems; + if (*scrollOffset != 0 && *scrollOffset + maxShownItems > totalItems) + *scrollOffset = totalItems - maxShownItems; - if (*scrollOffset + *cursorPos >= numItems) + if (*scrollOffset + *cursorPos >= totalItems) { - if (numItems == 0) + if (totalItems == 0) *cursorPos = 0; else - *cursorPos = numItems - 1; + *cursorPos = totalItems - 1; } } diff --git a/src/menu_specialized.c b/src/menu_specialized.c index eb8cae72f..2fd12f2fd 100644 --- a/src/menu_specialized.c +++ b/src/menu_specialized.c @@ -28,10 +28,10 @@ extern const struct CompressedSpriteSheet gMonFrontPicTable[]; -EWRAM_DATA static u8 sUnknown_0203CF48[3] = {0}; -EWRAM_DATA static struct ListMenuItem *sUnknown_0203CF4C = NULL; +EWRAM_DATA static u8 sMailboxWindowIds[MAILBOXWIN_COUNT] = {0}; +EWRAM_DATA static struct ListMenuItem *sMailboxList = NULL; -static void sub_81D1E7C(s32 itemIndex, bool8 onInit, struct ListMenu *list); +static void MailboxMenu_MoveCursorFunc(s32 itemIndex, bool8 onInit, struct ListMenu *list); static void sub_81D24A4(struct ConditionGraph *a0); static void sub_81D2634(struct ConditionGraph *a0); static void MoveRelearnerCursorCallback(s32 itemIndex, bool8 onInit, struct ListMenu *list); @@ -40,33 +40,33 @@ static void SetNextConditionSparkle(struct Sprite *sprite); static void SpriteCB_ConditionSparkle(struct Sprite *sprite); static void ShowAllConditionSparkles(struct Sprite *sprite); -static const struct WindowTemplate sUnknown_086253E8[] = +static const struct WindowTemplate sWindowTemplates_MailboxMenu[MAILBOXWIN_COUNT] = { - { + [MAILBOXWIN_TITLE] = { .bg = 0, .tilemapLeft = 1, .tilemapTop = 1, .width = 8, .height = 2, - .paletteNum = 0xF, + .paletteNum = 15, .baseBlock = 0x8 }, - { + [MAILBOXWIN_LIST] = { .bg = 0, .tilemapLeft = 21, .tilemapTop = 1, .width = 8, .height = 18, - .paletteNum = 0xF, + .paletteNum = 15, .baseBlock = 0x18 }, - { + [MAILBOXWIN_OPTIONS] = { .bg = 0, .tilemapLeft = 1, .tilemapTop = 1, .width = 11, .height = 8, - .paletteNum = 0xF, + .paletteNum = 15, .baseBlock = 0x18 } }; @@ -207,53 +207,55 @@ static const struct ListMenuTemplate sMoveRelearnerMovesListTemplate = .cursorKind = 0 }; -bool8 sub_81D1C44(u8 count) +bool8 MailboxMenu_Alloc(u8 count) { u8 i; - sUnknown_0203CF4C = Alloc(count * sizeof(*sUnknown_0203CF4C) + sizeof(*sUnknown_0203CF4C)); - if (sUnknown_0203CF4C == NULL) + // + 1 to count for 'Cancel' + sMailboxList = Alloc((count + 1) * sizeof(*sMailboxList)); + if (sMailboxList == NULL) return FALSE; - for (i = 0; i < ARRAY_COUNT(sUnknown_0203CF48); i++) - sUnknown_0203CF48[i] = WINDOW_NONE; + for (i = 0; i < ARRAY_COUNT(sMailboxWindowIds); i++) + sMailboxWindowIds[i] = WINDOW_NONE; return TRUE; } -u8 sub_81D1C84(u8 a0) +u8 MailboxMenu_AddWindow(u8 windowIdx) { - if (sUnknown_0203CF48[a0] == WINDOW_NONE) + if (sMailboxWindowIds[windowIdx] == WINDOW_NONE) { - if (a0 == 2) + if (windowIdx == MAILBOXWIN_OPTIONS) { - struct WindowTemplate template = sUnknown_086253E8[2]; + struct WindowTemplate template = sWindowTemplates_MailboxMenu[windowIdx]; template.width = GetMaxWidthInMenuTable(&gMailboxMailOptions[0], 4); - sUnknown_0203CF48[2] = AddWindow(&template); + sMailboxWindowIds[windowIdx] = AddWindow(&template); } - else + else // MAILBOXWIN_TITLE or MAILBOXWIN_LIST { - sUnknown_0203CF48[a0] = AddWindow(&sUnknown_086253E8[a0]); + sMailboxWindowIds[windowIdx] = AddWindow(&sWindowTemplates_MailboxMenu[windowIdx]); } - SetStandardWindowBorderStyle(sUnknown_0203CF48[a0], 0); + SetStandardWindowBorderStyle(sMailboxWindowIds[windowIdx], 0); } - return sUnknown_0203CF48[a0]; + return sMailboxWindowIds[windowIdx]; } -void sub_81D1D04(u8 a0) +void MailboxMenu_RemoveWindow(u8 windowIdx) { - ClearStdWindowAndFrameToTransparent(sUnknown_0203CF48[a0], 0); - ClearWindowTilemap(sUnknown_0203CF48[a0]); - RemoveWindow(sUnknown_0203CF48[a0]); - sUnknown_0203CF48[a0] = WINDOW_NONE; + ClearStdWindowAndFrameToTransparent(sMailboxWindowIds[windowIdx], 0); + ClearWindowTilemap(sMailboxWindowIds[windowIdx]); + RemoveWindow(sMailboxWindowIds[windowIdx]); + sMailboxWindowIds[windowIdx] = WINDOW_NONE; } -static u8 sub_81D1D34(u8 a0) +// Unused +static u8 MailboxMenu_GetWindowId(u8 windowIdx) { - return sUnknown_0203CF48[a0]; + return sMailboxWindowIds[windowIdx]; } -static void sub_81D1D44(u8 windowId, u32 itemId, u8 y) +static void MailboxMenu_ItemPrintFunc(u8 windowId, u32 itemId, u8 y) { u8 buffer[30]; u16 length; @@ -269,21 +271,21 @@ static void sub_81D1D44(u8 windowId, u32 itemId, u8 y) AddTextPrinterParameterized4(windowId, 1, 8, y, 0, 0, sPlayerNameTextColors, -1, buffer); } -u8 sub_81D1DC0(struct PlayerPCItemPageStruct *page) +u8 MailboxMenu_CreateList(struct PlayerPCItemPageStruct *page) { u16 i; for (i = 0; i < page->count; i++) { - sUnknown_0203CF4C[i].name = sEmptyItemName; - sUnknown_0203CF4C[i].id = i; + sMailboxList[i].name = sEmptyItemName; + sMailboxList[i].id = i; } - sUnknown_0203CF4C[i].name = gText_Cancel2; - sUnknown_0203CF4C[i].id = LIST_CANCEL; + sMailboxList[i].name = gText_Cancel2; + sMailboxList[i].id = LIST_CANCEL; - gMultiuseListMenuTemplate.items = sUnknown_0203CF4C; + gMultiuseListMenuTemplate.items = sMailboxList; gMultiuseListMenuTemplate.totalItems = page->count + 1; - gMultiuseListMenuTemplate.windowId = sUnknown_0203CF48[1]; + gMultiuseListMenuTemplate.windowId = sMailboxWindowIds[MAILBOXWIN_LIST]; gMultiuseListMenuTemplate.header_X = 0; gMultiuseListMenuTemplate.item_X = 8; gMultiuseListMenuTemplate.cursor_X = 0; @@ -292,8 +294,8 @@ u8 sub_81D1DC0(struct PlayerPCItemPageStruct *page) gMultiuseListMenuTemplate.cursorPal = 2; gMultiuseListMenuTemplate.fillValue = 1; gMultiuseListMenuTemplate.cursorShadowPal = 3; - gMultiuseListMenuTemplate.moveCursorFunc = sub_81D1E7C; - gMultiuseListMenuTemplate.itemPrintFunc = sub_81D1D44; + gMultiuseListMenuTemplate.moveCursorFunc = MailboxMenu_MoveCursorFunc; + gMultiuseListMenuTemplate.itemPrintFunc = MailboxMenu_ItemPrintFunc; gMultiuseListMenuTemplate.fontId = 1; gMultiuseListMenuTemplate.cursorKind = 0; gMultiuseListMenuTemplate.lettersSpacing = 0; @@ -302,20 +304,20 @@ u8 sub_81D1DC0(struct PlayerPCItemPageStruct *page) return ListMenuInit(&gMultiuseListMenuTemplate, page->itemsAbove, page->cursorPos); } -static void sub_81D1E7C(s32 itemIndex, bool8 onInit, struct ListMenu *list) +static void MailboxMenu_MoveCursorFunc(s32 itemIndex, bool8 onInit, struct ListMenu *list) { if (onInit != TRUE) PlaySE(SE_SELECT); } -void sub_81D1E90(struct PlayerPCItemPageStruct *page) +void MailboxMenu_AddScrollArrows(struct PlayerPCItemPageStruct *page) { page->scrollIndicatorTaskId = AddScrollIndicatorArrowPairParameterized(2, 0xC8, 12, 0x94, page->count - page->pageItems + 1, 0x6E, 0x6E, &page->itemsAbove); } -void sub_81D1EC0(void) +void MailboxMenu_Free(void) { - Free(sUnknown_0203CF4C); + Free(sMailboxList); } void InitConditionGraphData(struct ConditionGraph *graph) diff --git a/src/party_menu.c b/src/party_menu.c index f77703328..80012623f 100755 --- a/src/party_menu.c +++ b/src/party_menu.c @@ -5471,7 +5471,7 @@ static void TryGiveMailToSelectedMon(u8 taskId) struct MailStruct *mail; gPartyMenuUseExitCallback = FALSE; - mail = &gSaveBlock1Ptr->mail[playerPCItemPageInfo.itemsAbove + 6 + playerPCItemPageInfo.cursorPos]; + mail = &gSaveBlock1Ptr->mail[gPlayerPCItemPageInfo.itemsAbove + PARTY_SIZE + gPlayerPCItemPageInfo.cursorPos]; if (GetMonData(mon, MON_DATA_HELD_ITEM) != ITEM_NONE) { DisplayPartyMenuMessage(gText_PkmnHoldingItemCantHoldMail, TRUE); diff --git a/src/player_pc.c b/src/player_pc.c index f44a111b3..228c3ae10 100644 --- a/src/player_pc.c +++ b/src/player_pc.c @@ -30,24 +30,79 @@ #include "window.h" #include "menu_specialized.h" -// structures -struct Struct203BCC4 +// Top level PC menu options +enum { + MENU_ITEMSTORAGE, + MENU_MAILBOX, + MENU_DECORATION, + MENU_TURNOFF +}; + +// Item storage menu options +enum { + MENU_WITHDRAW, + MENU_DEPOSIT, + MENU_TOSS, + MENU_EXIT +}; + +// Windows for the main menus (top level menu, and item storage menu) +enum { + WIN_MAIN_MENU, + WIN_MAIN_MENU_BEDROOM, + WIN_ITEM_STORAGE_MENU, +}; + +// Windows for item storage (while viewing the PC's item inventory) +enum { + ITEMWIN_LIST, + ITEMWIN_MESSAGE, + ITEMWIN_ICON, + ITEMWIN_TITLE, + ITEMWIN_QUANTITY, + ITEMWIN_YESNO, + ITEMWIN_COUNT +}; + // When showing the main list, the first window to this window are drawn +#define ITEMWIN_LIST_END ITEMWIN_TITLE + +// Message IDs for Item Storage +enum { + MSG_SWITCH_WHICH_ITEM = 0xFFF7, + MSG_OKAY_TO_THROW_AWAY, + MSG_TOO_IMPORTANT, + MSG_NO_MORE_ROOM, + MSG_THREW_AWAY_ITEM, + MSG_HOW_MANY_TO_TOSS, + MSG_WITHDREW_ITEM, + MSG_HOW_MANY_TO_WITHDRAW, + MSG_GO_BACK_TO_PREV +}; + +#define TAG_ITEM_ICON 5110 +#define TAG_SCROLL_ARROW 5112 + +// Item list ID for toSwapPos to indicate an item is not currently being swapped +#define NOT_SWAPPING 0xFF + +#define SWAP_LINE_LENGTH 7 + +struct ItemStorageMenu { - struct ListMenuItem unk0[51]; - u8 unk198[51][0x18]; - u8 windowIds[6]; - u8 unk666; + struct ListMenuItem listItems[PC_ITEMS_COUNT + 1]; + u8 itemNames[PC_ITEMS_COUNT + 1][ITEM_NAME_LENGTH + 10]; + u8 windowIds[ITEMWIN_COUNT]; + u8 toSwapPos; u8 spriteId; - u8 spriteIds[7]; + u8 swapLineSpriteIds[SWAP_LINE_LENGTH]; }; -// static functions static void InitPlayerPCMenu(u8 taskId); static void PlayerPCProcessMenuInput(u8 taskId); static void InitItemStorageMenu(u8 taskId, u8 var); static u8 GetMailboxMailCount(void); -static void Mailbox_UpdateMailList(void); +static void Mailbox_CompactMailList(void); static void Mailbox_DrawMailboxMenu(u8 taskId); static void Mailbox_ProcessInput(u8 taskId); static void Mailbox_PrintWhatToDoWithPlayerMailText(u8 taskId); @@ -67,15 +122,14 @@ static void Mailbox_Give(u8 taskId); static void Mailbox_Cancel(u8 taskId); static void Mailbox_CancelMoveToBag(u8 taskId); -static void Mailbox_MoveToBagYesNoPrompt(u8 taskId); -static void Mailbox_DrawYesNoBeforeMove(u8 taskId); +static void Mailbox_HandleConfirmMoveToBag(u8 taskId); +static void Mailbox_AskConfirmMoveToBag(u8 taskId); static void Mailbox_DoGiveMailPokeMenu(u8 taskId); static void Mailbox_NoPokemonForMail(u8 taskId); static void Mailbox_FadeAndReadMail(u8 taskId); static void Mailbox_ReturnToFieldFromReadMail(void); -static void Mailbox_DoRedrawMailboxMenuAfterReturn(void); -static void pal_fill_for_maplights_or_black(void); +static void Mailbox_ReshowAfterMail(void); static void Mailbox_HandleReturnToProcessInput(u8 taskId); static void Mailbox_UpdateMailListAfterDeposit(void); @@ -83,91 +137,92 @@ static void ItemStorage_Withdraw(u8 taskId); static void ItemStorage_Deposit(u8 taskId); static void ItemStorage_Toss(u8 taskId); static void ItemStorage_Exit(u8 taskId); -static void ItemStorage_ResumeInputFromYesToss(u8 taskId); -static void ItemStorage_ResumeInputFromNoToss(u8 taskId); +static void ItemStorage_TossItemYes(u8 taskId); +static void ItemStorage_TossItemNo(u8 taskId); static void ItemStorageMenuPrint(const u8 *); static void ItemStorageMenuProcessInput(u8 taskId); -static void ItemStorage_ProcessWithdrawTossInput(u8 taskId); -static void ItemStorage_SetItemAndMailCount(u8); +static void SetPlayerPCListCount(u8); static void ItemStorage_HandleReturnToProcessInput(u8 taskId); -static void ItemStorage_WithdrawToss_Helper(u8 taskId, bool8 toss); +static void ItemStorage_Enter(u8 taskId, bool8 toss); +static void ItemStorage_CreateListMenu(u8 taskId); +static void ItemStorage_ProcessInput(u8 taskId); static void Task_ItemStorage_Deposit(u8 taskId); +static void ItemStorage_ReshowAfterBagMenu(void); static void ItemStorage_DoItemWithdraw(u8 taskId); static void ItemStorage_DoItemToss(u8 taskid); static void ItemStorage_HandleQuantityRolling(u8 taskid); -static void ItemStorage_GoBackToPlayerPCMenu(u8 taskId); -static void ItemStorage_ItemSwapChoosePrompt(u8 taskId); +static void ItemStorage_ExitItemList(u8 taskId); +static void ItemStorage_StartItemSwap(u8 taskId); static void ItemStorage_DoItemAction(u8 taskId); -static void ItemStorage_ProcessInput(u8 taskId); -static void ItemStorage_DoItemSwap(u8 taskId, bool8 a); +static void ItemStorage_FinishItemSwap(u8 taskId, bool8 a); static void ItemStorage_HandleRemoveItem(u8 taskId); -static void ItemStorage_WaitPressHandleResumeProcessInput(u8 taskId); -static void ItemStorage_StartScrollIndicatorAndProcessInput(u8 taskId); +static void ItemStorage_HandleErrorMessageInput(u8 taskId); +static void ItemStorage_ReturnToListInput(u8 taskId); -static const u8* ItemStorage_GetItemPcResponse(u16); +static const u8* ItemStorage_GetMessage(u16); static void CopyItemName_PlayerPC(u8 *string, u16 itemId); -static void sub_816BC14(void); -static void sub_816BFE0(u8 y, u8, u8 speed); -static void sub_816BCC4(u8); -static void UpdateSwapLinePos(u8); -static void sub_816C4FC(u8 taskId); -static void sub_816C0C8(void); -static void sub_816C060(u16 itemId); -static void sub_816BEF0(s32 id); -static void sub_816B4DC(u8 taskId); +static void ItemStorage_Init(void); +static void ItemStorage_DrawSwapArrow(u8 y, u8, u8 speed); +static void ItemStorage_RemoveWindow(u8); +static void ItemStorage_UpdateSwapLinePos(u8); +static void ItemStorage_ProcessItemSwapInput(u8 taskId); +static void ItemStorage_EraseItemIcon(void); +static void ItemStorage_DrawItemIcon(u16 itemId); +static void ItemStorage_PrintDescription(s32 id); +static void ItemStorage_EraseMainMenu(u8 taskId); static void ItemStorage_MoveCursor(s32 id, bool8 b, struct ListMenu * thisMenu); -static void fish4_goto_x5_or_x6(u8 windowId, u32 id, u8 yOffset); +static void ItemStorage_PrintMenuItem(u8 windowId, u32 id, u8 yOffset); -// EWRAM -static EWRAM_DATA const u8 *gPcItemMenuOptionOrder = NULL; -static EWRAM_DATA u8 gPcItemMenuOptionsNum = 0; -EWRAM_DATA struct PlayerPCItemPageStruct playerPCItemPageInfo = {0, 0, 0, 0, {0, 0, 0}, 0}; -static EWRAM_DATA struct Struct203BCC4 *gUnknown_0203BCC4 = NULL; +static EWRAM_DATA const u8 *sTopMenuOptionOrder = NULL; +static EWRAM_DATA u8 sTopMenuNumOptions = 0; +EWRAM_DATA struct PlayerPCItemPageStruct gPlayerPCItemPageInfo = {}; +static EWRAM_DATA struct ItemStorageMenu *sItemStorageMenu = NULL; -// .rodata -static const u8 *const gPCText_OptionDescList[] = +static const u8 *const sItemStorage_OptionDescriptions[] = { - gText_TakeOutItemsFromPC, - gText_StoreItemsInPC, - gText_ThrowAwayItemsInPC, - gText_GoBackPrevMenu, + [MENU_WITHDRAW] = gText_TakeOutItemsFromPC, + [MENU_DEPOSIT] = gText_StoreItemsInPC, + [MENU_TOSS] = gText_ThrowAwayItemsInPC, + [MENU_EXIT] = gText_GoBackPrevMenu, }; static const struct MenuAction sPlayerPCMenuActions[] = { - { gText_ItemStorage, PlayerPC_ItemStorage }, - { gText_Mailbox, PlayerPC_Mailbox }, - { gText_Decoration, PlayerPC_Decoration }, - { gText_TurnOff, PlayerPC_TurnOff } + [MENU_ITEMSTORAGE] = { gText_ItemStorage, PlayerPC_ItemStorage }, + [MENU_MAILBOX] = { gText_Mailbox, PlayerPC_Mailbox }, + [MENU_DECORATION] = { gText_Decoration, PlayerPC_Decoration }, + [MENU_TURNOFF] = { gText_TurnOff, PlayerPC_TurnOff } }; -static const u8 gBedroomPC_OptionOrder[] = +static const u8 sBedroomPC_OptionOrder[] = { - PLAYERPC_MENU_ITEMSTORAGE, - PLAYERPC_MENU_MAILBOX, - PLAYERPC_MENU_DECORATION, - PLAYERPC_MENU_TURNOFF + MENU_ITEMSTORAGE, + MENU_MAILBOX, + MENU_DECORATION, + MENU_TURNOFF }; +#define NUM_BEDROOM_PC_OPTIONS ARRAY_COUNT(sBedroomPC_OptionOrder) -static const u8 gPlayerPC_OptionOrder[] = +static const u8 sPlayerPC_OptionOrder[] = { - PLAYERPC_MENU_ITEMSTORAGE, - PLAYERPC_MENU_MAILBOX, - PLAYERPC_MENU_TURNOFF + MENU_ITEMSTORAGE, + MENU_MAILBOX, + MENU_TURNOFF }; +#define NUM_PLAYER_PC_OPTIONS ARRAY_COUNT(sPlayerPC_OptionOrder) -static const struct MenuAction gPCText_ItemPCOptionsText[] = +static const struct MenuAction sItemStorage_MenuActions[] = { - { gText_WithdrawItem, ItemStorage_Withdraw }, - { gText_DepositItem, ItemStorage_Deposit }, - { gText_TossItem, ItemStorage_Toss }, - { gText_Cancel, ItemStorage_Exit } + [MENU_WITHDRAW] = { gText_WithdrawItem, ItemStorage_Withdraw }, + [MENU_DEPOSIT] = { gText_DepositItem, ItemStorage_Deposit }, + [MENU_TOSS] = { gText_TossItem, ItemStorage_Toss }, + [MENU_EXIT] = { gText_Cancel, ItemStorage_Exit } }; -static const struct ItemSlot gNewGamePCItems[] = +static const struct ItemSlot sNewGamePCItems[] = { { ITEM_POTION, 1 }, { ITEM_NONE, 0 } @@ -175,15 +230,15 @@ static const struct ItemSlot gNewGamePCItems[] = const struct MenuAction gMailboxMailOptions[] = { - { gText_Read, Mailbox_DoMailRead }, + { gText_Read, Mailbox_DoMailRead }, { gText_MoveToBag, Mailbox_MoveToBag }, - { gText_Give2, Mailbox_Give }, - { gText_Cancel2, Mailbox_Cancel } + { gText_Give2, Mailbox_Give }, + { gText_Cancel2, Mailbox_Cancel } }; -static const struct WindowTemplate gUnknown_085DFF24[3] = +static const struct WindowTemplate sWindowTemplates_MainMenus[] = { - { + [WIN_MAIN_MENU] = { .bg = 0, .tilemapLeft = 1, .tilemapTop = 1, @@ -192,7 +247,7 @@ static const struct WindowTemplate gUnknown_085DFF24[3] = .paletteNum = 15, .baseBlock = 1 }, - { + [WIN_MAIN_MENU_BEDROOM] = { .bg = 0, .tilemapLeft = 1, .tilemapTop = 1, @@ -201,7 +256,7 @@ static const struct WindowTemplate gUnknown_085DFF24[3] = .paletteNum = 15, .baseBlock = 1 }, - { + [WIN_ITEM_STORAGE_MENU] = { .bg = 0, .tilemapLeft = 1, .tilemapTop = 1, @@ -212,17 +267,17 @@ static const struct WindowTemplate gUnknown_085DFF24[3] = } }; -static const struct YesNoFuncTable ResumeFromWithdrawYesNoFuncList = // ResumeFromWithdrawYesNoFuncList +static const struct YesNoFuncTable ItemTossYesNoFuncs = { - ItemStorage_ResumeInputFromYesToss, - ItemStorage_ResumeInputFromNoToss + ItemStorage_TossItemYes, + ItemStorage_TossItemNo }; -static const struct ListMenuTemplate gUnknown_085DFF44 = +static const struct ListMenuTemplate sListMenuTemplate_ItemStorage = { .items = NULL, .moveCursorFunc = ItemStorage_MoveCursor, - .itemPrintFunc = fish4_goto_x5_or_x6, + .itemPrintFunc = ItemStorage_PrintMenuItem, .totalItems = 0, .maxShowed = 0, .windowId = 0, @@ -239,9 +294,9 @@ static const struct ListMenuTemplate gUnknown_085DFF44 = .fontId = 7 }; -static const struct WindowTemplate gUnknown_085DFF5C[5] = +static const struct WindowTemplate sWindowTemplates_ItemStorage[ITEMWIN_COUNT] = { - { + [ITEMWIN_LIST] = { .bg = 0, .tilemapLeft = 16, .tilemapTop = 1, @@ -250,7 +305,7 @@ static const struct WindowTemplate gUnknown_085DFF5C[5] = .paletteNum = 15, .baseBlock = 0x0001 }, - { + [ITEMWIN_MESSAGE] = { .bg = 0, .tilemapLeft = 1, .tilemapTop = 13, @@ -259,7 +314,7 @@ static const struct WindowTemplate gUnknown_085DFF5C[5] = .paletteNum = 15, .baseBlock = 0x00EB }, - { + [ITEMWIN_ICON] = { .bg = 0, .tilemapLeft = 1, .tilemapTop = 8, @@ -268,7 +323,7 @@ static const struct WindowTemplate gUnknown_085DFF5C[5] = .paletteNum = 15, .baseBlock = 0x0153 }, - { + [ITEMWIN_TITLE] = { .bg = 0, .tilemapLeft = 1, .tilemapTop = 1, @@ -277,7 +332,7 @@ static const struct WindowTemplate gUnknown_085DFF5C[5] = .paletteNum = 15, .baseBlock = 0x0139 }, - { + [ITEMWIN_QUANTITY] = { .bg = 0, .tilemapLeft = 8, .tilemapTop = 9, @@ -285,61 +340,67 @@ static const struct WindowTemplate gUnknown_085DFF5C[5] = .height = 2, .paletteNum = 15, .baseBlock = 0x015C + }, + [ITEMWIN_YESNO] = { + .bg = 0, + .tilemapLeft = 9, + .tilemapTop = 7, + .width = 5, + .height = 4, + .paletteNum = 15, + .baseBlock = 0x0168 } }; -static const struct WindowTemplate gUnknown_085DFF84 = -{ - .bg = 0, - .tilemapLeft = 9, - .tilemapTop = 7, - .width = 5, - .height = 4, - .paletteNum = 15, - .baseBlock = 0x0168 -}; - -static const u8 gUnknown_085DFF8C[] = {0x01, 0x03, 0x02, 0x00}; +static const u8 sSwapArrowTextColors[] = {TEXT_COLOR_WHITE, TEXT_COLOR_LIGHT_GRAY, TEXT_COLOR_DARK_GRAY}; -// text +// Macro below is likely a fakematch, equivalent to sNewGamePCItems[i].quantity +#define GET_QUANTITY(i) ((u16)((u16 *)sNewGamePCItems + 1)[i * 2]) void NewGameInitPCItems(void) { - u8 i; - - // because Game Freak don't know how to use a struct or a 2d array - for(i = 0, ClearItemSlots(gSaveBlock1Ptr->pcItems, ARRAY_COUNT(gSaveBlock1Ptr->pcItems)); NEW_GAME_PC_ITEMS(i, PC_ITEM_ID) && NEW_GAME_PC_ITEMS(i, PC_QUANTITY) && - AddPCItem(NEW_GAME_PC_ITEMS(i, PC_ITEM_ID), NEW_GAME_PC_ITEMS(i, PC_QUANTITY)) == TRUE; i++); + u8 i = 0; + ClearItemSlots(gSaveBlock1Ptr->pcItems, PC_ITEMS_COUNT); + for(; sNewGamePCItems[i].itemId != ITEM_NONE && GET_QUANTITY(i) && + AddPCItem(sNewGamePCItems[i].itemId, GET_QUANTITY(i)) == TRUE; i++); } +#undef GET_QUANTITY void BedroomPC(void) { - gPcItemMenuOptionOrder = gBedroomPC_OptionOrder; - gPcItemMenuOptionsNum = 4; + sTopMenuOptionOrder = sBedroomPC_OptionOrder; + sTopMenuNumOptions = NUM_BEDROOM_PC_OPTIONS; DisplayItemMessageOnField(CreateTask(TaskDummy, 0), gText_WhatWouldYouLike, InitPlayerPCMenu); } void PlayerPC(void) { - gPcItemMenuOptionOrder = gPlayerPC_OptionOrder; - gPcItemMenuOptionsNum = 3; + sTopMenuOptionOrder = sPlayerPC_OptionOrder; + sTopMenuNumOptions = NUM_PLAYER_PC_OPTIONS; DisplayItemMessageOnField(CreateTask(TaskDummy, 0), gText_WhatWouldYouLike, InitPlayerPCMenu); } +#define tUsedSlots data[1] +#define tQuantity data[2] +#define tInTossMenu data[3] +#define tWindowId data[4] +#define tListTaskId data[5] + static void InitPlayerPCMenu(u8 taskId) { u16 *data; struct WindowTemplate windowTemplate; - data = gTasks[taskId].data; - if (gPcItemMenuOptionsNum == 3) - windowTemplate = gUnknown_085DFF24[0]; - else - windowTemplate = gUnknown_085DFF24[1]; - windowTemplate.width = sub_81DB3D8(sPlayerPCMenuActions, gPcItemMenuOptionOrder, gPcItemMenuOptionsNum); - data[4] = AddWindow(&windowTemplate); - SetStandardWindowBorderStyle(data[4], 0); - sub_81995E4(data[4], gPcItemMenuOptionsNum, sPlayerPCMenuActions, gPcItemMenuOptionOrder); - InitMenuInUpperLeftCornerPlaySoundWhenAPressed(data[4], gPcItemMenuOptionsNum, 0); + + if (sTopMenuNumOptions == NUM_PLAYER_PC_OPTIONS) + windowTemplate = sWindowTemplates_MainMenus[WIN_MAIN_MENU]; + else // Bedroom PC + windowTemplate = sWindowTemplates_MainMenus[WIN_MAIN_MENU_BEDROOM]; + + windowTemplate.width = sub_81DB3D8(sPlayerPCMenuActions, sTopMenuOptionOrder, sTopMenuNumOptions); + tWindowId = AddWindow(&windowTemplate); + SetStandardWindowBorderStyle(tWindowId, 0); + sub_81995E4(tWindowId, sTopMenuNumOptions, sPlayerPCMenuActions, sTopMenuOptionOrder); + InitMenuInUpperLeftCornerPlaySoundWhenAPressed(tWindowId, sTopMenuNumOptions, 0); ScheduleBgCopyTilemapToVram(0); gTasks[taskId].func = PlayerPCProcessMenuInput; } @@ -350,30 +411,30 @@ static void PlayerPCProcessMenuInput(u8 taskId) s8 inputOptionId; data = gTasks[taskId].data; - if (gPcItemMenuOptionsNum > 3) + if (sTopMenuNumOptions > 3) inputOptionId = Menu_ProcessInput(); else inputOptionId = Menu_ProcessInputNoWrap(); switch (inputOptionId) { - case MENU_NOTHING_CHOSEN: - break; - case MENU_B_PRESSED: - PlaySE(SE_SELECT); - ClearStdWindowAndFrameToTransparent(data[4], FALSE); - ClearWindowTilemap(data[4]); - RemoveWindow(data[4]); - ScheduleBgCopyTilemapToVram(0); - gTasks[taskId].func = PlayerPC_TurnOff; - break; - default: - ClearStdWindowAndFrameToTransparent(data[4], FALSE); - ClearWindowTilemap(data[4]); - RemoveWindow(data[4]); - ScheduleBgCopyTilemapToVram(0); - gTasks[taskId].func = sPlayerPCMenuActions[gPcItemMenuOptionOrder[inputOptionId]].func.void_u8; - break; + case MENU_NOTHING_CHOSEN: + break; + case MENU_B_PRESSED: + PlaySE(SE_SELECT); + ClearStdWindowAndFrameToTransparent(tWindowId, FALSE); + ClearWindowTilemap(tWindowId); + RemoveWindow(tWindowId); + ScheduleBgCopyTilemapToVram(0); + gTasks[taskId].func = PlayerPC_TurnOff; + break; + default: + ClearStdWindowAndFrameToTransparent(tWindowId, FALSE); + ClearWindowTilemap(tWindowId); + RemoveWindow(tWindowId); + ScheduleBgCopyTilemapToVram(0); + gTasks[taskId].func = sPlayerPCMenuActions[sTopMenuOptionOrder[inputOptionId]].func.void_u8; + break; } } @@ -384,31 +445,37 @@ void ReshowPlayerPC(u8 var) static void PlayerPC_ItemStorage(u8 taskId) { - InitItemStorageMenu(taskId, ITEMPC_MENU_WITHDRAW); + InitItemStorageMenu(taskId, MENU_WITHDRAW); gTasks[taskId].func = ItemStorageMenuProcessInput; } static void PlayerPC_Mailbox(u8 taskId) { - playerPCItemPageInfo.count = GetMailboxMailCount(); + gPlayerPCItemPageInfo.count = GetMailboxMailCount(); - if (playerPCItemPageInfo.count == 0) + if (gPlayerPCItemPageInfo.count == 0) + { + // Mailbox cannot be opened if no mail is in PC DisplayItemMessageOnField(taskId, gText_NoMailHere, ReshowPlayerPC); + } else { - playerPCItemPageInfo.cursorPos = 0; - playerPCItemPageInfo.itemsAbove = 0; - playerPCItemPageInfo.scrollIndicatorTaskId = TASK_NONE; - Mailbox_UpdateMailList(); - ItemStorage_SetItemAndMailCount(taskId); - if (sub_81D1C44(playerPCItemPageInfo.count) == TRUE) + gPlayerPCItemPageInfo.cursorPos = 0; + gPlayerPCItemPageInfo.itemsAbove = 0; + gPlayerPCItemPageInfo.scrollIndicatorTaskId = TASK_NONE; + Mailbox_CompactMailList(); + SetPlayerPCListCount(taskId); + if (MailboxMenu_Alloc(gPlayerPCItemPageInfo.count) == TRUE) { ClearDialogWindowAndFrame(0, 0); Mailbox_DrawMailboxMenu(taskId); gTasks[taskId].func = Mailbox_ProcessInput; } - else + else + { + // Alloc failed, exit Mailbox DisplayItemMessageOnField(taskId, gText_NoMailHere, ReshowPlayerPC); + } } } @@ -419,7 +486,7 @@ static void PlayerPC_Decoration(u8 taskId) static void PlayerPC_TurnOff(u8 taskId) { - if (gPcItemMenuOptionsNum == 4) // if the option count is 4, we are at the bedroom PC, so do gender specific handling. + if (sTopMenuNumOptions == NUM_BEDROOM_PC_OPTIONS) // Flimsy way to determine if Bedroom PC is in use { if (gSaveBlock2Ptr->playerGender == MALE) ScriptContext1_SetupScript(LittlerootTown_BrendansHouse_2F_EventScript_TurnOffPlayerPC); @@ -439,14 +506,14 @@ static void InitItemStorageMenu(u8 taskId, u8 var) struct WindowTemplate windowTemplate; data = gTasks[taskId].data; - windowTemplate = gUnknown_085DFF24[2]; - windowTemplate.width = GetMaxWidthInMenuTable(gPCText_ItemPCOptionsText, 4); - data[4] = AddWindow(&windowTemplate); - SetStandardWindowBorderStyle(data[4], 0); - PrintMenuTable(data[4], ARRAY_COUNT(gPCText_ItemPCOptionsText), gPCText_ItemPCOptionsText); - InitMenuInUpperLeftCornerPlaySoundWhenAPressed(data[4], 4, var); + windowTemplate = sWindowTemplates_MainMenus[WIN_ITEM_STORAGE_MENU]; + windowTemplate.width = GetMaxWidthInMenuTable(sItemStorage_MenuActions, ARRAY_COUNT(sItemStorage_MenuActions)); + tWindowId = AddWindow(&windowTemplate); + SetStandardWindowBorderStyle(tWindowId, 0); + PrintMenuTable(tWindowId, ARRAY_COUNT(sItemStorage_MenuActions), sItemStorage_MenuActions); + InitMenuInUpperLeftCornerPlaySoundWhenAPressed(tWindowId, 4, var); ScheduleBgCopyTilemapToVram(0); - ItemStorageMenuPrint(gPCText_OptionDescList[var]); + ItemStorageMenuPrint(sItemStorage_OptionDescriptions[var]); } static void ItemStorageMenuPrint(const u8 *textPtr) @@ -457,27 +524,26 @@ static void ItemStorageMenuPrint(const u8 *textPtr) static void ItemStorageMenuProcessInput(u8 taskId) { - s8 r5; - s8 r2; + s8 oldPos, newPos; s8 inputOptionId; - r5 = Menu_GetCursorPos(); + oldPos = Menu_GetCursorPos(); inputOptionId = Menu_ProcessInput(); - r2 = Menu_GetCursorPos(); + newPos = Menu_GetCursorPos(); switch (inputOptionId) { - case MENU_NOTHING_CHOSEN: - if (r5 != r2) - ItemStorageMenuPrint(gPCText_OptionDescList[r2]); - break; - case MENU_B_PRESSED: - PlaySE(SE_SELECT); - ItemStorage_Exit(taskId); - break; - default: - PlaySE(SE_SELECT); - gPCText_ItemPCOptionsText[inputOptionId].func.void_u8(taskId); - break; + case MENU_NOTHING_CHOSEN: + if (oldPos != newPos) + ItemStorageMenuPrint(sItemStorage_OptionDescriptions[newPos]); + break; + case MENU_B_PRESSED: + PlaySE(SE_SELECT); + ItemStorage_Exit(taskId); + break; + default: + PlaySE(SE_SELECT); + sItemStorage_MenuActions[inputOptionId].func.void_u8(taskId); + break; } } @@ -497,13 +563,13 @@ static void Task_ItemStorage_Deposit(u8 taskId) } } -void sub_816B31C(void) +void CB2_PlayerPCExitBagMenu(void) { - gFieldCallback = Mailbox_DoRedrawMailboxMenuAfterReturn; + gFieldCallback = ItemStorage_ReshowAfterBagMenu; SetMainCallback2(CB2_ReturnToField); } -void Mailbox_DoRedrawMailboxMenuAfterReturn(void) +static void ItemStorage_ReshowAfterBagMenu(void) { LoadMessageBoxAndBorderGfx(); DrawDialogueFrame(0, 1); @@ -521,12 +587,15 @@ static void ItemStorage_Withdraw(u8 taskId) { s16 *data = gTasks[taskId].data; - NUM_ITEMS = CountUsedPCItemSlots(); - if (NUM_ITEMS != 0) - ItemStorage_WithdrawToss_Helper(taskId, FALSE); + tUsedSlots = CountUsedPCItemSlots(); + if (tUsedSlots != 0) + { + ItemStorage_Enter(taskId, FALSE); + } else { - sub_816B4DC(taskId); + // Can't withdraw, no items in PC + ItemStorage_EraseMainMenu(taskId); DisplayItemMessageOnField(taskId, gText_NoItems, PlayerPC_ItemStorage); } @@ -536,136 +605,133 @@ static void ItemStorage_Toss(u8 taskId) { s16 *data = gTasks[taskId].data; - NUM_ITEMS = CountUsedPCItemSlots(); - if (NUM_ITEMS != 0) - ItemStorage_WithdrawToss_Helper(taskId, TRUE); + tUsedSlots = CountUsedPCItemSlots(); + if (tUsedSlots != 0) + { + ItemStorage_Enter(taskId, TRUE); + } else { - sub_816B4DC(taskId); + // Can't toss, no items in PC + ItemStorage_EraseMainMenu(taskId); DisplayItemMessageOnField(taskId, gText_NoItems, PlayerPC_ItemStorage); } } -static void ItemStorage_WithdrawToss_Helper(u8 taskId, bool8 toss) +static void ItemStorage_Enter(u8 taskId, bool8 toss) { u16 *data = gTasks[taskId].data; - data[3] = toss; - sub_816B4DC(taskId); - playerPCItemPageInfo.cursorPos = 0; - playerPCItemPageInfo.itemsAbove = 0; - playerPCItemPageInfo.scrollIndicatorTaskId = TASK_NONE; - ItemStorage_SetItemAndMailCount(taskId); - sub_816BC14(); + tInTossMenu = toss; + ItemStorage_EraseMainMenu(taskId); + gPlayerPCItemPageInfo.cursorPos = 0; + gPlayerPCItemPageInfo.itemsAbove = 0; + gPlayerPCItemPageInfo.scrollIndicatorTaskId = TASK_NONE; + SetPlayerPCListCount(taskId); + ItemStorage_Init(); FreeAndReserveObjectSpritePalettes(); LoadListMenuSwapLineGfx(); - CreateSwapLineSprites(gUnknown_0203BCC4->spriteIds, 7); + CreateSwapLineSprites(sItemStorageMenu->swapLineSpriteIds, SWAP_LINE_LENGTH); ClearDialogWindowAndFrame(0,0); - gTasks[taskId].func = ItemStorage_ProcessWithdrawTossInput; + gTasks[taskId].func = ItemStorage_CreateListMenu; } static void ItemStorage_Exit(u8 taskId) { - sub_816B4DC(taskId); + ItemStorage_EraseMainMenu(taskId); ReshowPlayerPC(taskId); } - -static void ItemStorage_SetItemAndMailCount(u8 taskId) +// Used by Item Storage and the Mailbox +static void SetPlayerPCListCount(u8 taskId) { - if (playerPCItemPageInfo.count > 7) - playerPCItemPageInfo.pageItems = 8; + if (gPlayerPCItemPageInfo.count > 7) + gPlayerPCItemPageInfo.pageItems = 8; else - playerPCItemPageInfo.pageItems = playerPCItemPageInfo.count + 1; + gPlayerPCItemPageInfo.pageItems = gPlayerPCItemPageInfo.count + 1; } -static void sub_816B4DC(u8 taskId) +static void ItemStorage_EraseMainMenu(u8 taskId) { u16 *data = gTasks[taskId].data; - - ClearStdWindowAndFrameToTransparent(data[4], FALSE); - ClearWindowTilemap(data[4]); - RemoveWindow(data[4]); + ClearStdWindowAndFrameToTransparent(tWindowId, FALSE); + ClearWindowTilemap(tWindowId); + RemoveWindow(tWindowId); ScheduleBgCopyTilemapToVram(0); } static u8 GetMailboxMailCount(void) { - u8 i, j; + u8 mailInPC, i; - for(i = 0, j = PARTY_SIZE; j < MAIL_COUNT; j++) - if (gSaveBlock1Ptr->mail[j].itemId != ITEM_NONE) - i++; + // Count mail in PC (by first skipping over mail in party) + for (mailInPC = 0, i = PARTY_SIZE; i < MAIL_COUNT; i++) + if (gSaveBlock1Ptr->mail[i].itemId != ITEM_NONE) + mailInPC++; - return i; + return mailInPC; } -static void Mailbox_UpdateMailList(void) +static void Mailbox_CompactMailList(void) { - struct MailStruct mailBuffer; + struct MailStruct temp; u8 i, j; for (i = PARTY_SIZE; i < MAIL_COUNT - 1; i++) { for (j = i + 1; j < MAIL_COUNT; j++) { - if (gSaveBlock1Ptr->mail[i].itemId == 0) - { - mailBuffer = gSaveBlock1Ptr->mail[i]; - gSaveBlock1Ptr->mail[i] = gSaveBlock1Ptr->mail[j]; - gSaveBlock1Ptr->mail[j] = mailBuffer; - } + if (gSaveBlock1Ptr->mail[i].itemId == ITEM_NONE) + SWAP(gSaveBlock1Ptr->mail[i], gSaveBlock1Ptr->mail[j], temp); } } } static void Mailbox_DrawMailboxMenu(u8 taskId) { - u8 windowId; - - windowId = sub_81D1C84(0); - sub_81D1C84(1); + u8 windowId = MailboxMenu_AddWindow(MAILBOXWIN_TITLE); + MailboxMenu_AddWindow(MAILBOXWIN_LIST); AddTextPrinterParameterized(windowId, 1, gText_Mailbox, GetStringCenterAlignXOffset(1, gText_Mailbox, 0x40), 1, 0, NULL); ScheduleBgCopyTilemapToVram(0); - gTasks[taskId].data[5] = sub_81D1DC0(&playerPCItemPageInfo); - sub_81D1E90(&playerPCItemPageInfo); + gTasks[taskId].tListTaskId = MailboxMenu_CreateList(&gPlayerPCItemPageInfo); + MailboxMenu_AddScrollArrows(&gPlayerPCItemPageInfo); } static void Mailbox_ProcessInput(u8 taskId) { u16 *data = gTasks[taskId].data; - s32 inputOptionId; if (!gPaletteFade.active) { - inputOptionId = ListMenu_ProcessInput(data[5]); - ListMenuGetScrollAndRow(data[5], &(playerPCItemPageInfo.itemsAbove), &(playerPCItemPageInfo.cursorPos)); + s32 inputOptionId = ListMenu_ProcessInput(tListTaskId); + ListMenuGetScrollAndRow(tListTaskId, &gPlayerPCItemPageInfo.itemsAbove, &gPlayerPCItemPageInfo.cursorPos); switch (inputOptionId) { - case LIST_NOTHING_CHOSEN: - break; - case LIST_CANCEL: - PlaySE(SE_SELECT); - RemoveScrollIndicatorArrowPair(playerPCItemPageInfo.scrollIndicatorTaskId); - Mailbox_ReturnToPlayerPC(taskId); - break; - default: - PlaySE(SE_SELECT); - sub_81D1D04(0); - sub_81D1D04(1); - DestroyListMenuTask(data[5], &(playerPCItemPageInfo.itemsAbove), &(playerPCItemPageInfo.cursorPos)); - ScheduleBgCopyTilemapToVram(0); - RemoveScrollIndicatorArrowPair(playerPCItemPageInfo.scrollIndicatorTaskId); - gTasks[taskId].func = Mailbox_PrintWhatToDoWithPlayerMailText; - break; + case LIST_NOTHING_CHOSEN: + break; + case LIST_CANCEL: + PlaySE(SE_SELECT); + RemoveScrollIndicatorArrowPair(gPlayerPCItemPageInfo.scrollIndicatorTaskId); + Mailbox_ReturnToPlayerPC(taskId); + break; + default: + // Selected mail, ask what to do with it + PlaySE(SE_SELECT); + MailboxMenu_RemoveWindow(MAILBOXWIN_TITLE); + MailboxMenu_RemoveWindow(MAILBOXWIN_LIST); + DestroyListMenuTask(tListTaskId, &gPlayerPCItemPageInfo.itemsAbove, &gPlayerPCItemPageInfo.cursorPos); + ScheduleBgCopyTilemapToVram(0); + RemoveScrollIndicatorArrowPair(gPlayerPCItemPageInfo.scrollIndicatorTaskId); + gTasks[taskId].func = Mailbox_PrintWhatToDoWithPlayerMailText; + break; } } } static void Mailbox_PrintWhatToDoWithPlayerMailText(u8 taskId) { - StringCopy(gStringVar1, gSaveBlock1Ptr->mail[playerPCItemPageInfo.itemsAbove + PARTY_SIZE + playerPCItemPageInfo.cursorPos].playerName); + StringCopy(gStringVar1, gSaveBlock1Ptr->mail[gPlayerPCItemPageInfo.itemsAbove + PARTY_SIZE + gPlayerPCItemPageInfo.cursorPos].playerName); ConvertInternationalPlayerNameStripChar(gStringVar1, CHAR_SPACE); StringExpandPlaceholders(gStringVar4, gText_WhatToDoWithVar1sMail); DisplayItemMessageOnField(taskId, gStringVar4, Mailbox_PrintMailOptions); @@ -675,19 +741,19 @@ static void Mailbox_ReturnToPlayerPC(u8 taskId) { s16 *data = gTasks[taskId].data; - sub_81D1D04(0); - sub_81D1D04(1); - DestroyListMenuTask(data[5], NULL, NULL); + MailboxMenu_RemoveWindow(MAILBOXWIN_TITLE); + MailboxMenu_RemoveWindow(MAILBOXWIN_LIST); + DestroyListMenuTask(tListTaskId, NULL, NULL); ScheduleBgCopyTilemapToVram(0); - sub_81D1EC0(); + MailboxMenu_Free(); ReshowPlayerPC(taskId); } static void Mailbox_PrintMailOptions(u8 taskId) { - u8 r4 = sub_81D1C84(2); - PrintMenuTable(r4, ARRAY_COUNT(gMailboxMailOptions), gMailboxMailOptions); - InitMenuInUpperLeftCornerPlaySoundWhenAPressed(r4, 4, 0); + u8 windowId = MailboxMenu_AddWindow(MAILBOXWIN_OPTIONS); + PrintMenuTable(windowId, ARRAY_COUNT(gMailboxMailOptions), gMailboxMailOptions); + InitMenuInUpperLeftCornerPlaySoundWhenAPressed(windowId, 4, 0); ScheduleBgCopyTilemapToVram(0); gTasks[taskId].func = Mailbox_MailOptionsProcessInput; } @@ -696,19 +762,18 @@ static void Mailbox_MailOptionsProcessInput(u8 taskId) { s8 inputOptionId = ProcessMenuInput_other(); - switch(inputOptionId) + switch (inputOptionId) { - case -2: - break; - case -1: - PlaySE(SE_SELECT); - Mailbox_Cancel(taskId); - break; - - default: - PlaySE(SE_SELECT); - gMailboxMailOptions[inputOptionId].func.void_u8(taskId); - break; + case MENU_NOTHING_CHOSEN: + break; + case MENU_B_PRESSED: + PlaySE(SE_SELECT); + Mailbox_Cancel(taskId); + break; + default: + PlaySE(SE_SELECT); + gMailboxMailOptions[inputOptionId].func.void_u8(taskId); + break; } } @@ -722,26 +787,26 @@ static void Mailbox_FadeAndReadMail(u8 taskId) { if (!gPaletteFade.active) { - sub_81D1EC0(); + MailboxMenu_Free(); CleanupOverworldWindowsAndTilemaps(); - ReadMail(&(gSaveBlock1Ptr->mail[playerPCItemPageInfo.itemsAbove + PARTY_SIZE + playerPCItemPageInfo.cursorPos]), Mailbox_ReturnToFieldFromReadMail, TRUE); + ReadMail(&gSaveBlock1Ptr->mail[gPlayerPCItemPageInfo.itemsAbove + PARTY_SIZE + gPlayerPCItemPageInfo.cursorPos], Mailbox_ReturnToFieldFromReadMail, TRUE); DestroyTask(taskId); } } static void Mailbox_ReturnToFieldFromReadMail(void) { - gFieldCallback = pal_fill_for_maplights_or_black; + gFieldCallback = Mailbox_ReshowAfterMail; SetMainCallback2(CB2_ReturnToField); } -static void pal_fill_for_maplights_or_black(void) +static void Mailbox_ReshowAfterMail(void) { u8 taskId; LoadMessageBoxAndBorderGfx(); taskId = CreateTask(Mailbox_HandleReturnToProcessInput, 0); - if (sub_81D1C44(playerPCItemPageInfo.count) == TRUE) + if (MailboxMenu_Alloc(gPlayerPCItemPageInfo.count) == TRUE) Mailbox_DrawMailboxMenu(taskId); else DestroyTask(taskId); @@ -756,49 +821,49 @@ static void Mailbox_HandleReturnToProcessInput(u8 taskId) static void Mailbox_MoveToBag(u8 taskId) { - DisplayItemMessageOnField(taskId, gText_MessageWillBeLost, Mailbox_DrawYesNoBeforeMove); + DisplayItemMessageOnField(taskId, gText_MessageWillBeLost, Mailbox_AskConfirmMoveToBag); } -static void Mailbox_DrawYesNoBeforeMove(u8 taskId) +static void Mailbox_AskConfirmMoveToBag(u8 taskId) { DisplayYesNoMenuDefaultYes(); - gTasks[taskId].func = Mailbox_MoveToBagYesNoPrompt; + gTasks[taskId].func = Mailbox_HandleConfirmMoveToBag; } -static void Mailbox_MoveToBagYesNoPrompt(u8 taskId) +static void Mailbox_HandleConfirmMoveToBag(u8 taskId) { - switch(Menu_ProcessInputNoWrapClearOnChoose()) + switch (Menu_ProcessInputNoWrapClearOnChoose()) { - case 0: - Mailbox_DoMailMoveToBag(taskId); - break; - case -1: - PlaySE(SE_SELECT); - case 1: - Mailbox_CancelMoveToBag(taskId); - break; - case -2: - default: - break; + case 0: // Yes + Mailbox_DoMailMoveToBag(taskId); + break; + case MENU_B_PRESSED: + PlaySE(SE_SELECT); + case 1: // No + Mailbox_CancelMoveToBag(taskId); + break; + case MENU_NOTHING_CHOSEN: + default: + break; } } static void Mailbox_DoMailMoveToBag(u8 taskId) { - struct MailStruct *mailStruct = &(gSaveBlock1Ptr->mail[playerPCItemPageInfo.itemsAbove + PARTY_SIZE + playerPCItemPageInfo.cursorPos]); - if (!AddBagItem(mailStruct->itemId, 1)) + struct MailStruct *mail = &gSaveBlock1Ptr->mail[gPlayerPCItemPageInfo.itemsAbove + PARTY_SIZE + gPlayerPCItemPageInfo.cursorPos]; + if (!AddBagItem(mail->itemId, 1)) { DisplayItemMessageOnField(taskId, gText_BagIsFull, Mailbox_Cancel); } else { DisplayItemMessageOnField(taskId, gText_MailToBagMessageErased, Mailbox_Cancel); - ClearMailStruct(mailStruct); - Mailbox_UpdateMailList(); - playerPCItemPageInfo.count--; - if (playerPCItemPageInfo.count < (playerPCItemPageInfo.pageItems + playerPCItemPageInfo.itemsAbove) && playerPCItemPageInfo.itemsAbove != 0) - playerPCItemPageInfo.itemsAbove--; - ItemStorage_SetItemAndMailCount(taskId); + ClearMailStruct(mail); + Mailbox_CompactMailList(); + gPlayerPCItemPageInfo.count--; + if (gPlayerPCItemPageInfo.count < (gPlayerPCItemPageInfo.pageItems + gPlayerPCItemPageInfo.itemsAbove) && gPlayerPCItemPageInfo.itemsAbove != 0) + gPlayerPCItemPageInfo.itemsAbove--; + SetPlayerPCListCount(taskId); } } @@ -822,7 +887,7 @@ static void Mailbox_DoGiveMailPokeMenu(u8 taskId) { if (!gPaletteFade.active) { - sub_81D1EC0(); + MailboxMenu_Free(); CleanupOverworldWindowsAndTilemaps(); ChooseMonToGiveMailFromMailbox(); DestroyTask(taskId); @@ -840,15 +905,15 @@ static void Mailbox_UpdateMailListAfterDeposit(void) u8 taskId; u8 prevCount; taskId = CreateTask(Mailbox_HandleReturnToProcessInput, 0); - prevCount = playerPCItemPageInfo.count; - playerPCItemPageInfo.count = GetMailboxMailCount(); - Mailbox_UpdateMailList(); - if (prevCount != playerPCItemPageInfo.count && (playerPCItemPageInfo.count < (playerPCItemPageInfo.pageItems + playerPCItemPageInfo.itemsAbove)) - && playerPCItemPageInfo.itemsAbove != 0) - playerPCItemPageInfo.itemsAbove--; - ItemStorage_SetItemAndMailCount(taskId); + prevCount = gPlayerPCItemPageInfo.count; + gPlayerPCItemPageInfo.count = GetMailboxMailCount(); + Mailbox_CompactMailList(); + if (prevCount != gPlayerPCItemPageInfo.count && (gPlayerPCItemPageInfo.count < (gPlayerPCItemPageInfo.pageItems + gPlayerPCItemPageInfo.itemsAbove)) + && gPlayerPCItemPageInfo.itemsAbove != 0) + gPlayerPCItemPageInfo.itemsAbove--; + SetPlayerPCListCount(taskId); LoadMessageBoxAndBorderGfx(); - if (sub_81D1C44(playerPCItemPageInfo.count) == TRUE) + if (MailboxMenu_Alloc(gPlayerPCItemPageInfo.count) == TRUE) Mailbox_DrawMailboxMenu(taskId); else DestroyTask(taskId); @@ -862,45 +927,44 @@ static void Mailbox_NoPokemonForMail(u8 taskId) static void Mailbox_Cancel(u8 taskId) { - sub_81D1D04(2); + MailboxMenu_RemoveWindow(MAILBOXWIN_OPTIONS); ClearDialogWindowAndFrame(0, 0); Mailbox_DrawMailboxMenu(taskId); ScheduleBgCopyTilemapToVram(0); gTasks[taskId].func = Mailbox_ProcessInput; } -static void sub_816BC14(void) +static void ItemStorage_Init(void) { - gUnknown_0203BCC4 = AllocZeroed(sizeof(struct Struct203BCC4)); - memset(gUnknown_0203BCC4->windowIds, 0xFF, 0x6); - gUnknown_0203BCC4->unk666 = 0xFF; - gUnknown_0203BCC4->spriteId = SPRITE_NONE; + sItemStorageMenu = AllocZeroed(sizeof(*sItemStorageMenu)); + memset(sItemStorageMenu->windowIds, WINDOW_NONE, ITEMWIN_COUNT); + sItemStorageMenu->toSwapPos = NOT_SWAPPING; + sItemStorageMenu->spriteId = SPRITE_NONE; } -static void sub_816BC58(void) +static void ItemStorage_Free(void) { u32 i; - - for(i = 0; i < 6; i++) - sub_816BCC4(i); - Free(gUnknown_0203BCC4); + for (i = 0; i < ITEMWIN_COUNT; i++) + ItemStorage_RemoveWindow(i); + Free(sItemStorageMenu); } -static u8 sub_816BC7C(u8 a) +static u8 ItemStorage_AddWindow(u8 i) { - u8 *windowIdLoc = &(gUnknown_0203BCC4->windowIds[a]); + u8 *windowIdLoc = &sItemStorageMenu->windowIds[i]; if (*windowIdLoc == WINDOW_NONE) { - *windowIdLoc = AddWindow(&gUnknown_085DFF5C[a]); + *windowIdLoc = AddWindow(&sWindowTemplates_ItemStorage[i]); DrawStdFrameWithCustomTileAndPalette(*windowIdLoc, FALSE, 0x214, 0xE); ScheduleBgCopyTilemapToVram(0); } return *windowIdLoc; } -static void sub_816BCC4(u8 a) +static void ItemStorage_RemoveWindow(u8 i) { - u8 *windowIdLoc = &(gUnknown_0203BCC4->windowIds[a]); + u8 *windowIdLoc = &sItemStorageMenu->windowIds[i]; if (*windowIdLoc != WINDOW_NONE) { ClearStdWindowAndFrameToTransparent(*windowIdLoc, FALSE); @@ -915,20 +979,25 @@ void ItemStorage_RefreshListMenu(void) { u16 i; - for(i = 0; i < playerPCItemPageInfo.count - 1; i++) + // Copy item names for all entries but the last (which is Cancel) + for(i = 0; i < gPlayerPCItemPageInfo.count - 1; i++) { - CopyItemName_PlayerPC(&(gUnknown_0203BCC4->unk198[i][0]), gSaveBlock1Ptr->pcItems[i].itemId); - gUnknown_0203BCC4->unk0[i].name = &(gUnknown_0203BCC4->unk198[i][0]); - gUnknown_0203BCC4->unk0[i].id = i; + CopyItemName_PlayerPC(&sItemStorageMenu->itemNames[i][0], gSaveBlock1Ptr->pcItems[i].itemId); + sItemStorageMenu->listItems[i].name = &sItemStorageMenu->itemNames[i][0]; + sItemStorageMenu->listItems[i].id = i; } - StringCopy(&(gUnknown_0203BCC4->unk198[i][0]) ,gText_Cancel2); - gUnknown_0203BCC4->unk0[i].name = &(gUnknown_0203BCC4->unk198[i][0]); - gUnknown_0203BCC4->unk0[i].id = -2; - gMultiuseListMenuTemplate = gUnknown_085DFF44; - gMultiuseListMenuTemplate.windowId = sub_816BC7C(0); - gMultiuseListMenuTemplate.totalItems = playerPCItemPageInfo.count; - gMultiuseListMenuTemplate.items = gUnknown_0203BCC4->unk0; - gMultiuseListMenuTemplate.maxShowed = playerPCItemPageInfo.pageItems; + + // Set up Cancel entry + StringCopy(&sItemStorageMenu->itemNames[i][0], gText_Cancel2); + sItemStorageMenu->listItems[i].name = &sItemStorageMenu->itemNames[i][0]; + sItemStorageMenu->listItems[i].id = LIST_CANCEL; + + // Set list menu data + gMultiuseListMenuTemplate = sListMenuTemplate_ItemStorage; + gMultiuseListMenuTemplate.windowId = ItemStorage_AddWindow(ITEMWIN_LIST); + gMultiuseListMenuTemplate.totalItems = gPlayerPCItemPageInfo.count; + gMultiuseListMenuTemplate.items = sItemStorageMenu->listItems; + gMultiuseListMenuTemplate.maxShowed = gPlayerPCItemPageInfo.pageItems; } void CopyItemName_PlayerPC(u8 *string, u16 itemId) @@ -936,31 +1005,31 @@ void CopyItemName_PlayerPC(u8 *string, u16 itemId) CopyItemName(itemId, string); } -static void ItemStorage_MoveCursor(s32 id, bool8 b, struct ListMenu *thisMenu) +static void ItemStorage_MoveCursor(s32 id, bool8 onInit, struct ListMenu *list) { - if (b != TRUE) + if (onInit != TRUE) PlaySE(SE_SELECT); - if (gUnknown_0203BCC4->unk666 == 0xFF) + if (sItemStorageMenu->toSwapPos == NOT_SWAPPING) { - sub_816C0C8(); + ItemStorage_EraseItemIcon(); if (id != LIST_CANCEL) - sub_816C060(gSaveBlock1Ptr->pcItems[id].itemId); + ItemStorage_DrawItemIcon(gSaveBlock1Ptr->pcItems[id].itemId); else - sub_816C060(ITEMPC_GO_BACK_TO_PREV); - sub_816BEF0(id); + ItemStorage_DrawItemIcon(MSG_GO_BACK_TO_PREV); + ItemStorage_PrintDescription(id); } } -static void fish4_goto_x5_or_x6(u8 windowId, u32 id, u8 yOffset) +static void ItemStorage_PrintMenuItem(u8 windowId, u32 id, u8 yOffset) { if (id != LIST_CANCEL) { - if (gUnknown_0203BCC4->unk666 != 0xFF) + if (sItemStorageMenu->toSwapPos != NOT_SWAPPING) { - if (gUnknown_0203BCC4->unk666 == (u8)id) - sub_816BFE0(yOffset, 0, 0xFF); + if (sItemStorageMenu->toSwapPos == (u8)id) + ItemStorage_DrawSwapArrow(yOffset, 0, TEXT_SPEED_FF); else - sub_816BFE0(yOffset, 0xFF, 0xFF); + ItemStorage_DrawSwapArrow(yOffset, 0xFF, TEXT_SPEED_FF); } ConvertIntToDecimalStringN(gStringVar1, gSaveBlock1Ptr->pcItems[id].quantity, STR_CONV_MODE_RIGHT_ALIGN, 3); StringExpandPlaceholders(gStringVar4, gText_xVar1); @@ -968,58 +1037,64 @@ static void fish4_goto_x5_or_x6(u8 windowId, u32 id, u8 yOffset) } } -static void sub_816BEF0(s32 id) +static void ItemStorage_PrintDescription(s32 id) { const u8* description; - u8 windowId = gUnknown_0203BCC4->windowIds[1]; + u8 windowId = sItemStorageMenu->windowIds[ITEMWIN_MESSAGE]; - if (id != -2) + // Get item description (or Cancel text) + if (id != LIST_CANCEL) description = (u8 *)ItemId_GetDescription(gSaveBlock1Ptr->pcItems[id].itemId); else - description = ItemStorage_GetItemPcResponse(ITEMPC_GO_BACK_TO_PREV); + description = ItemStorage_GetMessage(MSG_GO_BACK_TO_PREV); + FillWindowPixelBuffer(windowId, PIXEL_FILL(1)); AddTextPrinterParameterized(windowId, 1, description, 0, 1, 0, NULL); } -static void ItemStorage_StartScrollIndicator(void) +static void ItemStorage_AddScrollIndicator(void) { - if (playerPCItemPageInfo.scrollIndicatorTaskId == TASK_NONE) - playerPCItemPageInfo.scrollIndicatorTaskId = AddScrollIndicatorArrowPairParameterized(SCROLL_ARROW_UP, 0xB0, 0xC, 0x94, playerPCItemPageInfo.count - playerPCItemPageInfo.pageItems, 0x13F8, 0x13F8, &(playerPCItemPageInfo.itemsAbove)); + if (gPlayerPCItemPageInfo.scrollIndicatorTaskId == TASK_NONE) + gPlayerPCItemPageInfo.scrollIndicatorTaskId = AddScrollIndicatorArrowPairParameterized(SCROLL_ARROW_UP, 176, 12, 148, + gPlayerPCItemPageInfo.count - gPlayerPCItemPageInfo.pageItems, + TAG_SCROLL_ARROW, + TAG_SCROLL_ARROW, + &gPlayerPCItemPageInfo.itemsAbove); } static void ItemStorage_RemoveScrollIndicator(void) { - if (playerPCItemPageInfo.scrollIndicatorTaskId != TASK_NONE) + if (gPlayerPCItemPageInfo.scrollIndicatorTaskId != TASK_NONE) { - RemoveScrollIndicatorArrowPair(playerPCItemPageInfo.scrollIndicatorTaskId); - playerPCItemPageInfo.scrollIndicatorTaskId = TASK_NONE; + RemoveScrollIndicatorArrowPair(gPlayerPCItemPageInfo.scrollIndicatorTaskId); + gPlayerPCItemPageInfo.scrollIndicatorTaskId = TASK_NONE; } } -static void sub_816BFB8(u8 a, u8 b, u8 speed) +static void ItemStorage_SetSwapArrow(u8 listTaskId, u8 b, u8 speed) { - sub_816BFE0(ListMenuGetYCoordForPrintingArrowCursor(a), b, speed); + ItemStorage_DrawSwapArrow(ListMenuGetYCoordForPrintingArrowCursor(listTaskId), b, speed); } -static void sub_816BFE0(u8 y, u8 b, u8 speed) +static void ItemStorage_DrawSwapArrow(u8 y, u8 b, u8 speed) { - u8 windowId = gUnknown_0203BCC4->windowIds[0]; + u8 windowId = sItemStorageMenu->windowIds[ITEMWIN_LIST]; if (b == 0xFF) FillWindowPixelRect(windowId, PIXEL_FILL(1), 0, y, GetMenuCursorDimensionByFont(1, 0), GetMenuCursorDimensionByFont(1, 1)); else - AddTextPrinterParameterized4(windowId, 1, 0, y, 0, 0, gUnknown_085DFF8C, speed, gText_SelectorArrow2); + AddTextPrinterParameterized4(windowId, 1, 0, y, 0, 0, sSwapArrowTextColors, speed, gText_SelectorArrow2); } -static void sub_816C060(u16 itemId) +static void ItemStorage_DrawItemIcon(u16 itemId) { u8 spriteId; - u8* spriteIdLoc = &(gUnknown_0203BCC4->spriteId); + u8* spriteIdLoc = &sItemStorageMenu->spriteId; if (*spriteIdLoc == SPRITE_NONE) { - FreeSpriteTilesByTag(0x13F6); - FreeSpritePaletteByTag(0x13F6); - spriteId = AddItemIconSprite(0x13F6, 0x13F6, itemId); + FreeSpriteTilesByTag(TAG_ITEM_ICON); + FreeSpritePaletteByTag(TAG_ITEM_ICON); + spriteId = AddItemIconSprite(TAG_ITEM_ICON, TAG_ITEM_ICON, itemId); if (spriteId != MAX_SPRITES) { *spriteIdLoc = spriteId; @@ -1030,30 +1105,30 @@ static void sub_816C060(u16 itemId) } } -static void sub_816C0C8(void) +static void ItemStorage_EraseItemIcon(void) { - u8* spriteIdLoc = &(gUnknown_0203BCC4->spriteId); + u8* spriteIdLoc = &sItemStorageMenu->spriteId; if (*spriteIdLoc != SPRITE_NONE) { - FreeSpriteTilesByTag(0x13F6); - FreeSpritePaletteByTag(0x13F6); - DestroySprite(&(gSprites[*spriteIdLoc])); + FreeSpriteTilesByTag(TAG_ITEM_ICON); + FreeSpritePaletteByTag(TAG_ITEM_ICON); + DestroySprite(&gSprites[*spriteIdLoc]); *spriteIdLoc = SPRITE_NONE; } } -static void sub_816C110(void) +static void ItemStorage_CompactList(void) { CompactPCItems(); - sub_812220C(gSaveBlock1Ptr->pcItems, 50, &(playerPCItemPageInfo.pageItems), &(playerPCItemPageInfo.count), 0x8); + SetItemListPerPageCount(gSaveBlock1Ptr->pcItems, PC_ITEMS_COUNT, &gPlayerPCItemPageInfo.pageItems, &gPlayerPCItemPageInfo.count, 8); } -static void sub_816C140(void) +static void ItemStorage_CompactCursor(void) { - sub_812225C(&(playerPCItemPageInfo.itemsAbove), &(playerPCItemPageInfo.cursorPos), playerPCItemPageInfo.pageItems, playerPCItemPageInfo.count); + SetCursorWithinListBounds(&gPlayerPCItemPageInfo.itemsAbove, &gPlayerPCItemPageInfo.cursorPos, gPlayerPCItemPageInfo.pageItems, gPlayerPCItemPageInfo.count); } -static void ItemStorage_ProcessWithdrawTossInput(u8 taskId) +static void ItemStorage_CreateListMenu(u8 taskId) { s16 *data; bool32 toss; @@ -1061,98 +1136,97 @@ static void ItemStorage_ProcessWithdrawTossInput(u8 taskId) const u8* text; data = gTasks[taskId].data; - for(i = 0; i <=3; i++) - sub_816BC7C(i); - toss = data[3]; + for (i = 0; i <= ITEMWIN_LIST_END; i++) + ItemStorage_AddWindow(i); + toss = tInTossMenu; text = gText_TossItem; if (!toss) text = gText_WithdrawItem; x = GetStringCenterAlignXOffset(1, text, 104); - AddTextPrinterParameterized(gUnknown_0203BCC4->windowIds[3], 1, text, x, 1, 0, NULL); - CopyWindowToVram(gUnknown_0203BCC4->windowIds[2], 2); - sub_816C110(); - sub_816C140(); + AddTextPrinterParameterized(sItemStorageMenu->windowIds[ITEMWIN_TITLE], 1, text, x, 1, 0, NULL); + CopyWindowToVram(sItemStorageMenu->windowIds[ITEMWIN_ICON], 2); + ItemStorage_CompactList(); + ItemStorage_CompactCursor(); ItemStorage_RefreshListMenu(); - data[5] = ListMenuInit(&gMultiuseListMenuTemplate, playerPCItemPageInfo.itemsAbove, playerPCItemPageInfo.cursorPos); - ItemStorage_StartScrollIndicator(); + tListTaskId = ListMenuInit(&gMultiuseListMenuTemplate, gPlayerPCItemPageInfo.itemsAbove, gPlayerPCItemPageInfo.cursorPos); + ItemStorage_AddScrollIndicator(); ScheduleBgCopyTilemapToVram(0); gTasks[taskId].func = ItemStorage_ProcessInput; } -static const u8* ItemStorage_GetItemPcResponse(u16 itemId) +static const u8* ItemStorage_GetMessage(u16 itemId) { const u8 *string; switch(itemId) { - case ITEMPC_GO_BACK_TO_PREV: - string = gText_GoBackPrevMenu; - break; - case ITEMPC_HOW_MANY_TO_WITHDRAW: - string = gText_WithdrawHowManyItems; - break; - case ITEMPC_WITHDREW_THING: - string = gText_WithdrawXItems; - break; - case ITEMPC_HOW_MANY_TO_TOSS: - string = gText_TossHowManyVar1s; - break; - case ITEMPC_THREW_AWAY_ITEM: - string = gText_ThrewAwayVar2Var1s; - break; - case ITEMPC_NO_MORE_ROOM: - string = gText_NoRoomInBag; - break; - case ITEMPC_TOO_IMPORTANT: - string = gText_TooImportantToToss; - break; - case ITEMPC_OKAY_TO_THROW_AWAY: - string = gText_ConfirmTossItems; - break; - case ITEMPC_SWITCH_WHICH_ITEM: - string = gText_MoveVar1Where; - break; - default: - string = ItemId_GetDescription(itemId); - break; + case MSG_GO_BACK_TO_PREV: + string = gText_GoBackPrevMenu; + break; + case MSG_HOW_MANY_TO_WITHDRAW: + string = gText_WithdrawHowManyItems; + break; + case MSG_WITHDREW_ITEM: + string = gText_WithdrawXItems; + break; + case MSG_HOW_MANY_TO_TOSS: + string = gText_TossHowManyVar1s; + break; + case MSG_THREW_AWAY_ITEM: + string = gText_ThrewAwayVar2Var1s; + break; + case MSG_NO_MORE_ROOM: + string = gText_NoRoomInBag; + break; + case MSG_TOO_IMPORTANT: + string = gText_TooImportantToToss; + break; + case MSG_OKAY_TO_THROW_AWAY: + string = gText_ConfirmTossItems; + break; + case MSG_SWITCH_WHICH_ITEM: + string = gText_MoveVar1Where; + break; + default: + string = ItemId_GetDescription(itemId); + break; } return string; } -static void ItemStorage_PrintItemPcResponse(const u8 *string) +static void ItemStorage_PrintMessage(const u8 *string) { - u8 windowId = gUnknown_0203BCC4->windowIds[1]; + u8 windowId = sItemStorageMenu->windowIds[ITEMWIN_MESSAGE]; FillWindowPixelBuffer(windowId, PIXEL_FILL(1)); StringExpandPlaceholders(gStringVar4, string); AddTextPrinterParameterized(windowId, 1, gStringVar4, 0, 1, 0, NULL); } +// Process input while on the item storage's item list static void ItemStorage_ProcessInput(u8 taskId) { - s16 *data; - s32 id; - - data = gTasks[taskId].data; + s16 *data = gTasks[taskId].data; if (JOY_NEW(SELECT_BUTTON)) { - ListMenuGetScrollAndRow(data[5], &(playerPCItemPageInfo.itemsAbove), &(playerPCItemPageInfo.cursorPos)); - if ((playerPCItemPageInfo.itemsAbove + playerPCItemPageInfo.cursorPos) != (playerPCItemPageInfo.count - 1)) + // 'Select' starts input for swapping items if not on Cancel + ListMenuGetScrollAndRow(tListTaskId, &gPlayerPCItemPageInfo.itemsAbove, &gPlayerPCItemPageInfo.cursorPos); + if (gPlayerPCItemPageInfo.itemsAbove + gPlayerPCItemPageInfo.cursorPos != gPlayerPCItemPageInfo.count - 1) { PlaySE(SE_SELECT); - ItemStorage_ItemSwapChoosePrompt(taskId); + ItemStorage_StartItemSwap(taskId); } } else { - id = ListMenu_ProcessInput(data[5]); - ListMenuGetScrollAndRow(data[5], &(playerPCItemPageInfo.itemsAbove), &(playerPCItemPageInfo.cursorPos)); - switch(id) + s32 id = ListMenu_ProcessInput(tListTaskId); + ListMenuGetScrollAndRow(tListTaskId, &gPlayerPCItemPageInfo.itemsAbove, &gPlayerPCItemPageInfo.cursorPos); + switch (id) { case LIST_NOTHING_CHOSEN: break; case LIST_CANCEL: PlaySE(SE_SELECT); - ItemStorage_GoBackToPlayerPCMenu(taskId); + ItemStorage_ExitItemList(taskId); break; default: PlaySE(SE_SELECT); @@ -1162,50 +1236,46 @@ static void ItemStorage_ProcessInput(u8 taskId) } } -static void ItemStorage_GoBackToPlayerPCMenu_InitStorage(u8 taskId) +static void ItemStorage_ReturnToMenuSelect(u8 taskId) { - s16 *data; - - data = gTasks[taskId].data; + s16 *data = gTasks[taskId].data; if (!IsDma3ManagerBusyWithBgCopy()) { DrawDialogueFrame(0, 0); - if (!data[3]) - InitItemStorageMenu(taskId, ITEMPC_MENU_WITHDRAW); + + // Select Withdraw/Toss by default depending on which was just exited + if (!tInTossMenu) + InitItemStorageMenu(taskId, MENU_WITHDRAW); else - InitItemStorageMenu(taskId, ITEMPC_MENU_TOSS); + InitItemStorageMenu(taskId, MENU_TOSS); gTasks[taskId].func = ItemStorageMenuProcessInput; } } -static void ItemStorage_GoBackToPlayerPCMenu(u8 taskId) +static void ItemStorage_ExitItemList(u8 taskId) { - s16 *data; - - data = gTasks[taskId].data; - sub_816C0C8(); + s16 *data = gTasks[taskId].data; + ItemStorage_EraseItemIcon(); ItemStorage_RemoveScrollIndicator(); - DestroyListMenuTask(data[5], NULL, NULL); - DestroySwapLineSprites(gUnknown_0203BCC4->spriteIds, 7); - sub_816BC58(); - gTasks[taskId].func = ItemStorage_GoBackToPlayerPCMenu_InitStorage; + DestroyListMenuTask(tListTaskId, NULL, NULL); + DestroySwapLineSprites(sItemStorageMenu->swapLineSpriteIds, SWAP_LINE_LENGTH); + ItemStorage_Free(); + gTasks[taskId].func = ItemStorage_ReturnToMenuSelect; } -static void ItemStorage_ItemSwapChoosePrompt(u8 taskId) +static void ItemStorage_StartItemSwap(u8 taskId) { - s16 *data; - - data = gTasks[taskId].data; - ListMenuSetUnkIndicatorsStructField(data[5], 16, 1); - gUnknown_0203BCC4->unk666 = (playerPCItemPageInfo.itemsAbove + playerPCItemPageInfo.cursorPos); - sub_816BFB8(data[5], 0, 0); - UpdateSwapLinePos(gUnknown_0203BCC4->unk666); - CopyItemName(gSaveBlock1Ptr->pcItems[gUnknown_0203BCC4->unk666].itemId, gStringVar1); - ItemStorage_PrintItemPcResponse(ItemStorage_GetItemPcResponse(ITEMPC_SWITCH_WHICH_ITEM)); - gTasks[taskId].func = sub_816C4FC; + s16 *data = gTasks[taskId].data; + ListMenuSetUnkIndicatorsStructField(tListTaskId, 16, 1); + sItemStorageMenu->toSwapPos = gPlayerPCItemPageInfo.itemsAbove + gPlayerPCItemPageInfo.cursorPos; + ItemStorage_SetSwapArrow(tListTaskId, 0, 0); + ItemStorage_UpdateSwapLinePos(sItemStorageMenu->toSwapPos); + CopyItemName(gSaveBlock1Ptr->pcItems[sItemStorageMenu->toSwapPos].itemId, gStringVar1); + ItemStorage_PrintMessage(ItemStorage_GetMessage(MSG_SWITCH_WHICH_ITEM)); + gTasks[taskId].func = ItemStorage_ProcessItemSwapInput; } -static void sub_816C4FC(u8 taskId) +static void ItemStorage_ProcessItemSwapInput(u8 taskId) { s16 *data; s32 id; @@ -1213,225 +1283,220 @@ static void sub_816C4FC(u8 taskId) data = gTasks[taskId].data; if (JOY_NEW(SELECT_BUTTON)) { - ListMenuGetScrollAndRow(data[5], &(playerPCItemPageInfo.itemsAbove), &(playerPCItemPageInfo.cursorPos)); - ItemStorage_DoItemSwap(taskId, FALSE); + ListMenuGetScrollAndRow(tListTaskId, &gPlayerPCItemPageInfo.itemsAbove, &gPlayerPCItemPageInfo.cursorPos); + ItemStorage_FinishItemSwap(taskId, FALSE); return; } - id = ListMenu_ProcessInput(data[5]); - ListMenuGetScrollAndRow(data[5], &(playerPCItemPageInfo.itemsAbove), &(playerPCItemPageInfo.cursorPos)); - SetSwapLineSpritesInvisibility(gUnknown_0203BCC4->spriteIds, 7, FALSE); - UpdateSwapLinePos(playerPCItemPageInfo.cursorPos); - switch(id) + id = ListMenu_ProcessInput(tListTaskId); + ListMenuGetScrollAndRow(tListTaskId, &gPlayerPCItemPageInfo.itemsAbove, &gPlayerPCItemPageInfo.cursorPos); + SetSwapLineSpritesInvisibility(sItemStorageMenu->swapLineSpriteIds, SWAP_LINE_LENGTH, FALSE); + ItemStorage_UpdateSwapLinePos(gPlayerPCItemPageInfo.cursorPos); + switch (id) { case LIST_NOTHING_CHOSEN: break; case LIST_CANCEL: if (JOY_NEW(A_BUTTON)) - { - ItemStorage_DoItemSwap(taskId, FALSE); - } + ItemStorage_FinishItemSwap(taskId, FALSE); else - { - ItemStorage_DoItemSwap(taskId, TRUE); - } + ItemStorage_FinishItemSwap(taskId, TRUE); break; default: - ItemStorage_DoItemSwap(taskId, FALSE); + ItemStorage_FinishItemSwap(taskId, FALSE); break; } } -static void ItemStorage_DoItemSwap(u8 taskId, bool8 a) +static void ItemStorage_FinishItemSwap(u8 taskId, bool8 canceled) { - s16 *data; - u16 b; - - data = gTasks[taskId].data; - b = (playerPCItemPageInfo.itemsAbove + playerPCItemPageInfo.cursorPos); + s16 *data = gTasks[taskId].data; + u16 newPos = gPlayerPCItemPageInfo.itemsAbove + gPlayerPCItemPageInfo.cursorPos; PlaySE(SE_SELECT); - DestroyListMenuTask(data[5], &(playerPCItemPageInfo.itemsAbove), &(playerPCItemPageInfo.cursorPos)); - if (!a) + DestroyListMenuTask(tListTaskId, &gPlayerPCItemPageInfo.itemsAbove, &gPlayerPCItemPageInfo.cursorPos); + + if (!canceled && sItemStorageMenu->toSwapPos != newPos && sItemStorageMenu->toSwapPos != newPos - 1) { - if (gUnknown_0203BCC4->unk666 != b) - { - if (gUnknown_0203BCC4->unk666 != b - 1) - { - MoveItemSlotInList(gSaveBlock1Ptr->pcItems, gUnknown_0203BCC4->unk666, b); - ItemStorage_RefreshListMenu(); - } - } + MoveItemSlotInList(gSaveBlock1Ptr->pcItems, sItemStorageMenu->toSwapPos, newPos); + ItemStorage_RefreshListMenu(); } - if (gUnknown_0203BCC4->unk666 < b) - playerPCItemPageInfo.cursorPos--; - SetSwapLineSpritesInvisibility(gUnknown_0203BCC4->spriteIds, 7, TRUE); - gUnknown_0203BCC4->unk666 = 0xFF; - data[5] = ListMenuInit(&gMultiuseListMenuTemplate, playerPCItemPageInfo.itemsAbove, playerPCItemPageInfo.cursorPos); + if (sItemStorageMenu->toSwapPos < newPos) + gPlayerPCItemPageInfo.cursorPos--; + + SetSwapLineSpritesInvisibility(sItemStorageMenu->swapLineSpriteIds, SWAP_LINE_LENGTH, TRUE); + sItemStorageMenu->toSwapPos = NOT_SWAPPING; + tListTaskId = ListMenuInit(&gMultiuseListMenuTemplate, gPlayerPCItemPageInfo.itemsAbove, gPlayerPCItemPageInfo.cursorPos); ScheduleBgCopyTilemapToVram(0); gTasks[taskId].func = ItemStorage_ProcessInput; } -static void UpdateSwapLinePos(u8 y) +static void ItemStorage_UpdateSwapLinePos(u8 y) { - UpdateSwapLineSpritesPos(gUnknown_0203BCC4->spriteIds, 7, 128, ((y+1) * 16)); + UpdateSwapLineSpritesPos(sItemStorageMenu->swapLineSpriteIds, SWAP_LINE_LENGTH, 128, (y+1) * 16); } -static void sub_816C6BC(u8 windowId, u16 value, u32 mode, u8 x, u8 y, u8 n) +static void ItemStorage_PrintItemQuantity(u8 windowId, u16 value, u32 mode, u8 x, u8 y, u8 n) { ConvertIntToDecimalStringN(gStringVar1, value, mode, n); StringExpandPlaceholders(gStringVar4, gText_xVar1); AddTextPrinterParameterized(windowId, 1, gStringVar4, GetStringCenterAlignXOffset(1, gStringVar4, 48), y, 0, NULL); } +// Start an item Withdraw/Toss static void ItemStorage_DoItemAction(u8 taskId) { - s16 *data; - u16 b; - - data = gTasks[taskId].data; - b = (playerPCItemPageInfo.cursorPos + playerPCItemPageInfo.itemsAbove); + s16 *data = gTasks[taskId].data; + u16 pos = gPlayerPCItemPageInfo.cursorPos + gPlayerPCItemPageInfo.itemsAbove; ItemStorage_RemoveScrollIndicator(); - data[2] = 1; - if (!data[3]) + tQuantity = 1; + + if (!tInTossMenu) { - if (gSaveBlock1Ptr->pcItems[b].quantity == 1) + if (gSaveBlock1Ptr->pcItems[pos].quantity == 1) { + // Withdrawing 1 item, do it automatically ItemStorage_DoItemWithdraw(taskId); return; } - CopyItemName(gSaveBlock1Ptr->pcItems[b].itemId, gStringVar1); - ItemStorage_PrintItemPcResponse(ItemStorage_GetItemPcResponse(ITEMPC_HOW_MANY_TO_WITHDRAW)); + + // Withdrawing multiple items, show "how many" message + CopyItemName(gSaveBlock1Ptr->pcItems[pos].itemId, gStringVar1); + ItemStorage_PrintMessage(ItemStorage_GetMessage(MSG_HOW_MANY_TO_WITHDRAW)); } else { - if (gSaveBlock1Ptr->pcItems[b].quantity == 1) + if (gSaveBlock1Ptr->pcItems[pos].quantity == 1) { + // Tossing 1 item, do it automatically ItemStorage_DoItemToss(taskId); return; } - CopyItemName(gSaveBlock1Ptr->pcItems[b].itemId, gStringVar1); - ItemStorage_PrintItemPcResponse(ItemStorage_GetItemPcResponse(ITEMPC_HOW_MANY_TO_TOSS)); + + // Tossing multiple items, show "how many" message + CopyItemName(gSaveBlock1Ptr->pcItems[pos].itemId, gStringVar1); + ItemStorage_PrintMessage(ItemStorage_GetMessage(MSG_HOW_MANY_TO_TOSS)); } - sub_816C6BC(sub_816BC7C(4), data[2], STR_CONV_MODE_LEADING_ZEROS, 8, 1, 3); + + // Set up "how many" prompt + ItemStorage_PrintItemQuantity(ItemStorage_AddWindow(ITEMWIN_QUANTITY), tQuantity, STR_CONV_MODE_LEADING_ZEROS, 8, 1, 3); gTasks[taskId].func = ItemStorage_HandleQuantityRolling; } static void ItemStorage_HandleQuantityRolling(u8 taskId) { - s16 *data; - u16 b; + s16 *data = gTasks[taskId].data; + u16 pos = gPlayerPCItemPageInfo.cursorPos + gPlayerPCItemPageInfo.itemsAbove; - data = gTasks[taskId].data; - b = (playerPCItemPageInfo.cursorPos + playerPCItemPageInfo.itemsAbove); - if (AdjustQuantityAccordingToDPadInput(&(data[2]), gSaveBlock1Ptr->pcItems[b].quantity) == TRUE) - sub_816C6BC(sub_816BC7C(4), data[2], STR_CONV_MODE_LEADING_ZEROS, 8, 1, 3); + if (AdjustQuantityAccordingToDPadInput(&tQuantity, gSaveBlock1Ptr->pcItems[pos].quantity) == TRUE) + { + ItemStorage_PrintItemQuantity(ItemStorage_AddWindow(ITEMWIN_QUANTITY), tQuantity, STR_CONV_MODE_LEADING_ZEROS, 8, 1, 3); + } else { if (JOY_NEW(A_BUTTON)) { + // Quantity confirmed, perform action PlaySE(SE_SELECT); - sub_816BCC4(4); - if (!data[3]) + ItemStorage_RemoveWindow(ITEMWIN_QUANTITY); + if (!tInTossMenu) ItemStorage_DoItemWithdraw(taskId); else ItemStorage_DoItemToss(taskId); } else if (JOY_NEW(B_BUTTON)) { + // Canceled action PlaySE(SE_SELECT); - sub_816BCC4(4); - ItemStorage_PrintItemPcResponse(ItemStorage_GetItemPcResponse(gSaveBlock1Ptr->pcItems[b].itemId)); - ItemStorage_StartScrollIndicatorAndProcessInput(taskId); + ItemStorage_RemoveWindow(ITEMWIN_QUANTITY); + ItemStorage_PrintMessage(ItemStorage_GetMessage(gSaveBlock1Ptr->pcItems[pos].itemId)); + ItemStorage_ReturnToListInput(taskId); } } } static void ItemStorage_DoItemWithdraw(u8 taskId) { - s16 *data; - u16 b; + s16 *data = gTasks[taskId].data; + u16 pos = gPlayerPCItemPageInfo.cursorPos + gPlayerPCItemPageInfo.itemsAbove; - data = gTasks[taskId].data; - b = (playerPCItemPageInfo.cursorPos + playerPCItemPageInfo.itemsAbove); - if (AddBagItem(gSaveBlock1Ptr->pcItems[b].itemId, data[2]) == TRUE) + if (AddBagItem(gSaveBlock1Ptr->pcItems[pos].itemId, tQuantity) == TRUE) { - CopyItemName(gSaveBlock1Ptr->pcItems[b].itemId, gStringVar1); - ConvertIntToDecimalStringN(gStringVar2, data[2], STR_CONV_MODE_LEFT_ALIGN, 3); - ItemStorage_PrintItemPcResponse(ItemStorage_GetItemPcResponse(ITEMPC_WITHDREW_THING)); + // Item withdrawn + CopyItemName(gSaveBlock1Ptr->pcItems[pos].itemId, gStringVar1); + ConvertIntToDecimalStringN(gStringVar2, tQuantity, STR_CONV_MODE_LEFT_ALIGN, 3); + ItemStorage_PrintMessage(ItemStorage_GetMessage(MSG_WITHDREW_ITEM)); gTasks[taskId].func = ItemStorage_HandleRemoveItem; } else { - data[2] = 0; - ItemStorage_PrintItemPcResponse(ItemStorage_GetItemPcResponse(ITEMPC_NO_MORE_ROOM)); - gTasks[taskId].func = ItemStorage_WaitPressHandleResumeProcessInput; + // No room to withdraw items + tQuantity = 0; + ItemStorage_PrintMessage(ItemStorage_GetMessage(MSG_NO_MORE_ROOM)); + gTasks[taskId].func = ItemStorage_HandleErrorMessageInput; } } static void ItemStorage_DoItemToss(u8 taskId) { - s16 *data; - u16 b; + s16 *data = gTasks[taskId].data; + u16 pos = gPlayerPCItemPageInfo.cursorPos + gPlayerPCItemPageInfo.itemsAbove; - data = gTasks[taskId].data; - b = (playerPCItemPageInfo.cursorPos + playerPCItemPageInfo.itemsAbove); - if (!ItemId_GetImportance(gSaveBlock1Ptr->pcItems[b].itemId)) + if (!ItemId_GetImportance(gSaveBlock1Ptr->pcItems[pos].itemId)) { - CopyItemName(gSaveBlock1Ptr->pcItems[b].itemId, gStringVar1); - ConvertIntToDecimalStringN(gStringVar2, data[2], STR_CONV_MODE_LEFT_ALIGN, 3); - ItemStorage_PrintItemPcResponse(ItemStorage_GetItemPcResponse(ITEMPC_OKAY_TO_THROW_AWAY)); - CreateYesNoMenuWithCallbacks(taskId, &gUnknown_085DFF84, 1, 0, 1, 0x214, 0xE, &ResumeFromWithdrawYesNoFuncList); + // Show toss confirmation prompt + CopyItemName(gSaveBlock1Ptr->pcItems[pos].itemId, gStringVar1); + ConvertIntToDecimalStringN(gStringVar2, tQuantity, STR_CONV_MODE_LEFT_ALIGN, 3); + ItemStorage_PrintMessage(ItemStorage_GetMessage(MSG_OKAY_TO_THROW_AWAY)); + CreateYesNoMenuWithCallbacks(taskId, &sWindowTemplates_ItemStorage[ITEMWIN_YESNO], 1, 0, 1, 0x214, 0xE, &ItemTossYesNoFuncs); } else { - data[2] = 0; - ItemStorage_PrintItemPcResponse(ItemStorage_GetItemPcResponse(ITEMPC_TOO_IMPORTANT)); - gTasks[taskId].func = ItemStorage_WaitPressHandleResumeProcessInput; + // Can't toss important items + tQuantity = 0; + ItemStorage_PrintMessage(ItemStorage_GetMessage(MSG_TOO_IMPORTANT)); + gTasks[taskId].func = ItemStorage_HandleErrorMessageInput; } } -static void ItemStorage_ResumeInputFromYesToss(u8 taskId) +static void ItemStorage_TossItemYes(u8 taskId) { - ItemStorage_PrintItemPcResponse(ItemStorage_GetItemPcResponse(ITEMPC_THREW_AWAY_ITEM)); + ItemStorage_PrintMessage(ItemStorage_GetMessage(MSG_THREW_AWAY_ITEM)); gTasks[taskId].func = ItemStorage_HandleRemoveItem; } -static void ItemStorage_ResumeInputFromNoToss(u8 taskId) +static void ItemStorage_TossItemNo(u8 taskId) { - ItemStorage_PrintItemPcResponse(ItemStorage_GetItemPcResponse(gSaveBlock1Ptr->pcItems[(playerPCItemPageInfo.itemsAbove + playerPCItemPageInfo.cursorPos)].itemId)); - ItemStorage_StartScrollIndicatorAndProcessInput(taskId); + ItemStorage_PrintMessage(ItemStorage_GetMessage(gSaveBlock1Ptr->pcItems[gPlayerPCItemPageInfo.itemsAbove + gPlayerPCItemPageInfo.cursorPos].itemId)); + ItemStorage_ReturnToListInput(taskId); } +// Remove item from PC (was either Tossed or Withdrawn) static void ItemStorage_HandleRemoveItem(u8 taskId) { - s16 *data; - - data = gTasks[taskId].data; + s16 *data = gTasks[taskId].data; if (JOY_NEW(A_BUTTON | B_BUTTON)) { - RemovePCItem((playerPCItemPageInfo.cursorPos + playerPCItemPageInfo.itemsAbove), data[2]); - DestroyListMenuTask(data[5], &(playerPCItemPageInfo.itemsAbove), &(playerPCItemPageInfo.cursorPos)); - sub_816C110(); - sub_816C140(); + RemovePCItem(gPlayerPCItemPageInfo.cursorPos + gPlayerPCItemPageInfo.itemsAbove, tQuantity); + DestroyListMenuTask(tListTaskId, &gPlayerPCItemPageInfo.itemsAbove, &gPlayerPCItemPageInfo.cursorPos); + ItemStorage_CompactList(); + ItemStorage_CompactCursor(); ItemStorage_RefreshListMenu(); - data[5] = ListMenuInit(&gMultiuseListMenuTemplate, playerPCItemPageInfo.itemsAbove, playerPCItemPageInfo.cursorPos); - ItemStorage_StartScrollIndicatorAndProcessInput(taskId); + tListTaskId = ListMenuInit(&gMultiuseListMenuTemplate, gPlayerPCItemPageInfo.itemsAbove, gPlayerPCItemPageInfo.cursorPos); + ItemStorage_ReturnToListInput(taskId); } } -static void ItemStorage_WaitPressHandleResumeProcessInput(u8 taskId) +static void ItemStorage_HandleErrorMessageInput(u8 taskId) { - s16 *data; - - data = gTasks[taskId].data; + s16 *data = gTasks[taskId].data; if (JOY_NEW(A_BUTTON | B_BUTTON)) { - ItemStorage_PrintItemPcResponse(ItemStorage_GetItemPcResponse(gSaveBlock1Ptr->pcItems[(playerPCItemPageInfo.itemsAbove + playerPCItemPageInfo.cursorPos)].itemId)); - ItemStorage_StartScrollIndicatorAndProcessInput(taskId); + ItemStorage_PrintMessage(ItemStorage_GetMessage(gSaveBlock1Ptr->pcItems[gPlayerPCItemPageInfo.itemsAbove + gPlayerPCItemPageInfo.cursorPos].itemId)); + ItemStorage_ReturnToListInput(taskId); } } -static void ItemStorage_StartScrollIndicatorAndProcessInput(u8 taskId) +static void ItemStorage_ReturnToListInput(u8 taskId) { - ItemStorage_StartScrollIndicator(); + ItemStorage_AddScrollIndicator(); gTasks[taskId].func = ItemStorage_ProcessInput; } diff --git a/src/region_map.c b/src/region_map.c index 1a25d140c..4e547b5fb 100644 --- a/src/region_map.c +++ b/src/region_map.c @@ -48,6 +48,12 @@ #define FLYDESTICON_RED_OUTLINE 6 +enum { + TAG_CURSOR, + TAG_PLAYER_ICON, + TAG_FLY_ICON, +}; + // Static type declarations struct MultiNameFlyDest @@ -237,13 +243,13 @@ static const union AnimCmd *const sRegionMapCursorAnimTable[] = static const struct SpritePalette sRegionMapCursorSpritePalette = { .data = sRegionMapCursorPal, - .tag = 0 + .tag = TAG_CURSOR }; static const struct SpriteTemplate sRegionMapCursorSpriteTemplate = { - .tileTag = 0, - .paletteTag = 0, + .tileTag = TAG_CURSOR, + .paletteTag = TAG_CURSOR, .oam = &sRegionMapCursorOam, .anims = sRegionMapCursorAnimTable, .images = NULL, @@ -419,7 +425,7 @@ static const struct WindowTemplate sFlyMapWindowTemplates[] = static const struct SpritePalette sFlyTargetIconsSpritePalette = { .data = sFlyTargetIcons_Pal, - .tag = 2 + .tag = TAG_FLY_ICON }; static const u16 sRedOutlineFlyDestinations[][2] = @@ -497,8 +503,8 @@ static const union AnimCmd *const sFlyDestIcon_Anims[] = static const struct SpriteTemplate sFlyDestIconSpriteTemplate = { - .tileTag = 2, - .paletteTag = 2, + .tileTag = TAG_FLY_ICON, + .paletteTag = TAG_FLY_ICON, .oam = &sFlyDestIcon_OamData, .anims = sFlyDestIcon_Anims, .images = NULL, @@ -1692,8 +1698,8 @@ void CB2_OpenFlyMap(void) break; case 4: InitRegionMap(&sFlyMap->regionMap, FALSE); - CreateRegionMapCursor(0, 0); - CreateRegionMapPlayerIcon(1, 1); + CreateRegionMapCursor(TAG_CURSOR, TAG_CURSOR); + CreateRegionMapPlayerIcon(TAG_PLAYER_ICON, TAG_PLAYER_ICON); sFlyMap->mapSecId = sFlyMap->regionMap.mapSecId; StringFill(sFlyMap->nameBuffer, CHAR_SPACE, MAP_NAME_LENGTH); sDrawFlyDestTextWindow = TRUE; @@ -1827,7 +1833,7 @@ static void LoadFlyDestIcons(void) LZ77UnCompWram(sFlyTargetIcons_Gfx, sFlyMap->tileBuffer); sheet.data = sFlyMap->tileBuffer; sheet.size = sizeof(sFlyMap->tileBuffer); - sheet.tag = 2; + sheet.tag = TAG_FLY_ICON; LoadSpriteSheet(&sheet); LoadSpritePalette(&sFlyTargetIconsSpritePalette); CreateFlyDestIcons(); diff --git a/src/secret_base.c b/src/secret_base.c index e1c62e2f2..ce455642b 100644 --- a/src/secret_base.c +++ b/src/secret_base.c @@ -1074,7 +1074,7 @@ void DeleteRegistry_Yes_Callback(u8 taskId) DestroyListMenuTask(tListTaskId, &tScrollOffset, &tSelectedRow); gSaveBlock1Ptr->secretBases[tSelectedBaseId].registryStatus = UNREGISTERED; BuildRegistryMenuItems(taskId); - sub_812225C(&tScrollOffset, &tSelectedRow, tMaxShownItems, tNumBases); + SetCursorWithinListBounds(&tScrollOffset, &tSelectedRow, tMaxShownItems, tNumBases); FinalizeRegistryMenu(taskId); gTasks[taskId].func = HandleRegistryMenuInput; } |