ref: 331611812501d78d05113646bbb302b3dbd00f55
parent: 61b0c12165407dc030491d2ca2cfb5066262e1f7
author: YamaArashi <[email protected]>
date: Sun Feb 12 11:28:29 EST 2012
disasm of options menu hg-commit-id: 9122bf61b409
--- a/constants.asm
+++ b/constants.asm
@@ -600,6 +600,18 @@
W_RIVALNAME EQU $D34A ; 11 characters, including null
+W_OPTIONS EQU $D355
+; bit 7 = battle animation
+; 0: On
+; 1: Off
+; bit 6 = battle style
+; 0: Shift
+; 1: Set
+; bits 0-3 = text speed (number of frames to delay after printing a letter)
+; 1: Fast
+; 3: Medium
+; 5: Slow
+
W_OBTAINEDBADGES EQU $D356
W_PLAYERIDHI EQU $D359
--- a/main.asm
+++ b/main.asm
@@ -5745,17 +5745,17 @@
inc a ; adjust position to account for missing pokedex menu item
.displayMenuItem\@
cp a,0
- jp z,$7095 ; POKEDEX
+ jp z,StartMenu_Pokedex
cp a,1
- jp z,DisplayPokemonMenu ; POKEMON
+ jp z,StartMenu_Pokemon
cp a,2
- jp z,DisplayItemMenu ; ITEM
+ jp z,StartMenu_Item
cp a,3
- jp z,DisplayTrainerInfo ; Trainer Info
+ jp z,StartMenu_TrainerInfo
cp a,4
- jp z,$75e3 ; SAVE / RESET
+ jp z,StartMenu_SaveReset
cp a,5
- jp z,$75f6 ; OPTION
+ jp z,StartMenu_Option
; EXIT falls through to here
CloseStartMenu: ; 2B70
@@ -8416,8 +8416,276 @@
db $50
; 0x5d4d + 5 bytes
-INCBIN "baserom.gbc",$5d52,$3c3
+INCBIN "baserom.gbc",$5d52,$5e8a - $5d52
+DisplayOptionMenu: ; 5E8A
+ FuncCoord 0,0
+ ld hl,Coord
+ ld b,3
+ ld c,18
+ call TextBoxBorder
+ FuncCoord 0,5
+ ld hl,Coord
+ ld b,3
+ ld c,18
+ call TextBoxBorder
+ FuncCoord 0,10
+ ld hl,Coord
+ ld b,3
+ ld c,18
+ call TextBoxBorder
+ FuncCoord 1,1
+ ld hl,Coord
+ ld de,TextSpeedOptionText
+ call PlaceString
+ FuncCoord 1,6
+ ld hl,Coord
+ ld de,BattleAnimationOptionText
+ call PlaceString
+ FuncCoord 1,11
+ ld hl,Coord
+ ld de,BattleStyleOptionText
+ call PlaceString
+ FuncCoord 2,16
+ ld hl,Coord
+ ld de,OptionMenuCancelText
+ call PlaceString
+ xor a
+ ld [W_CURMENUITEMID],a
+ ld [W_OLDMENUITEMID],a
+ inc a
+ ld [$d358],a
+ ld [$cd40],a
+ ld a,3 ; text speed cursor Y coordinate
+ ld [W_TOPMENUITEMY],a
+ call SetCursorPositionsFromOptions
+ ld a,[$cd3d] ; text speed cursor X coordinate
+ ld [W_TOPMENUITEMX],a
+ ld a,$01
+ ld [H_AUTOBGTRANSFERENABLED],a ; enable auto background transfer
+ call Delay3
+.loop\@
+ call PlaceMenuCursor
+ call SetOptionsFromCursorPositions
+.getJoypadStateLoop\@
+ call GetJoypadStateLowSensitivity
+ ld a,[$ffb5]
+ ld b,a
+ and a,%11111011 ; any key besides select pressed?
+ jr z,.getJoypadStateLoop\@
+ bit 1,b ; B button pressed?
+ jr nz,.exitMenu\@
+ bit 3,b ; Start button pressed?
+ jr nz,.exitMenu\@
+ bit 0,b ; A button pressed?
+ jr z,.checkDirectionKeys\@
+ ld a,[W_TOPMENUITEMY]
+ cp a,16 ; is the cursor on Cancel?
+ jr nz,.loop\@
+.exitMenu\@
+ ld a,$90
+ call $23b1 ; play sound
+ ret
+.eraseOldMenuCursor\@
+ ld [W_TOPMENUITEMX],a
+ call EraseMenuCursor
+ jp .loop\@
+.checkDirectionKeys\@
+ ld a,[W_TOPMENUITEMY]
+ bit 7,b ; Down pressed?
+ jr nz,.downPressed\@
+ bit 6,b ; Up pressed?
+ jr nz,.upPressed\@
+ cp a,8 ; cursor in Battle Animation section?
+ jr z,.cursorInBattleAnimation\@
+ cp a,13 ; cursor in Battle Style section?
+ jr z,.cursorInBattleStyle\@
+ cp a,16 ; cursor on Cancel?
+ jr z,.loop\@
+.cursorInTextSpeed\@
+ bit 5,b ; Left pressed?
+ jp nz,.pressedLeftInTextSpeed\@
+ jp .pressedRightInTextSpeed\@
+.downPressed\@
+ cp a,16
+ ld b,-13
+ ld hl,$cd3d
+ jr z,.updateMenuVariables\@
+ ld b,5
+ cp a,3
+ inc hl
+ jr z,.updateMenuVariables\@
+ cp a,8
+ inc hl
+ jr z,.updateMenuVariables\@
+ ld b,3
+ inc hl
+ jr .updateMenuVariables\@
+.upPressed\@
+ cp a,8
+ ld b,-5
+ ld hl,$cd3d
+ jr z,.updateMenuVariables\@
+ cp a,13
+ inc hl
+ jr z,.updateMenuVariables\@
+ cp a,16
+ ld b,-3
+ inc hl
+ jr z,.updateMenuVariables\@
+ ld b,13
+ inc hl
+.updateMenuVariables\@
+ add b
+ ld [W_TOPMENUITEMY],a
+ ld a,[hl]
+ ld [W_TOPMENUITEMX],a
+ call PlaceUnfilledArrowMenuCursor
+ jp .loop\@
+.cursorInBattleAnimation\@
+ ld a,[$cd3e] ; battle animation cursor X coordinate
+ xor a,$0b ; toggle between 1 and 10
+ ld [$cd3e],a
+ jp .eraseOldMenuCursor\@
+.cursorInBattleStyle\@
+ ld a,[$cd3f] ; battle style cursor X coordinate
+ xor a,$0b ; toggle between 1 and 10
+ ld [$cd3f],a
+ jp .eraseOldMenuCursor\@
+.pressedLeftInTextSpeed\@
+ ld a,[$cd3d] ; text speed cursor X coordinate
+ cp a,1
+ jr z,.updateTextSpeedXCoord\@
+ cp a,7
+ jr nz,.fromSlowToMedium\@
+ sub a,6
+ jr .updateTextSpeedXCoord\@
+.fromSlowToMedium\@
+ sub a,7
+ jr .updateTextSpeedXCoord\@
+.pressedRightInTextSpeed\@
+ ld a,[$cd3d] ; text speed cursor X coordinate
+ cp a,14
+ jr z,.updateTextSpeedXCoord\@
+ cp a,7
+ jr nz,.fromFastToMedium\@
+ add a,7
+ jr .updateTextSpeedXCoord\@
+.fromFastToMedium\@
+ add a,6
+.updateTextSpeedXCoord\@
+ ld [$cd3d],a ; text speed cursor X coordinate
+ jp .eraseOldMenuCursor\@
+
+TextSpeedOptionText: ; 5FC0
+ db "TEXT SPEED",$4E
+ db " FAST MEDIUM SLOW@"
+
+BattleAnimationOptionText: ; 5FDE
+ db "BATTLE ANIMATION",$4E
+ db " ON OFF@"
+
+BattleStyleOptionText: ; 5FFD
+ db "BATTLE STYLE",$4E
+ db " SHIFT SET@"
+
+OptionMenuCancelText: ; 6018
+ db "CANCEL@"
+
+; sets the options variable according to the current placement of the menu cursors in the options menu
+SetOptionsFromCursorPositions: ; 601F
+ ld hl,TextSpeedOptionData
+ ld a,[$cd3d] ; text speed cursor X coordinate
+ ld c,a
+.loop\@
+ ld a,[hli]
+ cp c
+ jr z,.textSpeedMatchFound\@
+ inc hl
+ jr .loop\@
+.textSpeedMatchFound\@
+ ld a,[hl]
+ ld d,a
+ ld a,[$cd3e] ; battle animation cursor X coordinate
+ dec a
+ jr z,.battleAnimationOn\@
+.battleAnimationOff\@
+ set 7,d
+ jr .checkBattleStyle\@
+.battleAnimationOn\@
+ res 7,d
+.checkBattleStyle\@
+ ld a,[$cd3f] ; battle style cursor X coordinate
+ dec a
+ jr z,.battleStyleShift\@
+.battleStyleSet\@
+ set 6,d
+ jr .storeOptions\@
+.battleStyleShift\@
+ res 6,d
+.storeOptions\@
+ ld a,d
+ ld [W_OPTIONS],a
+ ret
+
+; reads the options variable and places menu cursors in the correct positions within the options menu
+SetCursorPositionsFromOptions: ; 604C
+ ld hl,TextSpeedOptionData + 1
+ ld a,[W_OPTIONS]
+ ld c,a
+ and a,$3f
+ push bc
+ ld de,2
+ call IsInArray
+ pop bc
+ dec hl
+ ld a,[hl]
+ ld [$cd3d],a ; text speed cursor X coordinate
+ FuncCoord 0,3
+ ld hl,Coord
+ call .placeUnfilledRightArrow\@
+ sla c
+ ld a,1 ; On
+ jr nc,.storeBattleAnimationCursorX\@
+ ld a,10 ; Off
+.storeBattleAnimationCursorX\@
+ ld [$cd3e],a ; battle animation cursor X coordinate
+ FuncCoord 0,8
+ ld hl,Coord
+ call .placeUnfilledRightArrow\@
+ sla c
+ ld a,1
+ jr nc,.storeBattleStyleCursorX\@
+ ld a,10
+.storeBattleStyleCursorX\@
+ ld [$cd3f],a ; battle style cursor X coordinate
+ FuncCoord 0,13
+ ld hl,Coord
+ call .placeUnfilledRightArrow\@
+; cursor in front of Cancel
+ FuncCoord 0,16
+ ld hl,Coord
+ ld a,1
+.placeUnfilledRightArrow\@
+ ld e,a
+ ld d,0
+ add hl,de
+ ld [hl],$ec ; unfilled right arrow menu cursor
+ ret
+
+; table that indicates how the 3 text speed options affect frame delays
+; Format:
+; 00: X coordinate of menu cursor
+; 01: delay after printing a letter (in frames)
+TextSpeedOptionData: ; 6096
+ db 14,5 ; Slow
+ db 7,3 ; Medium
+ db 1,1 ; Fast
+ db 7 ; default X coordinate (Medium)
+ db $ff ; terminator
+
+INCBIN "baserom.gbc",$609e,$6115-$609e
+
OakSpeech: ; 6115
ld a,$FF
call $23B1 ; stop music
@@ -16656,9 +16924,18 @@
ShrinkPic2:
INCBIN "pic/trainer/shrink2.pic"
-INCBIN "baserom.gbc",$13074,$130A9 - $13074
+INCBIN "baserom.gbc",$13074,$13095 - $13074
-DisplayPokemonMenu: ; 70A9
+StartMenu_Pokedex: ; 7095
+ ld a,$29
+ call Predef
+ call $3701 ; restore saved screen
+ call Delay3
+ call LoadGBPal
+ call $2429
+ jp RedisplayStartMenu
+
+StartMenu_Pokemon: ; 70A9
ld a,[W_NUMINPARTY]
and a
jp z,RedisplayStartMenu
@@ -16739,7 +17016,7 @@
.choseSwitch\@
ld a,[W_NUMINPARTY]
cp a,2 ; is there more than one pokemon in the party?
- jp c,DisplayPokemonMenu ; if not, no switching
+ jp c,StartMenu_Pokemon ; if not, no switching
call $7653
ld a,$04 ; swap pokemon positions menu
ld [$d07d],a
@@ -16754,7 +17031,7 @@
ld a,$37
call Predef
call ReloadMapData
- jp DisplayPokemonMenu
+ jp StartMenu_Pokemon
.choseOutOfBattleMove\@
push hl
ld a,[$cf92]
@@ -16802,7 +17079,7 @@
call LoadFontTilePatterns
ld hl,$d72e
set 1,[hl]
- jp DisplayPokemonMenu
+ jp StartMenu_Pokemon
.cut\@
bit 1,a ; does the player have the Cascade Badge?
jp z,.newBadgeRequired\@
@@ -16958,7 +17235,7 @@
call $3709 ; restore saved screen
call GoPAL_SET_CF1C
-DisplayItemMenu: ; 7302
+StartMenu_Item: ; 7302
ld a,[W_ISLINKBATTLE]
dec a
jr nz,.notInLinkBattle\@
@@ -17079,7 +17356,7 @@
call $3dbe
pop af
ld [$cfcb],a
- jp DisplayItemMenu
+ jp StartMenu_Item
.partyMenuNotDisplayed\@
pop af
ld [$cfcb],a
@@ -17159,7 +17436,7 @@
db SUPER_ROD
db $ff
-DisplayTrainerInfo: ; 7460
+StartMenu_TrainerInfo: ; 7460
call GBPalWhiteOut
call ClearScreen
call $2429 ; move sprites
@@ -17360,7 +17637,29 @@
jr nz,.loop\@
ret
-INCBIN "baserom.gbc",$135e3,$13773 - $135e3
+StartMenu_SaveReset: ; 75E3
+ ld a,[$d72e]
+ bit 6,a ; is the player using the link feature?
+ jp nz,InitGame
+ ld a,$3f
+ call Predef ; save the game
+ call $3701 ; restore saved screen
+ jp HoldTextDisplayOpen
+
+StartMenu_Option: ; 75F6
+ xor a
+ ld [H_AUTOBGTRANSFERENABLED],a
+ call ClearScreen
+ call $2429
+ ld hl,DisplayOptionMenu
+ ld b,BANK(DisplayOptionMenu)
+ call Bankswitch
+ call $3701 ; restore saved screen
+ call LoadTextBoxTilePatterns
+ call $2429
+ jp RedisplayStartMenu
+
+INCBIN "baserom.gbc",$13613,$7773 - $7613
TechnicalMachines: ; 0x13773
db MEGA_PUNCH