diff options
| -rw-r--r-- | constants.asm | 3 | ||||
| -rw-r--r-- | main.asm | 942 | 
2 files changed, 792 insertions, 153 deletions
| diff --git a/constants.asm b/constants.asm index b94632e4..5598b8a3 100644 --- a/constants.asm +++ b/constants.asm @@ -1654,6 +1654,7 @@ SUBSTITUTE   EQU $A4  STRUGGLE     EQU $A5  ; these do double duty as animation identifiers  SHOWPIC_ANIM EQU $A6 ; redraw monster pic +XSTATITEM_ANIM EQU $AE ; use X Attack/Defense/Speed/Special  SLP_ANIM     EQU $BD ; sleeping monster  CONF_ANIM    EQU $BF ; confused monster  TOSS_ANIM    EQU $C1 ; toss Poké Ball @@ -1663,6 +1664,8 @@ BLOCKBALL_ANIM EQU $C4 ; trainer knocks away Poké Ball  GREATTOSS_ANIM EQU $C5 ; toss Great Ball  ULTRATOSS_ANIM EQU $C6 ; toss Ultra Ball or Master Ball  HIDEPIC_ANIM EQU $C8 ; monster disappears +ROCK_ANIM EQU $C9 ; throw rock +BAIT_ANIM EQU $CA ; throw bait  ; super game boy palettes  PAL_ROUTE     EQU $00 @@ -1729,6 +1729,8 @@ CheckForJumpingAndTilePairCollisions: ; C2A  ; if not jumping  	ld a,[$c45c] ; tile the player is on  	ld [$cf0e],a + +CheckForTilePairCollisions: ; C4A  	ld a,[$cfc6] ; tile in front of the player  	ld c,a  .tilePairCollisionLoop\@ @@ -6729,7 +6731,46 @@ IsItemInBag: ; 3493  	and a  	ret -INCBIN "baserom.gbc",$349B,$3541 - $349B +INCBIN "baserom.gbc",$349B,$34BF - $349B + +; tests if the player's coordinates are in a specified array +; INPUT: +; hl = address of array +; OUTPUT: +; [$cd3d] = if there is match, the matching array index +; sets carry if the coordinates are in the array, clears carry if not +ArePlayerCoordsInArray: ; 34BF +	ld a,[W_YCOORD] +	ld b,a +	ld a,[W_XCOORD] +	ld c,a +	xor a +	ld [$cd3d],a +.loop\@ +	ld a,[hli] +	cp a,$ff ; reached terminator? +	jr z,.notInArray\@ +	push hl +	ld hl,$cd3d +	inc [hl] +	pop hl +.compareYCoord\@ +	cp b +	jr z,.compareXCoord\@ +	inc hl +	jr .loop\@ +.compareXCoord\@ +	ld a,[hli] +	cp c +	jr nz,.loop\@ +.inArray\@ +	scf +	ret +.notInArray\@ +	and a +	ret + +INCBIN "baserom.gbc",$34E4,$3541-$34E4  Function3541: ; 3541  ; XXX what do these three functions do @@ -15439,89 +15480,89 @@ UseItem_: ; $D5C7  	jp [hl]  ItemUsePtrTable: ; $D5E1 -	dw ItemUseBall      ;$5687 masterball -	dw ItemUseBall      ;$5687 ultraball -	dw ItemUseBall      ;$5687 greatball -	dw ItemUseBall      ;$5687 pokeball -	dw ItemUseTownMap   ;$5968 TownMap -	dw $5977            ;ItemUseBicycle -	dw $59B4            ;ItemUseSurfBoard (UNUSED, glitchy!) -	dw ItemUseBall      ;$5687 Safariball -	dw ItemUsePokedex   ;$DA56 pokedex -	dw ItemUseEvoStone  ; MOON_STONE -	dw ItemUseMedicine  ; ANTIDOTE -	dw ItemUseMedicine  ; BURN_HEAL -	dw ItemUseMedicine  ; ICE_HEAL -	dw ItemUseMedicine  ; AWAKENING -	dw ItemUseMedicine  ; PARLYZ_HEAL -	dw ItemUseMedicine  ; FULL_RESTORE -	dw ItemUseMedicine  ; MAX_POTION -	dw ItemUseMedicine  ; HYPER_POTION -	dw ItemUseMedicine  ; SUPER_POTION -	dw ItemUseMedicine  ; POTION -	dw $5F52            ; BOULDERBADGE -	dw $5F67            ; CASCADEBADGE -	dw UnusableItem     ; THUNDERBADGE -	dw UnusableItem     ; RAINBOWBADGE -	dw UnusableItem     ; SOULBADGE -	dw UnusableItem     ; MARSHBADGE -	dw UnusableItem     ; VOLCANOBADGE -	dw UnusableItem     ; EARTHBADGE -	dw $5FAF            ; ESCAPE_ROPE -	dw $6003            ; REPEL -	dw UnusableItem     ; OLD_AMBER -	dw ItemUseEvoStone  ; FIRE_STONE -	dw ItemUseEvoStone  ; THUNDER_STONE -	dw ItemUseEvoStone  ; WATER_STONE -	dw ItemUseVitamin   ; HP_UP -	dw ItemUseVitamin   ; PROTEIN -	dw ItemUseVitamin   ; IRON -	dw ItemUseVitamin   ; CARBOS -	dw ItemUseVitamin   ; CALCIUM -	dw ItemUseVitamin   ; RARE_CANDY -	dw UnusableItem     ; DOME_FOSSIL -	dw UnusableItem     ; HELIX_FOSSIL -	dw UnusableItem     ; SECRET_KEY +	dw ItemUseBall       ; MASTER_BALL +	dw ItemUseBall       ; ULTRA_BALL +	dw ItemUseBall       ; GREAT_BALL +	dw ItemUseBall       ; POKE_BALL +	dw ItemUseTownMap    ; TOWN_MAP +	dw ItemUseBicycle    ; BICYCLE +	dw ItemUseSurfboard  ; out-of-battle Surf effect +	dw ItemUseBall       ; SAFARI_BALL +	dw ItemUsePokedex    ; POKEDEX +	dw ItemUseEvoStone   ; MOON_STONE +	dw ItemUseMedicine   ; ANTIDOTE +	dw ItemUseMedicine   ; BURN_HEAL +	dw ItemUseMedicine   ; ICE_HEAL +	dw ItemUseMedicine   ; AWAKENING +	dw ItemUseMedicine   ; PARLYZ_HEAL +	dw ItemUseMedicine   ; FULL_RESTORE +	dw ItemUseMedicine   ; MAX_POTION +	dw ItemUseMedicine   ; HYPER_POTION +	dw ItemUseMedicine   ; SUPER_POTION +	dw ItemUseMedicine   ; POTION +	dw ItemUseBait       ; BOULDERBADGE +	dw ItemUseRock       ; CASCADEBADGE +	dw UnusableItem      ; THUNDERBADGE +	dw UnusableItem      ; RAINBOWBADGE +	dw UnusableItem      ; SOULBADGE +	dw UnusableItem      ; MARSHBADGE +	dw UnusableItem      ; VOLCANOBADGE +	dw UnusableItem      ; EARTHBADGE +	dw ItemUseEscapeRope ; ESCAPE_ROPE +	dw ItemUseRepel      ; REPEL +	dw UnusableItem      ; OLD_AMBER +	dw ItemUseEvoStone   ; FIRE_STONE +	dw ItemUseEvoStone   ; THUNDER_STONE +	dw ItemUseEvoStone   ; WATER_STONE +	dw ItemUseVitamin    ; HP_UP +	dw ItemUseVitamin    ; PROTEIN +	dw ItemUseVitamin    ; IRON +	dw ItemUseVitamin    ; CARBOS +	dw ItemUseVitamin    ; CALCIUM +	dw ItemUseVitamin    ; RARE_CANDY +	dw UnusableItem      ; DOME_FOSSIL +	dw UnusableItem      ; HELIX_FOSSIL +	dw UnusableItem      ; SECRET_KEY  	dw UnusableItem -	dw UnusableItem     ; BIKE_VOUCHER -	dw $6013            ; X_ACCURACY -	dw ItemUseEvoStone  ; LEAF_STONE -	dw $6022            ; CARD_KEY -	dw UnusableItem     ; NUGGET -	dw UnusableItem     ; ??? PP_UP -	dw $60CD            ; POKE_DOLL -	dw ItemUseMedicine  ; FULL_HEAL -	dw ItemUseMedicine  ; REVIVE -	dw ItemUseMedicine  ; MAX_REVIVE -	dw $60DC            ; GUARD_SPEC_ -	dw $60EB            ; SUPER_REPL -	dw $60F0            ; MAX_REPEL -	dw $60F5            ; DIRE_HIT -	dw UnusableItem     ; COIN -	dw ItemUseMedicine  ; FRESH_WATER -	dw ItemUseMedicine  ; SODA_POP -	dw ItemUseMedicine  ; LEMONADE -	dw UnusableItem     ; S_S__TICKET -	dw UnusableItem     ; GOLD_TEETH -	dw $6104            ; X_ATTACK -	dw $6104            ; X_DEFEND -	dw $6104            ; X_SPEED -	dw $6104            ; X_SPECIAL -	dw $623A            ; COIN_CASE -	dw $62DE            ; OAKS_PARCEL -	dw $62E1            ; ITEMFINDER -	dw UnusableItem     ; SILPH_SCOPE -	dw $6140            ; POKE_FLUTE -	dw UnusableItem     ; LIFT_KEY -	dw UnusableItem     ; EXP__ALL -	dw OldRodCode       ; OLD_ROD -	dw GoodRodCode 		; GOOD_ROD $6259 -	dw SuperRodCode     ; SUPER_ROD $6283 -	dw ItemUsePPUp      ; PP_UP (see other?) -	dw ItemUsePPRestore ; ETHER -	dw ItemUsePPRestore ; MAX_ETHER -	dw ItemUsePPRestore ; ELIXER -	dw ItemUsePPRestore ; MAX_ELIXER +	dw UnusableItem      ; BIKE_VOUCHER +	dw ItemUseXAccuracy  ; X_ACCURACY +	dw ItemUseEvoStone   ; LEAF_STONE +	dw ItemUseCardKey    ; CARD_KEY +	dw UnusableItem      ; NUGGET +	dw UnusableItem      ; ??? PP_UP +	dw ItemUsePokedoll   ; POKE_DOLL +	dw ItemUseMedicine   ; FULL_HEAL +	dw ItemUseMedicine   ; REVIVE +	dw ItemUseMedicine   ; MAX_REVIVE +	dw ItemUseGuardSpec  ; GUARD_SPEC_ +	dw ItemUseSuperRepel ; SUPER_REPL +	dw ItemUseMaxRepel   ; MAX_REPEL +	dw ItemUseDireHit    ; DIRE_HIT +	dw UnusableItem      ; COIN +	dw ItemUseMedicine   ; FRESH_WATER +	dw ItemUseMedicine   ; SODA_POP +	dw ItemUseMedicine   ; LEMONADE +	dw UnusableItem      ; S_S__TICKET +	dw UnusableItem      ; GOLD_TEETH +	dw ItemUseXStat      ; X_ATTACK +	dw ItemUseXStat      ; X_DEFEND +	dw ItemUseXStat      ; X_SPEED +	dw ItemUseXStat      ; X_SPECIAL +	dw ItemUseCoinCase   ; COIN_CASE +	dw ItemUseOaksParcel ; OAKS_PARCEL +	dw ItemUseItemfinder ; ITEMFINDER +	dw UnusableItem      ; SILPH_SCOPE +	dw ItemUsePokeflute  ; POKE_FLUTE +	dw UnusableItem      ; LIFT_KEY +	dw UnusableItem      ; EXP__ALL +	dw OldRodCode        ; OLD_ROD +	dw GoodRodCode       ; GOOD_ROD +	dw SuperRodCode      ; SUPER_ROD +	dw ItemUsePPUp       ; PP_UP (real one) +	dw ItemUsePPRestore  ; ETHER +	dw ItemUsePPRestore  ; MAX_ETHER +	dw ItemUsePPRestore  ; ELIXER +	dw ItemUsePPRestore  ; MAX_ELIXER  ItemUseBall: ; 03:5687  	ld a,[W_ISINBATTLE] @@ -15927,27 +15968,135 @@ ItemUseBallText06:  	db $13,$06  	db "@" -ItemUseTownMap: ; 03:5968 -	ld a,[W_ISINBATTLE]	;in-battle or outside +ItemUseTownMap: ; 5968 +	ld a,[W_ISINBATTLE]  	and a -	jp nz,ItemUseNotTime	;OAK: "this isn't the time..." +	jp nz,ItemUseNotTime +	ld b,$1c +	ld hl,$4e3e +	jp Bankswitch ; display Town Map -INCBIN "baserom.gbc",$d96f,$da4c - $d96f +ItemUseBicycle: ; 5977 +	ld a,[W_ISINBATTLE] +	and a +	jp nz,ItemUseNotTime +	ld a,[$d700] +	ld [$d11a],a +	cp a,2 ; is the player surfing? +	jp z,ItemUseNotTime +	dec a ; is player already bicycling? +	jr nz,.tryToGetOnBike\@ +.getOffBike\@ +	call ItemUseReloadOverworldData +	xor a +	ld [$d700],a ; change player state to walking +	call $2307 ; play walking music +	ld hl,GotOffBicycleText +	jr .printText\@ +.tryToGetOnBike\@ +	call IsBikeRidingAllowed +	jp nc,NoCyclingAllowedHere +	call ItemUseReloadOverworldData +	xor a ; no keys pressed +	ld [$ffb4],a ; current joypad state +	inc a +	ld [$d700],a ; change player state to bicycling +	ld hl,GotOnBicycleText +	call $2307 ; play bike riding music +.printText\@ +	jp PrintText -UnnamedText_da4c: ; 0xda4c -	TX_FAR _UnnamedText_da4c +; used for Surf out-of-battle effect +ItemUseSurfboard: ; 59B4 +	ld a,[$d700] +	ld [$d11a],a +	cp a,2 ; is the player already surfing? +	jr z,.tryToStopSurfing\@ +.tryToSurf\@ +	call IsNextTileShoreOrWater +	jp c,SurfingAttemptFailed +	ld hl,TilePairCollisionsWater +	call CheckForTilePairCollisions +	jp c,SurfingAttemptFailed +.surf\@ +	call .makePlayerMoveForward\@ +	ld hl,$d730 +	set 7,[hl] +	ld a,2 +	ld [$d700],a ; change player state to surfing +	call $2307 ; play surfing music +	ld hl,SurfingGotOnText +	jp PrintText +.tryToStopSurfing\@ +	xor a +	ld [$ff8c],a +	ld d,16 ; talking range in pixels (normal range) +	call IsSpriteInFrontOfPlayer2 +	res 7,[hl] +	ld a,[$ff8c] +	and a ; is there a sprite in the way? +	jr nz,.cannotStopSurfing\@ +	ld hl,TilePairCollisionsWater +	call CheckForTilePairCollisions +	jr c,.cannotStopSurfing\@ +	ld hl,$d530 ; pointer to list of passable tiles +	ld a,[hli] +	ld h,[hl] +	ld l,a ; hl now points to passable tiles +	ld a,[$cfc6] ; tile in front of the player +	ld b,a +.passableTileLoop\@ +	ld a,[hli] +	cp b +	jr z,.stopSurfing\@ +	cp a,$ff +	jr nz,.passableTileLoop\@ +.cannotStopSurfing\@ +	ld hl,SurfingNoPlaceToGetOffText +	jp PrintText +.stopSurfing\@ +	call .makePlayerMoveForward\@ +	ld hl,$d730 +	set 7,[hl] +	xor a +	ld [$d700],a ; change player state to walking +	dec a +	ld [$cd6b],a +	call $2307 ; play walking music +	jp LoadWalkingPlayerSpriteGraphics +; uses a simulated button press to make the player move forward +.makePlayerMoveForward\@ +	ld a,[$d52a] ; direction the player is going +	bit 3,a +	ld b,%01000000 ; Up key +	jr nz,.storeSimulatedButtonPress\@ +	bit 2,a +	ld b,%10000000 ; Down key +	jr nz,.storeSimulatedButtonPress\@ +	bit 1,a +	ld b,%00100000 ; Left key +	jr nz,.storeSimulatedButtonPress\@ +	ld b,%00010000 ; Right key +.storeSimulatedButtonPress\@ +	ld a,b +	ld [$ccd3],a ; base address of simulated button presses +	xor a +	ld [$cd39],a +	inc a +	ld [$cd38],a ; index of current simulated button press +	ret + +SurfingGotOnText: ; 5A4C +	TX_FAR _SurfingGotOnText  	db $50 -; 0xda4c + 5 bytes -UnnamedText_da51: ; 0xda51 -	TX_FAR _UnnamedText_da51 +SurfingNoPlaceToGetOffText: ; 5A51 +	TX_FAR _SurfingNoPlaceToGetOffText  	db $50 -; 0xda51 + 5 bytes -ItemUsePokedex: ; 0xda56 5A56 -	ld a, $29 -	jp $3e6d -; 0xda5b +ItemUsePokedex: ; 5A56 +	ld a,$29 +	jp Predef  ItemUseEvoStone: ; 5A5B  	ld a,[W_ISINBATTLE] @@ -16638,44 +16787,462 @@ VitaminText: ; 5F2E  	db "SPEED@"  	db "SPECIAL@" -INCBIN "baserom.gbc",$df52,$dfa5 - $df52 +ItemUseBait: ; 5F52 +	ld hl,ThrewBaitText +	call PrintText +	ld hl,$d007 ; catch rate +	srl [hl] ; halve catch rate +	ld a,BAIT_ANIM +	ld hl,$cce9 ; bait factor +	ld de,$cce8 ; escape factor +	jr BaitRockCommon + +ItemUseRock: ; 5F67 +	ld hl,ThrewRockText +	call PrintText +	ld hl,$d007 ; catch rate +	ld a,[hl] +	add a ; double catch rate +	jr nc,.noCarry\@ +	ld a,$ff +.noCarry\@ +	ld [hl],a +	ld a,ROCK_ANIM +	ld hl,$cce8 ; escape factor +	ld de,$cce9 ; bait factor -ThrewBaitText: ; 0xdfa5 +BaitRockCommon: ; 5F7F +	ld [W_ANIMATIONID],a +	xor a +	ld [$cc5b],a +	ld [H_WHOSETURN],a +	ld [de],a ; zero escape factor (for bait), zero bait factor (for rock) +.randomLoop\@ ; loop until a random number less than 5 is generated +	call GenRandom +	and a,7 +	cp a,5 +	jr nc,.randomLoop\@ +	inc a ; increment the random number, giving a range from 1 to 5 inclusive +	ld b,a +	ld a,[hl] +	add b ; increase bait factor (for bait), increase escape factor (for rock) +	jr nc,.noCarry\@ +	ld a,$ff +.noCarry\@ +	ld [hl],a +	ld a,$08 +	call Predef ; do animation +	ld c,70 +	jp DelayFrames + +ThrewBaitText: ; 5FA5  	TX_FAR _ThrewBaitText  	db $50 -ThrewRockText: ; 0xdfaa +ThrewRockText: ; 5FAA  	TX_FAR _ThrewRockText  	db $50 -INCBIN "baserom.gbc",$dfaf,$e20b - $dfaf +; also used for Dig out-of-battle effect +ItemUseEscapeRope: ; 5FAF +	ld a,[W_ISINBATTLE] +	and a +	jr nz,.notUsable\@ +	ld a,[W_CURMAP] +	cp a,AGATHAS_ROOM +	jr z,.notUsable\@ +	ld a,[W_CURMAPTILESET] +	ld b,a +	ld hl,EscapeRopeTilesets +.loop\@ +	ld a,[hli] +	cp a,$ff +	jr z,.notUsable\@ +	cp b +	jr nz,.loop\@ +	ld hl,$d732 +	set 3,[hl] +	set 6,[hl] +	ld hl,$d72e +	res 4,[hl] +	ld hl,$d790 +	res 7,[hl] ; unset Safari Zone bit +	xor a +	ld [$da47],a +	ld [$d61f],a +	inc a +	ld [$d078],a +	ld [$cd6a],a ; item used +	ld a,[$d152] +	and a ; using Dig? +	ret nz ; if so, return +	call ItemUseReloadOverworldData +	ld c,30 +	call DelayFrames +	jp RemoveUsedItem +.notUsable\@ +	jp ItemUseNotTime + +EscapeRopeTilesets: ; 5FFD +	db $03,$0f,$11,$16,$10 +	db $ff ; terminator + +ItemUseRepel: ; 6003 +	ld b,100 + +ItemUseRepelCommon: ; 6005 +	ld a,[W_ISINBATTLE] +	and a +	jp nz,ItemUseNotTime +	ld a,b +	ld [$d0db],a +	jp PrintItemUseTextAndRemoveItem + +; handles X Accuracy item +ItemUseXAccuracy: ; 6013 +	ld a,[W_ISINBATTLE] +	and a +	jp z,ItemUseNotTime +	ld hl,W_PLAYERBATTSTATUS2 +	set 0,[hl] ; X Accuracy bit +	jp PrintItemUseTextAndRemoveItem + +; This function is bugged and never works. It always jumps to ItemUseNotTime. +; The Card Key is handled in a different way. +ItemUseCardKey: ; 6022 +	xor a +	ld [$d71f],a +	call $4586 +	ld a,[$4586] +	cp a,$18 +	jr nz,.next0\@ +	ld hl,CardKeyTable1 +	jr .next1\@ +.next0\@ +	cp a,$24 +	jr nz,.next2\@ +	ld hl,CardKeyTable2 +	jr .next1\@ +.next2\@ +	cp a,$5e +	jp nz,ItemUseNotTime +	ld hl,CardKeyTable3 +.next1\@ +	ld a,[W_CURMAP] +	ld b,a +.loop\@ +	ld a,[hli] +	cp a,$ff +	jp z,ItemUseNotTime +	cp b +	jr nz,.nextEntry1\@ +	ld a,[hli] +	cp d +	jr nz,.nextEntry2\@ +	ld a,[hli] +	cp e +	jr nz,.nextEntry3\@ +	ld a,[hl] +	ld [$d71f],a +	jr .done\@ +.nextEntry1\@ +	inc hl +.nextEntry2\@ +	inc hl +.nextEntry3\@ +	inc hl +	jr .loop\@ +.done\@ +	ld hl,ItemUseText00 +	call PrintText +	ld hl,$d728 +	set 7,[hl] +	ret + +; These tables are probably supposed to be door locations in Silph Co., +; but they are unused. +; The reason there are 3 tables is unknown. + +; Format: +; 00: Map ID +; 01: Y +; 02: X +; 03: ID? + +CardKeyTable1: ; 6072 +	db  SILPH_CO_2F,$04,$04,$00 +	db  SILPH_CO_2F,$04,$05,$01 +	db  SILPH_CO_4F,$0C,$04,$02 +	db  SILPH_CO_4F,$0C,$05,$03 +	db  SILPH_CO_7F,$06,$0A,$04 +	db  SILPH_CO_7F,$06,$0B,$05 +	db  SILPH_CO_9F,$04,$12,$06 +	db  SILPH_CO_9F,$04,$13,$07 +	db SILPH_CO_10F,$08,$0A,$08 +	db SILPH_CO_10F,$08,$0B,$09 +	db $ff + +CardKeyTable2: ; 609B +	db SILPH_CO_3F,$08,$09,$0A +	db SILPH_CO_3F,$09,$09,$0B +	db SILPH_CO_5F,$04,$07,$0C +	db SILPH_CO_5F,$05,$07,$0D +	db SILPH_CO_6F,$0C,$05,$0E +	db SILPH_CO_6F,$0D,$05,$0F +	db SILPH_CO_8F,$08,$07,$10 +	db SILPH_CO_8F,$09,$07,$11 +	db SILPH_CO_9F,$08,$03,$12 +	db SILPH_CO_9F,$09,$03,$13 +	db $ff + +CardKeyTable3: ; 60C4 +	db SILPH_CO_11F,$08,$09,$14 +	db SILPH_CO_11F,$09,$09,$15 +	db $ff + +ItemUsePokedoll: ; 60CD +	ld a,[W_ISINBATTLE] +	dec a +	jp nz,ItemUseNotTime +	ld a,$01 +	ld [$d078],a +	jp PrintItemUseTextAndRemoveItem + +ItemUseGuardSpec: ; 60DC +	ld a,[W_ISINBATTLE] +	and a +	jp z,ItemUseNotTime +	ld hl,W_PLAYERBATTSTATUS2 +	set 1,[hl] ; Mist bit +	jp PrintItemUseTextAndRemoveItem + +ItemUseSuperRepel: ; 60EB +	ld b,200 +	jp ItemUseRepelCommon + +ItemUseMaxRepel: ; 60F0 +	ld b,250 +	jp ItemUseRepelCommon + +ItemUseDireHit: ; 60F5 +	ld a,[W_ISINBATTLE] +	and a +	jp z,ItemUseNotTime +	ld hl,W_PLAYERBATTSTATUS2 +	set 2,[hl] ; Focus Energy bit +	jp PrintItemUseTextAndRemoveItem + +ItemUseXStat: ; 6104 +	ld a,[W_ISINBATTLE] +	and a +	jr nz,.inBattle\@ +	call ItemUseNotTime +	ld a,2 +	ld [$cd6a],a ; item not used +	ret +.inBattle\@ +	ld hl,W_PLAYERMOVENUM +	ld a,[hli] +	push af ; save [W_PLAYERMOVENUM] +	ld a,[hl] +	push af ; save [W_PLAYERMOVEEFFECT] +	push hl +	ld a,[$cf91] +	sub a,X_ATTACK - ATTACK_UP1_EFFECT +	ld [hl],a ; store player move effect +	call PrintItemUseTextAndRemoveItem +	ld a,XSTATITEM_ANIM ; X stat item animation ID +	ld [W_PLAYERMOVENUM],a +	call $3725 ; restore saved screen +	call Delay3 +	xor a +	ld [H_WHOSETURN],a ; set turn to player's turn +	ld b,$0f +	ld hl,$7428 +	call Bankswitch ; do stat increase move +	pop hl +	pop af +	ld [hld],a ; restore [W_PLAYERMOVEEFFECT] +	pop af +	ld [hl],a ; restore [W_PLAYERMOVENUM] +	ret + +ItemUsePokeflute: ; 6140 +	ld a,[W_ISINBATTLE] +	and a +	jr nz,.inBattle\@ +; if not in battle +	call ItemUseReloadOverworldData +	ld a,[W_CURMAP] +	cp a,ROUTE_12 +	jr nz,.notRoute12\@ +	ld a,[$d7d8] +	bit 7,a ; has the player beaten Route 12 Snorlax yet? +	jr nz,.noSnorlaxToWakeUp\@ +; if the player hasn't beaten Route 12 Snorlax +	ld hl,Route12SnorlaxFluteCoords +	call ArePlayerCoordsInArray +	jr nc,.noSnorlaxToWakeUp\@ +	ld hl,PlayedFluteHadEffectText +	call PrintText +	ld hl,$d7d8 +	set 6,[hl] ; trigger Snorlax fight (handled by map script) +	ret +.notRoute12\@ +	cp a,ROUTE_16 +	jr nz,.noSnorlaxToWakeUp\@ +	ld a,[$d7e0] +	bit 1,a ; has the player beaten Route 16 Snorlax yet? +	jr nz,.noSnorlaxToWakeUp\@ +; if the player hasn't beaten Route 16 Snorlax +	ld hl,Route16SnorlaxFluteCoords +	call ArePlayerCoordsInArray +	jr nc,.noSnorlaxToWakeUp\@ +	ld hl,PlayedFluteHadEffectText +	call PrintText +	ld hl,$d7e0 +	set 0,[hl] ; trigger Snorlax fight (handled by map script) +	ret +.noSnorlaxToWakeUp\@ +	ld hl,PlayedFluteNoEffectText +	jp PrintText +.inBattle\@ +	xor a +	ld [$cd3d],a ; initialize variable that indicates if any pokemon were woken up to zero +	ld b,~SLP +	ld hl,W_PARTYMON1_STATUS +	call WakeUpEntireParty +	ld a,[W_ISINBATTLE] +	dec a ; is it a trainer battle? +	jr z,.skipWakingUpEnemyParty\@ +; if it's a trainer battle +	ld hl,$d8a8 ; enemy party pokemon 1 status +	call WakeUpEntireParty +.skipWakingUpEnemyParty\@ +	ld hl,W_PLAYERMONSTATUS +	ld a,[hl] +	and b ; remove Sleep status +	ld [hl],a +	ld hl,W_ENEMYMONSTATUS +	ld a,[hl] +	and b ; remove Sleep status +	ld [hl],a +	call $3701 ; restore saved screen +	ld a,[$cd3d] +	and a ; were any pokemon asleep before playing the flute? +	ld hl,PlayedFluteNoEffectText +	jp z,PrintText ; if no pokemon were asleep +; if some pokemon were asleep +	ld hl,PlayedFluteHadEffectText +	call PrintText +	ld a,[$d083] +	and a,$80 +	jr nz,.skipMusic\@ +	call $3748 ; wait for sound to end +	ld b,$08 +	ld hl,$6306 +	call Bankswitch ; play in-battle pokeflute music +.musicWaitLoop\@ ; wait for music to finish playing +	ld a,[$c02c] +	and a ; music off? +	jr nz,.musicWaitLoop\@ +.skipMusic\@ +	ld hl,FluteWokeUpText +	jp PrintText -UnnamedText_e20b: ; 0xe20b -	TX_FAR _UnnamedText_e20b +; wakes up all party pokemon +; INPUT: +; hl must point to status of first pokemon in party (player's or enemy's) +; b must equal ~SLP +; [$cd3d] should be initialized to 0 +; OUTPUT: +; [$cd3d]: set to 1 if any pokemon were asleep +WakeUpEntireParty: ; 61E5 +	ld de,44 +	ld c,6 +.loop\@ +	ld a,[hl] +	push af +	and a,SLP ; is pokemon asleep? +	jr z,.notAsleep\@ +	ld a,1 +	ld [$cd3d],a ; indicate that a pokemon had to be woken up +.notAsleep\@ +	pop af +	and b ; remove Sleep status +	ld [hl],a +	add hl,de +	dec c +	jr nz,.loop\@ +	ret + +; Format: +; 00: Y +; 01: X +Route12SnorlaxFluteCoords: ; 61FD +	db 62,9  ; one space West of Snorlax +	db 61,10 ; one space North of Snorlax +	db 63,10 ; one space South of Snorlax +	db 62,11 ; one space East of Snorlax +	db $ff ; terminator + +; Format: +; 00: Y +; 01: X +Route16SnorlaxFluteCoords: ; 6206 +	db 10,27 ; one space East of Snorlax +	db 10,25 ; one space West of Snorlax +	db $ff ; terminator + +PlayedFluteNoEffectText: ; 620B +	TX_FAR _PlayedFluteNoEffectText  	db $50 -; 0xe20b + 5 bytes -UnnamedText_e210: ; 0xe210 -	TX_FAR _UnnamedText_e210 +FluteWokeUpText: ; 6210 +	TX_FAR _FluteWokeUpText  	db $50 -; 0xe210 + 5 bytes -INCBIN "baserom.gbc",$e215,$e247 - $e215 +PlayedFluteHadEffectText: ; 6215 +	TX_FAR _PlayedFluteHadEffectText +	db $06 +	db $08 +	ld a,[W_ISINBATTLE] +	and a +	jr nz,.done\@ +; play out-of-battle pokeflute music +	ld a,$ff +	call $23b1 ; turn off music +	ld a,$b8 +	ld c,$02 +	call $23a1 ; play music +.musicWaitLoop\@ ; wait for music to finish playing +	ld a,[$c028] +	cp a,$b8 +	jr z,.musicWaitLoop\@  +	call $2307 ; start playing normal music again +.done\@ +	jp $24d7 ; end text -UnnamedText_e247: ; 0xe247 -	TX_FAR _UnnamedText_e247 +ItemUseCoinCase: ; 623A +	ld a,[W_ISINBATTLE] +	and a +	jp nz,ItemUseNotTime +	ld hl,CoinCaseNumCoinsText +	jp PrintText + +CoinCaseNumCoinsText: ; 6247 +	TX_FAR _CoinCaseNumCoinsText  	db $50 -; 0xe247 + 5 bytes  OldRodCode: ; 0xe24c -	call $62b4 ; probably sets carry if not in battle or not by water +	call FishingInit  	jp c, ItemUseNotTime  	ld bc, (5 << 8) | MAGIKARP  	ld a, $1 ; set bite  	jr RodResponse ; 0xe257 $34  GoodRodCode: ; 6259 0xe259 -	call $62B4 ; probably sets carry if not in battle or not by water +	call FishingInit  	jp c,ItemUseNotTime  .RandomLoop  	call GenRandom @@ -16705,7 +17272,7 @@ GoodRodMons:  	db 10,POLIWAG  SuperRodCode: ; $6283 0xe283 -	call $62B4 ; probably sets carry if in battle or not by water +	call FishingInit  	jp c, ItemUseNotTime  	call ReadSuperRodData ; 0xe8ea  	ld a, e @@ -16736,17 +17303,65 @@ RodResponse:  	ld [hl], a  	ret -INCBIN "baserom.gbc",$e2b4,$e30d - $e2b4 +; checks if fishing is possible and if so, runs initialization code common to all rods +; unsets carry if fishing is possible, sets carry if not +FishingInit: ; 62B4 +	ld a,[W_ISINBATTLE] +	and a +	jr z,.notInBattle\@ +	scf ; can't fish during battle +	ret +.notInBattle\@ +	call IsNextTileShoreOrWater +	ret c +	ld a,[$d700] +	cp a,2 ; Surfing? +	jr z,.surfing\@ +	call ItemUseReloadOverworldData +	ld hl,ItemUseText00 +	call PrintText +	ld a,$8e +	call $23b1 ; play sound +	ld c,80 +	call DelayFrames +	and a +	ret +.surfing\@ +	scf ; can't fish when surfing +	ret + +ItemUseOaksParcel: ; 62DE +	jp ItemUseNotYoursToUse -UnnamedText_e30d: ; 0xe30d -	TX_FAR _UnnamedText_e30d +ItemUseItemfinder: ; 62E1 +	ld a,[W_ISINBATTLE] +	and a +	jp nz,ItemUseNotTime +	call ItemUseReloadOverworldData +	ld b,$1d +	ld hl,$481f +	call Bankswitch ; check for hidden items +	ld hl,ItemfinderFoundNothingText +	jr nc,.printText\@ ; if no hidden items +	ld c,4 +.loop\@ +	ld a,$9e +	call $3740 ; play sound +	ld a,$b2 +	call $3740 ; play sound +	dec c +	jr nz,.loop\@ +	ld hl,ItemfinderFoundItemText +.printText\@ +	jp PrintText + +ItemfinderFoundItemText: ; 630D +	TX_FAR _ItemfinderFoundItemText  	db $50 -; 0xe30d + 5 bytes -UnnamedText_e312: ; 0xe312 -	TX_FAR _UnnamedText_e312 +ItemfinderFoundNothingText: ; 6312 +	TX_FAR _ItemfinderFoundNothingText  	db $50 -; 0xe312 + 5 bytes  ItemUsePPUp: ; 6317  	ld a,[W_ISINBATTLE] @@ -17473,7 +18088,39 @@ KeyItemBitfield: ; 6799  	db %00111011  	db %00000000 -INCBIN "baserom.gbc",$e7a4,$68ea - $67a4 +INCBIN "baserom.gbc",$e7a4,$68b8 - $67a4 + +; checks if the tile in front of the player is a shore or water tile +; used for surfing and fishing +; unsets carry if it is, sets carry if not +IsNextTileShoreOrWater: ; 68B8 +	ld a,[W_CURMAPTILESET] +	ld hl,WaterTilesets +	ld de,1 +	call IsInArray +	jr nc,.notShoreOrWater\@ +	ld a,[W_CURMAPTILESET] +	cp a,$0e ; Vermilion Dock tileset +	ld a,[$cfc6] ; tile in front of player +	jr z,.skipShoreTiles\@ ; if it's the Vermilion Dock tileset +	cp a,$48 ; eastern shore tile in Safari Zone +	jr z,.shoreOrWater\@ +	cp a,$32 ; usual eastern shore tile +	jr z,.shoreOrWater\@ +.skipShoreTiles\@ +	cp a,$14 ; water tile +	jr z,.shoreOrWater\@ +.notShoreOrWater\@ +	scf +	ret +.shoreOrWater\@ +	and a +	ret + +; tilesets with water +WaterTilesets: ; 68E0 +	db $00,$03,$05,$07,$0d,$0e,$11,$16,$17 +	db $ff ; terminator  ; 68EA 0xe8ea  ReadSuperRodData: @@ -17624,7 +18271,13 @@ FishingGroup10:  	db 15,GOLDEEN  	db 15,MAGIKARP -INCBIN "baserom.gbc",$E9C5,$ef7d - $E9C5 +; reloads map view and processes sprite data +; for items that cause the overworld to be displayed +ItemUseReloadOverworldData: ; 69C5 +	call LoadCurrentMapView +	jp $2429 + +INCBIN "baserom.gbc",$E9CB,$ef7d - $E9CB  _UnnamedText_ef7d: ; 0xef7d  	db $17, $f8, $42, $2a @@ -17700,20 +18353,20 @@ HealParty:  	ld e, l  	pop hl  	jr .HealPokemon\@ ; Next Pokémon -.DoneHealing\@ ; This calls $6606 for each Pokémon in party -- no idea why +.DoneHealing\@  	xor a  	ld [$cf92], a  	ld [$d11e], a  	ld a, [W_NUMINPARTY]  	ld b, a -.asm_f711 +.restoreBonusPPLoop\@ ; loop to restore bonus PP from PP Ups  	push bc -	call $6606 +	call RestoreBonusPP  	pop bc  	ld hl, $cf92  	inc [hl]  	dec b -	jr nz, .asm_f711 ; 0xf71b $f4 +	jr nz,.restoreBonusPPLoop\@  	ret  INCBIN "baserom.gbc",$f71e,$fbd9 - $f71e @@ -84838,16 +85491,12 @@ _UnnamedText_4fe3f: ; 0xa418f  	db $0, "There's no more", $4f  	db "room for #MON!", $55  	db "@" -; 0xa418f + 32 bytes - -UnnamedText_a41af: ; 0xa41af  	TX_RAM $de06  	db $0, " was", $55  	db "sent to #MON", $55  	db "BOX @"  	TX_RAM $cf4b  	db $0, " on PC!", $57 -; 0xa41ca + 12 bytes = 0xa41d6  _UnnamedText_4fe44: ; 0xa41d6  	db $0, "There's no more", $4f @@ -85922,13 +86571,13 @@ _ItemUseBallText06:  	TX_RAM $cfda  	db 0,"!@@" -_UnnamedText_da4c: ; 0xa685e +_SurfingGotOnText: ; 0xa685e  	db $0, $52, " got on", $4f  	db "@"  	TX_RAM $cd6d  	db $0, "!", $58 -_UnnamedText_da51: ; 0xa686f +_SurfingNoPlaceToGetOffText: ; 0xa686f  	db $0, "There's no place", $4f  	db "to get off!", $58 @@ -85951,68 +86600,55 @@ _ThrewRockText: ; 0xa68cc  	db $0, $52, " threw a", $4f  	db "ROCK.", $57 -_UnnamedText_e20b: ; 0xa68dd +_PlayedFluteNoEffectText: ; 0xa68dd  	db $0, "Played the #", $4f  	db "FLUTE.", $51  	db "Now, that's a", $4f  	db "catchy tune!", $58 -; 0xa68dd + 47 bytes -_UnnamedText_e210: ; 0xa690c +_FluteWokeUpText: ; 0xa690c  	db $0, "All sleeping", $4f  	db "#MON woke up.", $58 -; 0xa690c + 28 bytes -UnnamedText_a6928: ; 0xa6928 +_PlayedFluteHadEffectText: ; 0xa6928  	db $0, $52, " played the", $4f  	db "# FLUTE.@@" -; 0xa6940 -_UnnamedText_e247: ; 0xa6940 +_CoinCaseNumCoinsText: ; 0xa6940  	db $0, "Coins", $4f  	db "@" -; 0xa6940 + 8 bytes -	db $2, $a4, $d5, $c2 -; 0xa694c +	db $2, $a4, $d5, $c2 ; print BCD number  	db $0, " ", $58 -; 0xa694f -_UnnamedText_e30d: ; 0xa694f +_ItemfinderFoundItemText: ; 0xa694f  	db $0, "Yes! ITEMFINDER", $4f  	db "indicates there's", $55  	db "an item nearby.", $58 -; 0xa694f + 50 bytes -_UnnamedText_e312: ; 0xa6981 +_ItemfinderFoundNothingText: ; 0xa6981  	db $0, "Nope! ITEMFINDER", $4f  	db "isn't responding.", $58 -; 0xa6981 + 35 bytes  _RaisePPWhichTechniqueText: ; 0xa69a4  	db $0, "Raise PP of which", $4f  	db "technique?", $57 -; 0xa69a4 + 30 bytes  _RestorePPWhichTechniqueText: ; 0xa69c2  	db $0, "Restore PP of", $4f  	db "which technique?", $57 -; 0xa69c2 + 32 bytes  _PPMaxedOutText: ; 0xa69e2  	TX_RAM $cf4b  	db $0, "'s PP", $4f  	db "is maxed out.", $58 -; 0xa69e2 + 23 bytes  _PPIncreasedText: ; 0xa69f9  	TX_RAM $cf4b  	db $0, "'s PP", $4f  	db "increased.", $58 -; 0xa69f9 + 20 bytes  _PPRestoredText: ; 0xa6a0d  	db $0, "PP was restored.", $58 -; 0xa6a0d + 18 bytes  _BootedUpTMText: ; 0xa6a1f  	db $0, "Booted up a TM!", $58 | 
