shithub: pokered

Download patch

ref: 3dc998e060b0b5eef9edfdb7f48cceb4f8d318fa
parent: 58f94c6b0d21f4bf12684dc9bac9244d33dcf92c
parent: 92a0acca73fcb9c71b01757da9ceadc7e862355e
author: Bryan Bishop <kanzure@gmail.com>
date: Wed Jan 11 06:45:21 EST 2012

Merge in sawakita's coincase work.

hg-commit-id: 3265210c8894


--- a/constants.asm
+++ b/constants.asm
@@ -2,6 +2,8 @@
 BLUE EQU 0
 GREEN EQU 0
 
+;\1 = X
+;\2 = Y
 FuncCoord: MACRO
 Coord = $C3A0 + 20 * \2 + \1
 	ENDM
@@ -139,10 +141,16 @@
 
 W_ISLINKBATTLE EQU $D12B
 
+W_PRIZE1 EQU $D13D
+W_PRIZE2 EQU $D13E
+W_PRIZE3 EQU $D13F
+
 W_PLAYERNAME EQU $D158 ; 11 characters, including null
 
 W_NUMINPARTY EQU $D163
 
+W_NUMBAGITEMS EQU $D31D
+
 W_RIVALNAME  EQU $D34A ; 11 characters, including null
 
 W_CURMAP EQU $D35E
@@ -149,6 +157,9 @@
 
 W_YCOORD EQU $D361 ; player’s position on the current map
 W_XCOORD EQU $D362
+
+W_PLAYERCOINS1 EQU $D5A4
+W_PLAYERCOINS2 EQU $D5A5
 
 W_RIVALSTARTER EQU $D715
 
--- a/pokered.asm
+++ b/pokered.asm
@@ -1165,31 +1165,31 @@
 
 INCBIN "baserom.gbc",$24fd,$2f9e - $24fd
 
-GetMonName: ; 0x2f9e
-    push hl
-    ld a, [$ff00+$b8]
-    push af
-    ld a, $7
-    ldh [$b8], a
-    ld [$2000], a
-    ld a, [$d11e]
-    dec a
-    ld hl, $421e
-    ld c, $a
-    ld b, $0
-    call $3a87
-    ld de, $cd6d
-    push de
-    ld bc, $000a
-    call CopyData
-    ld hl, $cd77
-    ld [hl], $50
-    pop de
-    pop af
-    ldh [$b8], a
-    ld [$2000], a
-    pop hl
-    ret
+GetMonName: ; 2F9E
+	push hl
+	ld a,[$ffb8]
+	push af
+	ld a,BANK(MonsterNames) ; 07
+	ld [$ffb8],a
+	ld [$2000],a
+	ld a,[$d11e]
+	dec a
+	ld hl,MonsterNames ; 421E
+	ld c,10
+	ld b,0
+	call AddNTimes
+	ld de,$cd6d
+	push de
+	ld bc,10
+	call CopyData
+	ld hl,$cd77
+	ld [hl],$50
+	pop de
+	pop af
+	ld [$ffb8],a
+	ld [$2000],a
+	pop hl
+	ret
 
 GetItemName: ; 2FCF
 ; given an item ID at [$D11E], store the name of the item into a string
@@ -1275,6 +1275,7 @@
 	db "HM"
 
 INCBIN "baserom.gbc",$3040,$31cc - $3040
+
 LoadTrainerHeader: ; 0x31cc
     call $3157
     xor a
@@ -1336,10 +1337,22 @@
     inc [hl]
     ret
 
-INCBIN "baserom.gbc",$324c,$247
+INCBIN "baserom.gbc",$324c,$3474 - $324c
 
-Function3493: ; 3493
-; XXX what does this do
+FuncTX_F7: ; 3474
+; XXX find a better name for this function
+; special_F7
+        ld b,BANK(CeladonPrizeMenu)
+        ld hl,CeladonPrizeMenu
+        call Bankswitch
+        jp $29DF        ; continue to main text-engine function
+
+INCBIN "baserom.gbc",$347F,$3493 - $347F
+
+IsItemInBag: ; 3493
+; given an item_id in b
+; set zero flag if item isn't in player's bag
+; else reset zero flag
 ; related to Pokémon Tower and ghosts
 	ld a,$1C
 	call Predef
