ref: d527e05cd82887e451043f52106898650c340e96
parent: 6a90847eb661828d24b39be0f42932337884e80a
author: YamaArashi <shadow962@live.com>
date: Thu Feb 9 19:18:16 EST 2012
disasm of pokemon menu function hg-commit-id: 47d36266a0ae
--- a/constants.asm
+++ b/constants.asm
@@ -600,6 +600,8 @@
W_RIVALNAME EQU $D34A ; 11 characters, including null
+W_OBTAINEDBADGES EQU $D356
+
W_PLAYERIDHI EQU $D359
W_PLAYERIDLO EQU $D35A
--- a/main.asm
+++ b/main.asm
@@ -5681,6 +5681,8 @@
ld [$d11a],a
ld a,$8f ; Start menu sound
call $23b1
+
+RedisplayStartMenu: ; 2ADF
ld b,BANK(DrawStartMenu)
ld hl,DrawStartMenu
call Bankswitch
@@ -5743,17 +5745,17 @@
inc a ; adjust position to account for missing pokedex menu item
.displayMenuItem\@
cp a,0
- jp z,$7095 ; POKEDEX
+ jp z,$7095 ; POKEDEX
cp a,1
- jp z,$70a9 ; POKEMON
+ jp z,DisplayPokemonMenu ; POKEMON
cp a,2
- jp z,$7302 ; ITEM
+ jp z,$7302 ; ITEM
cp a,3
- jp z,$7460 ; Trainer Info
+ jp z,$7460 ; Trainer Info
cp a,4
- jp z,$75e3 ; SAVE / RESET
+ jp z,$75e3 ; SAVE / RESET
cp a,5
- jp z,$75f6 ; OPTION
+ jp z,$75f6 ; OPTION
; EXIT falls through to here
.closeMenu\@
call GetJoypadState
@@ -6971,8 +6973,7 @@
; INPUT
; FF95-FF98 = dividend
; FF99 = divisor
-; b = number of signficant bytes in the dividend (starting from FF95)
-; all bytes considered "not signifcant" will be treated as 0
+; b = number of bytes in the dividend (starting from FF95)
; OUTPUT
; FF95-FF98 = quotient
; FF99 = remainder
@@ -15268,7 +15269,7 @@
ld a,8
.next7\@ ;$574d
ld [H_DIVISOR],a
- ld b,4 ;number of significant bytes
+ ld b,4 ; number of bytes in dividend
call Divide
ld hl,W_ENEMYMONCURHP
ld a,[hli]
@@ -16452,43 +16453,290 @@
ShrinkPic2:
INCBIN "pic/trainer/shrink2.pic"
-INCBIN "baserom.gbc",$13074,$13228 - $13074
+INCBIN "baserom.gbc",$13074,$130A9 - $13074
-UnnamedText_13228: ; 0x13228
- TX_FAR _UnnamedText_13228
+DisplayPokemonMenu: ; 70A9
+ ld a,[W_NUMINPARTY]
+ and a
+ jp z,RedisplayStartMenu
+ xor a
+ ld [$cc35],a
+ ld [$d07d],a
+ ld [$cfcb],a
+ call DisplayPartyMenu
+ jr .checkIfPokemonChosen\@
+.loop\@
+ xor a
+ ld [$cc35],a
+ ld [$d07d],a
+ call GoBackToPartyMenu
+.checkIfPokemonChosen\@
+ jr nc,.chosePokemon\@
+.exitMenu\@
+ call GBPalWhiteOutWithDelay3
+ call $3dbe
+ call LoadGBPal
+ jp RedisplayStartMenu
+.chosePokemon\@
+ call $3719 ; save screen
+ ld a,$04
+ ld [$d125],a
+ call DisplayTextBoxID ; display pokemon menu options
+ ld hl,$cd3d
+ ld bc,$020c ; max menu item ID, top menu item Y
+ ld e,5
+.adjustMenuVariablesLoop\@
+ dec e
+ jr z,.storeMenuVariables\@
+ ld a,[hli]
+ and a
+ jr z,.storeMenuVariables\@
+ inc b
+ dec c
+ dec c
+ jr .adjustMenuVariablesLoop\@
+.storeMenuVariables\@
+ ld hl,W_TOPMENUITEMY
+ ld a,c
+ ld [hli],a ; top menu item Y
+ ld a,[$fff7]
+ ld [hli],a ; top menu item X
+ xor a
+ ld [hli],a ; current menu item ID
+ inc hl
+ ld a,b
+ ld [hli],a ; max menu item ID
+ ld a,%00000011 ; A button, B button
+ ld [hli],a ; menu watched keys
+ xor a
+ ld [hl],a
+ call HandleMenuInput
+ push af
+ call $3725 ; restore saved screen
+ pop af
+ bit 1,a ; was the B button pressed?
+ jp nz,.loop\@
+; if the B button wasn't pressed
+ ld a,[W_MAXMENUITEMID]
+ ld b,a
+ ld a,[W_CURMENUITEMID] ; menu selection
+ cp b
+ jp z,.exitMenu\@ ; if the player chose Cancel
+ dec b
+ cp b
+ jr z,.choseSwitch\@
+ dec b
+ cp b
+ jp z,.choseStats\@
+ ld c,a
+ ld b,0
+ ld hl,$cd3d
+ add hl,bc
+ jp .choseOutOfBattleMove\@
+.choseSwitch\@
+ ld a,[W_NUMINPARTY]
+ cp a,2 ; is there more than one pokemon in the party?
+ jp c,DisplayPokemonMenu ; if not, no switching
+ call $7653
+ ld a,$04 ; swap pokemon positions menu
+ ld [$d07d],a
+ call GoBackToPartyMenu
+ jp .checkIfPokemonChosen\@
+.choseStats\@
+ call CleanLCD_OAM
+ xor a
+ ld [$cc49],a
+ ld a,$36
+ call Predef
+ ld a,$37
+ call Predef
+ call $3071
+ jp DisplayPokemonMenu
+.choseOutOfBattleMove\@
+ push hl
+ ld a,[$cf92]
+ ld hl,W_PARTYMON1NAME
+ call GetPartyMonName
+ pop hl
+ ld a,[hl]
+ dec a
+ add a
+ ld b,0
+ ld c,a
+ ld hl,.outOfBattleMovePointers\@
+ add hl,bc
+ ld a,[hli]
+ ld h,[hl]
+ ld l,a
+ ld a,[W_OBTAINEDBADGES] ; badges obtained
+ jp [hl]
+.outOfBattleMovePointers\@
+ dw .cut\@
+ dw .fly\@
+ dw .surf\@
+ dw .surf\@
+ dw .strength\@
+ dw .flash\@
+ dw .dig\@
+ dw .teleport\@
+ dw .softboiled\@
+.fly\@
+ bit 2,a ; does the player have the Thunder Badge?
+ jp z,.newBadgeRequired\@
+ call CheckIfInOutsideMap
+ jr z,.canFly\@
+ ld a,[$cf92]
+ ld hl,W_PARTYMON1NAME
+ call GetPartyMonName
+ ld hl,.cannotFlyHereText\@
+ call PrintText
+ jp .loop\@
+.canFly\@
+ call $30a9 ; allow player to pick fly destination on map
+ ld a,[$d732]
+ bit 3,a ; did the player decide to fly?
+ jp nz,.goBackToMap\@
+ call LoadFontTilePatterns
+ ld hl,$d72e
+ set 1,[hl]
+ jp DisplayPokemonMenu
+.cut\@
+ bit 1,a ; does the player have the Cascade Badge?
+ jp z,.newBadgeRequired\@
+ ld a,$3c
+ call Predef
+ ld a,[$cd6a]
+ and a
+ jp z,.loop\@
+ jp CloseTextDisplay
+.surf\@
+ bit 4,a ; does the player have the Soul Badge?
+ jp z,.newBadgeRequired\@
+ ld b,$03
+ ld hl,$4dc0
+ call Bankswitch
+ ld hl,$d728
+ bit 1,[hl]
+ res 1,[hl]
+ jp z,.loop\@
+ ld a,$07
+ ld [$cf91],a
+ ld [$d152],a
+ call $30bc
+ ld a,[$cd6a]
+ and a
+ jp z,.loop\@
+ call GBPalWhiteOutWithDelay3
+ jp .goBackToMap\@
+.strength\@
+ bit 3,a ; does the player have the Rainbow Badge?
+ jp z,.newBadgeRequired\@
+ ld a,$5b
+ call Predef
+ call GBPalWhiteOutWithDelay3
+ jp .goBackToMap\@
+.flash\@
+ bit 0,a ; does the player have the Boulder Badge?
+ jp z,.newBadgeRequired\@
+ xor a
+ ld [$d35d],a
+ ld hl,.flashLightsAreaText\@
+ call PrintText
+ call GBPalWhiteOutWithDelay3
+ jp .goBackToMap\@
+.flashLightsAreaText\@
+ TX_FAR _FlashLightsAreaText
db $50
-; 0x13228 + 5 bytes
-
-INCBIN "baserom.gbc",$1322d,$1327b - $1322d
-
-UnnamedText_1327b: ; 0x1327b
- TX_FAR _UnnamedText_1327b
+.dig\@
+ ld a,$1d
+ ld [$cf91],a
+ ld [$d152],a
+ call $30bc
+ ld a,[$cd6a]
+ and a
+ jp z,.loop\@
+ call GBPalWhiteOutWithDelay3
+ jp .goBackToMap\@
+.teleport\@
+ call CheckIfInOutsideMap
+ jr z,.canTeleport\@
+ ld a,[$cf92]
+ ld hl,W_PARTYMON1NAME
+ call GetPartyMonName
+ ld hl,.cannotUseTeleportNowText\@
+ call PrintText
+ jp .loop\@
+.canTeleport\@
+ ld hl,.warpToLastPokemonCenterText\@
+ call PrintText
+ ld hl,$d732
+ set 3,[hl]
+ set 6,[hl]
+ ld hl,$d72e
+ set 1,[hl]
+ res 4,[hl]
+ ld c,60
+ call DelayFrames
+ call GBPalWhiteOutWithDelay3 ; zero all three palettes and wait 3 V-blanks
+ jp .goBackToMap\@
+.warpToLastPokemonCenterText\@
+ TX_FAR _WarpToLastPokemonCenterText
db $50
-; 0x1327b + 5 bytes
-
-UnnamedText_13280: ; 0x13280
- TX_FAR _UnnamedText_13280
+.cannotUseTeleportNowText\@
+ TX_FAR _CannotUseTeleportNowText
db $50
-; 0x13280 + 5 bytes
-
-UnnamedText_13285: ; 0x13285
- TX_FAR _UnnamedText_13285
+.cannotFlyHereText\@
+ TX_FAR _CannotFlyHereText
db $50
-; 0x13285 + 5 bytes
-
-INCBIN "baserom.gbc",$1328a,$132d4 - $1328a
-
-UnnamedText_132d4: ; 0x132d4
- TX_FAR _UnnamedText_132d4
+.softboiled\@
+ ld hl,W_PARTYMON1_MAXHP
+ ld a,[$cf92]
+ ld bc,44
+ call AddNTimes
+ ld a,[hli]
+ ld [H_DIVIDEND],a
+ ld a,[hl]
+ ld [H_DIVIDEND + 1],a
+ ld a,5
+ ld [H_DIVISOR],a
+ ld b,2 ; number of bytes
+ call Divide
+ ld bc,-33
+ add hl,bc
+ ld a,[hld]
+ ld b,a
+ ld a,[H_QUOTIENT + 3]
+ sub b
+ ld b,[hl]
+ ld a,[H_QUOTIENT + 2]
+ sbc b
+ jp nc,.notHealthyEnough\@
+ ld a,[$cc2b]
+ push af
+ ld a,$14
+ ld [$cf91],a
+ ld [$d152],a
+ call $30bc
+ pop af
+ ld [$cc2b],a
+ jp .loop\@
+.notHealthyEnough\@ ; if current HP is less than 1/5 of max HP
+ ld hl,.notHealthyEnoughText\@
+ call PrintText
+ jp .loop\@
+.notHealthyEnoughText\@
+ TX_FAR _NotHealthyEnoughText
db $50
-; 0x132d4 + 5 bytes
-
-INCBIN "baserom.gbc",$132d9,$132e8 - $132d9
-
-UnnamedText_132e8: ; 0x132e8
- TX_FAR _UnnamedText_132e8
+.goBackToMap\@
+ call $3dbe
+ jp CloseTextDisplay
+.newBadgeRequired\@
+ ld hl,.newBadgeRequiredText\@
+ call PrintText
+ jp .loop\@
+.newBadgeRequiredText\@
+ TX_FAR _NewBadgeRequiredText
db $50
-; 0x132e8 + 5 bytes
; writes a blank tile to all possible menu cursor positions on the party menu
ErasePartyMenuCursors: ; 72ED
@@ -36483,7 +36731,7 @@
call Multiply
ld a,[hl]
ld [H_DIVISOR],a ; set divisor to the the denominator of the ratio (the dividend is the product of the previous multiplication)
- ld b,$04 ; number of significant bytes in the dividend
+ ld b,$04 ; number of bytes in the dividend
call Divide
ld a,[H_QUOTIENT + 3]
ld b,a
@@ -82418,34 +82666,34 @@
db "Forget SURFing!", $58
; 0xa4088 + 33 bytes
-_UnnamedText_13228: ; 0xa40a9
+_FlashLightsAreaText: ; 0xa40a9
db $0, "A blinding FLASH", $4f
db "lights the area!", $58
; 0xa40a9 + 35 bytes
-_UnnamedText_1327b: ; 0xa40cc
+_WarpToLastPokemonCenterText: ; 0xa40cc
db $0, "Warp to the last", $4f
db "#MON CENTER.", $57
; 0xa40cc + 31 bytes
-_UnnamedText_13280: ; 0xa40eb
+_CannotUseTeleportNowText: ; 0xa40eb
TX_RAM $cd6d
db $0, " can't", $4f
db "use TELEPORT now.", $58
; 0xa40eb + 28 bytes
-_UnnamedText_13285: ; 0xa4107
+_CannotFlyHereText: ; 0xa4107
TX_RAM $cd6d
db $0, " can't", $4f
db "FLY here.", $58
; 0xa4107 + 20 bytes
-_UnnamedText_132d4: ; 0xa411b
+_NotHealthyEnoughText: ; 0xa411b
db $0, "Not healthy", $4f
db "enough.", $58
; 0xa411b + 21 bytes
-_UnnamedText_132e8: ; 0xa4130
+_NewBadgeRequiredText: ; 0xa4130
db $0, "No! A new BADGE", $4f
db "is required.", $58
; 0xa4130 + 30 bytes