diff options
Diffstat (limited to 'de/engine/overworld/pokemart.asm')
-rwxr-xr-x | de/engine/overworld/pokemart.asm | 272 |
1 files changed, 272 insertions, 0 deletions
diff --git a/de/engine/overworld/pokemart.asm b/de/engine/overworld/pokemart.asm new file mode 100755 index 00000000..a8f3fae6 --- /dev/null +++ b/de/engine/overworld/pokemart.asm @@ -0,0 +1,272 @@ +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 a,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, 13, 7 + lb bc, 8, 14 + ld a,TWO_OPTION_MENU + ld [wTextBoxID],a + call DisplayTextBoxID ; yes/no menu + ld a,[wMenuExitMethod] + cp a,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 CopyStringToCF50 ; copy name to wcf50 + ld hl,PokemartTellBuyPriceText + call PrintText + coord hl, 13, 7 + lb bc, 8, 14 + ld a,TWO_OPTION_MENU + ld [wTextBoxID],a + call DisplayTextBoxID ; yes/no menu + ld a,[wMenuExitMethod] + cp a,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 "@" |