@@ -13867,7 +13880,7 @@
 	cp a,$95 ; Pokémon Tower
 	jr nc,.next\@
 	ld b,SILPH_SCOPE
-	call Function3493
+	call IsItemInBag ; $3493
 	ret z
 .next\@
 	ld a,1
@@ -21010,8 +21023,378 @@
     ; warp-to
     EVENT_DISP $f, $16, $17 ; MANSION_1
 
-INCBIN "baserom.gbc",$524dd,$1b23
+INCBIN "baserom.gbc",$524DD,$5271B - $524DD
 
+CeladonPrizeMenu: ; 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 $2429
+        ld hl,WhichPrizeTextPtr
+        call PrintText
+        call $3ABE ; 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: ; 14:677E
+        TX_FAR _RequireCoinCaseText ; 22:628E
+        db $0D
+        db "@"
+
+ExchangeCoinsForPrizesTextPtr: ; 14:6784
+        TX_FAR _ExchangeCoinsForPrizesText ; 22:62A9
+        db "@"
+
+WhichPrizeTextPtr: ; 14:6789
+        TX_FAR _WhichPrizeText ; 22:62CD
+        db "@"
+
+GetPrizeMenuId: ; 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 ar $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 $3829      ; 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 $15CD ; Print_BCD
+        ld de,$D143
+        FuncCoord 13,7
+        ld hl,Coord
+        ld c,(%1 << 7 | 2)
+        call $15CD
+        ld de,$D145
+        FuncCoord 13,9
+        ld hl,Coord
+        ld c,(1 << 7 | 2)
+        jp $15CD
+
+PrizeDifferentMenuPtrs: ; 14:6843
+        dw PrizeMenuMon1Entries
+        dw PrizeMenuMon1Cost
+
+        dw PrizeMenuMon2Entries
+        dw PrizeMenuMon2Cost
+        
+        dw PrizeMenuTMsEntries
+        dw PrizeMenuTMsCost
+
+NoThanksText: ; 14:684F
+        db "NO THANKS@"
+
+PrizeMenuMon1Entries: ; 14:6859
+        db ABRA
+        db CLEFAIRY
+        db NIDORINA
+        db "@"
+PrizeMenuMon1Cost: ; 14:685D
+        db $01,$80
+        db $05,$00
+        db $12,$00
+        db "@"
+
+PrizeMenuMon2Entries: ; 14:6864
+        db DRATINI
+        db SCYTHER
+        db PORYGON
+        db "@"
+PrizeMenuMon2Cost: ; 14:6868
+        db $28,$00 ; 2800 Coins
+        db $55,$00 ; 5500 Coins
+        db $99,$99 ; 9999 Coins
+        db "@"
+
+PrizeMenuTMsEntries: ; 14:686F
+        db TM_23
+        db TM_15
+        db TM_50
+        db "@"
+PrizeMenuTMsCost: ; 14:6873
+        db $33,$00 ; 3300 Coins
+        db $55,$00 ; 5500 Coins
+        db $77,$00 ; 7700 Coins
+        db "@"
+
+PrintPrizePrice: ; 14:687A
+        FuncCoord 11,0
+        ld hl,Coord
+        ld b,$01
+        ld c,$07
+        call TextBoxBorder
+        call $2429      ; 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,W_PLAYERCOINS1
+        ld c,%10000010
+        call $15CD
+        ret
+
+.CoinText\@ ; 14:68A5
+        db "COIN@"
+
+.SixSpacesText\@ ; 14:68AA
+        db "      @"
+
+LoadCoinsToSubtract: ; 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: ; 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 $35EC ; yes/no textbox
+        ld a,[$CC26] ; yes/no answer (Y=0, N=1)
+        and a
+        jr nz,.PrintOhFineThen\@
+        call LoadCoinsToSubtract
+        call $35B1 ; subtract COINs from COIN_CASE
+        jr c,.NotEnoughCoins\@
+        ld a,[$D12F]
+        cp a,$02
+        jr nz,.GiveMon\@
+        ld a,[$D11E]
+        ld b,a
+        ld a,$01
+        ld c,a
+        call $3E2E ; GiveItem
+        jr nc,.BagIsFull\@
+        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 $3E48 ; GivePokemon
+        push af
+        ld a,[$CCD3] ; XXX is there room?
+        and a
+        call z,$3865
+        pop af
+        ret nc
+.SubtractCoins\@ ; 14:692C
+        call LoadCoinsToSubtract
+        ld hl,$FFA1
+        ld de,W_PLAYERCOINS2
+        ld c,$02 ; how many bytes
+        ld a,$0C
+        call Predef ; subtract coins (BCD daa operations)
+        jp PrintPrizePrice
+.BagIsFull\@ ; 14:693F
+        ld hl,PrizeRoomBagIsFullTextPtr
+        jp PrintText
+.NotEnoughCoins\@ ; 14:6945
+        ld hl,SorryNeedMoreCoinsTextPtr
+        jp PrintText
+.PrintOhFineThen\@ ; 14:694B
+        ld hl,OhFineThenTextPtr
+        jp PrintText
+
+UnknownData52951: ; 14:6951
+; XXX what's this?
+        db $00,$01,$00,$01,$00,$01,$00,$00,$01
+
+HereYouGoTextPtr:
+        TX_FAR _HereYouGoText ; 22:62E7
+        db $0D
+        db "@"
+
+SoYouWantPrizeTextPtr: ; 14:6960
+        TX_FAR _SoYouWantPrizeText ; 22:62F6
+        db "@"
+
+SorryNeedMoreCoinsTextPtr: ; 14:6965
+        TX_FAR _SorryNeedMoreCoins ; 22:630B
+        db $0D
+        db "@"
+
+PrizeRoomBagIsFullTextPtr: ; 14:696B
+        TX_FAR _OopsYouDontHaveEnoughRoomText ; 22:6329
+        db $0D
+        db "@"
+
+OhFineThenTextPtr: ; 14:6971
+        TX_FAR _OhFineThenText; 22:634C
+        db $0D ; wait keypress (A/B) without blink
+        db "@"
+
+GetPrizeMonLevel: ; 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
+
+PrizeMonLevelDictionary: ; 14:698A
+        db ABRA,9
+        db CLEFAIRY,8
+        db NIDORINA,17
+
+        db DRATINI,18
+        db SCYTHER,25
+        db PORYGON,26
+
+INCBIN "baserom.gbc",$52996,$54000 - $52996
+
 SECTION "bank15",DATA,BANK[$15]
 
 INCBIN "baserom.gbc",$54000,$54022 - $54000
