diff options
-rw-r--r-- | asm/shop.s | 1821 | ||||
-rw-r--r-- | data/shop.s | 80 | ||||
-rw-r--r-- | include/graphics.h | 4 | ||||
-rw-r--r-- | include/item_menu.h | 1 | ||||
-rw-r--r-- | include/party_menu.h | 1 | ||||
-rw-r--r-- | include/shop.h | 37 | ||||
-rw-r--r-- | include/strings.h | 16 | ||||
-rw-r--r-- | ld_script.txt | 5 | ||||
-rw-r--r-- | src/fldeff_escalator.c | 132 | ||||
-rwxr-xr-x | src/shop.c | 1039 | ||||
-rw-r--r-- | src/strings.c | 6 | ||||
-rw-r--r-- | src/tv.c | 22 | ||||
-rw-r--r-- | sym_ewram.txt | 23 |
13 files changed, 990 insertions, 2197 deletions
diff --git a/asm/shop.s b/asm/shop.s deleted file mode 100644 index 56658c4ff..000000000 --- a/asm/shop.s +++ /dev/null @@ -1,1821 +0,0 @@ - .include "asm/macros.inc" - .include "constants/constants.inc" - - .syntax unified - - .text - - thumb_func_start BuyMenuDrawMapMetatile -@ void BuyMenuDrawMapMetatile(u16 x, u16 y, u16 *src, u8 metatileLayerType) -BuyMenuDrawMapMetatile: @ 80E0670 - push {r4-r7,lr} - adds r7, r2, 0 - lsls r3, 24 - lsrs r3, 24 - adds r2, r3, 0 - lsls r0, 17 - lsrs r5, r0, 16 - lsls r1, 22 - lsrs r1, 16 - cmp r3, 0x1 - beq _080E06C0 - cmp r3, 0x1 - bgt _080E0690 - cmp r3, 0 - beq _080E0696 - b _080E0728 -_080E0690: - cmp r2, 0x2 - beq _080E06F8 - b _080E0728 -_080E0696: - ldr r6, =gShopDataPtr - ldr r0, [r6] - movs r2, 0xC0 - lsls r2, 5 - adds r0, r2 - lsls r5, 16 - asrs r5, 16 - lsls r4, r1, 16 - asrs r4, 16 - adds r1, r5, 0 - adds r2, r4, 0 - adds r3, r7, 0 - bl BuyMenuDrawMapMetatileLayer - ldr r0, [r6] - movs r1, 0x80 - lsls r1, 4 - b _080E06E2 - .pool -_080E06C0: - ldr r6, =gShopDataPtr - ldr r0, [r6] - movs r2, 0x80 - lsls r2, 5 - adds r0, r2 - lsls r5, 16 - asrs r5, 16 - lsls r4, r1, 16 - asrs r4, 16 - adds r1, r5, 0 - adds r2, r4, 0 - adds r3, r7, 0 - bl BuyMenuDrawMapMetatileLayer - ldr r0, [r6] - movs r1, 0xC0 - lsls r1, 5 -_080E06E2: - adds r0, r1 - adds r3, r7, 0 - adds r3, 0x8 - adds r1, r5, 0 - adds r2, r4, 0 - bl BuyMenuDrawMapMetatileLayer - b _080E0728 - .pool -_080E06F8: - ldr r6, =gShopDataPtr - ldr r0, [r6] - movs r2, 0x80 - lsls r2, 5 - adds r0, r2 - lsls r5, 16 - asrs r5, 16 - lsls r4, r1, 16 - asrs r4, 16 - adds r1, r5, 0 - adds r2, r4, 0 - adds r3, r7, 0 - bl BuyMenuDrawMapMetatileLayer - ldr r0, [r6] - movs r1, 0x80 - lsls r1, 4 - adds r0, r1 - adds r3, r7, 0 - adds r3, 0x8 - adds r1, r5, 0 - adds r2, r4, 0 - bl BuyMenuDrawMapMetatileLayer -_080E0728: - pop {r4-r7} - pop {r0} - bx r0 - .pool - thumb_func_end BuyMenuDrawMapMetatile - - thumb_func_start BuyMenuDrawMapMetatileLayer -@ int BuyMenuDrawMapMetatileLayer(void *tilemapBuffer, s16 xOffset, s16 yOffset, u16 *src) -BuyMenuDrawMapMetatileLayer: @ 80E0734 - lsls r1, 16 - asrs r1, 16 - lsls r2, 16 - asrs r2, 16 - adds r1, r2 - lsls r1, 1 - adds r1, r0 - ldrh r0, [r3] - strh r0, [r1] - ldrh r0, [r3, 0x2] - strh r0, [r1, 0x2] - adds r2, r1, 0 - adds r2, 0x40 - ldrh r0, [r3, 0x4] - strh r0, [r2] - adds r1, 0x42 - ldrh r0, [r3, 0x6] - strh r0, [r1] - bx lr - thumb_func_end BuyMenuDrawMapMetatileLayer - - thumb_func_start BuyMenuCollectEventObjectData -@ void BuyMenuCollectEventObjectData() -BuyMenuCollectEventObjectData: @ 80E075C - push {r4-r7,lr} - mov r7, r10 - mov r6, r9 - mov r5, r8 - push {r5-r7} - sub sp, 0x18 - movs r0, 0 - mov r8, r0 - mov r4, sp - adds r4, 0x2 - mov r0, sp - adds r1, r4, 0 - bl GetXYCoordsOneStepInFrontOfPlayer - movs r7, 0 - ldr r5, =gShopDataPtr - ldr r3, =0x00002010 - movs r2, 0x10 -_080E0780: - ldr r1, [r5] - lsls r0, r7, 2 - adds r0, r7 - lsls r0, 1 - adds r1, r3 - adds r1, r0 - strh r2, [r1] - adds r0, r7, 0x1 - lsls r0, 24 - lsrs r7, r0, 24 - cmp r7, 0xF - bls _080E0780 - movs r7, 0 - str r4, [sp, 0x8] - ldr r1, =gShopDataPtr - mov r9, r1 - mov r2, sp - str r2, [sp, 0x4] -_080E07A4: - movs r3, 0 - adds r4, r7, 0x1 - str r4, [sp, 0xC] -_080E07AA: - ldr r1, =0x0000fffc - adds r0, r3, r1 - ldr r2, [sp, 0x4] - ldrh r2, [r2] - adds r0, r2 - lsls r0, 16 - asrs r0, 16 - ldr r4, =0x0000fffe - adds r1, r7, r4 - ldr r2, [sp, 0x8] - ldrh r2, [r2] - adds r1, r2 - lsls r1, 16 - asrs r1, 16 - str r3, [sp, 0x10] - bl GetEventObjectIdByXY - lsls r0, 24 - lsrs r6, r0, 24 - ldr r3, [sp, 0x10] - cmp r6, 0x10 - beq _080E08C2 - mov r4, r9 - ldr r1, [r4] - mov r0, r8 - lsls r4, r0, 2 - adds r0, r4, r0 - lsls r5, r0, 1 - ldr r2, =0x00002010 - adds r0, r1, r2 - adds r0, r5 - movs r2, 0 - mov r10, r2 - strh r6, [r0] - ldr r2, =0x00002012 - adds r0, r1, r2 - adds r0, r5 - strh r3, [r0] - ldr r0, =0x00002014 - adds r1, r0 - adds r1, r5 - strh r7, [r1] - ldr r1, [sp, 0x4] - movs r2, 0 - ldrsh r0, [r1, r2] - subs r1, r3, 0x4 - adds r0, r1 - ldr r1, [sp, 0x8] - movs r2, 0 - ldrsh r1, [r1, r2] - mov r12, r1 - subs r1, r7, 0x2 - add r1, r12 - str r3, [sp, 0x10] - bl MapGridGetMetatileLayerTypeAt - mov r1, r9 - ldr r2, [r1] - ldr r1, =0x00002018 - adds r1, r2 - mov r12, r1 - add r12, r5 - lsls r0, 24 - lsrs r0, 24 - mov r1, r12 - strh r0, [r1] - ldr r1, =gEventObjects - lsls r0, r6, 3 - adds r0, r6 - lsls r0, 2 - adds r0, r1 - ldrb r0, [r0, 0x18] - lsls r0, 28 - lsrs r0, 28 - ldr r3, [sp, 0x10] - cmp r0, 0x2 - beq _080E0884 - cmp r0, 0x2 - bgt _080E0870 - cmp r0, 0x1 - beq _080E0876 - b _080E08A4 - .pool -_080E0870: - cmp r0, 0x3 - beq _080E0894 - b _080E08A4 -_080E0876: - ldr r4, =0x00002016 - adds r0, r2, r4 - adds r0, r5 - mov r1, r10 - b _080E08B6 - .pool -_080E0884: - ldr r4, =0x00002016 - adds r0, r2, r4 - adds r0, r5 - movs r1, 0x1 - b _080E08B6 - .pool -_080E0894: - ldr r1, =0x00002016 - adds r0, r2, r1 - adds r0, r5 - movs r1, 0x2 - b _080E08B6 - .pool -_080E08A4: - mov r2, r9 - ldr r0, [r2] - mov r2, r8 - adds r1, r4, r2 - lsls r1, 1 - ldr r4, =0x00002016 - adds r0, r4 - adds r0, r1 - movs r1, 0x3 -_080E08B6: - strh r1, [r0] - mov r0, r8 - adds r0, 0x1 - lsls r0, 24 - lsrs r0, 24 - mov r8, r0 -_080E08C2: - adds r0, r3, 0x1 - lsls r0, 24 - lsrs r3, r0, 24 - cmp r3, 0x6 - bhi _080E08CE - b _080E07AA -_080E08CE: - ldr r1, [sp, 0xC] - lsls r0, r1, 24 - lsrs r7, r0, 24 - cmp r7, 0x4 - bhi _080E08DA - b _080E07A4 -_080E08DA: - add sp, 0x18 - pop {r3-r5} - mov r8, r3 - mov r9, r4 - mov r10, r5 - pop {r4-r7} - pop {r0} - bx r0 - .pool - thumb_func_end BuyMenuCollectEventObjectData - - thumb_func_start BuyMenuDrawEventObjects -@ void BuyMenuDrawEventObjects() -BuyMenuDrawEventObjects: @ 80E08F0 - push {r4-r7,lr} - mov r7, r10 - mov r6, r9 - mov r5, r8 - push {r5-r7} - sub sp, 0x4 - movs r7, 0 - ldr r0, =gShopDataPtr - mov r8, r0 - ldr r1, =gEventObjects - mov r10, r1 - ldr r2, =gSprites - mov r9, r2 -_080E090A: - mov r3, r8 - ldr r0, [r3] - lsls r1, r7, 2 - adds r1, r7 - lsls r5, r1, 1 - ldr r4, =0x00002010 - adds r0, r4 - adds r1, r0, r5 - movs r2, 0 - ldrsh r0, [r1, r2] - cmp r0, 0x10 - beq _080E09D8 - adds r1, r0, 0 - lsls r0, r1, 3 - adds r0, r1 - lsls r0, 2 - add r0, r10 - ldrb r0, [r0, 0x5] - bl GetEventObjectGraphicsInfo - mov r4, r8 - ldr r3, [r4] - ldr r2, =0x00002010 - adds r1, r3, r2 - adds r1, r5 - movs r4, 0 - ldrsh r2, [r1, r4] - lsls r1, r2, 3 - adds r1, r2 - lsls r1, 2 - add r1, r10 - ldrb r4, [r1, 0x5] - ldr r2, =0x00002012 - adds r1, r3, r2 - adds r1, r5 - ldrh r2, [r1] - lsls r2, 4 - adds r2, 0x8 - lsls r2, 16 - asrs r2, 16 - ldr r1, =0x00002014 - adds r3, r1 - adds r3, r5 - ldrh r3, [r3] - lsls r3, 4 - movs r1, 0xA - ldrsh r0, [r0, r1] - lsrs r1, r0, 31 - adds r0, r1 - asrs r0, 1 - subs r0, 0x30 - subs r3, r0 - lsls r3, 16 - asrs r3, 16 - movs r0, 0x2 - str r0, [sp] - adds r0, r4, 0 - ldr r1, =SpriteCallbackDummy - bl AddPseudoEventObject - lsls r0, 24 - lsrs r4, r0, 24 - adds r6, r4, 0 - ldr r2, =0x00002010 - adds r1, r5, r2 - mov r3, r8 - ldr r0, [r3] - adds r0, r1 - bl BuyMenuCheckIfEventObjectOverlapsMenuBg - lsls r0, 24 - lsrs r0, 24 - cmp r0, 0x1 - bne _080E09C0 - lsls r2, r4, 4 - adds r2, r4 - lsls r2, 2 - add r2, r9 - adds r2, 0x42 - ldrb r0, [r2] - movs r4, 0x40 - negs r4, r4 - adds r1, r4, 0 - ands r0, r1 - movs r1, 0x4 - orrs r0, r1 - movs r1, 0x3F - ands r0, r1 - movs r1, 0x40 - orrs r0, r1 - strb r0, [r2] -_080E09C0: - lsls r0, r6, 4 - adds r0, r6 - lsls r0, 2 - add r0, r9 - mov r2, r8 - ldr r1, [r2] - ldr r3, =0x00002016 - adds r1, r3 - adds r1, r5 - ldrb r1, [r1] - bl StartSpriteAnim -_080E09D8: - adds r0, r7, 0x1 - lsls r0, 24 - lsrs r7, r0, 24 - cmp r7, 0xF - bls _080E090A - 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 BuyMenuDrawEventObjects - - thumb_func_start BuyMenuCheckIfEventObjectOverlapsMenuBg -BuyMenuCheckIfEventObjectOverlapsMenuBg: @ 80E0A14 - push {r4,lr} - adds r4, r0, 0 - movs r1, 0x2 - ldrsh r0, [r4, r1] - movs r2, 0x4 - ldrsh r1, [r4, r2] - adds r1, 0x2 - bl BuyMenuCheckForOverlapWithMenuBg - lsls r0, 24 - cmp r0, 0 - bne _080E0A38 - movs r1, 0x8 - ldrsh r0, [r4, r1] - cmp r0, 0x1 - beq _080E0A38 - movs r0, 0x1 - b _080E0A3A -_080E0A38: - movs r0, 0 -_080E0A3A: - pop {r4} - pop {r1} - bx r1 - thumb_func_end BuyMenuCheckIfEventObjectOverlapsMenuBg - - thumb_func_start BuyMenuCopyMenuBgToBg1TilemapBuffer -@ void BuyMenuCopyMenuBgToBg1TilemapBuffer() -BuyMenuCopyMenuBgToBg1TilemapBuffer: @ 80E0A40 - push {r4-r6,lr} - ldr r0, =gShopDataPtr - ldr r0, [r0] - movs r1, 0x80 - lsls r1, 4 - adds r4, r0, r1 - adds r3, r0, 0 - movs r1, 0 - ldr r0, =0x0000c3e3 - adds r6, r0, 0 - ldr r5, =0x000003ff -_080E0A56: - lsls r0, r1, 16 - asrs r2, r0, 16 - lsls r1, r2, 1 - adds r0, r1, r3 - ldrh r0, [r0] - cmp r0, 0 - beq _080E0A6A - adds r1, r4 - adds r0, r6 - strh r0, [r1] -_080E0A6A: - adds r0, r2, 0x1 - lsls r0, 16 - lsrs r1, r0, 16 - asrs r0, 16 - cmp r0, r5 - ble _080E0A56 - pop {r4-r6} - pop {r0} - bx r0 - .pool - thumb_func_end BuyMenuCopyMenuBgToBg1TilemapBuffer - - thumb_func_start BuyMenuCheckForOverlapWithMenuBg -@ bool8 BuyMenuCheckForOverlapWithMenuBg(u16 x, u16 y) -BuyMenuCheckForOverlapWithMenuBg: @ 80E0A88 - push {lr} - ldr r2, =gShopDataPtr - ldr r2, [r2] - lsls r0, 1 - lsls r1, 6 - adds r1, r0 - lsls r1, 1 - adds r1, r2 - ldrh r0, [r1] - cmp r0, 0 - bne _080E0AC0 - adds r0, r1, 0 - adds r0, 0x40 - ldrh r0, [r0] - cmp r0, 0 - bne _080E0AC0 - ldrh r0, [r1, 0x2] - cmp r0, 0 - bne _080E0AC0 - adds r0, r1, 0 - adds r0, 0x42 - ldrh r0, [r0] - cmp r0, 0 - bne _080E0AC0 - movs r0, 0x1 - b _080E0AC2 - .pool -_080E0AC0: - movs r0, 0 -_080E0AC2: - pop {r1} - bx r1 - thumb_func_end BuyMenuCheckForOverlapWithMenuBg - - thumb_func_start Task_BuyMenu -@ void Task_BuyMenu(u8 taskId) -Task_BuyMenu: @ 80E0AC8 - push {r4-r7,lr} - mov r7, r8 - push {r7} - lsls r0, 24 - lsrs r6, r0, 24 - lsls r0, r6, 2 - adds r0, r6 - 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 - beq _080E0AEA - b _080E0C8E -_080E0AEA: - ldrb r0, [r4, 0xE] - bl ListMenuHandleInputGetItemId - adds r5, r0, 0 - ldrb r0, [r4, 0xE] - ldr r7, =gShopDataPtr - ldr r2, [r7] - ldr r3, =0x00002008 - adds r1, r2, r3 - subs r3, 0x2 - adds r2, r3 - bl ListMenuGetScrollAndRow - movs r0, 0x2 - negs r0, r0 - cmp r5, r0 - beq _080E0B24 - adds r0, 0x1 - cmp r5, r0 - bne _080E0B32 - b _080E0C8E - .pool -_080E0B24: - movs r0, 0x5 - bl PlaySE - adds r0, r6, 0 - bl ExitBuyMenu - b _080E0C8E -_080E0B32: - movs r0, 0x5 - bl PlaySE - strh r5, [r4, 0xA] - movs r0, 0x2 - bl ClearWindowTilemap - bl BuyMenuRemoveScrollIndicatorArrows - ldrb r0, [r4, 0xE] - movs r1, 0x2 - bl BuyMenuPrintCursor - ldr r0, =gMartInfo - ldrb r0, [r0, 0xF] - cmp r0, 0 - bne _080E0B80 - lsls r0, r5, 16 - lsrs r0, 16 - bl ItemId_GetPrice - adds r4, r0, 0 - movs r0, 0x1 - bl GetPriceReduction - ldr r1, [r7] - movs r2, 0x80 - lsls r2, 6 - adds r1, r2 - lsls r4, 16 - lsrs r4, 16 - lsls r0, 24 - lsrs r0, 24 - asrs r4, r0 - str r4, [r1] - b _080E0B92 - .pool -_080E0B80: - ldr r1, [r7] - movs r3, 0x80 - lsls r3, 6 - adds r1, r3 - ldr r2, =gDecorations - lsls r0, r5, 5 - adds r0, r2 - ldrh r0, [r0, 0x14] - str r0, [r1] -_080E0B92: - ldr r0, =gSaveBlock1Ptr - ldr r0, [r0] - movs r1, 0x92 - lsls r1, 3 - adds r0, r1 - ldr r2, =gShopDataPtr - mov r8, r2 - ldr r1, [r2] - movs r7, 0x80 - lsls r7, 6 - adds r1, r7 - ldr r1, [r1] - bl IsEnoughMoney - lsls r0, 24 - cmp r0, 0 - bne _080E0BD0 - ldr r1, =gText_YouDontHaveMoney - ldr r2, =BuyMenuReturnToItemList - b _080E0C28 - .pool -_080E0BD0: - ldr r4, =gMartInfo - ldrb r0, [r4, 0xF] - cmp r0, 0 - bne _080E0C38 - lsls r0, r5, 16 - lsrs r5, r0, 16 - ldr r1, =gStringVar1 - adds r0, r5, 0 - bl CopyItemName - adds r0, r5, 0 - bl ItemId_GetPocket - lsls r0, 24 - lsrs r0, 24 - cmp r0, 0x3 - bne _080E0C24 - ldr r4, =gStringVar2 - adds r0, r5, 0 - bl ItemIdToBattleMoveId - lsls r0, 16 - lsrs r0, 16 - movs r1, 0xD - muls r1, r0 - ldr r0, =gMoveNames - adds r1, r0 - adds r0, r4, 0 - bl StringCopy - ldr r1, =gText_Var1CertainlyHowMany2 - b _080E0C26 - .pool -_080E0C24: - ldr r1, =gText_Var1CertainlyHowMany -_080E0C26: - ldr r2, =Task_BuyHowManyDialogueInit -_080E0C28: - adds r0, r6, 0 - bl BuyMenuDisplayMessage - b _080E0C8E - .pool -_080E0C38: - ldr r0, =gStringVar1 - lsls r1, r5, 5 - ldr r2, =gDecorations + 1 - adds r1, r2 - bl StringCopy - ldr r0, =gStringVar2 - mov r3, r8 - ldr r1, [r3] - adds r1, r7 - ldr r1, [r1] - movs r2, 0 - movs r3, 0x6 - bl ConvertIntToDecimalStringN - ldrb r0, [r4, 0xF] - cmp r0, 0x1 - bne _080E0C7C - ldr r0, =gStringVar4 - ldr r1, =gText_Var1IsItThatllBeVar2 - bl StringExpandPlaceholders - b _080E0C84 - .pool -_080E0C7C: - ldr r0, =gStringVar4 - ldr r1, =gText_YouWantedVar1ThatllBeVar2 - bl StringExpandPlaceholders -_080E0C84: - ldr r1, =gStringVar4 - ldr r2, =BuyMenuConfirmPurchase - adds r0, r6, 0 - bl BuyMenuDisplayMessage -_080E0C8E: - pop {r3} - mov r8, r3 - pop {r4-r7} - pop {r0} - bx r0 - .pool - thumb_func_end Task_BuyMenu - - thumb_func_start Task_BuyHowManyDialogueInit -@ void Task_BuyHowManyDialogueInit(u8 taskId) -Task_BuyHowManyDialogueInit: @ 80E0CA4 - push {r4-r6,lr} - sub sp, 0x8 - lsls r0, 24 - lsrs r6, r0, 24 - lsls r5, r6, 2 - adds r5, r6 - lsls r5, 3 - ldr r0, =gTasks + 0x8 - adds r5, r0 - ldrh r0, [r5, 0xA] - bl CountTotalItemQuantityInBag - adds r4, r0, 0 - lsls r4, 16 - lsrs r4, 16 - movs r0, 0x3 - movs r1, 0 - movs r2, 0x1 - movs r3, 0xD - bl SetWindowBorderStyle - ldr r0, =gStringVar1 - adds r1, r4, 0 - movs r2, 0x1 - movs r3, 0x4 - bl ConvertIntToDecimalStringN - ldr r4, =gStringVar4 - ldr r1, =gText_InBagVar1 - adds r0, r4, 0 - bl StringExpandPlaceholders - movs r0, 0 - str r0, [sp] - str r0, [sp, 0x4] - movs r0, 0x3 - adds r1, r4, 0 - movs r2, 0 - movs r3, 0x1 - bl BuyMenuPrint - movs r0, 0x1 - strh r0, [r5, 0x2] - movs r0, 0x4 - movs r1, 0 - movs r2, 0x1 - movs r3, 0xD - bl SetWindowBorderStyle - adds r0, r6, 0 - bl BuyMenuPrintItemQuantityAndPrice - movs r0, 0 - bl schedule_bg_copy_tilemap_to_vram - ldr r0, =gSaveBlock1Ptr - ldr r0, [r0] - movs r1, 0x92 - lsls r1, 3 - adds r0, r1 - bl GetMoney - ldr r1, =gShopDataPtr - ldr r4, [r1] - movs r2, 0x80 - lsls r2, 6 - adds r1, r4, r2 - ldr r1, [r1] - bl __udivsi3 - lsls r0, 16 - lsrs r1, r0, 16 - cmp r1, 0x63 - bls _080E0D60 - ldr r0, =0x0000200a - adds r1, r4, r0 - movs r0, 0x63 - strb r0, [r1] - b _080E0D66 - .pool -_080E0D60: - ldr r2, =0x0000200a - adds r0, r4, r2 - strb r1, [r0] -_080E0D66: - ldr r0, =gTasks - lsls r1, r6, 2 - adds r1, r6 - lsls r1, 3 - adds r1, r0 - ldr r0, =Task_BuyHowManyDialogueHandleInput - str r0, [r1] - add sp, 0x8 - pop {r4-r6} - pop {r0} - bx r0 - .pool - thumb_func_end Task_BuyHowManyDialogueInit - - thumb_func_start Task_BuyHowManyDialogueHandleInput -@ void Task_BuyHowManyDialogueHandleInput(u8 taskId) -Task_BuyHowManyDialogueHandleInput: @ 80E0D88 - push {r4-r7,lr} - lsls r0, 24 - lsrs r6, r0, 24 - adds r4, r6, 0 - lsls r0, r6, 2 - adds r0, r6 - lsls r0, 3 - ldr r1, =gTasks + 0x8 - adds r5, r0, r1 - adds r0, r5, 0x2 - ldr r7, =gShopDataPtr - ldr r1, [r7] - ldr r2, =0x0000200a - adds r1, r2 - ldrb r1, [r1] - bl AdjustQuantityAccordingToDPadInput - lsls r0, 24 - lsrs r0, 24 - cmp r0, 0x1 - bne _080E0DF0 - ldrh r0, [r5, 0xA] - bl ItemId_GetPrice - adds r4, r0, 0 - movs r0, 0x1 - bl GetPriceReduction - ldr r1, [r7] - movs r2, 0x80 - lsls r2, 6 - adds r1, r2 - lsls r4, 16 - lsrs r4, 16 - lsls r0, 24 - lsrs r0, 24 - asrs r4, r0 - movs r2, 0x2 - ldrsh r0, [r5, r2] - muls r0, r4 - str r0, [r1] - adds r0, r6, 0 - bl BuyMenuPrintItemQuantityAndPrice - b _080E0EA4 - .pool -_080E0DF0: - ldr r0, =gMain - ldrh r1, [r0, 0x2E] - movs r0, 0x1 - ands r0, r1 - cmp r0, 0 - beq _080E0E74 - movs r0, 0x5 - bl PlaySE - movs r0, 0x4 - movs r1, 0 - bl sub_8198070 - movs r0, 0x3 - movs r1, 0 - bl sub_8198070 - movs r0, 0x4 - bl ClearWindowTilemap - movs r0, 0x3 - bl ClearWindowTilemap - movs r0, 0x1 - bl PutWindowTilemap - ldrh r0, [r5, 0xA] - ldr r1, =gStringVar1 - bl CopyItemName - ldr r0, =gStringVar2 - movs r2, 0x2 - ldrsh r1, [r5, r2] - movs r2, 0 - movs r3, 0x2 - bl ConvertIntToDecimalStringN - ldr r0, =gStringVar3 - ldr r1, [r7] - movs r2, 0x80 - lsls r2, 6 - adds r1, r2 - ldr r1, [r1] - movs r2, 0 - movs r3, 0x6 - bl ConvertIntToDecimalStringN - ldr r1, =gText_Var1AndYouWantedVar2 - ldr r2, =BuyMenuConfirmPurchase - adds r0, r6, 0 - bl BuyMenuDisplayMessage - b _080E0EA4 - .pool -_080E0E74: - movs r0, 0x2 - ands r0, r1 - cmp r0, 0 - beq _080E0EA4 - movs r0, 0x5 - bl PlaySE - movs r0, 0x4 - movs r1, 0 - bl sub_8198070 - movs r0, 0x3 - movs r1, 0 - bl sub_8198070 - movs r0, 0x4 - bl ClearWindowTilemap - movs r0, 0x3 - bl ClearWindowTilemap - adds r0, r4, 0 - bl BuyMenuReturnToItemList -_080E0EA4: - pop {r4-r7} - pop {r0} - bx r0 - thumb_func_end Task_BuyHowManyDialogueHandleInput - - thumb_func_start BuyMenuConfirmPurchase -@ void BuyMenuConfirmPurchase(u8 taskId) -BuyMenuConfirmPurchase: @ 80E0EAC - push {lr} - sub sp, 0x10 - lsls r0, 24 - lsrs r0, 24 - ldr r1, =gUnknown_08589AA8 - movs r2, 0 - str r2, [sp] - movs r2, 0x1 - str r2, [sp, 0x4] - movs r2, 0xD - str r2, [sp, 0x8] - ldr r2, =gUnknown_08589A08 - str r2, [sp, 0xC] - movs r2, 0x1 - movs r3, 0 - bl CreateYesNoMenuWithCallbacks - add sp, 0x10 - pop {r0} - bx r0 - .pool - thumb_func_end BuyMenuConfirmPurchase - - thumb_func_start BuyMenuTryMakePurchase -@ void BuyMenuTryMakePurchase(u8 taskId) -BuyMenuTryMakePurchase: @ 80E0EDC - push {r4-r7,lr} - lsls r0, 24 - lsrs r5, r0, 24 - adds r7, r5, 0 - lsls r0, r5, 2 - adds r0, r5 - lsls r0, 3 - ldr r1, =gTasks + 0x8 - adds r4, r0, r1 - movs r0, 0x1 - bl PutWindowTilemap - ldr r6, =gMartInfo - ldrb r0, [r6, 0xF] - cmp r0, 0 - bne _080E0F40 - ldrh r0, [r4, 0xA] - ldrh r1, [r4, 0x2] - bl AddBagItem - lsls r0, 24 - lsrs r0, 24 - cmp r0, 0x1 - bne _080E0F30 - ldr r1, =gText_HereYouGoThankYou - ldr r2, =BuyMenuSubtractMoney - adds r0, r5, 0 - bl BuyMenuDisplayMessage - adds r0, r5, 0 - bl RecordItemPurchase - b _080E0F7A - .pool -_080E0F30: - ldr r1, =gText_NoMoreRoomForThis - ldr r2, =BuyMenuReturnToItemList - b _080E0F60 - .pool -_080E0F40: - ldrb r0, [r4, 0xA] - bl DecorationAdd - lsls r0, 24 - cmp r0, 0 - beq _080E0F70 - ldrb r0, [r6, 0xF] - cmp r0, 0x1 - bne _080E0F5C - ldr r1, =gText_ThankYouIllSendItHome - b _080E0F5E - .pool -_080E0F5C: - ldr r1, =gText_ThanksIllSendItHome -_080E0F5E: - ldr r2, =BuyMenuSubtractMoney -_080E0F60: - adds r0, r5, 0 - bl BuyMenuDisplayMessage - b _080E0F7A - .pool -_080E0F70: - ldr r1, =gText_SpaceForVar1Full - ldr r2, =BuyMenuReturnToItemList - adds r0, r7, 0 - bl BuyMenuDisplayMessage -_080E0F7A: - pop {r4-r7} - pop {r0} - bx r0 - .pool - thumb_func_end BuyMenuTryMakePurchase - - thumb_func_start BuyMenuSubtractMoney -@ void BuyMenuSubtractMoney(u8 taskId) -BuyMenuSubtractMoney: @ 80E0F88 - push {r4-r6,lr} - lsls r0, 24 - lsrs r6, r0, 24 - movs r0, 0x26 - bl IncrementGameStat - ldr r5, =gSaveBlock1Ptr - ldr r0, [r5] - movs r4, 0x92 - lsls r4, 3 - adds r0, r4 - ldr r1, =gShopDataPtr - ldr r1, [r1] - movs r2, 0x80 - lsls r2, 6 - adds r1, r2 - ldr r1, [r1] - bl RemoveMoney - movs r0, 0x5F - bl PlaySE - ldr r0, [r5] - adds r0, r4 - bl GetMoney - adds r1, r0, 0 - movs r0, 0 - movs r2, 0 - bl PrintMoneyAmountInMoneyBox - ldr r0, =gMartInfo - ldrb r0, [r0, 0xF] - cmp r0, 0 - bne _080E0FF0 - ldr r0, =gTasks - lsls r1, r6, 2 - adds r1, r6 - lsls r1, 3 - adds r1, r0 - ldr r0, =Task_ReturnToItemListAfterItemPurchase - b _080E0FFC - .pool -_080E0FF0: - ldr r0, =gTasks - lsls r1, r6, 2 - adds r1, r6 - lsls r1, 3 - adds r1, r0 - ldr r0, =Task_ReturnToItemListAfterDecorationPurchase -_080E0FFC: - str r0, [r1] - pop {r4-r6} - pop {r0} - bx r0 - .pool - thumb_func_end BuyMenuSubtractMoney - - thumb_func_start Task_ReturnToItemListAfterItemPurchase -@ void Task_ReturnToItemListAfterItemPurchase(u8 taskId) -Task_ReturnToItemListAfterItemPurchase: @ 80E100C - push {r4,r5,lr} - lsls r0, 24 - lsrs r4, r0, 24 - lsls r0, r4, 2 - adds r0, r4 - lsls r0, 3 - ldr r1, =gTasks + 0x8 - adds r5, r0, r1 - ldr r0, =gMain - ldrh r1, [r0, 0x2E] - movs r0, 0x3 - ands r0, r1 - cmp r0, 0 - beq _080E1072 - movs r0, 0x5 - bl PlaySE - movs r1, 0xA - ldrsh r0, [r5, r1] - cmp r0, 0x4 - bne _080E106C - movs r1, 0x2 - ldrsh r0, [r5, r1] - cmp r0, 0x9 - ble _080E106C - movs r0, 0xC - movs r1, 0x1 - bl AddBagItem - lsls r0, 24 - lsrs r0, 24 - cmp r0, 0x1 - bne _080E106C - ldr r1, =gText_ThrowInPremierBall - ldr r2, =BuyMenuReturnToItemList - adds r0, r4, 0 - bl BuyMenuDisplayMessage - b _080E1072 - .pool -_080E106C: - adds r0, r4, 0 - bl BuyMenuReturnToItemList -_080E1072: - pop {r4,r5} - pop {r0} - bx r0 - thumb_func_end Task_ReturnToItemListAfterItemPurchase - - thumb_func_start Task_ReturnToItemListAfterDecorationPurchase -@ void Task_ReturnToItemListAfterDecorationPurchase(u8 taskId) -Task_ReturnToItemListAfterDecorationPurchase: @ 80E1078 - push {r4,lr} - lsls r0, 24 - lsrs r4, r0, 24 - ldr r0, =gMain - ldrh r1, [r0, 0x2E] - movs r0, 0x3 - ands r0, r1 - cmp r0, 0 - beq _080E1096 - movs r0, 0x5 - bl PlaySE - adds r0, r4, 0 - bl BuyMenuReturnToItemList -_080E1096: - pop {r4} - pop {r0} - bx r0 - .pool - thumb_func_end Task_ReturnToItemListAfterDecorationPurchase - - thumb_func_start BuyMenuReturnToItemList -@ void BuyMenuReturnToItemList(u8 taskId) -BuyMenuReturnToItemList: @ 80E10A0 - push {r4-r6,lr} - lsls r0, 24 - lsrs r0, 24 - lsls r4, r0, 2 - adds r4, r0 - lsls r4, 3 - ldr r5, =gTasks + 0x8 - adds r6, r4, r5 - movs r0, 0x5 - movs r1, 0 - bl sub_8197DF8 - ldrb r0, [r6, 0xE] - movs r1, 0x1 - bl BuyMenuPrintCursor - movs r0, 0x1 - bl PutWindowTilemap - movs r0, 0x2 - bl PutWindowTilemap - movs r0, 0 - bl schedule_bg_copy_tilemap_to_vram - bl BuyMenuAddScrollIndicatorArrows - subs r5, 0x8 - adds r4, r5 - ldr r0, =Task_BuyMenu - str r0, [r4] - pop {r4-r6} - pop {r0} - bx r0 - .pool - thumb_func_end BuyMenuReturnToItemList - - thumb_func_start BuyMenuPrintItemQuantityAndPrice -@ void BuyMenuPrintItemQuantityAndPrice(u8 taskId) -BuyMenuPrintItemQuantityAndPrice: @ 80E10EC - push {r4,lr} - sub sp, 0x8 - lsls r0, 24 - lsrs r0, 24 - lsls r4, r0, 2 - adds r4, r0 - lsls r4, 3 - ldr r0, =gTasks + 0x8 - adds r4, r0 - movs r0, 0x4 - movs r1, 0x11 - bl FillWindowPixelBuffer - ldr r0, =gShopDataPtr - ldr r0, [r0] - movs r1, 0x80 - lsls r1, 6 - adds r0, r1 - ldr r3, [r0] - movs r0, 0xFF - str r0, [sp] - movs r0, 0x4 - movs r1, 0x26 - movs r2, 0x1 - bl PrintMoneyAmount - ldr r0, =gStringVar1 - movs r2, 0x2 - ldrsh r1, [r4, r2] - movs r2, 0x2 - movs r3, 0x2 - bl ConvertIntToDecimalStringN - ldr r4, =gStringVar4 - ldr r1, =gText_xVar1 - adds r0, r4, 0 - bl StringExpandPlaceholders - movs r0, 0 - str r0, [sp] - str r0, [sp, 0x4] - movs r0, 0x4 - adds r1, r4, 0 - movs r2, 0 - movs r3, 0x1 - bl BuyMenuPrint - add sp, 0x8 - pop {r4} - pop {r0} - bx r0 - .pool - thumb_func_end BuyMenuPrintItemQuantityAndPrice - - thumb_func_start ExitBuyMenu -@ void ExitBuyMenu(u8 taskId) -ExitBuyMenu: @ 80E1168 - push {r4,lr} - sub sp, 0x4 - adds r4, r0, 0 - lsls r4, 24 - lsrs r4, 24 - ldr r1, =gFieldCallback - ldr r0, =MapPostLoadHook_ExitBuyOrSellMenu - str r0, [r1] - movs r0, 0x1 - negs r0, r0 - movs r1, 0 - str r1, [sp] - movs r2, 0 - movs r3, 0x10 - bl BeginNormalPaletteFade - ldr r1, =gTasks - lsls r0, r4, 2 - adds r0, r4 - lsls r0, 3 - adds r0, r1 - ldr r1, =Task_ExitBuyMenu - str r1, [r0] - add sp, 0x4 - pop {r4} - pop {r0} - bx r0 - .pool - thumb_func_end ExitBuyMenu - - thumb_func_start Task_ExitBuyMenu -@ void Task_ExitBuyMenu(u8 taskId) -Task_ExitBuyMenu: @ 80E11B0 - push {r4,lr} - lsls r0, 24 - lsrs r4, r0, 24 - ldr r0, =gPaletteFade - ldrb r1, [r0, 0x7] - movs r0, 0x80 - ands r0, r1 - cmp r0, 0 - bne _080E11D6 - bl RemoveMoneyLabelObject - bl BuyMenuFreeMemory - ldr r0, =CB2_ReturnToField - bl SetMainCallback2 - adds r0, r4, 0 - bl DestroyTask -_080E11D6: - pop {r4} - pop {r0} - bx r0 - .pool - thumb_func_end Task_ExitBuyMenu - - thumb_func_start ClearItemPurchases -@ void ClearItemPurchases() -ClearItemPurchases: @ 80E11E4 - push {lr} - ldr r0, =gUnknown_02039F7C - movs r1, 0 - strb r1, [r0] - ldr r0, =gUnknown_02039F80 - movs r1, 0 - movs r2, 0xC - bl memset - pop {r0} - bx r0 - .pool - thumb_func_end ClearItemPurchases - - thumb_func_start RecordItemPurchase -@ void RecordItemPurchase(u8 taskId) -RecordItemPurchase: @ 80E1204 - push {r4-r7,lr} - lsls r0, 24 - lsrs r0, 24 - lsls r1, r0, 2 - adds r1, r0 - lsls r1, 3 - ldr r0, =gTasks + 0x8 - adds r4, r1, r0 - movs r3, 0 - ldr r5, =gUnknown_02039F80 - adds r6, r5, 0 -_080E121A: - lsls r0, r3, 2 - adds r2, r0, r6 - ldrh r1, [r2] - movs r7, 0xA - ldrsh r0, [r4, r7] - cmp r1, r0 - bne _080E1250 - ldrh r0, [r2, 0x2] - cmp r0, 0 - beq _080E1250 - adds r1, r0, 0 - movs r3, 0x2 - ldrsh r0, [r4, r3] - adds r0, r1, r0 - cmp r0, 0xFF - ble _080E1248 - movs r0, 0xFF - strh r0, [r2, 0x2] - b _080E127A - .pool -_080E1248: - ldrh r0, [r4, 0x2] - adds r0, r1, r0 - strh r0, [r2, 0x2] - b _080E127A -_080E1250: - adds r0, r3, 0x1 - lsls r0, 16 - lsrs r3, r0, 16 - cmp r3, 0x2 - bls _080E121A - ldr r2, =gUnknown_02039F7C - ldrb r0, [r2] - cmp r0, 0x2 - bhi _080E127A - lsls r0, 2 - adds r0, r5 - ldrh r1, [r4, 0xA] - strh r1, [r0] - ldrb r0, [r2] - lsls r0, 2 - adds r0, r5 - ldrh r1, [r4, 0x2] - strh r1, [r0, 0x2] - ldrb r0, [r2] - adds r0, 0x1 - strb r0, [r2] -_080E127A: - pop {r4-r7} - pop {r0} - bx r0 - .pool - thumb_func_end RecordItemPurchase - - thumb_func_start CreatePokemartMenu -@ void CreatePokemartMenu(u16 *itemsForSale) -CreatePokemartMenu: @ 80E1284 - push {r4,lr} - adds r4, r0, 0 - movs r0, 0 - bl CreateShopMenu - adds r0, r4, 0 - bl SetShopItemsForSale - bl ClearItemPurchases - ldr r0, =EnableBothScriptContexts - bl SetShopMenuCallback - pop {r4} - pop {r0} - bx r0 - .pool - thumb_func_end CreatePokemartMenu - - thumb_func_start CreateDecorationShop1Menu -@ void CreateDecorationShop1Menu(u16 *itemsForSale) -CreateDecorationShop1Menu: @ 80E12A8 - push {r4,lr} - adds r4, r0, 0 - movs r0, 0x1 - bl CreateShopMenu - adds r0, r4, 0 - bl SetShopItemsForSale - ldr r0, =EnableBothScriptContexts - bl SetShopMenuCallback - pop {r4} - pop {r0} - bx r0 - .pool - thumb_func_end CreateDecorationShop1Menu - - thumb_func_start CreateDecorationShop2Menu -@ void CreateDecorationShop2Menu(u16 *itemsForSale) -CreateDecorationShop2Menu: @ 80E12C8 - push {r4,lr} - adds r4, r0, 0 - movs r0, 0x2 - bl CreateShopMenu - adds r0, r4, 0 - bl SetShopItemsForSale - ldr r0, =EnableBothScriptContexts - bl SetShopMenuCallback - pop {r4} - pop {r0} - bx r0 - .pool - thumb_func_end CreateDecorationShop2Menu - - thumb_func_start sub_80E12E8 -sub_80E12E8: @ 80E12E8 - push {r4-r7,lr} - mov r7, r10 - mov r6, r9 - mov r5, r8 - push {r5-r7} - sub sp, 0x10 - mov r9, r1 - lsls r0, 24 - lsrs r0, 24 - lsls r2, 16 - lsrs r2, 16 - mov r10, r2 - ldr r2, =gTasks - lsls r1, r0, 2 - adds r1, r0 - lsls r1, 3 - adds r1, r2 - ldrh r0, [r1, 0x10] - subs r0, 0x1 - lsls r0, 16 - lsrs r5, r0, 16 - ldrh r0, [r1, 0x12] - subs r0, 0x1 - lsls r0, 16 - lsrs r3, r0, 16 - ldrh r4, [r1, 0xA] - movs r2, 0xC - ldrsh r0, [r1, r2] - cmp r0, 0 - bne _080E13AC - movs r2, 0 - lsls r5, 16 - str r5, [sp, 0xC] - lsls r0, r3, 16 - lsls r1, r4, 16 - asrs r0, 16 - str r0, [sp] - asrs r1, 16 - str r1, [sp, 0x4] - lsls r0, r1, 1 - mov r1, r9 - adds r7, r0, r1 -_080E133C: - movs r4, 0 - lsls r2, 16 - mov r8, r2 - asrs r0, r2, 16 - ldr r2, [sp] - adds r6, r2, r0 -_080E1348: - ldr r0, [sp, 0xC] - asrs r1, r0, 16 - lsls r4, 16 - asrs r0, r4, 16 - adds r5, r1, r0 - adds r0, r5, 0 - adds r1, r6, 0 - bl MapGridGetMetatileIdAt - movs r2, 0 - ldrsh r1, [r7, r2] - lsls r0, 16 - asrs r0, 16 - cmp r1, r0 - bne _080E1390 - ldr r0, [sp, 0x4] - cmp r0, 0x2 - beq _080E1380 - ldrh r0, [r7, 0x2] - mov r2, r10 - orrs r2, r0 - adds r0, r5, 0 - adds r1, r6, 0 - bl MapGridSetMetatileIdAt - b _080E1390 - .pool -_080E1380: - mov r1, r9 - ldrh r0, [r1] - mov r2, r10 - orrs r2, r0 - adds r0, r5, 0 - adds r1, r6, 0 - bl MapGridSetMetatileIdAt -_080E1390: - movs r2, 0x80 - lsls r2, 9 - adds r0, r4, r2 - lsrs r4, r0, 16 - asrs r0, 16 - cmp r0, 0x2 - ble _080E1348 - adds r0, r2, 0 - add r0, r8 - lsrs r2, r0, 16 - asrs r0, 16 - cmp r0, 0x2 - ble _080E133C - b _080E1434 -_080E13AC: - movs r2, 0 - lsls r5, 16 - str r5, [sp, 0xC] - lsls r0, r3, 16 - lsls r1, r4, 16 - asrs r0, 16 - str r0, [sp, 0x8] - asrs r7, r1, 16 -_080E13BC: - movs r4, 0 - lsls r2, 16 - mov r8, r2 - asrs r0, r2, 16 - ldr r1, [sp, 0x8] - adds r6, r1, r0 -_080E13C8: - ldr r2, [sp, 0xC] - asrs r1, r2, 16 - lsls r4, 16 - asrs r0, r4, 16 - adds r5, r1, r0 - adds r0, r5, 0 - adds r1, r6, 0 - bl MapGridGetMetatileIdAt - movs r1, 0x2 - subs r1, r7 - lsls r1, 1 - add r1, r9 - movs r2, 0 - ldrsh r1, [r1, r2] - lsls r0, 16 - asrs r0, 16 - cmp r1, r0 - bne _080E141A - cmp r7, 0x2 - beq _080E140A - movs r0, 0x1 - subs r0, r7 - lsls r0, 1 - add r0, r9 - ldrh r0, [r0] - mov r2, r10 - orrs r2, r0 - adds r0, r5, 0 - adds r1, r6, 0 - bl MapGridSetMetatileIdAt - b _080E141A -_080E140A: - mov r1, r9 - ldrh r0, [r1, 0x4] - mov r2, r10 - orrs r2, r0 - adds r0, r5, 0 - adds r1, r6, 0 - bl MapGridSetMetatileIdAt -_080E141A: - movs r2, 0x80 - lsls r2, 9 - adds r0, r4, r2 - lsrs r4, r0, 16 - asrs r0, 16 - cmp r0, 0x2 - ble _080E13C8 - adds r0, r2, 0 - add r0, r8 - lsrs r2, r0, 16 - asrs r0, 16 - cmp r0, 0x2 - ble _080E13BC -_080E1434: - add sp, 0x10 - pop {r3-r5} - mov r8, r3 - mov r9, r4 - mov r10, r5 - pop {r4-r7} - pop {r0} - bx r0 - thumb_func_end sub_80E12E8 - - thumb_func_start sub_80E1444 -sub_80E1444: @ 80E1444 - push {r4,r5,lr} - lsls r0, 24 - lsrs r3, r0, 24 - lsls r0, r3, 2 - adds r0, r3 - lsls r0, 3 - ldr r1, =gTasks + 0x8 - adds r4, r0, r1 - movs r0, 0x1 - strh r0, [r4, 0x6] - movs r1, 0 - ldrsh r0, [r4, r1] - cmp r0, 0x6 - bhi _080E14DE - lsls r0, 2 - ldr r1, =_080E1474 - adds r0, r1 - ldr r0, [r0] - mov pc, r0 - .pool - .align 2, 0 -_080E1474: - .4byte _080E1490 - .4byte _080E1498 - .4byte _080E14A0 - .4byte _080E14A8 - .4byte _080E14B0 - .4byte _080E14C4 - .4byte _080E14D4 -_080E1490: - ldr r1, =gUnknown_08589ABA - b _080E14C6 - .pool -_080E1498: - ldr r1, =gUnknown_08589AC0 - b _080E14C6 - .pool -_080E14A0: - ldr r1, =gUnknown_08589AC6 - b _080E14B2 - .pool -_080E14A8: - ldr r1, =gUnknown_08589ACC - b _080E14C6 - .pool -_080E14B0: - ldr r1, =gUnknown_08589AD2 -_080E14B2: - movs r2, 0xC0 - lsls r2, 4 - adds r0, r3, 0 - bl sub_80E12E8 - b _080E14DE - .pool -_080E14C4: - ldr r1, =gUnknown_08589AD8 -_080E14C6: - adds r0, r3, 0 - movs r2, 0 - bl sub_80E12E8 - b _080E14DE - .pool -_080E14D4: - ldr r1, =gUnknown_08589ADE - adds r0, r3, 0 - movs r2, 0 - bl sub_80E12E8 -_080E14DE: - ldrh r0, [r4] - adds r0, 0x1 - movs r1, 0x7 - ands r0, r1 - strh r0, [r4] - adds r5, r0, 0 - cmp r5, 0 - bne _080E1502 - bl DrawWholeMapView - movs r1, 0x2 - ldrsh r0, [r4, r1] - adds r0, 0x1 - movs r1, 0x3 - bl __modsi3 - strh r0, [r4, 0x2] - strh r5, [r4, 0x6] -_080E1502: - pop {r4,r5} - pop {r0} - bx r0 - .pool - thumb_func_end sub_80E1444 - - thumb_func_start sub_80E150C -sub_80E150C: @ 80E150C - push {r4-r7,lr} - adds r5, r0, 0 - lsls r5, 16 - lsrs r5, 16 - ldr r6, =sub_80E1444 - adds r0, r6, 0 - movs r1, 0 - bl CreateTask - adds r4, r0, 0 - lsls r4, 24 - lsrs r4, 24 - lsls r0, r4, 2 - adds r0, r4 - lsls r0, 3 - ldr r1, =gTasks + 0x8 - adds r7, r0, r1 - adds r0, r7, 0 - adds r0, 0x8 - adds r1, r7, 0 - adds r1, 0xA - bl PlayerGetDestCoords - movs r0, 0 - strh r0, [r7] - strh r0, [r7, 0x2] - strh r5, [r7, 0x4] - adds r0, r4, 0 - bl _call_via_r6 - adds r0, r4, 0 - pop {r4-r7} - pop {r1} - bx r1 - .pool - thumb_func_end sub_80E150C - - thumb_func_start sub_80E1558 -sub_80E1558: @ 80E1558 - push {lr} - lsls r0, 24 - lsrs r0, 24 - bl sub_80E150C - ldr r1, =gUnknown_02039F8C - strb r0, [r1] - pop {r0} - bx r0 - .pool - thumb_func_end sub_80E1558 - - thumb_func_start sub_80E1570 -sub_80E1570: @ 80E1570 - push {lr} - ldr r0, =gUnknown_02039F8C - ldrb r0, [r0] - bl DestroyTask - pop {r0} - bx r0 - .pool - thumb_func_end sub_80E1570 - - thumb_func_start sub_80E1584 -sub_80E1584: @ 80E1584 - push {lr} - ldr r2, =gTasks - ldr r0, =gUnknown_02039F8C - ldrb r1, [r0] - lsls r0, r1, 2 - adds r0, r1 - lsls r0, 3 - adds r1, r0, r2 - movs r2, 0xE - ldrsh r0, [r1, r2] - cmp r0, 0 - bne _080E15B0 - movs r2, 0xA - ldrsh r0, [r1, r2] - cmp r0, 0x2 - bne _080E15B0 - movs r0, 0 - b _080E15B2 - .pool -_080E15B0: - movs r0, 0x1 -_080E15B2: - pop {r1} - bx r1 - thumb_func_end sub_80E1584 - - .align 2, 0 @ Don't pad with nop. diff --git a/data/shop.s b/data/shop.s deleted file mode 100644 index 45ecbb585..000000000 --- a/data/shop.s +++ /dev/null @@ -1,80 +0,0 @@ -@ the third big chunk of data - - .include "asm/macros.inc" - .include "constants/constants.inc" - - .section .rodata - -gUnknown_08589A08:: @ 8589A08 - .4byte BuyMenuTryMakePurchase - .4byte BuyMenuReturnToItemList - -gUnknown_08589A10:: @ 8589A10 - .4byte gUnknown_085E93C7 - .4byte HandleShopMenuBuy - .4byte gUnknown_085E93CB - .4byte HandleShopMenuSell - .4byte gUnknown_085E93D0 - .4byte HandleShopMenuQuit - -gUnknown_08589A28:: @ 8589A28 - .4byte gUnknown_085E93C7 - .4byte HandleShopMenuBuy - .4byte gUnknown_085E93D0 - .4byte HandleShopMenuQuit - -gUnknown_08589A38:: @ 8589A38 - window_template 0, 2, 1, 9, 6, 15, 8 - window_template 0, 2, 1, 9, 4, 15, 8 - -gUnknown_08589A48:: @ 8589A48 - .byte 0, 0, 0, 0 - .4byte BuyMenuPrintItemDescriptionAndShowItemIcon - .4byte BuyMenuPrintPriceInList - .byte 0, 0, 0, 0, 1, 0, 8, 0, 33, 48, 0, 7 - -gUnknown_08589A60:: @ 8589A60 - .4byte 0x1F8 - .4byte 0x11E1 - .4byte 0x21D2 - .4byte 0x31C3 - -gUnknown_08589A70:: @ 8589A70 - window_template 0, 1, 1, 10, 2, 15, 30 - window_template 0, 14, 2, 15, 16, 15, 50 - window_template 0, 0, 13, 14, 6, 15, 0x122 - window_template 0, 1, 11, 12, 2, 15, 0x176 - window_template 0, 18, 11, 10, 2, 15, 0x18E - window_template 0, 2, 15, 27, 4, 15, 0x1A2 - null_window_template - -gUnknown_08589AA8:: @ 8589AA8 - window_template 0, 21, 9, 5, 4, 15, 0x20E - -gUnknown_08589AB0:: @ 8589AB0 - .byte 1, 2, 3 - .byte 0, 2, 3 - .byte 0, 3, 2 - - .align 1 - -gUnknown_08589ABA:: @ 8589ABA - .2byte 0x284, 0x282, 0x280 - -gUnknown_08589AC0:: @ 8589AC0 - .2byte 0x285, 0x283, 0x281 - -gUnknown_08589AC6:: @ 8589AC6 - .2byte 0x28C, 0x28A, 0x288 - -gUnknown_08589ACC:: @ 8589ACC - .2byte 0x28D, 0x28B, 0x289 - -gUnknown_08589AD2:: @ 8589AD2 - .2byte 0x2A0, 0x2A2, 0x2A4 - -gUnknown_08589AD8:: @ 8589AD8 - .2byte 0x2A1, 0x2A3, 0x2A5 - -gUnknown_08589ADE:: @ 8589ADE - .2byte 0x2A8, 0x2AA, 0x2AC diff --git a/include/graphics.h b/include/graphics.h index 4cbee1c34..07900977d 100644 --- a/include/graphics.h +++ b/include/graphics.h @@ -4029,4 +4029,8 @@ extern const u8 gUnknown_08D97CF4[]; extern const u8 gStatusGfx_Icons[]; extern const u8 gStatusPal_Icons[]; +extern const u8 gBuyMenuFrame_Gfx[]; +extern const u16 gBuyMenuFrame_Tilemap[]; +extern const u16 gMenuMoneyPal[]; + #endif //GUARD_GRAPHICS_H diff --git a/include/item_menu.h b/include/item_menu.h index b80d0628e..649eb934c 100644 --- a/include/item_menu.h +++ b/include/item_menu.h @@ -59,5 +59,6 @@ void bag_menu_mail_related(void); void CB2_BagMenuFromStartMenu(void); u8 sub_81ABB2C(u8 pocketId); bool8 UseRegisteredKeyItemOnField(void); +void CB2_GoToSellMenu(void); #endif //GUARD_item_menu_H diff --git a/include/party_menu.h b/include/party_menu.h index 170fcafc1..cb82eb82c 100644 --- a/include/party_menu.h +++ b/include/party_menu.h @@ -70,6 +70,5 @@ extern void sub_81B67C8(u8, u16, TaskFunc); extern void sub_81B79E8(u8, u16, TaskFunc); extern void sub_81B6DC4(u8, u16, TaskFunc); extern void sub_81B7C74(u8, u16, TaskFunc); -extern u16 ItemIdToBattleMoveId(u16); #endif // GUARD_PARTY_MENU_H diff --git a/include/shop.h b/include/shop.h index 067b8fee4..7f2d877dc 100644 --- a/include/shop.h +++ b/include/shop.h @@ -1,7 +1,7 @@ #ifndef GUARD_SHOP_H #define GUARD_SHOP_H -extern EWRAM_DATA struct ItemSlot gUnknown_02039F80[3]; +extern EWRAM_DATA struct ItemSlot gMartPurchaseHistory[3]; enum { @@ -10,9 +10,19 @@ enum MART_TYPE_2, }; +// shop view window NPC info enum +enum +{ + EVENT_OBJ_ID, + X_COORD, + Y_COORD, + ANIM_NUM, + LAYER_TYPE +}; + struct MartInfo { - /*0x0*/ void (* callback) (void); + /*0x0*/ void (*callback)(void); /*0x4*/ const struct MenuAction *menuActions; /*0x8*/ const u16 *itemList; /*0xC*/ u16 itemCount; @@ -20,23 +30,18 @@ struct MartInfo /*0xF*/ u8 martType; }; -struct BuyMenuLabel -{ - u8 label[16]; -}; - struct ShopData { - /*0x0000*/ u8 tilemapBuffers[4][0x800]; - /*0x2000*/ u8 filler2000[0x4]; - /*0x2004*/ u16 unk2004; - /*0x2006*/ u8 filler2006[0x2]; - /*0x2008*/ u16 unk2008; - /*0x200A*/ u8 filler200A; + /*0x0000*/ u16 tilemapBuffers[4][0x400]; + /*0x2000*/ u32 totalCost; + /*0x2004*/ u16 itemsShowed; + /*0x2006*/ u16 selectedRow; + /*0x2008*/ u16 scrollOffset; + /*0x200A*/ u8 maxQuantity; /*0x200B*/ u8 scrollIndicatorsTaskId; - /*0x200C*/ u8 unk200C; - /*0x200D*/ u8 unk200D[2]; - /*0x200F*/ u8 filler200F[0xA1]; + /*0x200C*/ u8 iconSlot; + /*0x200D*/ u8 itemSpriteIds[2]; + /*0x2010*/ s16 viewportObjects[16][5]; }; void CreatePokemartMenu(const u16 *); diff --git a/include/strings.h b/include/strings.h index 4ea33635b..0b037287a 100644 --- a/include/strings.h +++ b/include/strings.h @@ -855,5 +855,21 @@ extern const u8 gText_CanIHelpWithAnythingElse[]; extern const u8 gText_AnythingElseICanHelp[]; extern const u8 gText_QuitShopping[]; extern const u8 gText_PokedollarVar1[]; +extern const u8 gText_YouDontHaveMoney[]; +extern const u8 gText_Var1CertainlyHowMany2[]; +extern const u8 gText_Var1CertainlyHowMany[]; +extern const u8 gText_Var1IsItThatllBeVar2[]; +extern const u8 gText_YouWantedVar1ThatllBeVar2[]; +extern const u8 gText_InBagVar1[]; +extern const u8 gText_Var1AndYouWantedVar2[]; +extern const u8 gText_HereYouGoThankYou[]; +extern const u8 gText_NoMoreRoomForThis[]; +extern const u8 gText_ThankYouIllSendItHome[]; +extern const u8 gText_ThanksIllSendItHome[]; +extern const u8 gText_SpaceForVar1Full[]; +extern const u8 gText_ThrowInPremierBall[]; +extern const u8 gText_ShopBuy[]; +extern const u8 gText_ShopSell[]; +extern const u8 gText_ShopQuit[]; #endif //GUARD_STRINGS_H diff --git a/ld_script.txt b/ld_script.txt index 9592d5cf6..41a8d95c7 100644 --- a/ld_script.txt +++ b/ld_script.txt @@ -138,7 +138,7 @@ SECTIONS { src/contest.o(.text); asm/contest.o(.text); src/shop.o(.text); - asm/shop.o(.text); + src/fldeff_escalator.o(.text); src/berry.o(.text); asm/script_menu.o(.text); src/naming_screen.o(.text); @@ -443,7 +443,8 @@ SECTIONS { src/map_name_popup.o(.rodata); src/item_menu_icons.o(.rodata); data/contest.o(.rodata); - data/shop.o(.rodata); + src/shop.o(.rodata); + src/fldeff_escalator.o(.rodata); src/berry.o(.rodata); data/script_menu.o(.rodata); src/naming_screen.o(.rodata); diff --git a/src/fldeff_escalator.c b/src/fldeff_escalator.c new file mode 100644 index 000000000..b906225da --- /dev/null +++ b/src/fldeff_escalator.c @@ -0,0 +1,132 @@ +#include "global.h" +#include "task.h" +#include "fieldmap.h" +#include "field_camera.h" +#include "field_player_avatar.h" + +static EWRAM_DATA u8 sEscalatorAnim_TaskId = 0; + +void sub_80E12E8(u8 taskId, const s16 *list, u16 c) +{ + s16 r5 = gTasks[taskId].data[4] - 1; + s16 r3 = gTasks[taskId].data[5] - 1; + s16 r4 = gTasks[taskId].data[1]; + s16 y; + s16 x; + + if (gTasks[taskId].data[2] == 0) + { + for (y = 0; y < 3; y++) + { + for (x = 0; x < 3; x++) + { + s16 metatileId = MapGridGetMetatileIdAt(r5 + x, r3 + y); + + if (list[r4] == metatileId) + { + if (r4 != 2) + MapGridSetMetatileIdAt(r5 + x, r3 + y, c | list[r4 + 1]); + else + MapGridSetMetatileIdAt(r5 + x, r3 + y, c | list[0]); + } + } + } + } + else + { + for (y = 0; y < 3; y++) + { + for (x = 0; x < 3; x++) + { + s16 metatileId = MapGridGetMetatileIdAt(r5 + x, r3 + y); + + if (list[2 - r4] == metatileId) + { + if (r4 != 2) + MapGridSetMetatileIdAt(r5 + x, r3 + y, c | list[1 - r4]); + else + MapGridSetMetatileIdAt(r5 + x, r3 + y, c | list[2]); + } + } + } + } +} + +static const u16 gUnknown_08589ABA[] = {0x284, 0x282, 0x280}; +static const u16 gUnknown_08589AC0[] = {0x285, 0x283, 0x281}; +static const u16 gUnknown_08589AC6[] = {0x28C, 0x28A, 0x288}; +static const u16 gUnknown_08589ACC[] = {0x28D, 0x28B, 0x289}; +static const u16 gUnknown_08589AD2[] = {0x2A0, 0x2A2, 0x2A4}; +static const u16 gUnknown_08589AD8[] = {0x2A1, 0x2A3, 0x2A5}; +static const u16 gUnknown_08589ADE[] = {0x2A8, 0x2AA, 0x2AC}; + +void sub_80E1444(u8 taskId) +{ + s16 *data = gTasks[taskId].data; + + data[3] = 1; + + switch (data[0]) + { + case 0: + sub_80E12E8(taskId, gUnknown_08589ABA, 0); + break; + case 1: + sub_80E12E8(taskId, gUnknown_08589AC0, 0); + break; + case 2: + sub_80E12E8(taskId, gUnknown_08589AC6, 0xC00); + break; + case 3: + sub_80E12E8(taskId, gUnknown_08589ACC, 0); + break; + case 4: + sub_80E12E8(taskId, gUnknown_08589AD2, 0xC00); + break; + case 5: + sub_80E12E8(taskId, gUnknown_08589AD8, 0); + break; + case 6: + sub_80E12E8(taskId, gUnknown_08589ADE, 0); + break; + } + + data[0] = (data[0] + 1) & 7; + if (!data[0]) + { + DrawWholeMapView(); + data[1] = (data[1] + 1) % 3; + data[3] = 0; + } +} + +u8 sub_80E150C(u16 var) +{ + u8 taskId = CreateTask(sub_80E1444, 0); + s16 *data = gTasks[taskId].data; + + PlayerGetDestCoords(&data[4], &data[5]); + data[0] = 0; + data[1] = 0; + data[2] = var; + sub_80E1444(taskId); + return taskId; +} + +void sub_80E1558(u8 var) +{ + sEscalatorAnim_TaskId = sub_80E150C(var); +} + +void sub_80E1570(void) +{ + DestroyTask(sEscalatorAnim_TaskId); +} + +bool8 sub_80E1584(void) +{ + if (gTasks[sEscalatorAnim_TaskId].data[3] == 0 && gTasks[sEscalatorAnim_TaskId].data[1] == 2) + return FALSE; + else + return TRUE; +} diff --git a/src/shop.c b/src/shop.c index 26151171a..510c9f4f7 100755 --- a/src/shop.c +++ b/src/shop.c @@ -1,15 +1,20 @@ #include "global.h" #include "bg.h" +#include "data2.h" #include "decompress.h" #include "decoration.h" +#include "decoration_inventory.h" +#include "event_object_movement.h" #include "field_player_avatar.h" #include "field_screen.h" #include "field_weather.h" #include "fieldmap.h" #include "gpu_regs.h" +#include "graphics.h" #include "international_string_util.h" #include "item.h" #include "item_icon.h" +#include "item_menu.h" #include "list_menu.h" #include "main.h" #include "malloc.h" @@ -18,6 +23,7 @@ #include "money.h" #include "overworld.h" #include "palette.h" +#include "party_menu.h" #include "scanline_effect.h" #include "script.h" #include "shop.h" @@ -27,54 +33,243 @@ #include "strings.h" #include "text_window.h" #include "tv.h" +#include "constants/items.h" +#include "constants/metatile_behaviors.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 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]; +EWRAM_DATA struct MartInfo gMartInfo = {0}; +EWRAM_DATA struct ShopData *gShopDataPtr = NULL; +EWRAM_DATA struct ListMenuItem *gUnknown_02039F74 = NULL; +EWRAM_DATA u8 (*gUnknown_02039F78)[16] = {0}; +EWRAM_DATA u8 gMartPurchaseHistoryId = 0; +EWRAM_DATA struct ItemSlot gMartPurchaseHistory[3] = {0}; static void Task_ShopMenu(u8 taskId); -void HandleShopMenuQuit(u8 taskId); -void CB2_InitBuyMenu(void); +static void Task_HandleShopMenuQuit(u8 taskId); +static 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 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) +static void MapPostLoadHook_ReturnToShopMenu(void); +static void Task_ReturnToShopMenu(u8 taskId); +static void ShowShopMenuAfterExitingBuyOrSellMenu(u8 taskId); +static void BuyMenuDrawGraphics(void); +static void BuyMenuAddScrollIndicatorArrows(void); +static void Task_BuyMenu(u8 taskId); +static void BuyMenuBuildListMenuTemplate(void); +static void BuyMenuInitBgs(void); +static void BuyMenuInitWindows(void); +static void BuyMenuDecompressBgGraphics(void); +static void BuyMenuSetListEntry(struct ListMenuItem*, u16, u8*); +static void BuyMenuAddItemIcon(u16, u8); +static void BuyMenuRemoveItemIcon(u16, u8); +static void BuyMenuPrint(u8 windowId, const u8 *text, u8 x, u8 y, s8 speed, u8 colorSet); +static void BuyMenuDrawMapGraphics(void); +static void BuyMenuCopyMenuBgToBg1TilemapBuffer(void); +static void BuyMenuCollectEventObjectData(void); +static void BuyMenuDrawEventObjects(void); +static void BuyMenuDrawMapBg(void); +static bool8 BuyMenuCheckForOverlapWithMenuBg(int, int); +static void BuyMenuDrawMapMetatile(s16, s16, const u16*, u8); +static void BuyMenuDrawMapMetatileLayer(u16 *dest, s16 offset1, s16 offset2, const u16 *src); +static bool8 BuyMenuCheckIfEventObjectOverlapsMenuBg(s16 *); +static void ExitBuyMenu(u8 taskId); +static void Task_ExitBuyMenu(u8 taskId); +static void BuyMenuTryMakePurchase(u8 taskId); +static void BuyMenuReturnToItemList(u8 taskId); +static void Task_BuyHowManyDialogueInit(u8 taskId); +static void BuyMenuConfirmPurchase(u8 taskId); +static void BuyMenuPrintItemQuantityAndPrice(u8 taskId); +static void Task_BuyHowManyDialogueHandleInput(u8 taskId); +static void BuyMenuSubtractMoney(u8 taskId); +static void RecordItemPurchase(u8 taskId); +static void Task_ReturnToItemListAfterItemPurchase(u8 taskId); +static void Task_ReturnToItemListAfterDecorationPurchase(u8 taskId); +static void Task_HandleShopMenuBuy(u8 taskId); +static void Task_HandleShopMenuSell(u8 taskId); +static void BuyMenuPrintItemDescriptionAndShowItemIcon(int item, bool8 onInit, struct ListMenu *list); +static void BuyMenuPrintPriceInList(u8 windowId, int item, u8 y); + +static const struct YesNoFuncTable sShopPurchaseYesNoFuncs = +{ + BuyMenuTryMakePurchase, + BuyMenuReturnToItemList +}; + +static const struct MenuAction sShopMenuActions_BuySellQuit[] = +{ + { gText_ShopBuy, {.void_u8=Task_HandleShopMenuBuy} }, + { gText_ShopSell, {.void_u8=Task_HandleShopMenuSell} }, + { gText_ShopQuit, {.void_u8=Task_HandleShopMenuQuit} } +}; + +static const struct MenuAction sShopMenuActions_BuyQuit[] = +{ + { gText_ShopBuy, {.void_u8=Task_HandleShopMenuBuy} }, + { gText_ShopQuit, {.void_u8=Task_HandleShopMenuQuit} } +}; + +static const struct WindowTemplate sShopMenuWindowTemplates[] = +{ + { + .priority = 0, + .tilemapLeft = 2, + .tilemapTop = 1, + .width = 9, + .height = 6, + .paletteNum = 15, + .baseBlock = 0x0008, + }, + { + .priority = 0, + .tilemapLeft = 2, + .tilemapTop = 1, + .width = 9, + .height = 4, + .paletteNum = 15, + .baseBlock = 0x0008, + } +}; + +static const struct ListMenuTemplate sShopBuyMenuListTemplate = +{ + .items = NULL, + .moveCursorFunc = BuyMenuPrintItemDescriptionAndShowItemIcon, + .itemPrintFunc = BuyMenuPrintPriceInList, + .totalItems = 0, + .maxShowed = 0, + .windowId = 1, + .header_X = 0, + .item_X = 8, + .cursor_X = 0, + .upText_Y = 1, + .cursorPal = 2, + .fillValue = 0, + .cursorShadowPal = 3, + .lettersSpacing = 0, + .itemVerticalPadding = 0, + .scrollMultiple = LIST_NO_MULTIPLE_SCROLL, + .fontId = 7, + .cursorKind = 0 +}; + +static const struct BgTemplate sShopBuyMenuBgTemplates[] = +{ + { + .bg = 0, + .charBaseIndex = 2, + .mapBaseIndex = 31, + .screenSize = 0, + .paletteMode = 0, + .priority = 0, + .baseTile = 0 + }, + { + .bg = 1, + .charBaseIndex = 0, + .mapBaseIndex = 30, + .screenSize = 0, + .paletteMode = 0, + .priority = 1, + .baseTile = 0 + }, + { + .bg = 2, + .charBaseIndex = 0, + .mapBaseIndex = 29, + .screenSize = 0, + .paletteMode = 0, + .priority = 2, + .baseTile = 0 + }, + { + .bg = 3, + .charBaseIndex = 0, + .mapBaseIndex = 28, + .screenSize = 0, + .paletteMode = 0, + .priority = 3, + .baseTile = 0 + } +}; + +static const struct WindowTemplate sShopBuyMenuWindowTemplates[] = +{ + { + .priority = 0, + .tilemapLeft = 1, + .tilemapTop = 1, + .width = 10, + .height = 2, + .paletteNum = 15, + .baseBlock = 0x001E, + }, + { + .priority = 0, + .tilemapLeft = 14, + .tilemapTop = 2, + .width = 15, + .height = 16, + .paletteNum = 15, + .baseBlock = 0x0032, + }, + { + .priority = 0, + .tilemapLeft = 0, + .tilemapTop = 13, + .width = 14, + .height = 6, + .paletteNum = 15, + .baseBlock = 0x0122, + }, + { + .priority = 0, + .tilemapLeft = 1, + .tilemapTop = 11, + .width = 12, + .height = 2, + .paletteNum = 15, + .baseBlock = 0x0176, + }, + { + .priority = 0, + .tilemapLeft = 18, + .tilemapTop = 11, + .width = 10, + .height = 2, + .paletteNum = 15, + .baseBlock = 0x018E, + }, + { + .priority = 0, + .tilemapLeft = 2, + .tilemapTop = 15, + .width = 27, + .height = 4, + .paletteNum = 15, + .baseBlock = 0x01A2, + }, + DUMMY_WIN_TEMPLATE +}; + +static const struct WindowTemplate sShopBuyMenuYesNoWindowTemplates = +{ + .priority = 0, + .tilemapLeft = 21, + .tilemapTop = 9, + .width = 5, + .height = 4, + .paletteNum = 15, + .baseBlock = 0x020E, +}; + +static const u8 sShopBuyMenuTextColors[][3] = +{ + {1, 2, 3}, + {0, 2, 3}, + {0, 3, 2} +}; + +static u8 CreateShopMenu(u8 martType) { int numMenuItems; @@ -84,20 +279,20 @@ void BuyMenuDrawMapMetatile(s16, s16, u16*, u8); if (martType == MART_TYPE_0) { struct WindowTemplate winTemplate; - winTemplate = gUnknown_08589A38[0]; - winTemplate.width = GetMaxWidthInMenuTable(gUnknown_08589A10, ARRAY_COUNT(gUnknown_08589A10)); + winTemplate = sShopMenuWindowTemplates[0]; + winTemplate.width = GetMaxWidthInMenuTable(sShopMenuActions_BuySellQuit, ARRAY_COUNT(sShopMenuActions_BuySellQuit)); gMartInfo.windowId = AddWindow(&winTemplate); - gMartInfo.menuActions = gUnknown_08589A10; - numMenuItems = ARRAY_COUNT(gUnknown_08589A10); + gMartInfo.menuActions = sShopMenuActions_BuySellQuit; + numMenuItems = ARRAY_COUNT(sShopMenuActions_BuySellQuit); } else { struct WindowTemplate winTemplate; - winTemplate = gUnknown_08589A38[1]; - winTemplate.width = GetMaxWidthInMenuTable(gUnknown_08589A28, ARRAY_COUNT(gUnknown_08589A28)); + winTemplate = sShopMenuWindowTemplates[1]; + winTemplate.width = GetMaxWidthInMenuTable(sShopMenuActions_BuyQuit, ARRAY_COUNT(sShopMenuActions_BuyQuit)); gMartInfo.windowId = AddWindow(&winTemplate); - gMartInfo.menuActions = gUnknown_08589A28; - numMenuItems = ARRAY_COUNT(gUnknown_08589A28); + gMartInfo.menuActions = sShopMenuActions_BuyQuit; + numMenuItems = ARRAY_COUNT(sShopMenuActions_BuyQuit); } SetStandardWindowBorderStyle(gMartInfo.windowId, 0); @@ -109,12 +304,12 @@ void BuyMenuDrawMapMetatile(s16, s16, u16*, u8); return CreateTask(Task_ShopMenu, 8); } -/*static*/ void SetShopMenuCallback(void (* callback)(void)) +static void SetShopMenuCallback(void (* callback)(void)) { gMartInfo.callback = callback; } -/*static*/ void SetShopItemsForSale(const u16 *items) +static void SetShopItemsForSale(const u16 *items) { u16 i = 0; @@ -133,11 +328,11 @@ static void Task_ShopMenu(u8 taskId) s8 inputCode = Menu_ProcessInputNoWrapAround(); switch (inputCode) { - case -2: + case LIST_B_PRESSED: break; - case -1: + case LIST_NOTHING_CHOSEN: PlaySE(SE_SELECT); - HandleShopMenuQuit(taskId); + Task_HandleShopMenuQuit(taskId); break; default: gMartInfo.menuActions[inputCode].func.void_u8(taskId); @@ -145,31 +340,31 @@ static void Task_ShopMenu(u8 taskId) } } -void HandleShopMenuBuy(u8 taskId) +static void Task_HandleShopMenuBuy(u8 taskId) { - s16 *taskData = gTasks[taskId].data; - taskData[8] = (u32)CB2_InitBuyMenu >> 16; - taskData[9] = (u32)CB2_InitBuyMenu; + s16 *data = gTasks[taskId].data; + data[8] = (u32)CB2_InitBuyMenu >> 16; + data[9] = (u32)CB2_InitBuyMenu; gTasks[taskId].func = Task_GoToBuyOrSellMenu; FadeScreen(1, 0); } -void HandleShopMenuSell(u8 taskId) +static void Task_HandleShopMenuSell(u8 taskId) { - s16 *taskData = gTasks[taskId].data; - taskData[8] = (u32)CB2_GoToSellMenu >> 16; - taskData[9] = (u32)CB2_GoToSellMenu; + s16 *data = gTasks[taskId].data; + data[8] = (u32)CB2_GoToSellMenu >> 16; + data[9] = (u32)CB2_GoToSellMenu; gTasks[taskId].func = Task_GoToBuyOrSellMenu; FadeScreen(1, 0); } void CB2_ExitSellMenu(void) { - gFieldCallback = MapPostLoadHook_ExitBuyOrSellMenu; + gFieldCallback = MapPostLoadHook_ReturnToShopMenu; SetMainCallback2(CB2_ReturnToField); } -/*static*/ void HandleShopMenuQuit(u8 taskId) +static void Task_HandleShopMenuQuit(u8 taskId) { sub_8198070(gMartInfo.windowId, 2); RemoveWindow(gMartInfo.windowId); @@ -183,38 +378,38 @@ void CB2_ExitSellMenu(void) static void Task_GoToBuyOrSellMenu(u8 taskId) { - s16 *taskData = gTasks[taskId].data; + s16 *data = gTasks[taskId].data; if (!gPaletteFade.active) { DestroyTask(taskId); - SetMainCallback2((void *)((u16)taskData[8] << 16 | (u16)taskData[9])); + SetMainCallback2((void *)((u16)data[8] << 16 | (u16)data[9])); } } -void MapPostLoadHook_ExitBuyOrSellMenu(void) +static void MapPostLoadHook_ReturnToShopMenu(void) { pal_fill_black(); - CreateTask(Task_ExitSellMenu, 8); + CreateTask(Task_ReturnToShopMenu, 8); } -void Task_ExitSellMenu(u8 taskId) +static void Task_ReturnToShopMenu(u8 taskId) { if (IsWeatherNotFadingIn() == TRUE) { if (gMartInfo.martType == MART_TYPE_2) - DisplayItemMessageOnField(taskId, gText_CanIHelpWithAnythingElse, ReturnToShopMenuAfterExitingSellMenu); + DisplayItemMessageOnField(taskId, gText_CanIHelpWithAnythingElse, ShowShopMenuAfterExitingBuyOrSellMenu); else - DisplayItemMessageOnField(taskId, gText_AnythingElseICanHelp, ReturnToShopMenuAfterExitingSellMenu); + DisplayItemMessageOnField(taskId, gText_AnythingElseICanHelp, ShowShopMenuAfterExitingBuyOrSellMenu); } } -void ReturnToShopMenuAfterExitingSellMenu(u8 taskId) +static void ShowShopMenuAfterExitingBuyOrSellMenu(u8 taskId) { CreateShopMenu(gMartInfo.martType); DestroyTask(taskId); } -void CB2_BuyMenu(void) +static void CB2_BuyMenu(void) { RunTasks(); AnimateSprites(); @@ -223,14 +418,18 @@ void CB2_BuyMenu(void) UpdatePaletteFade(); } -void VBlankCB_BuyMenu(void) +static void VBlankCB_BuyMenu(void) { LoadOam(); ProcessSpriteCopyRequests(); TransferPlttBuffer(); } -void CB2_InitBuyMenu(void) +#define tItemCount data[1] +#define tItemId data[5] +#define tListTaskId data[7] + +static void CB2_InitBuyMenu(void) { u8 taskId; @@ -248,8 +447,8 @@ void CB2_InitBuyMenu(void) clear_scheduled_bg_copies_to_vram(); gShopDataPtr = AllocZeroed(sizeof(struct ShopData)); gShopDataPtr->scrollIndicatorsTaskId = 0xFF; - gShopDataPtr->unk200D[0] = -1; - gShopDataPtr->unk200D[1] = -1; + gShopDataPtr->itemSpriteIds[0] = -1; + gShopDataPtr->itemSpriteIds[1] = -1; BuyMenuBuildListMenuTemplate(); BuyMenuInitBgs(); FillBgTilemapBufferRect_Palette0(0, 0, 0, 0, 0x20, 0x20); @@ -268,7 +467,7 @@ void CB2_InitBuyMenu(void) BuyMenuDrawGraphics(); BuyMenuAddScrollIndicatorArrows(); taskId = CreateTask(Task_BuyMenu, 8); - gTasks[taskId].data[7] = ListMenuInit(&gMultiuseListMenuTemplate, 0, 0); + gTasks[taskId].tListTaskId = ListMenuInit(&gMultiuseListMenuTemplate, 0, 0); BlendPalettes(0xFFFFFFFF, 0x10, RGB_BLACK); BeginNormalPaletteFade(0xFFFFFFFF, 0, 0x10, 0, RGB_BLACK); SetVBlankCallback(VBlankCB_BuyMenu); @@ -277,7 +476,7 @@ void CB2_InitBuyMenu(void) } } -void BuyMenuFreeMemory(void) +static void BuyMenuFreeMemory(void) { Free(gShopDataPtr); Free(gUnknown_02039F74); @@ -285,7 +484,7 @@ void BuyMenuFreeMemory(void) FreeAllWindowBuffers(); } -void BuyMenuBuildListMenuTemplate(void) +static void BuyMenuBuildListMenuTemplate(void) { u16 i; u16 itemCount; @@ -299,7 +498,7 @@ void BuyMenuBuildListMenuTemplate(void) gUnknown_02039F74[i].name = gUnknown_02039F78[i]; gUnknown_02039F74[i].id = -2; - gMultiuseListMenuTemplate = gUnknown_08589A48; + gMultiuseListMenuTemplate = sShopBuyMenuListTemplate; gMultiuseListMenuTemplate.items = gUnknown_02039F74; gMultiuseListMenuTemplate.totalItems = gMartInfo.itemCount + 1; if (gMultiuseListMenuTemplate.totalItems > 8) @@ -307,10 +506,10 @@ void BuyMenuBuildListMenuTemplate(void) else gMultiuseListMenuTemplate.maxShowed = gMultiuseListMenuTemplate.totalItems; - gShopDataPtr->unk2004 = gMultiuseListMenuTemplate.maxShowed; + gShopDataPtr->itemsShowed = gMultiuseListMenuTemplate.maxShowed; } -void BuyMenuSetListEntry(struct ListMenuItem *menuItem, u16 item, u8 *name) +static void BuyMenuSetListEntry(struct ListMenuItem *menuItem, u16 item, u8 *name) { if (gMartInfo.martType == MART_TYPE_0) CopyItemName(item, name); @@ -321,19 +520,19 @@ void BuyMenuSetListEntry(struct ListMenuItem *menuItem, u16 item, u8 *name) menuItem->id = item; } -void BuyMenuPrintItemDescriptionAndShowItemIcon(int item, bool8 onInit, struct ListMenu *list) +static 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); + BuyMenuAddItemIcon(item, gShopDataPtr->iconSlot); else - BuyMenuAddItemIcon(-1, gShopDataPtr->unk200C); + BuyMenuAddItemIcon(-1, gShopDataPtr->iconSlot); - BuyMenuRemoveItemIcon(item, gShopDataPtr->unk200C ^ 1); - gShopDataPtr->unk200C ^= 1; + BuyMenuRemoveItemIcon(item, gShopDataPtr->iconSlot ^ 1); + gShopDataPtr->iconSlot ^= 1; if (item != -2) { if (gMartInfo.martType == MART_TYPE_0) @@ -350,7 +549,7 @@ void BuyMenuPrintItemDescriptionAndShowItemIcon(int item, bool8 onInit, struct L BuyMenuPrint(2, description, 3, 1, 0, 0); } -void BuyMenuPrintPriceInList(u8 windowId, int item, u8 y) +static void BuyMenuPrintPriceInList(u8 windowId, int item, u8 y) { u8 x; @@ -375,11 +574,11 @@ void BuyMenuPrintPriceInList(u8 windowId, int item, u8 y) StringExpandPlaceholders(gStringVar4, gText_PokedollarVar1); x = GetStringRightAlignXOffset(7, gStringVar4, 0x78); - AddTextPrinterParameterized4(windowId, 7, x, y, 0, 0, gUnknown_08589AB0[1], -1, gStringVar4); + AddTextPrinterParameterized4(windowId, 7, x, y, 0, 0, sShopBuyMenuTextColors[1], -1, gStringVar4); } } -void BuyMenuAddScrollIndicatorArrows(void) +static void BuyMenuAddScrollIndicatorArrows(void) { if (gShopDataPtr->scrollIndicatorsTaskId == 0xFF && gMartInfo.itemCount + 1 > 8) { @@ -389,13 +588,13 @@ void BuyMenuAddScrollIndicatorArrows(void) 0xC, 0x94, gMartInfo.itemCount - 7, - 0x834, - 0x834, - &gShopDataPtr->unk2008); + 2100, + 2100, + &gShopDataPtr->scrollOffset); } } -void BuyMenuRemoveScrollIndicatorArrows(void) +static void BuyMenuRemoveScrollIndicatorArrows(void) { if (gShopDataPtr->scrollIndicatorsTaskId != 0xFF) { @@ -404,22 +603,22 @@ void BuyMenuRemoveScrollIndicatorArrows(void) } } -void BuyMenuPrintCursor(u8 scrollIndicatorsTaskId, u8 colorSet) +static void BuyMenuPrintCursor(u8 scrollIndicatorsTaskId, u8 colorSet) { u8 y = ListMenuGetYCoordForPrintingArrowCursor(scrollIndicatorsTaskId); BuyMenuPrint(1, gText_SelectorArrow2, 0, y, 0, colorSet); } -void BuyMenuAddItemIcon(u16 item, u8 iconSlot) +static void BuyMenuAddItemIcon(u16 item, u8 iconSlot) { u8 spriteId; - u8 *spriteIdPtr = &gShopDataPtr->unk200D[iconSlot]; + u8 *spriteIdPtr = &gShopDataPtr->itemSpriteIds[iconSlot]; if (*spriteIdPtr != 0xFF) return; if (gMartInfo.martType == MART_TYPE_0 || item == 0xFFFF) { - spriteId = AddItemIconSprite(iconSlot + 0x83E, iconSlot + 0x83E, item); + spriteId = AddItemIconSprite(iconSlot + 2110, iconSlot + 2110, item); if (spriteId != MAX_SPRITES) { *spriteIdPtr = spriteId; @@ -429,28 +628,28 @@ void BuyMenuAddItemIcon(u16 item, u8 iconSlot) } else { - spriteId = AddDecorationIconObject(item, 20, 84, 1, iconSlot + 0x83E, iconSlot + 0x83E); + spriteId = AddDecorationIconObject(item, 20, 84, 1, iconSlot + 2110, iconSlot + 2110); if (spriteId != MAX_SPRITES) *spriteIdPtr = spriteId; } } -void BuyMenuRemoveItemIcon(u16 item, u8 iconSlot) +static void BuyMenuRemoveItemIcon(u16 item, u8 iconSlot) { - u8 *spriteIdPtr = &gShopDataPtr->unk200D[iconSlot]; + u8 *spriteIdPtr = &gShopDataPtr->itemSpriteIds[iconSlot]; if (*spriteIdPtr == 0xFF) return; - FreeSpriteTilesByTag(iconSlot + 0x83E); - FreeSpritePaletteByTag(iconSlot + 0x83E); + FreeSpriteTilesByTag(iconSlot + 2110); + FreeSpritePaletteByTag(iconSlot + 2110); DestroySprite(&gSprites[*spriteIdPtr]); *spriteIdPtr = 0xFF; } -void BuyMenuInitBgs(void) +static void BuyMenuInitBgs(void) { ResetBgsAndClearDma3BusyFlags(0); - InitBgsFromTemplates(0, gUnknown_08589A60, ARRAY_COUNT(gUnknown_08589A60)); + InitBgsFromTemplates(0, sShopBuyMenuBgTemplates, ARRAY_COUNT(sShopBuyMenuBgTemplates)); SetBgTilemapBuffer(1, gShopDataPtr->tilemapBuffers[1]); SetBgTilemapBuffer(2, gShopDataPtr->tilemapBuffers[3]); SetBgTilemapBuffer(3, gShopDataPtr->tilemapBuffers[2]); @@ -470,16 +669,16 @@ void BuyMenuInitBgs(void) ShowBg(3); } -void BuyMenuDecompressBgGraphics(void) +static 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) +static void BuyMenuInitWindows(void) { - InitWindows(gUnknown_08589A70); + InitWindows(sShopBuyMenuWindowTemplates); DeactivateAllTextPrinters(); LoadUserWindowBorderGfx(0, 1, 0xD0); LoadMessageBoxGfx(0, 0xA, 0xE0); @@ -488,18 +687,18 @@ void BuyMenuInitWindows(void) PutWindowTilemap(2); } -void BuyMenuPrint(u8 windowId, const u8 *text, u8 x, u8 y, s8 speed, u8 colorSet) +static void BuyMenuPrint(u8 windowId, const u8 *text, u8 x, u8 y, s8 speed, u8 colorSet) { - AddTextPrinterParameterized4(windowId, 1, x, y, 0, 0, gUnknown_08589AB0[colorSet], speed, text); + AddTextPrinterParameterized4(windowId, 1, x, y, 0, 0, sShopBuyMenuTextColors[colorSet], speed, text); } -void BuyMenuDisplayMessage(u8 taskId, const u8 *text, TaskFunc callback) +static 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) +static void BuyMenuDrawGraphics(void) { BuyMenuDrawMapGraphics(); BuyMenuCopyMenuBgToBg1TilemapBuffer(); @@ -511,24 +710,22 @@ void BuyMenuDrawGraphics(void) schedule_bg_copy_tilemap_to_vram(3); } -void BuyMenuDrawMapGraphics(void) +static 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) +static void BuyMenuDrawMapBg(void) { s16 i; s16 j; s16 x; s16 y; const struct MapLayout *mapLayout; - u16 metatile, metatileLayerType; + u16 metatile; + u8 metatileLayerType; mapLayout = gMapHeader.mapLayout; GetXYCoordsOneStepInFrontOfPlayer(&x, &y); @@ -545,135 +742,491 @@ void BuyMenuDrawMapBg(void) else metatileLayerType = 1; - if (metatile < 0x200) + if (metatile < NUM_METATILES_IN_PRIMARY) { BuyMenuDrawMapMetatile(i, j, (u16*)mapLayout->primaryTileset->metatiles + metatile * 8, metatileLayerType); } else { - BuyMenuDrawMapMetatile(i, j, (u16*)mapLayout->secondaryTileset->metatiles + ((metatile - 0x200) * 8), metatileLayerType); + BuyMenuDrawMapMetatile(i, j, (u16*)mapLayout->secondaryTileset->metatiles + ((metatile - NUM_METATILES_IN_PRIMARY) * 8), metatileLayerType); + } + } + } +} + +static void BuyMenuDrawMapMetatile(s16 x, s16 y, const u16 *src, u8 metatileLayerType) +{ + u16 offset1 = x * 2; + u16 offset2 = y * 64; + + switch (metatileLayerType) + { + case 0: + BuyMenuDrawMapMetatileLayer(gShopDataPtr->tilemapBuffers[3], offset1, offset2, src); + BuyMenuDrawMapMetatileLayer(gShopDataPtr->tilemapBuffers[1], offset1, offset2, src + 4); + break; + case 1: + BuyMenuDrawMapMetatileLayer(gShopDataPtr->tilemapBuffers[2], offset1, offset2, src); + BuyMenuDrawMapMetatileLayer(gShopDataPtr->tilemapBuffers[3], offset1, offset2, src + 4); + break; + case 2: + BuyMenuDrawMapMetatileLayer(gShopDataPtr->tilemapBuffers[2], offset1, offset2, src); + BuyMenuDrawMapMetatileLayer(gShopDataPtr->tilemapBuffers[1], offset1, offset2, src + 4); + break; + } +} + +static void BuyMenuDrawMapMetatileLayer(u16 *dest, s16 offset1, s16 offset2, const u16 *src) +{ + // This function draws a whole 2x2 metatile. + dest[offset1 + offset2] = src[0]; // top left + dest[offset1 + offset2 + 1] = src[1]; // top right + dest[offset1 + offset2 + 32] = src[2]; // bottom left + dest[offset1 + offset2 + 33] = src[3]; // bottom right +} + +static void BuyMenuCollectEventObjectData(void) +{ + s16 facingX; + s16 facingY; + u8 y; + u8 x; + u8 r8 = 0; + + GetXYCoordsOneStepInFrontOfPlayer(&facingX, &facingY); + for (y = 0; y < 16; y++) + gShopDataPtr->viewportObjects[y][EVENT_OBJ_ID] = 16; + for (y = 0; y < 5; y++) + { + for (x = 0; x < 7; x++) + { + u8 eventObjId = GetEventObjectIdByXY(facingX - 4 + x, facingY - 2 + y); + + if (eventObjId != 16) + { + gShopDataPtr->viewportObjects[r8][EVENT_OBJ_ID] = eventObjId; + gShopDataPtr->viewportObjects[r8][X_COORD] = x; + gShopDataPtr->viewportObjects[r8][Y_COORD] = y; + gShopDataPtr->viewportObjects[r8][LAYER_TYPE] = MapGridGetMetatileLayerTypeAt(facingX - 4 + x, facingY - 2 + y); + + switch (gEventObjects[eventObjId].facingDirection) + { + case DIR_SOUTH: + gShopDataPtr->viewportObjects[r8][ANIM_NUM] = 0; + break; + case DIR_NORTH: + gShopDataPtr->viewportObjects[r8][ANIM_NUM] = 1; + break; + case DIR_WEST: + gShopDataPtr->viewportObjects[r8][ANIM_NUM] = 2; + break; + case DIR_EAST: + default: + gShopDataPtr->viewportObjects[r8][ANIM_NUM] = 3; + break; + } + r8++; + } + } + } +} + +static void BuyMenuDrawEventObjects(void) +{ + u8 i; + u8 spriteId; + const struct EventObjectGraphicsInfo *graphicsInfo; + + for (i = 0; i < 16; i++) // max objects? + { + if (gShopDataPtr->viewportObjects[i][EVENT_OBJ_ID] == 16) + continue; + + graphicsInfo = GetEventObjectGraphicsInfo(gEventObjects[gShopDataPtr->viewportObjects[i][EVENT_OBJ_ID]].graphicsId); + + spriteId = AddPseudoEventObject( + gEventObjects[gShopDataPtr->viewportObjects[i][EVENT_OBJ_ID]].graphicsId, + SpriteCallbackDummy, + (u16)gShopDataPtr->viewportObjects[i][X_COORD] * 16 + 8, + (u16)gShopDataPtr->viewportObjects[i][Y_COORD] * 16 + 48 - graphicsInfo->height / 2, + 2); + + if (BuyMenuCheckIfEventObjectOverlapsMenuBg(gShopDataPtr->viewportObjects[i]) == TRUE) + { + gSprites[spriteId].subspriteTableNum = 4; + gSprites[spriteId].subspriteMode = 1; + } + + StartSpriteAnim(&gSprites[spriteId], gShopDataPtr->viewportObjects[i][ANIM_NUM]); + } +} + +static bool8 BuyMenuCheckIfEventObjectOverlapsMenuBg(s16 *object) +{ + if (!BuyMenuCheckForOverlapWithMenuBg(object[X_COORD], object[Y_COORD] + 2) && object[LAYER_TYPE] != MB_SECRET_BASE_WALL) + { + return TRUE; + } + else + { + return FALSE; + } +} + +static void BuyMenuCopyMenuBgToBg1TilemapBuffer(void) +{ + s16 i; + u16 *dest = gShopDataPtr->tilemapBuffers[1]; + const u16 *src = gShopDataPtr->tilemapBuffers[0]; + + for (i = 0; i < 1024; i++) + { + if (src[i] != 0) + { + dest[i] = src[i] + 0xC3E3; + } + } +} + +static bool8 BuyMenuCheckForOverlapWithMenuBg(int x, int y) +{ + const u16 *metatile = gShopDataPtr->tilemapBuffers[0]; + int offset1 = x * 2; + int offset2 = y * 64; + + if (metatile[offset2 + offset1] == 0 && + metatile[offset2 + offset1 + 32] == 0 && + metatile[offset2 + offset1 + 1] == 0 && + metatile[offset2 + offset1 + 33] == 0) + { + return TRUE; + } + + return FALSE; +} + +static void Task_BuyMenu(u8 taskId) +{ + s16 *data = gTasks[taskId].data; + + if (!gPaletteFade.active) + { + s32 itemId = ListMenuHandleInputGetItemId(tListTaskId); + ListMenuGetScrollAndRow(tListTaskId, &gShopDataPtr->scrollOffset, &gShopDataPtr->selectedRow); + + switch (itemId) + { + case LIST_NOTHING_CHOSEN: + break; + case LIST_B_PRESSED: + PlaySE(SE_SELECT); + ExitBuyMenu(taskId); + break; + default: + PlaySE(SE_SELECT); + tItemId = itemId; + ClearWindowTilemap(2); + BuyMenuRemoveScrollIndicatorArrows(); + BuyMenuPrintCursor(tListTaskId, 2); + + if (gMartInfo.martType == MART_TYPE_0) + { + gShopDataPtr->totalCost = (ItemId_GetPrice(itemId) >> GetPriceReduction(1)); + } + else + { + gShopDataPtr->totalCost = gDecorations[itemId].price; + } + + if (!IsEnoughMoney(&gSaveBlock1Ptr->money, gShopDataPtr->totalCost)) + { + BuyMenuDisplayMessage(taskId, gText_YouDontHaveMoney, BuyMenuReturnToItemList); + } + else + { + if (gMartInfo.martType == MART_TYPE_0) + { + CopyItemName(itemId, gStringVar1); + if (ItemId_GetPocket(itemId) == POCKET_TM_HM) + { + StringCopy(gStringVar2, gMoveNames[ItemIdToBattleMoveId(itemId)]); + BuyMenuDisplayMessage(taskId, gText_Var1CertainlyHowMany2, Task_BuyHowManyDialogueInit); + } + else + { + BuyMenuDisplayMessage(taskId, gText_Var1CertainlyHowMany, Task_BuyHowManyDialogueInit); + } + } + else + { + StringCopy(gStringVar1, gDecorations[itemId].name); + ConvertIntToDecimalStringN(gStringVar2, gShopDataPtr->totalCost, STR_CONV_MODE_LEFT_ALIGN, 6); + + if (gMartInfo.martType == MART_TYPE_1) + StringExpandPlaceholders(gStringVar4, gText_Var1IsItThatllBeVar2); + else + StringExpandPlaceholders(gStringVar4, gText_YouWantedVar1ThatllBeVar2); + BuyMenuDisplayMessage(taskId, gStringVar4, BuyMenuConfirmPurchase); + } + } + break; + } + } +} + +static void Task_BuyHowManyDialogueInit(u8 taskId) +{ + s16 *data = gTasks[taskId].data; + + u16 quantityInBag = CountTotalItemQuantityInBag(tItemId); + u16 maxQuantity; + + SetWindowBorderStyle(3, FALSE, 1, 13); + ConvertIntToDecimalStringN(gStringVar1, quantityInBag, STR_CONV_MODE_RIGHT_ALIGN, 4); + StringExpandPlaceholders(gStringVar4, gText_InBagVar1); + BuyMenuPrint(3, gStringVar4, 0, 1, 0, 0); + tItemCount = 1; + SetWindowBorderStyle(4, FALSE, 1, 13); + BuyMenuPrintItemQuantityAndPrice(taskId); + schedule_bg_copy_tilemap_to_vram(0); + + maxQuantity = GetMoney(&gSaveBlock1Ptr->money) / gShopDataPtr->totalCost; + + if (maxQuantity > 99) + { + gShopDataPtr->maxQuantity = 99; + } + else + { + gShopDataPtr->maxQuantity = maxQuantity; + } + + gTasks[taskId].func = Task_BuyHowManyDialogueHandleInput; +} + +static void Task_BuyHowManyDialogueHandleInput(u8 taskId) +{ + s16 *data = gTasks[taskId].data; + + if (AdjustQuantityAccordingToDPadInput(&tItemCount, gShopDataPtr->maxQuantity) == TRUE) + { + gShopDataPtr->totalCost = (ItemId_GetPrice(tItemId) >> GetPriceReduction(1)) * tItemCount; + BuyMenuPrintItemQuantityAndPrice(taskId); + } + else + { + if (gMain.newKeys & A_BUTTON) + { + PlaySE(SE_SELECT); + sub_8198070(4, 0); + sub_8198070(3, 0); + ClearWindowTilemap(4); + ClearWindowTilemap(3); + PutWindowTilemap(1); + CopyItemName(tItemId, gStringVar1); + ConvertIntToDecimalStringN(gStringVar2, tItemCount, STR_CONV_MODE_LEFT_ALIGN, 2); + ConvertIntToDecimalStringN(gStringVar3, gShopDataPtr->totalCost, STR_CONV_MODE_LEFT_ALIGN, 6); + BuyMenuDisplayMessage(taskId, gText_Var1AndYouWantedVar2, BuyMenuConfirmPurchase); + } + else if (gMain.newKeys & B_BUTTON) + { + PlaySE(SE_SELECT); + sub_8198070(4, 0); + sub_8198070(3, 0); + ClearWindowTilemap(4); + ClearWindowTilemap(3); + BuyMenuReturnToItemList(taskId); + } + } +} + +static void BuyMenuConfirmPurchase(u8 taskId) +{ + CreateYesNoMenuWithCallbacks(taskId, &sShopBuyMenuYesNoWindowTemplates, 1, 0, 0, 1, 13, &sShopPurchaseYesNoFuncs); +} + +static void BuyMenuTryMakePurchase(u8 taskId) +{ + s16 *data = gTasks[taskId].data; + + PutWindowTilemap(1); + + if (gMartInfo.martType == MART_TYPE_0) + { + if (AddBagItem(tItemId, tItemCount) == TRUE) + { + BuyMenuDisplayMessage(taskId, gText_HereYouGoThankYou, BuyMenuSubtractMoney); + RecordItemPurchase(taskId); + } + else + { + BuyMenuDisplayMessage(taskId, gText_NoMoreRoomForThis, BuyMenuReturnToItemList); + } + } + else + { + if (DecorationAdd(tItemId)) + { + if (gMartInfo.martType == MART_TYPE_1) + { + BuyMenuDisplayMessage(taskId, gText_ThankYouIllSendItHome, BuyMenuSubtractMoney); + } + else + { + BuyMenuDisplayMessage(taskId, gText_ThanksIllSendItHome, BuyMenuSubtractMoney); } } + else + { + BuyMenuDisplayMessage(taskId, gText_SpaceForVar1Full, BuyMenuReturnToItemList); + } + } +} + +static void BuyMenuSubtractMoney(u8 taskId) +{ + IncrementGameStat(GAME_STAT_SHOPPED); + RemoveMoney(&gSaveBlock1Ptr->money, gShopDataPtr->totalCost); + PlaySE(SE_REGI); + PrintMoneyAmountInMoneyBox(0, GetMoney(&gSaveBlock1Ptr->money), 0); + + if (gMartInfo.martType == MART_TYPE_0) + { + gTasks[taskId].func = Task_ReturnToItemListAfterItemPurchase; + } + else + { + gTasks[taskId].func = Task_ReturnToItemListAfterDecorationPurchase; } } -#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 + +static void Task_ReturnToItemListAfterItemPurchase(u8 taskId) +{ + s16 *data = gTasks[taskId].data; + + if (gMain.newKeys & (A_BUTTON | B_BUTTON)) + { + PlaySE(SE_SELECT); + if (tItemId == ITEM_POKE_BALL && tItemCount > 9 && AddBagItem(ITEM_PREMIER_BALL, 1) == TRUE) + { + BuyMenuDisplayMessage(taskId, gText_ThrowInPremierBall, BuyMenuReturnToItemList); + } + else + { + BuyMenuReturnToItemList(taskId); + } + } +} + +static void Task_ReturnToItemListAfterDecorationPurchase(u8 taskId) +{ + if (gMain.newKeys & (A_BUTTON | B_BUTTON)) + { + PlaySE(SE_SELECT); + BuyMenuReturnToItemList(taskId); + } +} + +static void BuyMenuReturnToItemList(u8 taskId) +{ + s16 *data = gTasks[taskId].data; + + sub_8197DF8(5, 0); + BuyMenuPrintCursor(tListTaskId, 1); + PutWindowTilemap(1); + PutWindowTilemap(2); + schedule_bg_copy_tilemap_to_vram(0); + BuyMenuAddScrollIndicatorArrows(); + gTasks[taskId].func = Task_BuyMenu; +} + +static void BuyMenuPrintItemQuantityAndPrice(u8 taskId) +{ + s16 *data = gTasks[taskId].data; + + FillWindowPixelBuffer(4, 0x11); + PrintMoneyAmount(4, 38, 1, gShopDataPtr->totalCost, TEXT_SPEED_FF); + ConvertIntToDecimalStringN(gStringVar1, tItemCount, 2, 2); + StringExpandPlaceholders(gStringVar4, gText_xVar1); + BuyMenuPrint(4, gStringVar4, 0, 1, 0, 0); +} + +static void ExitBuyMenu(u8 taskId) +{ + gFieldCallback = MapPostLoadHook_ReturnToShopMenu; + BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 16, 0); + gTasks[taskId].func = Task_ExitBuyMenu; +} + +static void Task_ExitBuyMenu(u8 taskId) +{ + if (!gPaletteFade.active) + { + RemoveMoneyLabelObject(); + BuyMenuFreeMemory(); + SetMainCallback2(CB2_ReturnToField); + DestroyTask(taskId); + } +} + +static void ClearItemPurchases(void) +{ + gMartPurchaseHistoryId = 0; + memset(gMartPurchaseHistory, 0, sizeof(gMartPurchaseHistory)); +} + +static void RecordItemPurchase(u8 taskId) +{ + s16 *data = gTasks[taskId].data; + + u16 i; + + for (i = 0; i < 3; i++) + { + if (gMartPurchaseHistory[i].itemId == tItemId && gMartPurchaseHistory[i].quantity != 0) + { + if (gMartPurchaseHistory[i].quantity + tItemCount > 255) + { + gMartPurchaseHistory[i].quantity = 255; + } + else + { + gMartPurchaseHistory[i].quantity += tItemCount; + } + return; + } + } + + if (gMartPurchaseHistoryId < 3) + { + gMartPurchaseHistory[gMartPurchaseHistoryId].itemId = tItemId; + gMartPurchaseHistory[gMartPurchaseHistoryId].quantity = tItemCount; + gMartPurchaseHistoryId++; + } +} + +#undef tItemCount +#undef tItemId +#undef tListTaskId + +void CreatePokemartMenu(const u16 *itemsForSale) +{ + CreateShopMenu(MART_TYPE_0); + SetShopItemsForSale(itemsForSale); + ClearItemPurchases(); + SetShopMenuCallback(EnableBothScriptContexts); +} + +void CreateDecorationShop1Menu(const u16 *itemsForSale) +{ + CreateShopMenu(MART_TYPE_1); + SetShopItemsForSale(itemsForSale); + SetShopMenuCallback(EnableBothScriptContexts); +} + +void CreateDecorationShop2Menu(const u16 *itemsForSale) +{ + CreateShopMenu(MART_TYPE_2); + SetShopItemsForSale(itemsForSale); + SetShopMenuCallback(EnableBothScriptContexts); +} diff --git a/src/strings.c b/src/strings.c index cdbbb4468..15c247744 100644 --- a/src/strings.c +++ b/src/strings.c @@ -349,9 +349,9 @@ const u8 gText_Var1ThrownAway[] = _("The {STR_VAR_1}\nwas thrown away."); const u8 gText_Var1AteTheVar2[] = _("{STR_VAR_1} ate the\n{STR_VAR_2}.{PAUSE_UNTIL_PRESS}"); const u8 gText_Var1HappilyAteVar2[] = _("{STR_VAR_1} happily ate the\n{STR_VAR_2}.{PAUSE_UNTIL_PRESS}"); const u8 gText_Var1DisdainfullyAteVar2[] = _("{STR_VAR_1} disdainfully ate the\n{STR_VAR_2}.{PAUSE_UNTIL_PRESS}"); -const u8 gUnknown_085E93C7[] = _("BUY"); -const u8 gUnknown_085E93CB[] = _("SELL"); -const u8 gUnknown_085E93D0[] = _("QUIT"); +const u8 gText_ShopBuy[] = _("BUY"); +const u8 gText_ShopSell[] = _("SELL"); +const u8 gText_ShopQuit[] = _("QUIT"); const u8 gText_InBagVar1[] = _("IN BAG: {STR_VAR_1}"); const u8 gText_QuitShopping[] = _("Quit shopping."); const u8 gText_Var1CertainlyHowMany[] = _("{STR_VAR_1}? Certainly.\nHow many would you like?"); @@ -1580,7 +1580,7 @@ void SaveRecordedItemPurchasesForTVShow(void) if (sCurTVShowSlot != -1 && HasMixableShowAlreadyBeenSpawnedWithPlayerID(TVSHOW_SMART_SHOPPER, FALSE) != TRUE) { TV_SortPurchasesByQuantity(); - if (gUnknown_02039F80[0].quantity >= 20) + if (gMartPurchaseHistory[0].quantity >= 20) { show = &gSaveBlock1Ptr->tvShows[sCurTVShowSlot]; show->smartshopperShow.kind = TVSHOW_SMART_SHOPPER; @@ -1588,8 +1588,8 @@ void SaveRecordedItemPurchasesForTVShow(void) show->smartshopperShow.shopLocation = gMapHeader.regionMapSectionId; for (i = 0; i < 3; i ++) { - show->smartshopperShow.itemIds[i] = gUnknown_02039F80[i].itemId; - show->smartshopperShow.itemAmounts[i] = gUnknown_02039F80[i].quantity; + show->smartshopperShow.itemIds[i] = gMartPurchaseHistory[i].itemId; + show->smartshopperShow.itemAmounts[i] = gMartPurchaseHistory[i].quantity; } show->smartshopperShow.priceReduced = GetPriceReduction(1); StringCopy(show->smartshopperShow.playerName, gSaveBlock2Ptr->playerName); @@ -2992,14 +2992,14 @@ void TV_SortPurchasesByQuantity(void) { for (j = i + 1; j < 3; j ++) { - if (gUnknown_02039F80[i].quantity < gUnknown_02039F80[j].quantity) - { - tmpId = gUnknown_02039F80[i].itemId; - tmpQn = gUnknown_02039F80[i].quantity; - gUnknown_02039F80[i].itemId = gUnknown_02039F80[j].itemId; - gUnknown_02039F80[i].quantity = gUnknown_02039F80[j].quantity; - gUnknown_02039F80[j].itemId = tmpId; - gUnknown_02039F80[j].quantity = tmpQn; + if (gMartPurchaseHistory[i].quantity < gMartPurchaseHistory[j].quantity) + { + tmpId = gMartPurchaseHistory[i].itemId; + tmpQn = gMartPurchaseHistory[i].quantity; + gMartPurchaseHistory[i].itemId = gMartPurchaseHistory[j].itemId; + gMartPurchaseHistory[i].quantity = gMartPurchaseHistory[j].quantity; + gMartPurchaseHistory[j].itemId = tmpId; + gMartPurchaseHistory[j].quantity = tmpQn; } } } diff --git a/sym_ewram.txt b/sym_ewram.txt index 7219e38c1..db4f7935f 100644 --- a/sym_ewram.txt +++ b/sym_ewram.txt @@ -373,27 +373,10 @@ gUnknown_02039F5C: @ 2039F5C gUnknown_02039F5D: @ 2039F5D .space 0x3 -gMartInfo: @ 2039F60 - .space 0x10 - -gShopDataPtr: @ 2039F70 - .space 0x4 - -gUnknown_02039F74: @ 2039F74 - .space 0x4 - -gUnknown_02039F78: @ 2039F78 - .space 0x4 - -gUnknown_02039F7C: @ 2039F7C - .space 0x4 - -gUnknown_02039F80: @ 2039F80 - .space 0xC - -gUnknown_02039F8C: @ 2039F8C - .space 0x4 + .include "src/shop.o" + .include "src/fldeff_escalator.o" + .align 2 gUnknown_02039F90: @ 2039F90 .space 0x4 |