shithub: pokered

ref: 7911bc130943392a9aa901139c924aa9658e015f
dir: /engine/menu/prize_menu.asm/

View raw version
CeladonPrizeMenu: ; 5271b (14:671b)
	ld b,COIN_CASE
	call IsItemInBag
	jr nz,.havingCoinCase
	ld hl,RequireCoinCaseTextPtr
	jp PrintText
.havingCoinCase
	ld hl,$D730
	set 6,[hl]
	ld hl,ExchangeCoinsForPrizesTextPtr
	call PrintText
; the following are the menu settings
	xor a
	ld [$CC26],a
	ld [$CC2A],a
	ld a,$03
	ld [$CC29],a
	ld a,$03
	ld [$CC28],a
	ld a,$04
	ld [$CC24],a
	ld a,$01
	ld [$CC25],a
	call PrintPrizePrice ; 687A
	FuncCoord 0,2
	ld hl,Coord
	ld b,$08
	ld c,$10
	call TextBoxBorder
	call GetPrizeMenuId ;678E
	call UpdateSprites
	ld hl,WhichPrizeTextPtr
	call PrintText
	call HandleMenuInput ; menu choice handler
	bit 1,a ; keypress = B (Cancel)
	jr nz,.NoChoice
	ld a,[$CC26]
	cp a,$03 ; "NO,THANKS" choice
	jr z,.NoChoice
	call HandlePrizeChoice ; 14:68C6
.NoChoice
	ld hl,$D730
	res 6,[hl]
	ret

RequireCoinCaseTextPtr: ; 5277e (14:677e)
	TX_FAR _RequireCoinCaseText
	db $0D
	db "@"

ExchangeCoinsForPrizesTextPtr: ; 52784 (14:6784)
	TX_FAR _ExchangeCoinsForPrizesText
	db "@"

WhichPrizeTextPtr: ; 52789 (14:6789)
	TX_FAR _WhichPrizeText
	db "@"

GetPrizeMenuId: ; 5278e (14:678e)
; determine which one among the three
; prize-texts has been selected
; using the text ID (stored in [$FF8C])
; load the three prizes at $D13D-$D13F
; load the three prices at $D141-$D146
; display the three prizes' names
; (distinguishing between Pokemon names
; and Items (specifically TMs) names)
	ld a,[$FF8C]
	sub a,$03       ; prize-texts' id are 3, 4 and 5
	ld [$D12F],a    ; prize-texts' id (relative, i.e. 0, 1 or 2)
	add a
	add a
	ld d,$00
	ld e,a
	ld hl,PrizeDifferentMenuPtrs
	add hl,de
	ld a,[hli]
	ld d,[hl]
	ld e,a
	inc hl
	push hl
	ld hl,W_PRIZE1
	call CopyString      ; XXX what does this do
	pop hl
	ld a,[hli]
	ld h,[hl]
	ld l,a
	ld de,$D141
	ld bc,$0006
	call CopyData
	ld a,[$D12F]
	cp a,$02        ;is TM_menu?
	jr nz,.putMonName
	ld a,[W_PRIZE1]
	ld [$D11E],a
	call GetItemName
	FuncCoord 2,4
	ld hl,Coord
	call PlaceString
	ld a,[W_PRIZE2]
	ld [$D11E],a
	call GetItemName
	FuncCoord 2,6
	ld hl,Coord
	call PlaceString
	ld a,[W_PRIZE3]
	ld [$D11E],a
	call GetItemName
	FuncCoord 2,8
	ld hl,Coord
	call PlaceString
	jr .putNoThanksText
.putMonName ; 14:67EC
	ld a,[W_PRIZE1]
	ld [$D11E],a
	call GetMonName
	FuncCoord 2,4
	ld hl,Coord
	call PlaceString
	ld a,[W_PRIZE2]
	ld [$D11E],a
	call GetMonName
	FuncCoord 2,6
	ld hl,Coord
	call PlaceString
	ld a,[W_PRIZE3]
	ld [$D11E],a
	call GetMonName
	FuncCoord 2,8
	ld hl,Coord
	call PlaceString
.putNoThanksText ; 14:6819
	FuncCoord 2,10
	ld hl,Coord
	ld de,NoThanksText
	call PlaceString
; put prices on the right side of the textbox
	ld de,$D141
	FuncCoord 13,5
	ld hl,Coord
; reg. c:
; [low nybble] number of bytes
; [bit 765 = %100] space-padding (not zero-padding)
	ld c,(1 << 7 | 2)
; Function $15CD displays BCD value (same routine
; used by text-command $02)
	call PrintBCDNumber ; Print_BCD
	ld de,$D143
	FuncCoord 13,7
	ld hl,Coord
	ld c,(%1 << 7 | 2)
	call PrintBCDNumber
	ld de,$D145
	FuncCoord 13,9
	ld hl,Coord
	ld c,(1 << 7 | 2)
	jp PrintBCDNumber

