mirror of
https://github.com/pret/pokeyellow.git
synced 2026-08-28 13:24:26 -05:00
SubtractAmountPaidFromMoney_ and HandleItemListSwapping
This commit is contained in:
168
yellow/main.asm
168
yellow/main.asm
@@ -721,10 +721,174 @@ INCLUDE "engine/menu/naming_screen.asm"
|
||||
|
||||
INCLUDE "engine/oak_speech2.asm"
|
||||
|
||||
; subtracts the amount the player paid from their money
|
||||
; sets carry flag if there is enough money and unsets carry flag if not
|
||||
SubtractAmountPaidFromMoney_: ; 68a6 (1:68a6)
|
||||
dr $68a6,$68c9
|
||||
ld de, wPlayerMoney
|
||||
ld hl, hMoney ; total price of items
|
||||
ld c, 3 ; length of money in bytes
|
||||
call StringCmp
|
||||
ret c
|
||||
ld de, wPlayerMoney + 2
|
||||
ld hl, hMoney + 2 ; total price of items
|
||||
ld c, 3 ; length of money in bytes
|
||||
predef SubBCDPredef ; subtract total price from money
|
||||
ld a, MONEY_BOX
|
||||
ld [wTextBoxID], a
|
||||
call DisplayTextBoxID ; redraw money text box
|
||||
and a
|
||||
ret
|
||||
|
||||
HandleItemListSwapping: ; 68c9 (1:68c9)
|
||||
dr $68c9,$69a5
|
||||
ld a,[wListMenuID]
|
||||
cp a,ITEMLISTMENU
|
||||
jp nz,DisplayListMenuIDLoop ; only rearrange item list menus
|
||||
push hl
|
||||
ld hl,wListPointer
|
||||
ld a,[hli]
|
||||
ld h,[hl]
|
||||
ld l,a
|
||||
inc hl ; hl = beginning of list entries
|
||||
ld a,[wCurrentMenuItem]
|
||||
ld b,a
|
||||
ld a,[wListScrollOffset]
|
||||
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,[wMenuItemToSwap] ; 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,[wCurrentMenuItem]
|
||||
inc a
|
||||
ld b,a
|
||||
ld a,[wListScrollOffset] ; index of top (visible) menu item within the list
|
||||
add b
|
||||
ld [wMenuItemToSwap],a ; ID of item chosen for swapping (counts from 1)
|
||||
ld c,20
|
||||
call DelayFrames
|
||||
jp DisplayListMenuIDLoop
|
||||
.swapItems
|
||||
ld a,[wCurrentMenuItem]
|
||||
inc a
|
||||
ld b,a
|
||||
ld a,[wListScrollOffset]
|
||||
add b
|
||||
ld b,a
|
||||
ld a,[wMenuItemToSwap] ; 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 [wMenuItemToSwap],a ; ID of item chosen for swapping (counts from 1)
|
||||
ld c,20
|
||||
call DelayFrames
|
||||
push hl
|
||||
push de
|
||||
ld hl,wListPointer
|
||||
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,[wCurrentMenuItem]
|
||||
ld b,a
|
||||
ld a,[wListScrollOffset]
|
||||
add b
|
||||
add a
|
||||
ld c,a
|
||||
ld b,0
|
||||
add hl,bc ; hl = address of currently selected item entry
|
||||
ld a,[wMenuItemToSwap] ; 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 [wMenuItemToSwap],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,wListPointer
|
||||
ld a,[hli]
|
||||
ld h,[hl]
|
||||
ld l,a
|
||||
dec [hl] ; decrease the number of items
|
||||
ld a,[hl]
|
||||
ld [wListCount],a ; update number of items variable
|
||||
cp a,1
|
||||
jr nz,.skipSettingMaxMenuItemID
|
||||
ld [wMaxMenuItem],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 [wListScrollOffset],a
|
||||
ld [wCurrentMenuItem],a
|
||||
.done
|
||||
xor a
|
||||
ld [wMenuItemToSwap],a ; 0 means no item is currently being swapped
|
||||
pop de
|
||||
pop hl
|
||||
jp DisplayListMenuIDLoop
|
||||
|
||||
DisplayPokemartDialogue_: ; 69a5 (1:69a5)
|
||||
dr $69a5,$6d97
|
||||
DisplayPokemonCenterDialogue_: ; 6d97 (1:6d97)
|
||||
|
||||
Reference in New Issue
Block a user