diff options
| -rw-r--r-- | main.asm | 427 | 
1 files changed, 415 insertions, 12 deletions
| @@ -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 | 