INCLUDE "data/prizes.asm"

PrintPrizePrice: ; 5287a (14:687a)
	FuncCoord 11,0
	ld hl,Coord
	ld b,$01
	ld c,$07
	call TextBoxBorder
	call UpdateSprites      ; XXX save OAM?
	FuncCoord 12,0
	ld hl,Coord
	ld de,.CoinText
	call PlaceString
	FuncCoord 13,1
	ld hl,Coord
	ld de,.SixSpacesText
	call PlaceString
	FuncCoord 13,1
	ld hl,Coord
	ld de,wPlayerCoins
	ld c,%10000010
	call PrintBCDNumber
	ret

.CoinText ; 14:68A5
	db "COIN@"

.SixSpacesText ; 14:68AA
	db "      @"

LoadCoinsToSubtract: ; 528b1 (14:68b1)
	ld a,[$D139] ; backup of selected menu_entry
	add a
	ld d,$00
	ld e,a
	ld hl,$D141 ; first prize's price
	add hl,de ; get selected prize's price
	xor a
	ld [$FF9F],a
	ld a,[hli]
	ld [$FFA0],a
	ld a,[hl]
	ld [$FFA1],a
	ret

HandlePrizeChoice: ; 528c6 (14:68c6)
	ld a,[$CC26] ; selected menu_entry
	ld [$D139],a
	ld d,$00
	ld e,a
	ld hl,W_PRIZE1
	add hl,de
	ld a,[hl]
	ld [$D11E],a
	ld a,[$D12F]
	cp a,$02 ; is prize a TM?
	jr nz,.GetMonName
	call GetItemName
	jr .GivePrize
.GetMonName ; 14:68E3
	call GetMonName
.GivePrize ; 14:68E6
	ld hl,SoYouWantPrizeTextPtr
	call PrintText
	call YesNoChoice ; yes/no textbox
	ld a,[$CC26] ; yes/no answer (Y=0, N=1)
	and a
	jr nz,.PrintOhFineThen
	call LoadCoinsToSubtract
	call HasEnoughCoins
	jr c,.NotEnoughCoins
	ld a,[$D12F]
	cp a,$02
	jr nz,.GiveMon
	ld a,[$D11E]
	ld b,a
	ld a,1
	ld c,a
	call GiveItem ; GiveItem
	jr nc,.BagFull
	jr .SubtractCoins
.GiveMon ; 14:6912
	ld a,[$D11E]
	ld [$CF91],a
	push af
	call GetPrizeMonLevel ; 14:6977
	ld c,a
	pop af
	ld b,a
	call GivePokemon
	push af
	ld a,[$CCD3] ; XXX is there room?
	and a
	call z,WaitForTextScrollButtonPress
	pop af
	ret nc
.SubtractCoins ; 14:692C
	call LoadCoinsToSubtract
	ld hl,$FFA1
	ld de,wPlayerCoins + 1
	ld c,$02 ; how many bytes
	ld a,$0C
	call Predef ; subtract coins (BCD daa operations)
	jp PrintPrizePrice
.BagFull
	ld hl,PrizeRoomBagIsFullTextPtr
	jp PrintText
.NotEnoughCoins ; 14:6945
	ld hl,SorryNeedMoreCoinsText
	jp PrintText
.PrintOhFineThen ; 14:694B
	ld hl,OhFineThenTextPtr
	jp PrintText

UnknownData52951: ; 52951 (14:6951)
; XXX what's this?
	db $00,$01,$00,$01,$00,$01,$00,$00,$01

HereYouGoTextPtr: ; 5295a (14:695a)
	TX_FAR _HereYouGoText
	db $0D
	db "@"

SoYouWantPrizeTextPtr: ; 52960 (14:6960)
	TX_FAR _SoYouWantPrizeText
	db "@"

SorryNeedMoreCoinsText: ; 52965 (14:6965)
	TX_FAR _SorryNeedMoreCoinsText
	db $0D
	db "@"

PrizeRoomBagIsFullTextPtr: ; 5296b (14:696b)
	TX_FAR _OopsYouDontHaveEnoughRoomText
	db $0D
	db "@"

OhFineThenTextPtr: ; 52971 (14:6971)
	TX_FAR _OhFineThenText
	db $0D ; wait keypress (A/B) without blink
	db "@"

GetPrizeMonLevel: ; 52977 (14:6977)
	ld a,[$CF91]
	ld b,a
	ld hl,PrizeMonLevelDictionary
.loop ; 14:697E
	ld a,[hli]
	cp b
	jr z,.matchFound
	inc hl
	jr .loop
.matchFound ; 14:6985
	ld a,[hl]
	ld [$D127],a
	ret

INCLUDE "data/prize_mon_levels.asm"