summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--main.asm427
1 files changed, 415 insertions, 12 deletions
diff --git a/main.asm b/main.asm
index b9c8b629..d9efcb2d 100644
--- a/main.asm
+++ b/main.asm
@@ -5158,7 +5158,7 @@ DisplayPokemartDialogue: ; 2A2E
ld a,$01
ld [$ffb8],a
ld [$2000],a
- call $6c20
+ call DisplayPokemartDialogue_
pop af
ld [$ffb8],a
ld [$2000],a
@@ -5352,7 +5352,26 @@ CountSetBits: ; 2B7F
ld [$d11e],a ; store number of set bits
ret
-INCBIN "baserom.gbc",$2B96,$2BBB - $2B96
+; subtracts the amount the player paid from their money
+; sets carry flag if there is enough money and unsets carry flag if not
+SubtractAmountPaidFromMoney: ; 2B96
+ ld b,BANK(SubtractAmountPaidFromMoney_)
+ ld hl,SubtractAmountPaidFromMoney_
+ jp Bankswitch
+
+; adds the amount the player sold to their money
+AddAmountSoldToMoney: ; 2B9E
+ ld de,W_PLAYERMONEY1
+ ld hl,$ffa1 ; total price of items
+ ld c,3 ; length of money in bytes
+ ld a,$0b
+ call Predef ; add total price to money
+ ld a,$13
+ ld [$d125],a
+ call DisplayTextBoxID ; redraw money text box
+ ld a,$b2
+ call $3740 ; play sound
+ jp $3748 ; wait until sound is done playing
; function to remove an item (in varying quantities) from the player's bag or PC box
; INPUT:
@@ -5412,7 +5431,7 @@ DisplayListMenuID: ; 2BE6
ld hl,$d730
set 6,[hl] ; turn off letter printing delay
xor a
- ld [$cc35],a
+ ld [$cc35],a ; 0 means no item is currently being swapped
ld [$d12a],a
ld a,[$cf8b]
ld l,a
@@ -5563,7 +5582,7 @@ DisplayListMenuIDLoop: ; 2C53
bit 1,a ; was the B button pressed?
jp nz,ExitListMenu ; if so, exit the menu
bit 2,a ; was the select button pressed?
- jp nz,$6b44 ; if so, allow the player to swap menu entries
+ jp nz,HandleItemListSwapping ; if so, allow the player to swap menu entries
ld b,a
bit 7,b ; was Down pressed?
ld hl,$cc36 ; index of top (visible) menu item within the list
@@ -5704,11 +5723,11 @@ DisplayChooseQuantityMenu: ; 2D57
jp .waitForKeyPressLoop\@
.buttonAPressed\@ ; the player chose to make the transaction
xor a
- ld [$cc35],a
+ ld [$cc35],a ; 0 means no item is currently being swapped
ret
.buttonBPressed\@ ; the player chose to cancel the transaction
xor a
- ld [$cc35],a
+ ld [$cc35],a ; 0 means no item is currently being swapped
ld a,$ff
ret
@@ -5730,7 +5749,7 @@ ExitListMenu: ; 2E3B
res 6,[hl]
call BankswitchBack
xor a
- ld [$cc35],a
+ ld [$cc35],a ; 0 means no item is currently being swapped
scf
ret
@@ -5899,14 +5918,14 @@ PrintListMenuEntries: ; 2E5A
inc c
push bc
inc c
- ld a,[$cc35]
- and a
+ ld a,[$cc35] ; ID of item chosen for swapping (counts from 1)
+ and a ; is an item being swapped?
jr z,.nextListEntry\@
sla a
- cp c
+ cp c ; is it this item?
jr nz,.nextListEntry\@
dec hl
- ld a,$ec ; unfilled right arrow menu cursor
+ ld a,$ec ; unfilled right arrow menu cursor to indicate an item being swapped
ld [hli],a
.nextListEntry\@
ld bc,2 * 20 ; 2 rows
@@ -8155,7 +8174,391 @@ DefaultNamesRivalList:
db "NEW NAME@RED@ASH@JACK@@"
ENDC
-INCBIN "baserom.gbc",$6b21,$6e0c - $6b21
+; subtracts the amount the player paid from their money
+; sets carry flag if there is enough money and unsets carry flag if not
+SubtractAmountPaidFromMoney_: ; 6B21
+ ld de,W_PLAYERMONEY3
+ ld hl,$ff9f ; total price of items
+ ld c,3 ; length of money in bytes
+ call StringCmp
+ ret c
+ ld de,W_PLAYERMONEY1
+ ld hl,$ffa1 ; total price of items
+ ld c,3 ; length of money in bytes
+ ld a,$0c
+ call Predef ; subtract total price from money
+ ld a,$13
+ ld [$d125],a
+ call DisplayTextBoxID ; redraw money text box
+ and a
+ ret
+
+HandleItemListSwapping: ; 6B44
+ ld a,[W_LISTMENUID]
+ cp a,ITEMLISTMENU
+ jp nz,DisplayListMenuIDLoop ; only rearrange item list menus
+ push hl
+ ld hl,$cf8b
+ ld a,[hli]
+ ld h,[hl]
+ ld l,a
+ inc hl ; hl = beginning of list entries
+ ld a,[W_CURMENUITEMID]
+ ld b,a
+ ld a,[$cc36] ; index of top (visible) menu item within the list
+ add b
+ add a
+ ld c,a
+ ld b,0
+ add hl,bc ; hl = address of currently selected item entry
+ ld a,[hl]
+ pop hl
+ inc a
+ jp z,DisplayListMenuIDLoop ; ignore attempts to swap the Cancel menu item
+ ld a,[$cc35] ; ID of item chosen for swapping (counts from 1)
+ and a ; has the first item to swap already been chosen?
+ jr nz,.swapItems\@
+; if not, set the currently selected item as the first item
+ ld a,[W_CURMENUITEMID]
+ inc a
+ ld b,a
+ ld a,[$cc36] ; index of top (visible) menu item within the list
+ add b
+ ld [$cc35],a ; ID of item chosen for swapping (counts from 1)
+ ld c,20
+ call DelayFrames
+ jp DisplayListMenuIDLoop
+.swapItems\@
+ ld a,[W_CURMENUITEMID]
+ inc a
+ ld b,a
+ ld a,[$cc36] ; index of top (visible) menu item within the list
+ add b
+ ld b,a
+ ld a,[$cc35] ; ID of item chosen for swapping (counts from 1)
+ cp b ; is the currently selected item the same as the first item to swap?
+ jp z,DisplayListMenuIDLoop ; ignore attempts to swap an item with itself
+ dec a
+ ld [$cc35],a ; ID of item chosen for swapping (counts from 1)
+ ld c,20
+ call DelayFrames
+ push hl
+ push de
+ ld hl,$cf8b
+ ld a,[hli]
+ ld h,[hl]
+ ld l,a
+ inc hl ; hl = beginning of list entries
+ ld d,h
+ ld e,l ; de = beginning of list entries
+ ld a,[W_CURMENUITEMID]
+ ld b,a
+ ld a,[$cc36] ; index of top (visible) menu item within the list
+ add b
+ add a
+ ld c,a
+ ld b,0
+ add hl,bc ; hl = address of currently selected item entry
+ ld a,[$cc35] ; ID of item chosen for swapping (counts from 1)
+ add a
+ add e
+ ld e,a
+ jr nc,.noCarry\@
+ inc d
+.noCarry\@ ; de = address of first item to swap
+ ld a,[de]
+ ld b,a
+ ld a,[hli]
+ cp b
+ jr z,.swapSameItemType\@
+.swapDifferentItems\@
+ ld [$ff95],a ; [$ff95] = second item ID
+ ld a,[hld]
+ ld [$ff96],a ; [$ff96] = second item quantity
+ ld a,[de]
+ ld [hli],a ; put first item ID in second item slot
+ inc de
+ ld a,[de]
+ ld [hl],a ; put first item quantity in second item slot
+ ld a,[$ff96]
+ ld [de],a ; put second item quantity in first item slot
+ dec de
+ ld a,[$ff95]
+ ld [de],a ; put second item ID in first item slot
+ xor a
+ ld [$cc35],a ; 0 means no item is currently being swapped
+ pop de
+ pop hl
+ jp DisplayListMenuIDLoop
+.swapSameItemType\@
+ inc de
+ ld a,[hl]
+ ld b,a
+ ld a,[de]
+ add b ; a = sum of both item quantities
+ cp a,100 ; is the sum too big for one item slot?
+ jr c,.combineItemSlots\@
+; swap enough items from the first slot to max out the second slot if they can't be combined
+ sub a,99
+ ld [de],a
+ ld a,99
+ ld [hl],a
+ jr .done\@
+.combineItemSlots\@
+ ld [hl],a ; put the sum in the second item slot
+ ld hl,$cf8b
+ ld a,[hli]
+ ld h,[hl]
+ ld l,a
+ dec [hl] ; decrease the number of items
+ ld a,[hl]
+ ld [$d12a],a ; update number of items variable
+ cp a,1
+ jr nz,.skipSettingMaxMenuItemID\@
+ ld [W_MAXMENUITEMID],a ; if the number of items is only one now, update the max menu item ID
+.skipSettingMaxMenuItemID\@
+ dec de
+ ld h,d
+ ld l,e
+ inc hl
+ inc hl ; hl = address of item after first item to swap
+.moveItemsUpLoop\@ ; erase the first item slot and move up all the following item slots to fill the gap
+ ld a,[hli]
+ ld [de],a
+ inc de
+ inc a ; reached the $ff terminator?
+ jr z,.afterMovingItemsUp\@
+ ld a,[hli]
+ ld [de],a
+ inc de
+ jr .moveItemsUpLoop\@
+.afterMovingItemsUp\@
+ xor a
+ ld [$cc36],a ; 0 means no item is currently being swapped
+ ld [W_CURMENUITEMID],a
+.done\@
+ xor a
+ ld [$cc35],a ; 0 means no item is currently being swapped
+ pop de
+ pop hl
+ jp DisplayListMenuIDLoop
+
+DisplayPokemartDialogue_: ; 6C20
+ ld a,[$cc36]
+ ld [$d07e],a
+ call $2429 ; move sprites
+ xor a
+ ld [$cf0a],a ; flag that is set if something is sold or bought
+.loop\@
+ xor a
+ ld [$cc36],a
+ ld [W_CURMENUITEMID],a
+ ld [$cc2f],a
+ inc a
+ ld [$cf93],a
+ ld a,$13
+ ld [$d125],a
+ call DisplayTextBoxID ; draw money text box
+ ld a,$15
+ ld [$d125],a
+ call DisplayTextBoxID ; do buy/sell/quit menu
+ ld hl,$d128 ; pointer to this pokemart's inventory
+ ld a,[hli]
+ ld l,[hl]
+ ld h,a ; hl = address of inventory
+ ld a,[$d12e]
+ cp a,$02
+ jp z,.done\@
+ ld a,[$d12d] ; ID of the chosen menu item
+ and a ; buying?
+ jp z,.buyMenu\@
+ dec a ; selling?
+ jp z,.sellMenu\@
+ dec a ; quitting?
+ jp z,.done\@
+.sellMenu\@
+ xor a
+ ld [$cf93],a
+ ld a,$02
+ ld [$d11b],a
+ ld hl,$5bd5
+ ld b,$0e
+ call Bankswitch
+ ld a,[W_NUMBAGITEMS]
+ and a
+ jp z,.bagEmpty\@
+ ld hl,PokemonSellingGreetingText
+ call PrintText
+ call $3719 ; save screen
+.sellMenuLoop\@
+ call $3725 ; restore saved screen
+ ld a,$13
+ ld [$d125],a
+ call DisplayTextBoxID ; draw money text box
+ ld hl,W_NUMBAGITEMS
+ ld a,l
+ ld [$cf8b],a
+ ld a,h
+ ld [$cf8c],a
+ xor a
+ ld [$cf93],a
+ ld [W_CURMENUITEMID],a
+ ld a,ITEMLISTMENU
+ ld [W_LISTMENUID],a
+ call DisplayListMenuID
+ jp c,.returnToMainPokemartMenu\@ ; if the player closed the menu
+.confirmItemSale\@ ; if the player is trying to sell a specific item
+ call $30d9 ; check if item is unsellable
+ ld a,[$d124]
+ and a
+ jr nz,.unsellableItem\@
+ ld a,[$cf91]
+ call IsItemHM
+ jr c,.unsellableItem\@
+ ld a,PRICEDITEMLISTMENU
+ ld [W_LISTMENUID],a
+ ld [$ff8e],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,PokemartTellSellPrice
+ ld bc,$0e01
+ call PrintText
+ FuncCoord 14,7
+ ld hl,Coord
+ ld bc,$080f
+ ld a,$14
+ ld [$d125],a
+ call DisplayTextBoxID ; yes/no menu
+ ld a,[$d12e]
+ cp a,$02
+ jr z,.sellMenuLoop\@ ; if the player pressed the B button
+ ld a,[$d12d] ; ID of the chosen menu item
+ dec a
+ jr z,.sellMenuLoop\@ ; if the player chose No
+.sellItem\@
+ ld a,[$cf0a] ; flag that is set if something is sold or bought
+ and a
+ jr nz,.skipSettingFlag1\@
+ inc a
+ ld [$cf0a],a
+.skipSettingFlag1\@
+ call AddAmountSoldToMoney
+ ld hl,W_NUMBAGITEMS
+ call RemoveItemFromInventory
+ jp .sellMenuLoop\@
+.unsellableItem\@
+ ld hl,PokemartUnsellableItemText
+ call PrintText
+ jp .returnToMainPokemartMenu\@
+.bagEmpty\@
+ ld hl,PokemartItemBagEmptyText
+ call PrintText
+ call $3719 ; save screen
+ jp .returnToMainPokemartMenu\@
+.buyMenu\@
+ ld a,$01
+ ld [$cf93],a
+ ld a,$03
+ ld [$d11b],a
+ ld hl,$5bd5
+ ld b,$0e
+ call Bankswitch
+ ld hl,PokemartBuyingGreetingText
+ call PrintText
+ call $3719 ; save screen
+.buyMenuLoop\@
+ call $3725 ; restore saved screen
+ ld a,$13
+ ld [$d125],a
+ call DisplayTextBoxID ; draw money text box
+ ld hl,$cf7b
+ ld a,l
+ ld [$cf8b],a
+ ld a,h
+ ld [$cf8c],a
+ xor a
+ ld [W_CURMENUITEMID],a
+ inc a
+ ld [$cf93],a
+ inc a ; a = 2 (PRICEDITEMLISTMENU)
+ ld [W_LISTMENUID],a
+ call DisplayListMenuID
+ jr c,.returnToMainPokemartMenu\@ ; if the player closed the menu
+ ld a,$63
+ ld [$cf97],a
+ xor a
+ ld [$ff8e],a
+ call DisplayChooseQuantityMenu
+ inc a
+ jr z,.buyMenuLoop\@ ; if the player closed the choose quantity menu with the B button
+ ld a,[$cf91] ; item ID
+ ld [$d11e],a ; store item ID for GetItemName
+ call GetItemName
+ call $3826 ; copy name to $cf4b
+ ld hl,PokemartTellBuyPrice
+ call PrintText
+ FuncCoord 14,7
+ ld hl,Coord
+ ld bc,$080f
+ ld a,$14
+ ld [$d125],a
+ call DisplayTextBoxID ; yes/no menu
+ ld a,[$d12e]
+ cp a,$02
+ jp z,.buyMenuLoop\@ ; if the player pressed the B button
+ ld a,[$d12d] ; ID of the chosen menu item
+ dec a
+ jr z,.buyMenuLoop\@ ; if the player chose No
+.buyItem\@
+ call .isThereEnoughMoney\@
+ jr c,.notEnoughMoney\@
+ ld hl,W_NUMBAGITEMS
+ call AddItemToInventory
+ jr nc,.bagFull\@
+ call SubtractAmountPaidFromMoney
+ ld a,[$cf0a] ; flag that is set if something is sold or bought
+ and a
+ jr nz,.skipSettingFlag2\@
+ ld a,$01
+ ld [$cf0a],a
+.skipSettingFlag2\@
+ ld a,$b2
+ call $3740 ; play sound
+ call $3748 ; wait until sound is done playing
+ ld hl,PokemartBoughtItemText
+ call PrintText
+ jp .buyMenuLoop\@
+.returnToMainPokemartMenu\@
+ call $3725 ; restore save screen
+ ld a,$13
+ ld [$d125],a
+ call DisplayTextBoxID ; draw money text box
+ ld hl,PokemartAnythingElseText
+ call PrintText
+ jp .loop\@
+.isThereEnoughMoney\@
+ ld de,W_PLAYERMONEY3
+ ld hl,$ff9f ; item price
+ 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,$01
+ ld [$cfcb],a
+ call $2429 ; move sprites
+ ld a,[$d07e]
+ ld [$cc36],a
+ ret
PokemartBuyingGreetingText: ; 0x6e0c
TX_FAR _PokemartBuyingGreetingText