summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMarcus Huderle <huderlem@gmail.com>2018-09-01 17:15:35 -0500
committerMarcus Huderle <huderlem@gmail.com>2018-09-01 17:15:35 -0500
commit8ecf3b2159efbbd760fcf8fc6a16990bd409269f (patch)
tree3149b94eb65d86a170a4f4cb7abf6ae693e59c6f
parent1895383352da3bd5a4f4990fab045ae3610937fc (diff)
Start decompiling shop.c
-rw-r--r--asm/shop.s895
-rw-r--r--include/shop.h34
-rw-r--r--include/strings.h7
-rw-r--r--include/tv.h1
-rw-r--r--ld_script.txt1
-rw-r--r--src/money.c3
-rwxr-xr-xsrc/shop.c360
-rw-r--r--sym_ewram.txt4
8 files changed, 430 insertions, 875 deletions
diff --git a/asm/shop.s b/asm/shop.s
index 30a5ec278..57ebe9747 100644
--- a/asm/shop.s
+++ b/asm/shop.s
@@ -5,862 +5,19 @@
.text
- thumb_func_start CreateShopMenu
-@ s8 CreateShopMenu(s8 type)
-CreateShopMenu: @ 80DFA78
- push {r4,r5,lr}
- sub sp, 0x10
- adds r4, r0, 0
- lsls r4, 24
- lsrs r4, 24
- bl ScriptContext2_Enable
- ldr r5, =gUnknown_02039F60
- strb r4, [r5, 0xF]
- cmp r4, 0
- bne _080DFACC
- ldr r0, =gUnknown_08589A38
- ldr r1, [r0, 0x4]
- ldr r0, [r0]
- str r0, [sp]
- str r1, [sp, 0x4]
- ldr r4, =gUnknown_08589A10
- adds r0, r4, 0
- movs r1, 0x3
- bl GetMaxWidthInMenuTable
- lsls r0, 24
- ldr r2, =0x00ffffff
- ldr r1, [sp]
- ands r1, r2
- orrs r1, r0
- str r1, [sp]
- mov r0, sp
- bl AddWindow
- strb r0, [r5, 0xE]
- str r4, [r5, 0x4]
- movs r5, 0x3
- b _080DFAF8
- .pool
-_080DFACC:
- ldr r0, =gUnknown_08589A38
- ldr r1, [r0, 0xC]
- ldr r0, [r0, 0x8]
- str r0, [sp, 0x8]
- str r1, [sp, 0xC]
- ldr r4, =gUnknown_08589A28
- adds r0, r4, 0
- movs r1, 0x2
- bl GetMaxWidthInMenuTable
- lsls r0, 24
- ldr r2, =0x00ffffff
- ldr r1, [sp, 0x8]
- ands r1, r2
- orrs r1, r0
- str r1, [sp, 0x8]
- add r0, sp, 0x8
- bl AddWindow
- strb r0, [r5, 0xE]
- str r4, [r5, 0x4]
- movs r5, 0x2
-_080DFAF8:
- ldr r4, =gUnknown_02039F60
- ldrb r0, [r4, 0xE]
- movs r1, 0
- bl SetStandardWindowBorderStyle
- ldrb r0, [r4, 0xE]
- ldr r2, [r4, 0x4]
- adds r1, r5, 0
- bl PrintMenuTable
- ldrb r0, [r4, 0xE]
- adds r1, r5, 0
- movs r2, 0
- bl InitMenuInUpperLeftCornerPlaySoundWhenAPressed
- ldrb r0, [r4, 0xE]
- bl PutWindowTilemap
- ldrb r0, [r4, 0xE]
- movs r1, 0x1
- bl CopyWindowToVram
- ldr r0, =Task_ShopMenu
- movs r1, 0x8
- bl CreateTask
- lsls r0, 24
- lsrs r0, 24
- add sp, 0x10
- pop {r4,r5}
- pop {r1}
- bx r1
- .pool
- thumb_func_end CreateShopMenu
-
- thumb_func_start SetShopMenuCallback
-@ void SetShopMenuCallback()
-SetShopMenuCallback: @ 80DFB4C
- ldr r1, =gUnknown_02039F60
- str r0, [r1]
- bx lr
- .pool
- thumb_func_end SetShopMenuCallback
-
- thumb_func_start SetShopItemsForSale
-@ int SetShopItemsForSale(s16 *itemsForSale)
-SetShopItemsForSale: @ 80DFB58
- push {lr}
- adds r1, r0, 0
- movs r2, 0
- ldr r3, =gUnknown_02039F60
- str r1, [r3, 0x8]
- strh r2, [r3, 0xC]
- ldrh r0, [r1]
- cmp r0, 0
- beq _080DFB80
-_080DFB6A:
- ldrh r0, [r3, 0xC]
- adds r0, 0x1
- strh r0, [r3, 0xC]
- adds r0, r2, 0x1
- lsls r0, 16
- lsrs r2, r0, 16
- lsls r0, r2, 1
- adds r0, r1
- ldrh r0, [r0]
- cmp r0, 0
- bne _080DFB6A
-_080DFB80:
- pop {r0}
- bx r0
- .pool
- thumb_func_end SetShopItemsForSale
-
- thumb_func_start Task_ShopMenu
-@ void Task_ShopMenu(u8 taskId)
-Task_ShopMenu: @ 80DFB88
- push {r4,r5,lr}
- lsls r0, 24
- lsrs r4, r0, 24
- adds r5, r4, 0
- bl Menu_ProcessInputNoWrapAround
- lsls r0, 24
- asrs r2, r0, 24
- movs r0, 0x2
- negs r0, r0
- cmp r2, r0
- beq _080DFBC4
- adds r0, 0x1
- cmp r2, r0
- bne _080DFBB4
- movs r0, 0x5
- bl PlaySE
- adds r0, r4, 0
- bl HandleShopMenuQuit
- b _080DFBC4
-_080DFBB4:
- ldr r0, =gUnknown_02039F60
- ldr r1, [r0, 0x4]
- lsls r0, r2, 3
- adds r0, r1
- ldr r1, [r0, 0x4]
- adds r0, r5, 0
- bl _call_via_r1
-_080DFBC4:
- pop {r4,r5}
- pop {r0}
- bx r0
- .pool
- thumb_func_end Task_ShopMenu
-
- thumb_func_start HandleShopMenuBuy
-@ void HandleShopMenuBuy(u8 taskId)
-HandleShopMenuBuy: @ 80DFBD0
- push {r4,lr}
- lsls r0, 24
- lsrs r0, 24
- lsls r1, r0, 2
- adds r1, r0
- lsls r1, 3
- ldr r2, =gTasks + 0x8
- adds r4, r1, r2
- ldr r3, =CB2_InitBuyMenu
- lsrs r0, r3, 16
- strh r0, [r4, 0x10]
- strh r3, [r4, 0x12]
- subs r2, 0x8
- adds r1, r2
- ldr r0, =Task_GoToBuyOrSellMenu
- str r0, [r1]
- movs r0, 0x1
- movs r1, 0
- bl FadeScreen
- pop {r4}
- pop {r0}
- bx r0
- .pool
- thumb_func_end HandleShopMenuBuy
-
- thumb_func_start HandleShopMenuSell
-@ void HandleShopMenuSell(u8 taskId)
-HandleShopMenuSell: @ 80DFC0C
- push {r4,lr}
- lsls r0, 24
- lsrs r0, 24
- lsls r1, r0, 2
- adds r1, r0
- lsls r1, 3
- ldr r2, =gTasks + 0x8
- adds r4, r1, r2
- ldr r3, =CB2_GoToSellMenu
- lsrs r0, r3, 16
- strh r0, [r4, 0x10]
- strh r3, [r4, 0x12]
- subs r2, 0x8
- adds r1, r2
- ldr r0, =Task_GoToBuyOrSellMenu
- str r0, [r1]
- movs r0, 0x1
- movs r1, 0
- bl FadeScreen
- pop {r4}
- pop {r0}
- bx r0
- .pool
- thumb_func_end HandleShopMenuSell
-
- thumb_func_start CB2_ExitSellMenu
-@ int CB2_ExitSellMenu()
-CB2_ExitSellMenu: @ 80DFC48
- push {lr}
- ldr r0, =gFieldCallback
- ldr r1, =MapPostLoadHook_ExitBuyOrSellMenu
- str r1, [r0]
- ldr r0, =CB2_ReturnToField
- bl SetMainCallback2
- pop {r0}
- bx r0
- .pool
- thumb_func_end CB2_ExitSellMenu
-
- thumb_func_start HandleShopMenuQuit
-@ void HandleShopMenuQuit(u8 taskId)
-HandleShopMenuQuit: @ 80DFC68
- push {r4,r5,lr}
- adds r4, r0, 0
- lsls r4, 24
- lsrs r4, 24
- ldr r5, =gUnknown_02039F60
- ldrb r0, [r5, 0xE]
- movs r1, 0x2
- bl sub_8198070
- ldrb r0, [r5, 0xE]
- bl RemoveWindow
- bl SaveRecordedItemPurchasesForTVShow
- bl ScriptContext2_Disable
- adds r0, r4, 0
- bl DestroyTask
- ldr r5, [r5]
- cmp r5, 0
- beq _080DFC98
- bl _call_via_r5
-_080DFC98:
- pop {r4,r5}
- pop {r0}
- bx r0
- .pool
- thumb_func_end HandleShopMenuQuit
-
- thumb_func_start Task_GoToBuyOrSellMenu
-@ int Task_GoToBuyOrSellMenu(u8 taskId)
-Task_GoToBuyOrSellMenu: @ 80DFCA4
- push {r4,lr}
- lsls r0, 24
- lsrs r2, r0, 24
- lsls r0, r2, 2
- adds r0, r2
- lsls r0, 3
- ldr r1, =gTasks + 0x8
- adds r4, r0, r1
- ldr r0, =gPaletteFade
- ldrb r1, [r0, 0x7]
- movs r0, 0x80
- ands r0, r1
- cmp r0, 0
- bne _080DFCD2
- adds r0, r2, 0
- bl DestroyTask
- ldrh r0, [r4, 0x10]
- lsls r0, 16
- ldrh r1, [r4, 0x12]
- orrs r0, r1
- bl SetMainCallback2
-_080DFCD2:
- pop {r4}
- pop {r0}
- bx r0
- .pool
- thumb_func_end Task_GoToBuyOrSellMenu
-
- thumb_func_start MapPostLoadHook_ExitBuyOrSellMenu
-@ void MapPostLoadHook_ExitBuyOrSellMenu()
-MapPostLoadHook_ExitBuyOrSellMenu: @ 80DFCE0
- push {lr}
- bl pal_fill_black
- ldr r0, =Task_ExitSellMenu
- movs r1, 0x8
- bl CreateTask
- pop {r0}
- bx r0
- .pool
- thumb_func_end MapPostLoadHook_ExitBuyOrSellMenu
-
- thumb_func_start Task_ExitSellMenu
-@ void Task_ExitSellMenu(u8 taskId)
-Task_ExitSellMenu: @ 80DFCF8
- push {r4,r5,lr}
- lsls r0, 24
- lsrs r4, r0, 24
- adds r5, r4, 0
- bl IsWeatherNotFadingIn
- lsls r0, 24
- lsrs r0, 24
- cmp r0, 0x1
- bne _080DFD36
- ldr r0, =gUnknown_02039F60
- ldrb r0, [r0, 0xF]
- cmp r0, 0x2
- bne _080DFD2C
- ldr r1, =gText_CanIHelpWithAnythingElse
- ldr r2, =ReturnToShopMenuAfterExitingSellMenu
- adds r0, r4, 0
- bl DisplayItemMessageOnField
- b _080DFD36
- .pool
-_080DFD2C:
- ldr r1, =gText_AnythingElseICanHelp
- ldr r2, =ReturnToShopMenuAfterExitingSellMenu
- adds r0, r5, 0
- bl DisplayItemMessageOnField
-_080DFD36:
- pop {r4,r5}
- pop {r0}
- bx r0
- .pool
- thumb_func_end Task_ExitSellMenu
-
- thumb_func_start ReturnToShopMenuAfterExitingSellMenu
-@ void ReturnToShopMenuAfterExitingSellMenu(u8 taskId)
-ReturnToShopMenuAfterExitingSellMenu: @ 80DFD44
- push {r4,lr}
- adds r4, r0, 0
- lsls r4, 24
- lsrs r4, 24
- ldr r0, =gUnknown_02039F60
- ldrb r0, [r0, 0xF]
- bl CreateShopMenu
- adds r0, r4, 0
- bl DestroyTask
- pop {r4}
- pop {r0}
- bx r0
- .pool
- thumb_func_end ReturnToShopMenuAfterExitingSellMenu
-
- thumb_func_start CB2_BuyMenu
-@ void CB2_BuyMenu()
-CB2_BuyMenu: @ 80DFD64
- push {lr}
- bl RunTasks
- bl AnimateSprites
- bl BuildOamBuffer
- bl do_scheduled_bg_tilemap_copies_to_vram
- bl UpdatePaletteFade
- pop {r0}
- bx r0
- thumb_func_end CB2_BuyMenu
-
- thumb_func_start VBlankCB_BuyMenu
-@ void VBlankCB_BuyMenu()
-VBlankCB_BuyMenu: @ 80DFD80
- push {lr}
- bl LoadOam
- bl ProcessSpriteCopyRequests
- bl TransferPlttBuffer
- pop {r0}
- bx r0
- thumb_func_end VBlankCB_BuyMenu
-
- thumb_func_start CB2_InitBuyMenu
-@ void CB2_InitBuyMenu()
-CB2_InitBuyMenu: @ 80DFD94
- push {r4,r5,lr}
- sub sp, 0xC
- ldr r0, =gMain
- movs r1, 0x87
- lsls r1, 3
- adds r5, r0, r1
- ldrb r4, [r5]
- cmp r4, 0
- beq _080DFE20
- cmp r4, 0x1
- bne _080DFDAC
- b _080DFEE4
-_080DFDAC:
- bl BuyMenuDrawGraphics
- bl BuyMenuAddScrollIndicatorArrows
- ldr r0, =Task_BuyMenu
- movs r1, 0x8
- bl CreateTask
- adds r4, r0, 0
- lsls r4, 24
- lsrs r4, 24
- ldr r0, =gMultiuseListMenuTemplate
- movs r1, 0
- movs r2, 0
- bl ListMenuInit
- ldr r2, =gTasks
- lsls r1, r4, 2
- adds r1, r4
- lsls r1, 3
- adds r1, r2
- lsls r0, 24
- lsrs r0, 24
- movs r5, 0
- strh r0, [r1, 0x16]
- movs r4, 0x1
- negs r4, r4
- adds r0, r4, 0
- movs r1, 0x10
- movs r2, 0
- bl BlendPalettes
- str r5, [sp]
- adds r0, r4, 0
- movs r1, 0
- movs r2, 0x10
- movs r3, 0
- bl BeginNormalPaletteFade
- ldr r0, =VBlankCB_BuyMenu
- bl SetVBlankCallback
- ldr r0, =CB2_BuyMenu
- bl SetMainCallback2
- b _080DFEF4
- .pool
-_080DFE20:
- bl SetVBlankHBlankCallbacksToNull
- str r4, [sp, 0x8]
- movs r1, 0xE0
- lsls r1, 19
- ldr r2, =0x01000100
- add r0, sp, 0x8
- bl CpuFastSet
- bl ScanlineEffect_Stop
- bl reset_temp_tile_data_buffers
- bl FreeAllSpritePalettes
- bl ResetPaletteFade
- bl ResetSpriteData
- bl ResetTasks
- bl clear_scheduled_bg_copies_to_vram
- ldr r4, =gUnknown_02039F70
- ldr r0, =0x000020b0
- bl AllocZeroed
- str r0, [r4]
- ldr r1, =0x0000200b
- adds r0, r1
- movs r1, 0xFF
- strb r1, [r0]
- ldr r0, [r4]
- ldr r1, =0x0000200d
- adds r0, r1
- movs r1, 0x1
- negs r1, r1
- strb r1, [r0]
- ldr r0, [r4]
- ldr r1, =0x0000200e
- adds r0, r1
- movs r1, 0x1
- negs r1, r1
- strb r1, [r0]
- bl BuyMenuBuildListMenuTemplate
- bl BuyMenuInitBgs
- movs r4, 0x20
- str r4, [sp]
- str r4, [sp, 0x4]
- movs r0, 0
- movs r1, 0
- movs r2, 0
- movs r3, 0
- bl FillBgTilemapBufferRect_Palette0
- str r4, [sp]
- str r4, [sp, 0x4]
- movs r0, 0x1
- movs r1, 0
- movs r2, 0
- movs r3, 0
- bl FillBgTilemapBufferRect_Palette0
- str r4, [sp]
- str r4, [sp, 0x4]
- movs r0, 0x2
- movs r1, 0
- movs r2, 0
- movs r3, 0
- bl FillBgTilemapBufferRect_Palette0
- str r4, [sp]
- str r4, [sp, 0x4]
- movs r0, 0x3
- movs r1, 0
- movs r2, 0
- movs r3, 0
- bl FillBgTilemapBufferRect_Palette0
- bl BuyMenuInitWindows
- bl BuyMenuDecompressBgGraphics
- b _080DFEEE
- .pool
-_080DFEE4:
- bl free_temp_tile_data_buffers_if_possible
- lsls r0, 24
- cmp r0, 0
- bne _080DFEF4
-_080DFEEE:
- ldrb r0, [r5]
- adds r0, 0x1
- strb r0, [r5]
-_080DFEF4:
- add sp, 0xC
- pop {r4,r5}
- pop {r0}
- bx r0
- thumb_func_end CB2_InitBuyMenu
-
- thumb_func_start BuyMenuFreeMemory
-@ void BuyMenuFreeMemory()
-BuyMenuFreeMemory: @ 80DFEFC
- push {lr}
- ldr r0, =gUnknown_02039F70
- ldr r0, [r0]
- bl Free
- ldr r0, =gUnknown_02039F74
- ldr r0, [r0]
- bl Free
- ldr r0, =gUnknown_02039F78
- ldr r0, [r0]
- bl Free
- bl FreeAllWindowBuffers
- pop {r0}
- bx r0
- .pool
- thumb_func_end BuyMenuFreeMemory
-
- thumb_func_start BuyMenuBuildListMenuTemplate
-@ void BuyMenuBuildListMenuTemplate()
-BuyMenuBuildListMenuTemplate: @ 80DFF2C
- push {r4-r7,lr}
- ldr r7, =gUnknown_02039F74
- ldr r4, =gUnknown_02039F60
- ldrh r0, [r4, 0xC]
- adds r0, 0x1
- lsls r0, 3
- bl Alloc
- str r0, [r7]
- ldr r5, =gUnknown_02039F78
- ldrh r0, [r4, 0xC]
- adds r0, 0x1
- lsls r0, 4
- bl Alloc
- str r0, [r5]
- movs r6, 0
- ldrh r0, [r4, 0xC]
- cmp r6, r0
- bcs _080DFF78
-_080DFF54:
- lsls r1, r6, 3
- ldr r0, [r7]
- adds r0, r1
- ldr r2, [r4, 0x8]
- lsls r1, r6, 1
- adds r1, r2
- ldrh r1, [r1]
- lsls r3, r6, 4
- ldr r2, [r5]
- adds r2, r3
- bl BuyMenuSetListEntry
- adds r0, r6, 0x1
- lsls r0, 16
- lsrs r6, r0, 16
- ldrh r2, [r4, 0xC]
- cmp r6, r2
- bcc _080DFF54
-_080DFF78:
- ldr r4, =gUnknown_02039F78
- lsls r5, r6, 4
- ldr r0, [r4]
- adds r0, r5
- ldr r1, =gText_Cancel2
- bl StringCopy
- ldr r2, =gUnknown_02039F74
- ldr r0, [r2]
- lsls r1, r6, 3
- adds r1, r0
- ldr r0, [r4]
- adds r0, r5
- str r0, [r1]
- movs r0, 0x2
- negs r0, r0
- str r0, [r1, 0x4]
- ldr r3, =gMultiuseListMenuTemplate
- adds r1, r3, 0
- ldr r0, =gUnknown_08589A48
- ldm r0!, {r4-r6}
- stm r1!, {r4-r6}
- ldm r0!, {r4-r6}
- stm r1!, {r4-r6}
- ldr r0, [r2]
- str r0, [r3]
- ldr r0, =gUnknown_02039F60
- ldrh r0, [r0, 0xC]
- adds r1, r0, 0x1
- strh r1, [r3, 0xC]
- lsls r0, r1, 16
- lsrs r0, 16
- cmp r0, 0x8
- bls _080DFFDC
- movs r0, 0x8
- strh r0, [r3, 0xE]
- b _080DFFDE
- .pool
-_080DFFDC:
- strh r1, [r3, 0xE]
-_080DFFDE:
- ldr r0, =gUnknown_02039F70
- ldr r0, [r0]
- ldr r1, =gMultiuseListMenuTemplate
- ldrh r1, [r1, 0xE]
- ldr r2, =0x00002004
- adds r0, r2
- strh r1, [r0]
- pop {r4-r7}
- pop {r0}
- bx r0
- .pool
- thumb_func_end BuyMenuBuildListMenuTemplate
-
- thumb_func_start BuyMenuSetListEntry
-@ void BuyMenuSetListEntry(struct ListMenuEntry *entry, u16 code, u8 *str)
-BuyMenuSetListEntry: @ 80E0000
- push {r4-r6,lr}
- adds r6, r0, 0
- adds r5, r2, 0
- lsls r1, 16
- lsrs r4, r1, 16
- ldr r0, =gUnknown_02039F60
- ldrb r0, [r0, 0xF]
- cmp r0, 0
- bne _080E0020
- adds r0, r4, 0
- adds r1, r5, 0
- bl CopyItemName
- b _080E002C
- .pool
-_080E0020:
- lsls r1, r4, 5
- ldr r0, =gDecorations + 1
- adds r1, r0
- adds r0, r5, 0
- bl StringCopy
-_080E002C:
- str r5, [r6]
- str r4, [r6, 0x4]
- pop {r4-r6}
- pop {r0}
- bx r0
- .pool
- thumb_func_end BuyMenuSetListEntry
-
- thumb_func_start BuyMenuPrintItemDescriptionAndShowItemIcon
-@ void BuyMenuPrintItemDescriptionAndShowItemIcon(s32 menuEntryCode, bool8 isInitialSelection, struct ListMenu *listMenu)
-BuyMenuPrintItemDescriptionAndShowItemIcon: @ 80E003C
- push {r4-r7,lr}
- mov r7, r8
- push {r7}
- sub sp, 0x8
- adds r7, r0, 0
- lsls r1, 24
- lsrs r1, 24
- cmp r1, 0x1
- beq _080E0054
- movs r0, 0x5
- bl PlaySE
-_080E0054:
- movs r0, 0x2
- negs r0, r0
- cmp r7, r0
- beq _080E0078
- lsls r4, r7, 16
- lsrs r0, r4, 16
- ldr r1, =gUnknown_02039F70
- ldr r1, [r1]
- ldr r2, =0x0000200c
- adds r1, r2
- ldrb r1, [r1]
- bl BuyMenuAddItemIcon
- b _080E008A
- .pool
-_080E0078:
- ldr r0, =0x0000ffff
- ldr r1, =gUnknown_02039F70
- ldr r1, [r1]
- ldr r2, =0x0000200c
- adds r1, r2
- ldrb r1, [r1]
- bl BuyMenuAddItemIcon
- lsls r4, r7, 16
-_080E008A:
- lsrs r4, 16
- mov r8, r4
- ldr r6, =gUnknown_02039F70
- ldr r0, [r6]
- ldr r5, =0x0000200c
- adds r0, r5
- ldrb r0, [r0]
- movs r4, 0x1
- adds r1, r4, 0
- eors r1, r0
- mov r0, r8
- bl BuyMenuRemoveItemIcon
- ldr r1, [r6]
- adds r1, r5
- ldrb r0, [r1]
- eors r0, r4
- strb r0, [r1]
- movs r0, 0x2
- negs r0, r0
- cmp r7, r0
- beq _080E00E8
- ldr r0, =gUnknown_02039F60
- ldrb r0, [r0, 0xF]
- cmp r0, 0
- bne _080E00D8
- mov r0, r8
- bl ItemId_GetDescription
- adds r4, r0, 0
- b _080E00EA
- .pool
-_080E00D8:
- ldr r0, =gDecorations
- lsls r1, r7, 5
- adds r0, 0x18
- adds r1, r0
- ldr r4, [r1]
- b _080E00EA
- .pool
-_080E00E8:
- ldr r4, =gText_QuitShopping
-_080E00EA:
- movs r0, 0x2
- movs r1, 0
- bl FillWindowPixelBuffer
- movs r0, 0
- str r0, [sp]
- str r0, [sp, 0x4]
- movs r0, 0x2
- adds r1, r4, 0
- movs r2, 0x3
- movs r3, 0x1
- bl BuyMenuPrint
- add sp, 0x8
- pop {r3}
- mov r8, r3
- pop {r4-r7}
- pop {r0}
- bx r0
- .pool
- thumb_func_end BuyMenuPrintItemDescriptionAndShowItemIcon
-
- thumb_func_start BuyMenuPrintPriceInList
-@ void BuyMenuPrintPriceInList(u8 windowId, s32 menuEntryCode, u8 y)
-BuyMenuPrintPriceInList: @ 80E0114
- push {r4-r7,lr}
- sub sp, 0x14
- lsls r0, 24
- lsrs r6, r0, 24
- lsls r2, 24
- lsrs r7, r2, 24
- movs r0, 0x2
- negs r0, r0
- cmp r1, r0
- beq _080E01AC
- ldr r0, =gUnknown_02039F60
- ldrb r0, [r0, 0xF]
- cmp r0, 0
- bne _080E0164
- ldr r5, =gStringVar1
- lsls r0, r1, 16
- lsrs r0, 16
- bl ItemId_GetPrice
- adds r4, r0, 0
- movs r0, 0x1
- bl GetPriceReduction
- lsls r4, 16
- lsrs r4, 16
- lsls r0, 24
- lsrs r0, 24
- asrs r4, r0
- adds r0, r5, 0
- adds r1, r4, 0
- movs r2, 0
- movs r3, 0x5
- bl ConvertIntToDecimalStringN
- b _080E0176
- .pool
-_080E0164:
- ldr r0, =gStringVar1
- ldr r2, =gDecorations
- lsls r1, 5
- adds r1, r2
- ldrh r1, [r1, 0x14]
- movs r2, 0
- movs r3, 0x5
- bl ConvertIntToDecimalStringN
-_080E0176:
- ldr r4, =gStringVar4
- ldr r1, =gText_PokedollarVar1
- adds r0, r4, 0
- bl StringExpandPlaceholders
- movs r0, 0x7
- adds r1, r4, 0
- movs r2, 0x78
- bl GetStringRightAlignXOffset
- adds r2, r0, 0
- lsls r2, 24
- lsrs r2, 24
- movs r0, 0
- str r0, [sp]
- str r0, [sp, 0x4]
- ldr r0, =gUnknown_08589AB3
- str r0, [sp, 0x8]
- movs r0, 0x1
- negs r0, r0
- str r0, [sp, 0xC]
- str r4, [sp, 0x10]
- adds r0, r6, 0
- movs r1, 0x7
- adds r3, r7, 0
- bl AddTextPrinterParameterized2
-_080E01AC:
- add sp, 0x14
- pop {r4-r7}
- pop {r0}
- bx r0
- .pool
- thumb_func_end BuyMenuPrintPriceInList
-
thumb_func_start BuyMenuAddScrollIndicatorArrows
@ void BuyMenuAddScrollIndicatorArrows()
BuyMenuAddScrollIndicatorArrows: @ 80E01C8
push {r4,r5,lr}
sub sp, 0x10
- ldr r5, =gUnknown_02039F70
+ ldr r5, =gShopDataPtr
ldr r2, [r5]
ldr r4, =0x0000200b
adds r0, r2, r4
ldrb r0, [r0]
cmp r0, 0xFF
bne _080E0206
- ldr r0, =gUnknown_02039F60
+ ldr r0, =gMartInfo
ldrh r1, [r0, 0xC]
adds r0, r1, 0x1
cmp r0, 0x8
@@ -893,7 +50,7 @@ _080E0206:
@ void BuyMenuRemoveScrollIndicatorArrows()
BuyMenuRemoveScrollIndicatorArrows: @ 80E0224
push {r4,lr}
- ldr r4, =gUnknown_02039F70
+ ldr r4, =gShopDataPtr
ldr r0, [r4]
ldr r2, =0x0000200b
adds r1, r0, r2
@@ -950,7 +107,7 @@ BuyMenuAddItemIcon: @ 80E0284
lsrs r2, r0, 16
lsls r1, 24
lsrs r3, r1, 24
- ldr r0, =gUnknown_02039F70
+ ldr r0, =gShopDataPtr
ldr r4, =0x0000200d
adds r1, r3, r4
ldr r0, [r0]
@@ -958,7 +115,7 @@ BuyMenuAddItemIcon: @ 80E0284
ldrb r0, [r4]
cmp r0, 0xFF
bne _080E0310
- ldr r0, =gUnknown_02039F60
+ ldr r0, =gMartInfo
ldrb r0, [r0, 0xF]
cmp r0, 0
beq _080E02AE
@@ -1016,7 +173,7 @@ BuyMenuRemoveItemIcon: @ 80E031C
push {r4,r5,lr}
lsls r1, 24
lsrs r4, r1, 24
- ldr r0, =gUnknown_02039F70
+ ldr r0, =gShopDataPtr
ldr r2, =0x0000200d
adds r1, r4, r2
ldr r0, [r0]
@@ -1056,7 +213,7 @@ BuyMenuInitBgs: @ 80E036C
movs r0, 0
movs r2, 0x4
bl InitBgsFromTemplates
- ldr r4, =gUnknown_02039F70
+ ldr r4, =gShopDataPtr
ldr r1, [r4]
movs r0, 0x80
lsls r0, 4
@@ -1134,7 +291,7 @@ BuyMenuDecompressBgGraphics: @ 80E0424
movs r0, 0x1
bl decompress_and_copy_tile_data_to_vram
ldr r0, =gBuyMenuFrame_Tilemap
- ldr r1, =gUnknown_02039F70
+ ldr r1, =gShopDataPtr
ldr r1, [r1]
bl LZDecompressWram
ldr r0, =gMenuMoneyPal
@@ -1427,7 +584,7 @@ _080E0690:
beq _080E06F8
b _080E0728
_080E0696:
- ldr r6, =gUnknown_02039F70
+ ldr r6, =gShopDataPtr
ldr r0, [r6]
movs r2, 0xC0
lsls r2, 5
@@ -1446,7 +603,7 @@ _080E0696:
b _080E06E2
.pool
_080E06C0:
- ldr r6, =gUnknown_02039F70
+ ldr r6, =gShopDataPtr
ldr r0, [r6]
movs r2, 0x80
lsls r2, 5
@@ -1472,7 +629,7 @@ _080E06E2:
b _080E0728
.pool
_080E06F8:
- ldr r6, =gUnknown_02039F70
+ ldr r6, =gShopDataPtr
ldr r0, [r6]
movs r2, 0x80
lsls r2, 5
@@ -1542,7 +699,7 @@ BuyMenuCollectEventObjectData: @ 80E075C
adds r1, r4, 0
bl GetXYCoordsOneStepInFrontOfPlayer
movs r7, 0
- ldr r5, =gUnknown_02039F70
+ ldr r5, =gShopDataPtr
ldr r3, =0x00002010
movs r2, 0x10
_080E0780:
@@ -1560,7 +717,7 @@ _080E0780:
bls _080E0780
movs r7, 0
str r4, [sp, 0x8]
- ldr r1, =gUnknown_02039F70
+ ldr r1, =gShopDataPtr
mov r9, r1
mov r2, sp
str r2, [sp, 0x4]
@@ -1728,7 +885,7 @@ BuyMenuDrawEventObjects: @ 80E08F0
push {r5-r7}
sub sp, 0x4
movs r7, 0
- ldr r0, =gUnknown_02039F70
+ ldr r0, =gShopDataPtr
mov r8, r0
ldr r1, =gEventObjects
mov r10, r1
@@ -1883,7 +1040,7 @@ _080E0A3A:
@ void BuyMenuCopyMenuBgToBg1TilemapBuffer()
BuyMenuCopyMenuBgToBg1TilemapBuffer: @ 80E0A40
push {r4-r6,lr}
- ldr r0, =gUnknown_02039F70
+ ldr r0, =gShopDataPtr
ldr r0, [r0]
movs r1, 0x80
lsls r1, 4
@@ -1921,7 +1078,7 @@ _080E0A6A:
@ bool8 BuyMenuCheckForOverlapWithMenuBg(u16 x, u16 y)
BuyMenuCheckForOverlapWithMenuBg: @ 80E0A88
push {lr}
- ldr r2, =gUnknown_02039F70
+ ldr r2, =gShopDataPtr
ldr r2, [r2]
lsls r0, 1
lsls r1, 6
@@ -1979,7 +1136,7 @@ _080E0AEA:
bl ListMenuHandleInputGetItemId
adds r5, r0, 0
ldrb r0, [r4, 0xE]
- ldr r7, =gUnknown_02039F70
+ ldr r7, =gShopDataPtr
ldr r2, [r7]
ldr r3, =0x00002008
adds r1, r2, r3
@@ -2011,7 +1168,7 @@ _080E0B32:
ldrb r0, [r4, 0xE]
movs r1, 0x2
bl BuyMenuPrintCursor
- ldr r0, =gUnknown_02039F60
+ ldr r0, =gMartInfo
ldrb r0, [r0, 0xF]
cmp r0, 0
bne _080E0B80
@@ -2049,7 +1206,7 @@ _080E0B92:
movs r1, 0x92
lsls r1, 3
adds r0, r1
- ldr r2, =gUnknown_02039F70
+ ldr r2, =gShopDataPtr
mov r8, r2
ldr r1, [r2]
movs r7, 0x80
@@ -2065,7 +1222,7 @@ _080E0B92:
b _080E0C28
.pool
_080E0BD0:
- ldr r4, =gUnknown_02039F60
+ ldr r4, =gMartInfo
ldrb r0, [r4, 0xF]
cmp r0, 0
bne _080E0C38
@@ -2199,7 +1356,7 @@ Task_BuyHowManyDialogueInit: @ 80E0CA4
lsls r1, 3
adds r0, r1
bl GetMoney
- ldr r1, =gUnknown_02039F70
+ ldr r1, =gShopDataPtr
ldr r4, [r1]
movs r2, 0x80
lsls r2, 6
@@ -2248,7 +1405,7 @@ Task_BuyHowManyDialogueHandleInput: @ 80E0D88
ldr r1, =gTasks + 0x8
adds r5, r0, r1
adds r0, r5, 0x2
- ldr r7, =gUnknown_02039F70
+ ldr r7, =gShopDataPtr
ldr r1, [r7]
ldr r2, =0x0000200a
adds r1, r2
@@ -2389,7 +1546,7 @@ BuyMenuTryMakePurchase: @ 80E0EDC
adds r4, r0, r1
movs r0, 0x1
bl PutWindowTilemap
- ldr r6, =gUnknown_02039F60
+ ldr r6, =gMartInfo
ldrb r0, [r6, 0xF]
cmp r0, 0
bne _080E0F40
@@ -2459,7 +1616,7 @@ BuyMenuSubtractMoney: @ 80E0F88
movs r4, 0x92
lsls r4, 3
adds r0, r4
- ldr r1, =gUnknown_02039F70
+ ldr r1, =gShopDataPtr
ldr r1, [r1]
movs r2, 0x80
lsls r2, 6
@@ -2475,7 +1632,7 @@ BuyMenuSubtractMoney: @ 80E0F88
movs r0, 0
movs r2, 0
bl PrintMoneyAmountInMoneyBox
- ldr r0, =gUnknown_02039F60
+ ldr r0, =gMartInfo
ldrb r0, [r0, 0xF]
cmp r0, 0
bne _080E0FF0
@@ -2623,7 +1780,7 @@ BuyMenuPrintItemQuantityAndPrice: @ 80E10EC
movs r0, 0x4
movs r1, 0x11
bl FillWindowPixelBuffer
- ldr r0, =gUnknown_02039F70
+ ldr r0, =gShopDataPtr
ldr r0, [r0]
movs r1, 0x80
lsls r1, 6
diff --git a/include/shop.h b/include/shop.h
index 9b14a672e..d7822ec31 100644
--- a/include/shop.h
+++ b/include/shop.h
@@ -3,6 +3,40 @@
extern EWRAM_DATA struct ItemSlot gUnknown_02039F80[3];
+enum
+{
+ MART_TYPE_0, // normal mart
+ MART_TYPE_1,
+ MART_TYPE_2,
+};
+
+struct MartInfo
+{
+ /*0x0*/ void (* callback) (void);
+ /*0x4*/ const struct MenuAction *menuActions;
+ /*0x8*/ const u16 *itemList;
+ /*0xC*/ u16 itemCount;
+ /*0xE*/ u8 windowId;
+ /*0xF*/ u8 martType;
+};
+
+struct BuyMenuLabel
+{
+ u8 label[16];
+};
+
+struct ShopData
+{
+ /*0x0000*/ u8 filler0[0x2004];
+ /*0x2004*/ u16 unk2004;
+ /*0x2006*/ u8 filler2006[0x5];
+ /*0x200B*/ u8 unk200B;
+ /*0x200C*/ u8 unk200C;
+ /*0x200D*/ s8 unk200D;
+ /*0x200E*/ s8 unk200E;
+ /*0x200F*/ u8 filler200F[0xA1];
+};
+
void CreatePokemartMenu(const u16 *);
void CreateDecorationShop1Menu(const u16 *);
void CreateDecorationShop2Menu(const u16 *);
diff --git a/include/strings.h b/include/strings.h
index e72360563..0515f953f 100644
--- a/include/strings.h
+++ b/include/strings.h
@@ -151,8 +151,6 @@ extern const u8 gMenuText_Confirm[];
extern const u8 gMenuText_Show[];
extern const u8 gMenuText_Give2[];
-extern const u8 gText_Cancel2[];
-
extern const u8 gText_WithdrawPokemon[];
extern const u8 gText_WithdrawMonDescription[];
extern const u8 gText_DepositPokemon[];
@@ -843,4 +841,9 @@ extern const u8 gText_TwoDashes[];
extern const u8 *const gReturnToXStringsTable2[];
+extern const u8 gText_CanIHelpWithAnythingElse[];
+extern const u8 gText_AnythingElseICanHelp[];
+extern const u8 gText_QuitShopping[];
+extern const u8 gText_PokedollarVar1[];
+
#endif //GUARD_STRINGS_H
diff --git a/include/tv.h b/include/tv.h
index 7a938f888..4f1d7730f 100644
--- a/include/tv.h
+++ b/include/tv.h
@@ -50,5 +50,6 @@ void PutBattleUpdateOnTheAir(u8 opponentLinkPlayerId, u16 move, u16 speciesPlaye
void BravoTrainerPokemonProfile_BeforeInterview1(u16 move);
void UpdateTVScreensOnMap(int, int);
void TV_PrintIntToStringVar(u8 varIdx, int value);
+void SaveRecordedItemPurchasesForTVShow(void);
#endif //GUARD_TV_H
diff --git a/ld_script.txt b/ld_script.txt
index 668cf7c5a..1a94ae87a 100644
--- a/ld_script.txt
+++ b/ld_script.txt
@@ -138,6 +138,7 @@ SECTIONS {
src/item.o(.text);
src/contest.o(.text);
asm/contest.o(.text);
+ src/shop.o(.text);
asm/shop.o(.text);
src/berry.o(.text);
asm/script_menu.o(.text);
diff --git a/src/money.c b/src/money.c
index 98f25a42a..9f2348f18 100644
--- a/src/money.c
+++ b/src/money.c
@@ -6,10 +6,9 @@
#include "menu.h"
#include "window.h"
#include "sprite.h"
+#include "strings.h"
#include "decompress.h"
-extern const u8 gText_PokedollarVar1[];
-
extern const u8 gMenuMoneyGfx[];
extern const u8 gMenuMoneyPal[];
diff --git a/src/shop.c b/src/shop.c
new file mode 100755
index 000000000..5dc85859b
--- /dev/null
+++ b/src/shop.c
@@ -0,0 +1,360 @@
+#include "global.h"
+#include "bg.h"
+#include "decoration.h"
+#include "field_screen.h"
+#include "field_weather.h"
+#include "international_string_util.h"
+#include "item.h"
+#include "list_menu.h"
+#include "main.h"
+#include "malloc.h"
+#include "menu.h"
+#include "menu_helpers.h"
+#include "overworld.h"
+#include "palette.h"
+#include "scanline_effect.h"
+#include "script.h"
+#include "shop.h"
+#include "sound.h"
+#include "string_util.h"
+#include "strings.h"
+#include "tv.h"
+#include "constants/rgb.h"
+#include "constants/songs.h"
+
+extern struct ShopData *gShopDataPtr;
+extern struct ListMenuItem *gUnknown_02039F74;
+extern u8 (*gUnknown_02039F78)[16];
+extern struct MartInfo gMartInfo;
+
+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[];
+
+static void Task_ShopMenu(u8 taskId);
+void HandleShopMenuQuit(u8 taskId);
+void CB2_InitBuyMenu(void);
+static void Task_GoToBuyOrSellMenu(u8 taskId);
+void CB2_GoToSellMenu(void);
+void MapPostLoadHook_ExitBuyOrSellMenu(void);
+void Task_ExitSellMenu(u8 taskId);
+void ReturnToShopMenuAfterExitingSellMenu(u8 taskId);
+void BuyMenuDrawGraphics(void);
+void BuyMenuAddScrollIndicatorArrows(void);
+void Task_BuyMenu(u8 taskId);
+void BuyMenuBuildListMenuTemplate(void);
+void BuyMenuInitBgs(void);
+void BuyMenuInitWindows(void);
+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);
+
+
+/*static*/ u8 CreateShopMenu(u8 martType)
+{
+ int numMenuItems;
+
+ ScriptContext2_Enable();
+ gMartInfo.martType = martType;
+
+ if (martType == MART_TYPE_0)
+ {
+ struct WindowTemplate winTemplate;
+ winTemplate = gUnknown_08589A38[0];
+ winTemplate.width = GetMaxWidthInMenuTable(gUnknown_08589A10, ARRAY_COUNT(gUnknown_08589A10));
+ gMartInfo.windowId = AddWindow(&winTemplate);
+ gMartInfo.menuActions = gUnknown_08589A10;
+ numMenuItems = ARRAY_COUNT(gUnknown_08589A10);
+ }
+ else
+ {
+ struct WindowTemplate winTemplate;
+ winTemplate = gUnknown_08589A38[1];
+ winTemplate.width = GetMaxWidthInMenuTable(gUnknown_08589A28, ARRAY_COUNT(gUnknown_08589A28));
+ gMartInfo.windowId = AddWindow(&winTemplate);
+ gMartInfo.menuActions = gUnknown_08589A28;
+ numMenuItems = ARRAY_COUNT(gUnknown_08589A28);
+ }
+
+ SetStandardWindowBorderStyle(gMartInfo.windowId, 0);
+ PrintMenuTable(gMartInfo.windowId, numMenuItems, gMartInfo.menuActions);
+ InitMenuInUpperLeftCornerPlaySoundWhenAPressed(gMartInfo.windowId, numMenuItems, 0);
+ PutWindowTilemap(gMartInfo.windowId);
+ CopyWindowToVram(gMartInfo.windowId, 1);
+
+ return CreateTask(Task_ShopMenu, 8);
+}
+
+/*static*/ void SetShopMenuCallback(void (* callback)(void))
+{
+ gMartInfo.callback = callback;
+}
+
+/*static*/ void SetShopItemsForSale(const u16 *items)
+{
+ u16 i = 0;
+
+ gMartInfo.itemList = items;
+ gMartInfo.itemCount = 0;
+
+ while (gMartInfo.itemList[i])
+ {
+ gMartInfo.itemCount++;
+ i++;
+ }
+}
+
+static void Task_ShopMenu(u8 taskId)
+{
+ s8 inputCode = Menu_ProcessInputNoWrapAround();
+ switch (inputCode)
+ {
+ case -2:
+ break;
+ case -1:
+ PlaySE(SE_SELECT);
+ HandleShopMenuQuit(taskId);
+ break;
+ default:
+ gMartInfo.menuActions[inputCode].func.void_u8(taskId);
+ break;
+ }
+}
+
+void HandleShopMenuBuy(u8 taskId)
+{
+ s16 *taskData = gTasks[taskId].data;
+ taskData[8] = (u32)CB2_InitBuyMenu >> 16;
+ taskData[9] = (u32)CB2_InitBuyMenu;
+ gTasks[taskId].func = Task_GoToBuyOrSellMenu;
+ FadeScreen(1, 0);
+}
+
+void HandleShopMenuSell(u8 taskId)
+{
+ s16 *taskData = gTasks[taskId].data;
+ taskData[8] = (u32)CB2_GoToSellMenu >> 16;
+ taskData[9] = (u32)CB2_GoToSellMenu;
+ gTasks[taskId].func = Task_GoToBuyOrSellMenu;
+ FadeScreen(1, 0);
+}
+
+void CB2_ExitSellMenu(void)
+{
+ gFieldCallback = MapPostLoadHook_ExitBuyOrSellMenu;
+ SetMainCallback2(CB2_ReturnToField);
+}
+
+/*static*/ void HandleShopMenuQuit(u8 taskId)
+{
+ sub_8198070(gMartInfo.windowId, 2);
+ RemoveWindow(gMartInfo.windowId);
+ SaveRecordedItemPurchasesForTVShow();
+ ScriptContext2_Disable();
+ DestroyTask(taskId);
+
+ if (gMartInfo.callback)
+ gMartInfo.callback();
+}
+
+static void Task_GoToBuyOrSellMenu(u8 taskId)
+{
+ s16 *taskData = gTasks[taskId].data;
+ if (!gPaletteFade.active)
+ {
+ DestroyTask(taskId);
+ SetMainCallback2((void *)((u16)taskData[8] << 16 | (u16)taskData[9]));
+ }
+}
+
+void MapPostLoadHook_ExitBuyOrSellMenu(void)
+{
+ pal_fill_black();
+ CreateTask(Task_ExitSellMenu, 8);
+}
+
+void Task_ExitSellMenu(u8 taskId)
+{
+ if (IsWeatherNotFadingIn() == TRUE)
+ {
+ if (gMartInfo.martType == MART_TYPE_2)
+ DisplayItemMessageOnField(taskId, gText_CanIHelpWithAnythingElse, ReturnToShopMenuAfterExitingSellMenu);
+ else
+ DisplayItemMessageOnField(taskId, gText_AnythingElseICanHelp, ReturnToShopMenuAfterExitingSellMenu);
+ }
+}
+
+void ReturnToShopMenuAfterExitingSellMenu(u8 taskId)
+{
+ CreateShopMenu(gMartInfo.martType);
+ DestroyTask(taskId);
+}
+
+void CB2_BuyMenu(void)
+{
+ RunTasks();
+ AnimateSprites();
+ BuildOamBuffer();
+ do_scheduled_bg_tilemap_copies_to_vram();
+ UpdatePaletteFade();
+}
+
+void VBlankCB_BuyMenu(void)
+{
+ LoadOam();
+ ProcessSpriteCopyRequests();
+ TransferPlttBuffer();
+}
+
+void CB2_InitBuyMenu(void)
+{
+ u8 taskId;
+
+ switch (gMain.state)
+ {
+ case 0:
+ SetVBlankHBlankCallbacksToNull();
+ CpuFastFill(0, (void *)OAM, 0x400);
+ ScanlineEffect_Stop();
+ reset_temp_tile_data_buffers();
+ FreeAllSpritePalettes();
+ ResetPaletteFade();
+ ResetSpriteData();
+ ResetTasks();
+ clear_scheduled_bg_copies_to_vram();
+ gShopDataPtr = AllocZeroed(sizeof(struct ShopData));
+ gShopDataPtr->unk200B = 0xFF;
+ gShopDataPtr->unk200D = -1;
+ gShopDataPtr->unk200E = -1;
+ BuyMenuBuildListMenuTemplate();
+ BuyMenuInitBgs();
+ FillBgTilemapBufferRect_Palette0(0, 0, 0, 0, 0x20, 0x20);
+ FillBgTilemapBufferRect_Palette0(1, 0, 0, 0, 0x20, 0x20);
+ FillBgTilemapBufferRect_Palette0(2, 0, 0, 0, 0x20, 0x20);
+ FillBgTilemapBufferRect_Palette0(3, 0, 0, 0, 0x20, 0x20);
+ BuyMenuInitWindows();
+ BuyMenuDecompressBgGraphics();
+ gMain.state++;
+ break;
+ case 1:
+ if (!free_temp_tile_data_buffers_if_possible())
+ gMain.state++;
+ break;
+ default:
+ BuyMenuDrawGraphics();
+ BuyMenuAddScrollIndicatorArrows();
+ taskId = CreateTask(Task_BuyMenu, 8);
+ gTasks[taskId].data[7] = ListMenuInit(&gMultiuseListMenuTemplate, 0, 0);
+ BlendPalettes(0xFFFFFFFF, 0x10, RGB_BLACK);
+ BeginNormalPaletteFade(0xFFFFFFFF, 0, 0x10, 0, RGB_BLACK);
+ SetVBlankCallback(VBlankCB_BuyMenu);
+ SetMainCallback2(CB2_BuyMenu);
+ break;
+ }
+}
+
+void BuyMenuFreeMemory(void)
+{
+ Free(gShopDataPtr);
+ Free(gUnknown_02039F74);
+ Free(gUnknown_02039F78);
+ FreeAllWindowBuffers();
+}
+
+void BuyMenuBuildListMenuTemplate(void)
+{
+ u16 i;
+ u16 itemCount;
+
+ gUnknown_02039F74 = Alloc((gMartInfo.itemCount + 1) * sizeof(*gUnknown_02039F74));
+ gUnknown_02039F78 = Alloc((gMartInfo.itemCount + 1) * sizeof(*gUnknown_02039F78));
+ for (i = 0; i < gMartInfo.itemCount; i++)
+ BuyMenuSetListEntry(&gUnknown_02039F74[i], gMartInfo.itemList[i], gUnknown_02039F78[i]);
+
+ StringCopy(gUnknown_02039F78[i], gText_Cancel2);
+ gUnknown_02039F74[i].name = gUnknown_02039F78[i];
+ gUnknown_02039F74[i].id = -2;
+
+ gMultiuseListMenuTemplate = gUnknown_08589A48;
+ gMultiuseListMenuTemplate.items = gUnknown_02039F74;
+ gMultiuseListMenuTemplate.totalItems = gMartInfo.itemCount + 1;
+ if (gMultiuseListMenuTemplate.totalItems > 8)
+ gMultiuseListMenuTemplate.maxShowed = 8;
+ else
+ gMultiuseListMenuTemplate.maxShowed = gMultiuseListMenuTemplate.totalItems;
+
+ gShopDataPtr->unk2004 = gMultiuseListMenuTemplate.maxShowed;
+}
+
+void BuyMenuSetListEntry(struct ListMenuItem *menuItem, u16 item, u8 *name)
+{
+ if (gMartInfo.martType == MART_TYPE_0)
+ CopyItemName(item, name);
+ else
+ StringCopy(name, gDecorations[item].name);
+
+ menuItem->name = name;
+ menuItem->id = item;
+}
+
+void BuyMenuPrintItemDescriptionAndShowItemIcon(int item, bool8 onInit, struct ListMenu *list)
+{
+ const u8 *description;
+ if (onInit != TRUE)
+ PlaySE(SE_SELECT);
+
+ if (item != -2)
+ BuyMenuAddItemIcon(item, gShopDataPtr->unk200C);
+ else
+ BuyMenuAddItemIcon(-1, gShopDataPtr->unk200C);
+
+ BuyMenuRemoveItemIcon(item, gShopDataPtr->unk200C ^ 1);
+ gShopDataPtr->unk200C ^= 1;
+ if (item != -2)
+ {
+ if (gMartInfo.martType == MART_TYPE_0)
+ description = ItemId_GetDescription(item);
+ else
+ description = gDecorations[item].description;
+ }
+ else
+ {
+ description = gText_QuitShopping;
+ }
+
+ FillWindowPixelBuffer(2, 0);
+ BuyMenuPrint(2, description, 3, 1, 0, 0);
+}
+
+void BuyMenuPrintPriceInList(u8 windowId, int item, u8 y)
+{
+ u8 x;
+
+ if (item != -2)
+ {
+ if (gMartInfo.martType == MART_TYPE_0)
+ {
+ ConvertIntToDecimalStringN(
+ gStringVar1,
+ ItemId_GetPrice(item) >> GetPriceReduction(1),
+ STR_CONV_MODE_LEFT_ALIGN,
+ 5);
+ }
+ else
+ {
+ ConvertIntToDecimalStringN(
+ gStringVar1,
+ gDecorations[item].price,
+ STR_CONV_MODE_LEFT_ALIGN,
+ 5);
+ }
+
+ StringExpandPlaceholders(gStringVar4, gText_PokedollarVar1);
+ x = GetStringRightAlignXOffset(7, gStringVar4, 0x78);
+ AddTextPrinterParameterized2(windowId, 7, x, y, 0, 0, gUnknown_08589AB3, -1, gStringVar4);
+ }
+}
diff --git a/sym_ewram.txt b/sym_ewram.txt
index bf2632e91..aad8b2d25 100644
--- a/sym_ewram.txt
+++ b/sym_ewram.txt
@@ -391,10 +391,10 @@ gUnknown_02039F5C: @ 2039F5C
gUnknown_02039F5D: @ 2039F5D
.space 0x3
-gUnknown_02039F60: @ 2039F60
+gMartInfo: @ 2039F60
.space 0x10
-gUnknown_02039F70: @ 2039F70
+gShopDataPtr: @ 2039F70
.space 0x4
gUnknown_02039F74: @ 2039F74