@@ -30457,7 +30840,44 @@
 	db 0,$5A,$4F
 	db "can't move!",$58
 
-INCBIN "baserom.gbc",$89A29,$8A425 - $89A29
+INCBIN "baserom.gbc",$89A29,$8A28E - $89A29
+
+_RequireCoinCaseText: ; 22:628E
+        db 0,"A COIN CASE is",$4F
+        db "required!@@"
+
+_ExchangeCoinsForPrizesText: ; 22:62A9
+        db 0,"We exchange your",$4F
+        db "coins for prizes.",$58
+
+_WhichPrizeText: ; 22:62CD
+        db 0,"Which prize do",$4F
+        db "you want?",$57
+
+_HereYouGoText: ; 22:62E7
+        db 0,"Here you go!@@"
+
+_SoYouWantPrizeText: ; 22:62F6
+        db 0,"So, you want",$4F
+        db "@"
+        db 1
+        dw $CD6D
+        db 0,"?",$57
+
+_SorryNeedMoreCoins: ; 22:630B
+        db 0,"Sorry, you need",$4F
+        db "more coins.@@"
+
+_OopsYouDontHaveEnoughRoomText: ; 22:6329
+        db 0,"Oops! You don't",$4F
+        db "have enough room.@@"
+
+_OhFineThenText: ; 22:634C
+        db 0,"Oh, fine then.@@"
+;635d
+
+INCBIN "baserom.gbc",$8A35D,$8A425 - $8A35D
+
 INCLUDE "text/oakspeech.tx"
 
 INCBIN "baserom.gbc",$8A605,$6696 - $6605