ref: 1aefbfa5230fe188417e52674f79a6d5b009a51e
dir: /engine/overworld/pokemart.asm/
DisplayPokemartDialogue_: ld a, [wListScrollOffset] ld [wSavedListScrollOffset], a call UpdateSprites xor a ld [wBoughtOrSoldItemInMart], a .loop xor a ld [wListScrollOffset], a ld [wCurrentMenuItem], a ld [wPlayerMonNumber], a inc a ld [wPrintItemPrices], a ld a, MONEY_BOX ld [wTextBoxID], a call DisplayTextBoxID ld a, BUY_SELL_QUIT_MENU ld [wTextBoxID], a call DisplayTextBoxID ; This code is useless. It copies the address of the pokemart's inventory to hl, ; but the address is never used. ld hl, wItemListPointer ld a, [hli] ld l, [hl] ld h, a ld a, [wMenuExitMethod] cp CANCELLED_MENU jp z, .done ld a, [wChosenMenuItem] and a ; buying? jp z, .buyMenu dec a ; selling? jp z, .sellMenu dec a ; quitting? jp z, .done .sellMenu ; the same variables are set again below, so this code has no effect xor a ld [wPrintItemPrices], a ld a, INIT_BAG_ITEM_LIST ld [wInitListType], a callab InitList ld a, [wNumBagItems] and a jp z, .bagEmpty ld hl, PokemonSellingGreetingText call PrintText call SaveScreenTilesToBuffer1 ; save screen .sellMenuLoop call LoadScreenTilesFromBuffer1 ; restore saved screen ld a, MONEY_BOX ld [wTextBoxID], a call DisplayTextBoxID ; draw money text box ld hl, wNumBagItems ld a, l ld [wListPointer], a ld a, h ld [wListPointer + 1], a xor a ld [wPrintItemPrices], a ld [wCurrentMenuItem], a ld a, ITEMLISTMENU ld [wListMenuID], a call DisplayListMenuID jp c, .returnToMainPokemartMenu ; if the player closed the menu .confirmItemSale ; if the player is trying to sell a specific item call IsKeyItem ld a, [wIsKeyItem] and a jr nz, .unsellableItem ld a, [wcf91] call IsItemHM jr c, .unsellableItem ld a, PRICEDITEMLISTMENU ld [wListMenuID], a ld [hHalveItemPrices], a ; halve prices when selling call DisplayChooseQuantityMenu inc a jr z, .sellMenuLoop ; if the player closed the choose quantity menu with the B button ld hl, PokemartTellSellPriceText lb bc, 14, 1 ; location that PrintText always prints to, this is useless call PrintText coord hl, 14, 7 lb bc, 8, 15 ld a, TWO_OPTION_MENU ld [wTextBoxID], a call DisplayTextBoxID ; yes/no menu ld a, [wMenuExitMethod] cp CHOSE_SECOND_ITEM jr z, .sellMenuLoop ; if the player chose No or pressed the B button ; The following code is supposed to check if the player chose No, but the above ; check already catches it. ld a, [wChosenMenuItem] dec a jr z, .sellMenuLoop .sellItem ld a, [wBoughtOrSoldItemInMart] and a jr nz, .skipSettingFlag1 inc a ld [wBoughtOrSoldItemInMart], a .skipSettingFlag1 call AddAmountSoldToMoney ld hl, wNumBagItems call RemoveItemFromInventory jp .sellMenuLoop .unsellableItem ld hl, PokemartUnsellableItemText call PrintText jp .returnToMainPokemartMenu .bagEmpty ld hl, PokemartItemBagEmptyText call PrintText call SaveScreenTilesToBuffer1 jp .returnToMainPokemartMenu .buyMenu ; the same variables are set again below, so this code has no effect ld a, 1 ld [wPrintItemPrices], a ld a, INIT_OTHER_ITEM_LIST ld [wInitListType], a callab InitList ld hl, PokemartBuyingGreetingText call PrintText call SaveScreenTilesToBuffer1 .buyMenuLoop call LoadScreenTilesFromBuffer1 ld a, MONEY_BOX ld [wTextBoxID], a call DisplayTextBoxID ld hl, wItemList ld a, l ld [wListPointer], a ld a, h ld [wListPointer + 1], a xor a ld [wCurrentMenuItem], a inc a ld [wPrintItemPrices], a inc a ; a = 2 (PRICEDITEMLISTMENU) ld [wListMenuID], a call DisplayListMenuID jr c, .returnToMainPokemartMenu ; if the player closed the menu ld a, 99 ld [wMaxItemQuantity], a xor a ld [hHalveItemPrices], a ; don't halve item prices when buying call DisplayChooseQuantityMenu inc a jr z, .buyMenuLoop ; if the player closed the choose quantity menu with the B button ld a, [wcf91] ; item ID ld [wd11e], a ; store item ID for GetItemName call GetItemName call CopyStringToCF4B ; copy name to wcf4b ld hl, PokemartTellBuyPriceText call PrintText coord hl, 14, 7 lb bc, 8, 15 ld a, TWO_OPTION_MENU ld [wTextBoxID], a call DisplayTextBoxID ; yes/no menu ld a, [wMenuExitMethod] cp CHOSE_SECOND_ITEM jp z, .buyMenuLoop ; if the player chose No or pressed the B button ; The following code is supposed to check if the player chose No, but the above ; check already catches it. ld a, [wChosenMenuItem] dec a jr z, .buyMenuLoop .buyItem call .isThereEnoughMoney jr c, .notEnoughMoney ld hl, wNumBagItems call AddItemToInventory jr nc, .bagFull call SubtractAmountPaidFromMoney ld a, [wBoughtOrSoldItemInMart] and a jr nz, .skipSettingFlag2 ld a, 1 ld [wBoughtOrSoldItemInMart], a .skipSettingFlag2 ld a, SFX_PURCHASE call PlaySoundWaitForCurrent call WaitForSoundToFinish ld hl, PokemartBoughtItemText call PrintText jp .buyMenuLoop .returnToMainPokemartMenu call LoadScreenTilesFromBuffer1 ld a, MONEY_BOX ld [wTextBoxID], a call DisplayTextBoxID ld hl, PokemartAnythingElseText call PrintText jp .loop .isThereEnoughMoney ld de, wPlayerMoney ld hl, hMoney ld c, 3 ; length of money in bytes jp StringCmp .notEnoughMoney ld hl, PokemartNotEnoughMoneyText call PrintText jr .returnToMainPokemartMenu .bagFull ld hl, PokemartItemBagFullText call PrintText jr .returnToMainPokemartMenu .done ld hl, PokemartThankYouText call PrintText ld a, 1 ld [wUpdateSpritesEnabled], a call UpdateSprites ld a, [wSavedListScrollOffset] ld [wListScrollOffset], a ret PokemartBuyingGreetingText: TX_FAR _PokemartBuyingGreetingText db "@" PokemartTellBuyPriceText: TX_FAR _PokemartTellBuyPriceText db "@" PokemartBoughtItemText: TX_FAR _PokemartBoughtItemText db "@" PokemartNotEnoughMoneyText: TX_FAR _PokemartNotEnoughMoneyText db "@" PokemartItemBagFullText: TX_FAR _PokemartItemBagFullText db "@" PokemonSellingGreetingText: TX_FAR _PokemonSellingGreetingText db "@" PokemartTellSellPriceText: TX_FAR _PokemartTellSellPriceText db "@" PokemartItemBagEmptyText: TX_FAR _PokemartItemBagEmptyText db "@" PokemartUnsellableItemText: TX_FAR _PokemartUnsellableItemText db "@" PokemartThankYouText: TX_FAR _PokemartThankYouText db "@" PokemartAnythingElseText: TX_FAR _PokemartAnythingElseText db "@"