summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMarcus Huderle <huderlem@gmail.com>2018-09-06 11:37:45 -0500
committerMarcus Huderle <huderlem@gmail.com>2018-09-06 11:37:45 -0500
commitfa9d1759bd7fa17ced37225bd31d46466da857c6 (patch)
treeeed062151ca794e3928da6dbfbeab74eb90a671c
parent8ecf3b2159efbbd760fcf8fc6a16990bd409269f (diff)
checkpoint
-rw-r--r--asm/shop.s555
-rw-r--r--data/shop.s5
-rw-r--r--include/battle_pyramid_bag.h2
-rw-r--r--include/shop.h12
-rw-r--r--src/battle_pyramid_bag.c12
-rwxr-xr-xsrc/shop.c331
6 files changed, 342 insertions, 575 deletions
diff --git a/asm/shop.s b/asm/shop.s
index 57ebe9747..56658c4ff 100644
--- a/asm/shop.s
+++ b/asm/shop.s
@@ -5,561 +5,6 @@
.text
- thumb_func_start BuyMenuAddScrollIndicatorArrows
-@ void BuyMenuAddScrollIndicatorArrows()
-BuyMenuAddScrollIndicatorArrows: @ 80E01C8
- push {r4,r5,lr}
- sub sp, 0x10
- ldr r5, =gShopDataPtr
- ldr r2, [r5]
- ldr r4, =0x0000200b
- adds r0, r2, r4
- ldrb r0, [r0]
- cmp r0, 0xFF
- bne _080E0206
- ldr r0, =gMartInfo
- ldrh r1, [r0, 0xC]
- adds r0, r1, 0x1
- cmp r0, 0x8
- ble _080E0206
- subs r0, r1, 0x7
- str r0, [sp]
- ldr r0, =0x00000834
- str r0, [sp, 0x4]
- str r0, [sp, 0x8]
- ldr r1, =0x00002008
- adds r0, r2, r1
- str r0, [sp, 0xC]
- movs r0, 0x2
- movs r1, 0xAC
- movs r2, 0xC
- movs r3, 0x94
- bl AddScrollIndicatorArrowPairParameterized
- ldr r1, [r5]
- adds r1, r4
- strb r0, [r1]
-_080E0206:
- add sp, 0x10
- pop {r4,r5}
- pop {r0}
- bx r0
- .pool
- thumb_func_end BuyMenuAddScrollIndicatorArrows
-
- thumb_func_start BuyMenuRemoveScrollIndicatorArrows
-@ void BuyMenuRemoveScrollIndicatorArrows()
-BuyMenuRemoveScrollIndicatorArrows: @ 80E0224
- push {r4,lr}
- ldr r4, =gShopDataPtr
- ldr r0, [r4]
- ldr r2, =0x0000200b
- adds r1, r0, r2
- ldrb r0, [r1]
- cmp r0, 0xFF
- beq _080E0242
- bl RemoveScrollIndicatorArrowPair
- ldr r0, [r4]
- ldr r1, =0x0000200b
- adds r0, r1
- movs r1, 0xFF
- strb r1, [r0]
-_080E0242:
- pop {r4}
- pop {r0}
- bx r0
- .pool
- thumb_func_end BuyMenuRemoveScrollIndicatorArrows
-
- thumb_func_start BuyMenuPrintCursor
-@ void BuyMenuPrintCursor(u8 taskId, u8 colorSetId)
-BuyMenuPrintCursor: @ 80E0250
- push {r4,lr}
- sub sp, 0x8
- adds r4, r1, 0
- lsls r0, 24
- lsrs r0, 24
- lsls r4, 24
- lsrs r4, 24
- bl ListMenuGetYCoordForPrintingArrowCursor
- adds r3, r0, 0
- lsls r3, 24
- lsrs r3, 24
- ldr r1, =gText_SelectorArrow2
- movs r0, 0
- str r0, [sp]
- str r4, [sp, 0x4]
- movs r0, 0x1
- movs r2, 0
- bl BuyMenuPrint
- add sp, 0x8
- pop {r4}
- pop {r0}
- bx r0
- .pool
- thumb_func_end BuyMenuPrintCursor
-
- thumb_func_start BuyMenuAddItemIcon
-@ void BuyMenuAddItemIcon(u16 id, u8 iconSlot)
-BuyMenuAddItemIcon: @ 80E0284
- push {r4,lr}
- sub sp, 0x8
- lsls r0, 16
- lsrs r2, r0, 16
- lsls r1, 24
- lsrs r3, r1, 24
- ldr r0, =gShopDataPtr
- ldr r4, =0x0000200d
- adds r1, r3, r4
- ldr r0, [r0]
- adds r4, r0, r1
- ldrb r0, [r4]
- cmp r0, 0xFF
- bne _080E0310
- ldr r0, =gMartInfo
- ldrb r0, [r0, 0xF]
- cmp r0, 0
- beq _080E02AE
- ldr r0, =0x0000ffff
- cmp r2, r0
- bne _080E02F0
-_080E02AE:
- ldr r0, =0x0000083e
- adds r1, r3, r0
- adds r0, r1, 0
- bl AddItemIconSprite
- lsls r0, 24
- lsrs r2, r0, 24
- cmp r2, 0x40
- beq _080E0310
- strb r2, [r4]
- ldr r1, =gSprites
- lsls r0, r2, 4
- adds r0, r2
- lsls r0, 2
- adds r0, r1
- movs r1, 0x18
- strh r1, [r0, 0x24]
- movs r1, 0x58
- strh r1, [r0, 0x26]
- b _080E0310
- .pool
-_080E02F0:
- lsls r0, r2, 24
- lsrs r0, 24
- ldr r2, =0x0000083e
- adds r1, r3, r2
- str r1, [sp]
- str r1, [sp, 0x4]
- movs r1, 0x14
- movs r2, 0x54
- movs r3, 0x1
- bl AddDecorationIconObject
- lsls r0, 24
- lsrs r2, r0, 24
- cmp r2, 0x40
- beq _080E0310
- strb r2, [r4]
-_080E0310:
- add sp, 0x8
- pop {r4}
- pop {r0}
- bx r0
- .pool
- thumb_func_end BuyMenuAddItemIcon
-
- thumb_func_start BuyMenuRemoveItemIcon
-@ void BuyMenuRemoveItemIcon(u16 id, u8 iconSlot)
-BuyMenuRemoveItemIcon: @ 80E031C
- push {r4,r5,lr}
- lsls r1, 24
- lsrs r4, r1, 24
- ldr r0, =gShopDataPtr
- ldr r2, =0x0000200d
- adds r1, r4, r2
- ldr r0, [r0]
- adds r5, r0, r1
- ldrb r0, [r5]
- cmp r0, 0xFF
- beq _080E0356
- ldr r0, =0x0000083e
- adds r4, r0
- adds r0, r4, 0
- bl FreeSpriteTilesByTag
- adds r0, r4, 0
- bl FreeSpritePaletteByTag
- ldrb r1, [r5]
- lsls r0, r1, 4
- adds r0, r1
- lsls r0, 2
- ldr r1, =gSprites
- adds r0, r1
- bl DestroySprite
- movs r0, 0xFF
- strb r0, [r5]
-_080E0356:
- pop {r4,r5}
- pop {r0}
- bx r0
- .pool
- thumb_func_end BuyMenuRemoveItemIcon
-
- thumb_func_start BuyMenuInitBgs
-@ void BuyMenuInitBgs()
-BuyMenuInitBgs: @ 80E036C
- push {r4,lr}
- movs r0, 0
- bl ResetBgsAndClearDma3BusyFlags
- ldr r1, =gUnknown_08589A60
- movs r0, 0
- movs r2, 0x4
- bl InitBgsFromTemplates
- ldr r4, =gShopDataPtr
- ldr r1, [r4]
- movs r0, 0x80
- lsls r0, 4
- adds r1, r0
- movs r0, 0x1
- bl SetBgTilemapBuffer
- ldr r1, [r4]
- movs r0, 0xC0
- lsls r0, 5
- adds r1, r0
- movs r0, 0x2
- bl SetBgTilemapBuffer
- ldr r1, [r4]
- movs r0, 0x80
- lsls r0, 5
- adds r1, r0
- movs r0, 0x3
- bl SetBgTilemapBuffer
- movs r0, 0x10
- movs r1, 0
- bl SetGpuReg
- movs r0, 0x12
- movs r1, 0
- bl SetGpuReg
- movs r0, 0x14
- movs r1, 0
- bl SetGpuReg
- movs r0, 0x16
- movs r1, 0
- bl SetGpuReg
- movs r0, 0x18
- movs r1, 0
- bl SetGpuReg
- movs r0, 0x1A
- movs r1, 0
- bl SetGpuReg
- movs r0, 0x1C
- movs r1, 0
- bl SetGpuReg
- movs r0, 0x1E
- movs r1, 0
- bl SetGpuReg
- movs r0, 0x50
- movs r1, 0
- bl SetGpuReg
- movs r1, 0x82
- lsls r1, 5
- movs r0, 0
- bl SetGpuReg
- movs r0, 0
- bl ShowBg
- movs r0, 0x1
- bl ShowBg
- movs r0, 0x2
- bl ShowBg
- movs r0, 0x3
- bl ShowBg
- pop {r4}
- pop {r0}
- bx r0
- .pool
- thumb_func_end BuyMenuInitBgs
-
- thumb_func_start BuyMenuDecompressBgGraphics
-@ void BuyMenuDecompressBgGraphics()
-BuyMenuDecompressBgGraphics: @ 80E0424
- push {lr}
- sub sp, 0x4
- ldr r1, =gBuyMenuFrame_Gfx
- movs r2, 0xE8
- lsls r2, 2
- ldr r3, =0x000003e3
- movs r0, 0
- str r0, [sp]
- movs r0, 0x1
- bl decompress_and_copy_tile_data_to_vram
- ldr r0, =gBuyMenuFrame_Tilemap
- ldr r1, =gShopDataPtr
- ldr r1, [r1]
- bl LZDecompressWram
- ldr r0, =gMenuMoneyPal
- movs r1, 0xC0
- movs r2, 0x20
- bl LoadCompressedPalette
- add sp, 0x4
- pop {r0}
- bx r0
- .pool
- thumb_func_end BuyMenuDecompressBgGraphics
-
- thumb_func_start BuyMenuInitWindows
-@ void BuyMenuInitWindows()
-BuyMenuInitWindows: @ 80E0468
- push {lr}
- ldr r0, =gUnknown_08589A70
- bl InitWindows
- bl DeactivateAllTextPrinters
- movs r0, 0
- movs r1, 0x1
- movs r2, 0xD0
- bl LoadUserWindowBorderGfx
- movs r0, 0
- movs r1, 0xA
- movs r2, 0xE0
- bl LoadMessageBoxGfx
- movs r0, 0
- bl PutWindowTilemap
- movs r0, 0x1
- bl PutWindowTilemap
- movs r0, 0x2
- bl PutWindowTilemap
- pop {r0}
- bx r0
- .pool
- thumb_func_end BuyMenuInitWindows
-
- thumb_func_start BuyMenuPrint
-@ void BuyMenuPrint(u8 windowId, u8 *str, u8 x, u8 y, u8 speed, u8 colorSetId)
-BuyMenuPrint: @ 80E04A4
- push {r4-r6,lr}
- sub sp, 0x14
- ldr r6, [sp, 0x24]
- ldr r5, [sp, 0x28]
- lsls r0, 24
- lsrs r0, 24
- lsls r2, 24
- lsrs r2, 24
- lsls r3, 24
- lsrs r3, 24
- lsls r5, 24
- lsrs r5, 24
- movs r4, 0
- str r4, [sp]
- str r4, [sp, 0x4]
- lsls r4, r5, 1
- adds r4, r5
- ldr r5, =gUnknown_08589AB0
- adds r4, r5
- str r4, [sp, 0x8]
- lsls r6, 24
- asrs r6, 24
- str r6, [sp, 0xC]
- str r1, [sp, 0x10]
- movs r1, 0x1
- bl AddTextPrinterParameterized2
- add sp, 0x14
- pop {r4-r6}
- pop {r0}
- bx r0
- .pool
- thumb_func_end BuyMenuPrint
-
- thumb_func_start BuyMenuDisplayMessage
-@ void BuyMenuDisplayMessage(u8 taskId, u8 *str, void ( *callback)(u8 taskId))
-BuyMenuDisplayMessage: @ 80E04E8
- push {r4-r6,lr}
- sub sp, 0x10
- adds r4, r0, 0
- adds r5, r1, 0
- adds r6, r2, 0
- lsls r4, 24
- lsrs r4, 24
- bl GetPlayerTextSpeed
- lsls r0, 24
- lsrs r0, 24
- movs r1, 0x1
- str r1, [sp]
- str r0, [sp, 0x4]
- str r5, [sp, 0x8]
- str r6, [sp, 0xC]
- adds r0, r4, 0
- movs r1, 0x5
- movs r2, 0xA
- movs r3, 0xE
- bl DisplayMessageAndContinueTask
- movs r0, 0
- bl schedule_bg_copy_tilemap_to_vram
- add sp, 0x10
- pop {r4-r6}
- pop {r0}
- bx r0
- thumb_func_end BuyMenuDisplayMessage
-
- thumb_func_start BuyMenuDrawGraphics
-@ void BuyMenuDrawGraphics()
-BuyMenuDrawGraphics: @ 80E0524
- push {lr}
- bl BuyMenuDrawMapGraphics
- bl BuyMenuCopyMenuBgToBg1TilemapBuffer
- movs r0, 0x13
- movs r1, 0xB
- bl AddMoneyLabelObject
- ldr r0, =gSaveBlock1Ptr
- ldr r0, [r0]
- movs r1, 0x92
- lsls r1, 3
- adds r0, r1
- bl GetMoney
- adds r3, r0, 0
- movs r0, 0
- movs r1, 0x1
- movs r2, 0xD
- bl PrintMoneyAmountInMoneyBoxWithBorder
- movs r0, 0
- bl schedule_bg_copy_tilemap_to_vram
- movs r0, 0x1
- bl schedule_bg_copy_tilemap_to_vram
- movs r0, 0x2
- bl schedule_bg_copy_tilemap_to_vram
- movs r0, 0x3
- bl schedule_bg_copy_tilemap_to_vram
- pop {r0}
- bx r0
- .pool
- thumb_func_end BuyMenuDrawGraphics
-
- thumb_func_start BuyMenuDrawMapGraphics
-@ void BuyMenuDrawMapGraphics()
-BuyMenuDrawMapGraphics: @ 80E0570
- push {lr}
- bl BuyMenuCollectEventObjectData
- bl BuyMenuDrawEventObjects
- bl BuyMenuDrawMapBg
- pop {r0}
- bx r0
- thumb_func_end BuyMenuDrawMapGraphics
-
- thumb_func_start BuyMenuDrawMapBg
-@ void BuyMenuDrawMapBg()
-BuyMenuDrawMapBg: @ 80E0584
- push {r4-r7,lr}
- mov r7, r10
- mov r6, r9
- mov r5, r8
- push {r5-r7}
- sub sp, 0x4
- ldr r0, =gMapHeader
- ldr r0, [r0]
- mov r9, r0
- mov r4, sp
- adds r4, 0x2
- mov r0, sp
- adds r1, r4, 0
- bl GetXYCoordsOneStepInFrontOfPlayer
- mov r1, sp
- mov r0, sp
- ldrh r0, [r0]
- subs r0, 0x4
- strh r0, [r1]
- ldrh r0, [r4]
- subs r0, 0x4
- strh r0, [r4]
- movs r1, 0
- mov r10, r4
-_080E05B6:
- movs r4, 0
- lsls r7, r1, 16
- asrs r0, r7, 16
- mov r8, r0
-_080E05BE:
- mov r0, sp
- movs r1, 0
- ldrsh r0, [r0, r1]
- lsls r4, 16
- asrs r5, r4, 16
- adds r0, r5
- mov r2, r10
- movs r3, 0
- ldrsh r1, [r2, r3]
- add r1, r8
- bl MapGridGetMetatileIdAt
- lsls r0, 16
- lsrs r6, r0, 16
- adds r0, r5, 0
- mov r1, r8
- bl BuyMenuCheckForOverlapWithMenuBg
- lsls r0, 24
- lsrs r0, 24
- cmp r0, 0x1
- bne _080E0608
- mov r0, sp
- movs r1, 0
- ldrsh r0, [r0, r1]
- adds r0, r5
- mov r2, r10
- movs r3, 0
- ldrsh r1, [r2, r3]
- add r1, r8
- bl MapGridGetMetatileLayerTypeAt
- lsls r0, 24
- lsrs r5, r0, 24
- b _080E060A
- .pool
-_080E0608:
- movs r5, 0x1
-_080E060A:
- ldr r0, =0x000001ff
- cmp r6, r0
- bhi _080E062C
- asrs r0, r4, 16
- mov r2, r9
- ldr r1, [r2, 0x10]
- lsls r3, r6, 4
- ldr r2, [r1, 0xC]
- adds r2, r3
- asrs r1, r7, 16
- adds r3, r5, 0
- bl BuyMenuDrawMapMetatile
- b _080E0644
- .pool
-_080E062C:
- asrs r0, r4, 16
- mov r3, r9
- ldr r2, [r3, 0x14]
- ldr r3, =0xfffffe00
- adds r1, r6, r3
- lsls r1, 4
- ldr r2, [r2, 0xC]
- adds r2, r1
- asrs r1, r7, 16
- adds r3, r5, 0
- bl BuyMenuDrawMapMetatile
-_080E0644:
- movs r1, 0x80
- lsls r1, 9
- adds r0, r4, r1
- lsrs r4, r0, 16
- asrs r0, 16
- cmp r0, 0xE
- ble _080E05BE
- adds r0, r7, r1
- lsrs r1, r0, 16
- asrs r0, 16
- cmp r0, 0x9
- ble _080E05B6
- add sp, 0x4
- pop {r3-r5}
- mov r8, r3
- mov r9, r4
- mov r10, r5
- pop {r4-r7}
- pop {r0}
- bx r0
- .pool
- thumb_func_end BuyMenuDrawMapBg
-
thumb_func_start BuyMenuDrawMapMetatile
@ void BuyMenuDrawMapMetatile(u16 x, u16 y, u16 *src, u8 metatileLayerType)
BuyMenuDrawMapMetatile: @ 80E0670
diff --git a/data/shop.s b/data/shop.s
index 58f294e6b..45ecbb585 100644
--- a/data/shop.s
+++ b/data/shop.s
@@ -53,9 +53,10 @@ gUnknown_08589AA8:: @ 8589AA8
gUnknown_08589AB0:: @ 8589AB0
.byte 1, 2, 3
+ .byte 0, 2, 3
+ .byte 0, 3, 2
-gUnknown_08589AB3:: @ 8589AB3
- .byte 0, 2, 3, 0, 3, 2, 0
+ .align 1
gUnknown_08589ABA:: @ 8589ABA
.2byte 0x284, 0x282, 0x280
diff --git a/include/battle_pyramid_bag.h b/include/battle_pyramid_bag.h
index 5d5d8ccfa..2301b0aa0 100644
--- a/include/battle_pyramid_bag.h
+++ b/include/battle_pyramid_bag.h
@@ -11,7 +11,7 @@ struct PyramidBagResources
u8 windowIds[5];
u8 unk814;
u8 unk815;
- u8 scrollArrowSpriteId;
+ u8 scrollIndicatorsTaskId;
const u8 *menuActionIds;
u8 filler81C[0x820 - 0x81C];
u8 menuActionsCount;
diff --git a/include/shop.h b/include/shop.h
index d7822ec31..067b8fee4 100644
--- a/include/shop.h
+++ b/include/shop.h
@@ -27,13 +27,15 @@ struct BuyMenuLabel
struct ShopData
{
- /*0x0000*/ u8 filler0[0x2004];
+ /*0x0000*/ u8 tilemapBuffers[4][0x800];
+ /*0x2000*/ u8 filler2000[0x4];
/*0x2004*/ u16 unk2004;
- /*0x2006*/ u8 filler2006[0x5];
- /*0x200B*/ u8 unk200B;
+ /*0x2006*/ u8 filler2006[0x2];
+ /*0x2008*/ u16 unk2008;
+ /*0x200A*/ u8 filler200A;
+ /*0x200B*/ u8 scrollIndicatorsTaskId;
/*0x200C*/ u8 unk200C;
- /*0x200D*/ s8 unk200D;
- /*0x200E*/ s8 unk200E;
+ /*0x200D*/ u8 unk200D[2];
/*0x200F*/ u8 filler200F[0xA1];
};
diff --git a/src/battle_pyramid_bag.c b/src/battle_pyramid_bag.c
index 8a5ce7a99..46ba50792 100644
--- a/src/battle_pyramid_bag.c
+++ b/src/battle_pyramid_bag.c
@@ -264,7 +264,7 @@ void sub_81C4F98(u8 a0, void (*callback)(void))
gPyramidBagResources->callback2 = NULL;
gPyramidBagResources->unk814 = 0xFF;
- gPyramidBagResources->scrollArrowSpriteId = 0xFF;
+ gPyramidBagResources->scrollIndicatorsTaskId = 0xFF;
memset(gPyramidBagResources->itemsSpriteIds, 0xFF, sizeof(gPyramidBagResources->itemsSpriteIds));
memset(gPyramidBagResources->windowIds, 0xFF, sizeof(gPyramidBagResources->windowIds));
@@ -532,16 +532,16 @@ static void PrintItemDescription(s32 listMenuId)
static void AddScrollArrow(void)
{
- if (gPyramidBagResources->scrollArrowSpriteId == 0xFF)
- gPyramidBagResources->scrollArrowSpriteId = AddScrollIndicatorArrowPairParameterized(2, 172, 12, 148, gPyramidBagResources->listMenuCount - gPyramidBagResources->listMenuMaxShown, 0xB5E, 0xB5E, &gPyramidBagCursorData.scrollPosition);
+ if (gPyramidBagResources->scrollIndicatorsTaskId == 0xFF)
+ gPyramidBagResources->scrollIndicatorsTaskId = AddScrollIndicatorArrowPairParameterized(2, 172, 12, 148, gPyramidBagResources->listMenuCount - gPyramidBagResources->listMenuMaxShown, 0xB5E, 0xB5E, &gPyramidBagCursorData.scrollPosition);
}
static void RemoveScrollArrow(void)
{
- if (gPyramidBagResources->scrollArrowSpriteId != 0xFF)
+ if (gPyramidBagResources->scrollIndicatorsTaskId != 0xFF)
{
- RemoveScrollIndicatorArrowPair(gPyramidBagResources->scrollArrowSpriteId);
- gPyramidBagResources->scrollArrowSpriteId = 0xFF;
+ RemoveScrollIndicatorArrowPair(gPyramidBagResources->scrollIndicatorsTaskId);
+ gPyramidBagResources->scrollIndicatorsTaskId = 0xFF;
}
}
diff --git a/src/shop.c b/src/shop.c
index 5dc85859b..2f7126dc6 100755
--- a/src/shop.c
+++ b/src/shop.c
@@ -1,23 +1,31 @@
#include "global.h"
#include "bg.h"
+#include "decompress.h"
#include "decoration.h"
+#include "field_player_avatar.h"
#include "field_screen.h"
#include "field_weather.h"
+#include "fieldmap.h"
+#include "gpu_regs.h"
#include "international_string_util.h"
#include "item.h"
+#include "item_icon.h"
#include "list_menu.h"
#include "main.h"
#include "malloc.h"
#include "menu.h"
#include "menu_helpers.h"
+#include "money.h"
#include "overworld.h"
#include "palette.h"
#include "scanline_effect.h"
#include "script.h"
#include "shop.h"
#include "sound.h"
+#include "sprite.h"
#include "string_util.h"
#include "strings.h"
+#include "text_window.h"
#include "tv.h"
#include "constants/rgb.h"
#include "constants/songs.h"
@@ -31,7 +39,12 @@ extern const struct WindowTemplate gUnknown_08589A38[2];
extern const struct MenuAction gUnknown_08589A10[3];
extern const struct MenuAction gUnknown_08589A28[2];
extern const struct ListMenuTemplate gUnknown_08589A48;
-extern const u8 gUnknown_08589AB3[];
+extern const struct BgTemplate gUnknown_08589A60[4];
+extern const u8 gBuyMenuFrame_Gfx[];
+extern const u8 gBuyMenuFrame_Tilemap[];
+extern const u16 gMenuMoneyPal[];
+extern const struct WindowTemplate gUnknown_08589A70[];
+extern u8 gUnknown_08589AB0[][3];
static void Task_ShopMenu(u8 taskId);
void HandleShopMenuQuit(u8 taskId);
@@ -51,7 +64,14 @@ void BuyMenuDecompressBgGraphics(void);
void BuyMenuSetListEntry(struct ListMenuItem*, u16, u8*);
void BuyMenuAddItemIcon(u16, u8);
void BuyMenuRemoveItemIcon(u16, u8);
-void BuyMenuPrint(u8, const u8*, u8, u8, u8, u8);
+void BuyMenuPrint(u8 windowId, const u8 *text, u8 x, u8 y, s8 speed, u8 colorSet);
+void BuyMenuDrawMapGraphics(void);
+void BuyMenuCopyMenuBgToBg1TilemapBuffer(void);
+void BuyMenuCollectEventObjectData(void);
+void BuyMenuDrawEventObjects(void);
+void BuyMenuDrawMapBg(void);
+bool8 BuyMenuCheckForOverlapWithMenuBg(u16, u16);
+void BuyMenuDrawMapMetatile(s16, s16, u16*, u8);
/*static*/ u8 CreateShopMenu(u8 martType)
@@ -227,9 +247,9 @@ void CB2_InitBuyMenu(void)
ResetTasks();
clear_scheduled_bg_copies_to_vram();
gShopDataPtr = AllocZeroed(sizeof(struct ShopData));
- gShopDataPtr->unk200B = 0xFF;
- gShopDataPtr->unk200D = -1;
- gShopDataPtr->unk200E = -1;
+ gShopDataPtr->scrollIndicatorsTaskId = 0xFF;
+ gShopDataPtr->unk200D[0] = -1;
+ gShopDataPtr->unk200D[1] = -1;
BuyMenuBuildListMenuTemplate();
BuyMenuInitBgs();
FillBgTilemapBufferRect_Palette0(0, 0, 0, 0, 0x20, 0x20);
@@ -355,6 +375,305 @@ void BuyMenuPrintPriceInList(u8 windowId, int item, u8 y)
StringExpandPlaceholders(gStringVar4, gText_PokedollarVar1);
x = GetStringRightAlignXOffset(7, gStringVar4, 0x78);
- AddTextPrinterParameterized2(windowId, 7, x, y, 0, 0, gUnknown_08589AB3, -1, gStringVar4);
+ AddTextPrinterParameterized2(windowId, 7, x, y, 0, 0, gUnknown_08589AB0[1], -1, gStringVar4);
}
}
+
+void BuyMenuAddScrollIndicatorArrows(void)
+{
+ if (gShopDataPtr->scrollIndicatorsTaskId == 0xFF && gMartInfo.itemCount + 1 > 8)
+ {
+ gShopDataPtr->scrollIndicatorsTaskId = AddScrollIndicatorArrowPairParameterized(
+ SCROLL_ARROW_UP,
+ 0xAC,
+ 0xC,
+ 0x94,
+ gMartInfo.itemCount - 7,
+ 0x834,
+ 0x834,
+ &gShopDataPtr->unk2008);
+ }
+}
+
+void BuyMenuRemoveScrollIndicatorArrows(void)
+{
+ if (gShopDataPtr->scrollIndicatorsTaskId != 0xFF)
+ {
+ RemoveScrollIndicatorArrowPair(gShopDataPtr->scrollIndicatorsTaskId);
+ gShopDataPtr->scrollIndicatorsTaskId = 0xFF;
+ }
+}
+
+void BuyMenuPrintCursor(u8 scrollIndicatorsTaskId, u8 colorSet)
+{
+ u8 y = ListMenuGetYCoordForPrintingArrowCursor(scrollIndicatorsTaskId);
+ BuyMenuPrint(1, gText_SelectorArrow2, 0, y, 0, colorSet);
+}
+
+void BuyMenuAddItemIcon(u16 item, u8 iconSlot)
+{
+ u8 spriteId;
+ u8 *spriteIdPtr = &gShopDataPtr->unk200D[iconSlot];
+ if (*spriteIdPtr != 0xFF)
+ return;
+
+ if (gMartInfo.martType == MART_TYPE_0 || item == 0xFFFF)
+ {
+ spriteId = AddItemIconSprite(iconSlot + 0x83E, iconSlot + 0x83E, item);
+ if (spriteId != MAX_SPRITES)
+ {
+ *spriteIdPtr = spriteId;
+ gSprites[spriteId].pos2.x = 24;
+ gSprites[spriteId].pos2.y = 88;
+ }
+ }
+ else
+ {
+ spriteId = AddDecorationIconObject(item, 20, 84, 1, iconSlot + 0x83E, iconSlot + 0x83E);
+ if (spriteId != MAX_SPRITES)
+ *spriteIdPtr = spriteId;
+ }
+}
+
+void BuyMenuRemoveItemIcon(u16 item, u8 iconSlot)
+{
+ u8 *spriteIdPtr = &gShopDataPtr->unk200D[iconSlot];
+ if (*spriteIdPtr == 0xFF)
+ return;
+
+ FreeSpriteTilesByTag(iconSlot + 0x83E);
+ FreeSpritePaletteByTag(iconSlot + 0x83E);
+ DestroySprite(&gSprites[*spriteIdPtr]);
+ *spriteIdPtr = 0xFF;
+}
+
+void BuyMenuInitBgs(void)
+{
+ ResetBgsAndClearDma3BusyFlags(0);
+ InitBgsFromTemplates(0, gUnknown_08589A60, ARRAY_COUNT(gUnknown_08589A60));
+ SetBgTilemapBuffer(1, gShopDataPtr->tilemapBuffers[1]);
+ SetBgTilemapBuffer(2, gShopDataPtr->tilemapBuffers[3]);
+ SetBgTilemapBuffer(3, gShopDataPtr->tilemapBuffers[2]);
+ SetGpuReg(REG_OFFSET_BG0HOFS, 0);
+ SetGpuReg(REG_OFFSET_BG0VOFS, 0);
+ SetGpuReg(REG_OFFSET_BG1HOFS, 0);
+ SetGpuReg(REG_OFFSET_BG1VOFS, 0);
+ SetGpuReg(REG_OFFSET_BG2HOFS, 0);
+ SetGpuReg(REG_OFFSET_BG2VOFS, 0);
+ SetGpuReg(REG_OFFSET_BG3HOFS, 0);
+ SetGpuReg(REG_OFFSET_BG3VOFS, 0);
+ SetGpuReg(REG_OFFSET_BLDCNT, 0);
+ SetGpuReg(REG_OFFSET_DISPCNT, DISPCNT_MODE_0 | DISPCNT_OBJ_ON | DISPCNT_OBJ_1D_MAP);
+ ShowBg(0);
+ ShowBg(1);
+ ShowBg(2);
+ ShowBg(3);
+}
+
+void BuyMenuDecompressBgGraphics(void)
+{
+ decompress_and_copy_tile_data_to_vram(1, gBuyMenuFrame_Gfx, 0x3A0, 0x3E3, 0);
+ LZDecompressWram(gBuyMenuFrame_Tilemap, gShopDataPtr->tilemapBuffers[0]);
+ LoadCompressedPalette(gMenuMoneyPal, 0xC0, 0x20);
+}
+
+void BuyMenuInitWindows(void)
+{
+ InitWindows(gUnknown_08589A70);
+ DeactivateAllTextPrinters();
+ LoadUserWindowBorderGfx(0, 1, 0xD0);
+ LoadMessageBoxGfx(0, 0xA, 0xE0);
+ PutWindowTilemap(0);
+ PutWindowTilemap(1);
+ PutWindowTilemap(2);
+}
+
+void BuyMenuPrint(u8 windowId, const u8 *text, u8 x, u8 y, s8 speed, u8 colorSet)
+{
+ AddTextPrinterParameterized2(windowId, 1, x, y, 0, 0, gUnknown_08589AB0[colorSet], speed, text);
+}
+
+void BuyMenuDisplayMessage(u8 taskId, const u8 *text, TaskFunc callback)
+{
+ DisplayMessageAndContinueTask(taskId, 5, 10, 14, 1, GetPlayerTextSpeed(), text, callback);
+ schedule_bg_copy_tilemap_to_vram(0);
+}
+
+void BuyMenuDrawGraphics(void)
+{
+ BuyMenuDrawMapGraphics();
+ BuyMenuCopyMenuBgToBg1TilemapBuffer();
+ AddMoneyLabelObject(19, 11);
+ PrintMoneyAmountInMoneyBoxWithBorder(0, 1, 13, GetMoney(&gSaveBlock1Ptr->money));
+ schedule_bg_copy_tilemap_to_vram(0);
+ schedule_bg_copy_tilemap_to_vram(1);
+ schedule_bg_copy_tilemap_to_vram(2);
+ schedule_bg_copy_tilemap_to_vram(3);
+}
+
+void BuyMenuDrawMapGraphics(void)
+{
+ BuyMenuCollectEventObjectData();
+ BuyMenuDrawEventObjects();
+ BuyMenuDrawMapBg();
+}
+
+#ifdef NONMATCHING
+// functionally equivalent, but couldn't get the loop variables using the
+// stack correctly. Might be related to the tileset metatiles type.
+void BuyMenuDrawMapBg(void)
+{
+ s16 i;
+ s16 j;
+ s16 x;
+ s16 y;
+ const struct MapLayout *mapLayout;
+ u16 metatile, metatileLayerType;
+
+ mapLayout = gMapHeader.mapLayout;
+ GetXYCoordsOneStepInFrontOfPlayer(&x, &y);
+ x -= 4;
+ y -= 4;
+
+ for (j = 0; j < 10; j++)
+ {
+ for (i = 0; i < 15; i++)
+ {
+ metatile = MapGridGetMetatileIdAt(x + i, y + j);
+ if (BuyMenuCheckForOverlapWithMenuBg(i, j) == TRUE)
+ metatileLayerType = MapGridGetMetatileLayerTypeAt(x + i, y + j);
+ else
+ metatileLayerType = 1;
+
+ if (metatile < 0x200)
+ {
+ BuyMenuDrawMapMetatile(i, j, (u16*)mapLayout->primaryTileset->metatiles + metatile * 8, metatileLayerType);
+ }
+ else
+ {
+ BuyMenuDrawMapMetatile(i, j, (u16*)mapLayout->secondaryTileset->metatiles + ((metatile - 0x200) * 8), metatileLayerType);
+ }
+ }
+ }
+}
+#else
+NAKED
+void BuyMenuDrawMapBg(void)
+{
+ asm_unified("\n\
+ push {r4-r7,lr}\n\
+ mov r7, r10\n\
+ mov r6, r9\n\
+ mov r5, r8\n\
+ push {r5-r7}\n\
+ sub sp, 0x4\n\
+ ldr r0, =gMapHeader\n\
+ ldr r0, [r0]\n\
+ mov r9, r0\n\
+ mov r4, sp\n\
+ adds r4, 0x2\n\
+ mov r0, sp\n\
+ adds r1, r4, 0\n\
+ bl GetXYCoordsOneStepInFrontOfPlayer\n\
+ mov r1, sp\n\
+ mov r0, sp\n\
+ ldrh r0, [r0]\n\
+ subs r0, 0x4\n\
+ strh r0, [r1]\n\
+ ldrh r0, [r4]\n\
+ subs r0, 0x4\n\
+ strh r0, [r4]\n\
+ movs r1, 0\n\
+ mov r10, r4\n\
+_080E05B6:\n\
+ movs r4, 0\n\
+ lsls r7, r1, 16\n\
+ asrs r0, r7, 16\n\
+ mov r8, r0\n\
+_080E05BE:\n\
+ mov r0, sp\n\
+ movs r1, 0\n\
+ ldrsh r0, [r0, r1]\n\
+ lsls r4, 16\n\
+ asrs r5, r4, 16\n\
+ adds r0, r5\n\
+ mov r2, r10\n\
+ movs r3, 0\n\
+ ldrsh r1, [r2, r3]\n\
+ add r1, r8\n\
+ bl MapGridGetMetatileIdAt\n\
+ lsls r0, 16\n\
+ lsrs r6, r0, 16\n\
+ adds r0, r5, 0\n\
+ mov r1, r8\n\
+ bl BuyMenuCheckForOverlapWithMenuBg\n\
+ lsls r0, 24\n\
+ lsrs r0, 24\n\
+ cmp r0, 0x1\n\
+ bne _080E0608\n\
+ mov r0, sp\n\
+ movs r1, 0\n\
+ ldrsh r0, [r0, r1]\n\
+ adds r0, r5\n\
+ mov r2, r10\n\
+ movs r3, 0\n\
+ ldrsh r1, [r2, r3]\n\
+ add r1, r8\n\
+ bl MapGridGetMetatileLayerTypeAt\n\
+ lsls r0, 24\n\
+ lsrs r5, r0, 24\n\
+ b _080E060A\n\
+ .pool\n\
+_080E0608:\n\
+ movs r5, 0x1\n\
+_080E060A:\n\
+ ldr r0, =0x000001ff\n\
+ cmp r6, r0\n\
+ bhi _080E062C\n\
+ asrs r0, r4, 16\n\
+ mov r2, r9\n\
+ ldr r1, [r2, 0x10]\n\
+ lsls r3, r6, 4\n\
+ ldr r2, [r1, 0xC]\n\
+ adds r2, r3\n\
+ asrs r1, r7, 16\n\
+ adds r3, r5, 0\n\
+ bl BuyMenuDrawMapMetatile\n\
+ b _080E0644\n\
+ .pool\n\
+_080E062C:\n\
+ asrs r0, r4, 16\n\
+ mov r3, r9\n\
+ ldr r2, [r3, 0x14]\n\
+ ldr r3, =0xfffffe00\n\
+ adds r1, r6, r3\n\
+ lsls r1, 4\n\
+ ldr r2, [r2, 0xC]\n\
+ adds r2, r1\n\
+ asrs r1, r7, 16\n\
+ adds r3, r5, 0\n\
+ bl BuyMenuDrawMapMetatile\n\
+_080E0644:\n\
+ movs r1, 0x80\n\
+ lsls r1, 9\n\
+ adds r0, r4, r1\n\
+ lsrs r4, r0, 16\n\
+ asrs r0, 16\n\
+ cmp r0, 0xE\n\
+ ble _080E05BE\n\
+ adds r0, r7, r1\n\
+ lsrs r1, r0, 16\n\
+ asrs r0, 16\n\
+ cmp r0, 0x9\n\
+ ble _080E05B6\n\
+ add sp, 0x4\n\
+ pop {r3-r5}\n\
+ mov r8, r3\n\
+ mov r9, r4\n\
+ mov r10, r5\n\
+ pop {r4-r7}\n\
+ pop {r0}\n\
+ bx r0\n\
+ .pool");
+}
+#endif // NONMATCHING