summaryrefslogtreecommitdiff
path: root/main.asm
diff options
context:
space:
mode:
Diffstat (limited to 'main.asm')
-rw-r--r--main.asm2495
1 files changed, 2205 insertions, 290 deletions
diff --git a/main.asm b/main.asm
index 3e6157768..88a3e193d 100644
--- a/main.asm
+++ b/main.asm
@@ -2155,7 +2155,16 @@ GetTileType: ; 185d
ret
; 1875
-INCBIN "baserom.gbc", $1875, $18ac - $1875
+INCBIN "baserom.gbc", $1875, $18a0 - $1875
+
+CheckCounterTile: ; 18a0
+ cp $90
+ ret z
+ cp $98
+ ret
+; 18a6
+
+INCBIN "baserom.gbc", $18a6, $18ac - $18a6
CheckIceTile: ; 18ac
cp $23
@@ -2183,7 +2192,35 @@ CheckWaterfallTile: ; 18bd
ret
; 18c3
-INCBIN "baserom.gbc", $18c3, $1c07 - $18c3
+
+INCBIN "baserom.gbc", $18c3, $18d2 - $18c3
+
+
+GetMapObject: ; 18d2
+; Return the location of map object a in bc.
+ ld hl, MapObjects
+ ld bc, $10
+ call AddNTimes
+ ld b, h
+ ld c, l
+ ret
+; 18de
+
+
+INCBIN "baserom.gbc", $18de, $1b07 - $18de
+
+
+GetSpriteDirection: ; 1b07
+ ld hl, $0008
+ add hl, bc
+ ld a, [hl]
+ and %00001100
+ ret
+; 1b0f
+
+
+INCBIN "baserom.gbc", $1b0f, $1c07 - $1b0f
+
Function1c07: ; 0x1c07
push af
@@ -2737,29 +2774,25 @@ INCBIN "baserom.gbc", $261b, $261f - $261b
PushScriptPointer: ; 261f
-; used to call a script from asm
-; input:
-; a: bank
-; hl: address
+; Call a script at a:hl.
-; bank
- ld [$d439], a ; ScriptBank
-
-; address
+ ld [ScriptBank], a
ld a, l
- ld [$d43a], a ; ScriptAddressLo
+ ld [ScriptPos], a
ld a, h
- ld [$d43b], a ; ScriptAddressHi
+ ld [ScriptPos + 1], a
ld a, $ff
- ld [$d438], a
+ ld [ScriptRunning], a
scf
ret
; 2631
+
INCBIN "baserom.gbc", $2631, $26d4 - $2631
+
GetScriptByte: ; 0x26d4
; Return byte at ScriptBank:ScriptPos in a.
@@ -2803,7 +2836,139 @@ ObjectEventText:
db "@"
; 0x26f7
-INCBIN "baserom.gbc", $26f7, $2b74-$26f7
+
+INCBIN "baserom.gbc", $26f7, $2a07 - $26f7
+
+
+GetFacingTileCoord: ; 2a07
+; Return map coordinates in (d, e) and tile id in a
+; of the tile the player is facing.
+
+ ld a, [PlayerDirection]
+ and %1100
+ srl a
+ srl a
+ ld l, a
+ ld h, 0
+ add hl, hl
+ add hl, hl
+ ld de, .Directions
+ add hl, de
+
+ ld d, [hl]
+ inc hl
+ ld e, [hl]
+ inc hl
+
+ ld a, [hli]
+ ld h, [hl]
+ ld l, a
+
+ ld a, [MapX]
+ add d
+ ld d, a
+ ld a, [MapY]
+ add e
+ ld e, a
+ ld a, [hl]
+ ret
+
+.Directions
+ ; x, y
+ db 0, 1
+ dw TileDown
+ db 0, -1
+ dw TileUp
+ db -1, 0
+ dw TileLeft
+ db 1, 0
+ dw TileRight
+; 2a3c
+
+
+INCBIN "baserom.gbc", $2a3c, $2a8b - $2a3c
+
+
+CheckFacingSign: ; 2a8b
+ call GetFacingTileCoord
+ ld b, a
+ ld a, d
+ sub 4
+ ld d, a
+ ld a, e
+ sub 4
+ ld e, a
+ ld a, [$dc01]
+ and a
+ ret z
+ ld c, a
+ ld a, [hROMBank]
+ push af
+ call $2c52
+ call $2aaa
+ pop hl
+ ld a, h
+ rst Bankswitch
+ ret
+; 2aaa
+
+; 2aaa
+ ld hl, $dc02
+ ld a, [hli]
+ ld h, [hl]
+ ld l, a
+.asm_2ab0
+ push hl
+ ld a, [hli]
+ cp e
+ jr nz, .asm_2abb
+ ld a, [hli]
+ cp d
+ jr nz, .asm_2abb
+ jr .asm_2ac8
+
+.asm_2abb
+ pop hl
+ ld a, 5
+ add l
+ ld l, a
+ jr nc, .asm_2ac3
+ inc h
+
+.asm_2ac3
+ dec c
+ jr nz, .asm_2ab0
+ xor a
+ ret
+
+.asm_2ac8
+ pop hl
+ ld de, EngineBuffer1
+ ld bc, 5
+ call CopyBytes
+ scf
+ ret
+; 0x2ad4
+
+
+INCBIN "baserom.gbc", $2ad4, $2b29 - $2ad4
+
+
+FadeToMenu: ; 2b29
+ xor a
+ ld [hBGMapMode], a
+ call $1d6e
+ ld a, $23
+ ld hl, $4084
+ rst FarCall
+ call ClearSprites
+ call Function2ed3
+ ret
+; 2b3c
+
+
+INCBIN "baserom.gbc", $2b3c, $2b74 - $2b3c
+
Function2b74: ; 0x2b74
push af
@@ -3076,7 +3241,27 @@ Predef: ; 2d83
ret
; 2dba
-INCBIN "baserom.gbc", $2dba, $2e6f-$2dba
+
+ResetWindow: ; 2dba
+
+ call $1fbf
+ ld a, [hROMBank]
+ push af
+ ld a, $1
+ rst Bankswitch
+
+ call $6454
+ call $2e20
+ call $64bf
+
+ pop af
+ rst Bankswitch
+ ret
+; 2dcf
+
+
+INCBIN "baserom.gbc", $2dcf, $2e6f-$2dcf
+
BitTable1Func: ; 0x2e6f
ld hl, $da72
@@ -3198,7 +3383,30 @@ InitString: ; 0x2ef9
ret
; 0x2f17
-INCBIN "baserom.gbc", $2f17, $2f8c - $2f17
+
+INCBIN "baserom.gbc", $2f17, $2f3f - $2f17
+
+
+DoItemEffect: ; 2f3f
+ callba _DoItemEffect
+ ret
+; 2f46
+
+
+CheckTossableItem: ; 2f46
+ push hl
+ push de
+ push bc
+ callba _CheckTossableItem
+ pop bc
+ pop de
+ pop hl
+ ret
+; 2f53
+
+
+INCBIN "baserom.gbc", $2f53, $2f8c - $2f53
+
RNG: ; 2f8c
; Two random numbers are generated by adding and subtracting
@@ -4216,7 +4424,223 @@ GetMoveName: ; 34f8
; 350c
-INCBIN "baserom.gbc", $350c, $3856 - $350c
+INCBIN "baserom.gbc", $350c, $3600 - $350c
+
+
+CheckTrainerBattle2: ; 3600
+
+ ld a, [hROMBank]
+ push af
+ call $2c52
+
+ call CheckTrainerBattle
+
+ pop bc
+ ld a, b
+ rst Bankswitch
+ ret
+; 360d
+
+
+CheckTrainerBattle: ; 360d
+; Check if any trainer on the map sees the player and wants to battle.
+
+; Skip the player object.
+ ld a, 1
+ ld de, MapObjects + OBJECT_LENGTH
+
+.loop
+
+; Start a battle if the object:
+
+ push af
+ push de
+
+; Has a sprite
+ ld hl, $0001
+ add hl, de
+ ld a, [hl]
+ and a
+ jr z, .next
+
+; Is a trainer
+ ld hl, $0008
+ add hl, de
+ ld a, [hl]
+ and $f
+ cp $2
+ jr nz, .next
+
+; Is visible on the map
+ ld hl, $0000
+ add hl, de
+ ld a, [hl]
+ cp $ff
+ jr z, .next
+
+; Is facing the player...
+ call $1ae5
+ call FacingPlayerDistance_bc
+ jr nc, .next
+
+; ...within their sight range
+ ld hl, $0009
+ add hl, de
+ ld a, [hl]
+ cp b
+ jr c, .next
+
+; And hasn't already been beaten
+ push bc
+ push de
+ ld hl, $000a
+ add hl, de
+ ld a, [hli]
+ ld h, [hl]
+ ld l, a
+ ld e, [hl]
+ inc hl
+ ld d, [hl]
+ ld b, CHECK_FLAG
+ call BitTable1Func
+ ld a, c
+ pop de
+ pop bc
+ and a
+ jr z, .asm_3666
+
+.next
+ pop de
+ ld hl, OBJECT_LENGTH
+ add hl, de
+ ld d, h
+ ld e, l
+
+ pop af
+ inc a
+ cp NUM_OBJECTS
+ jr nz, .loop
+ xor a
+ ret
+
+.asm_3666
+ pop de
+ pop af
+ ld [$ffe0], a
+ ld a, b
+ ld [$d03f], a
+ ld a, c
+ ld [$d040], a
+ jr .asm_367e
+
+ ld a, $1
+ ld [$d03f], a
+ ld a, $ff
+ ld [$d040], a
+
+.asm_367e
+ call $2c57
+ ld [EngineBuffer1], a
+ ld a, [$ffe0]
+ call GetMapObject
+ ld hl, $000a
+ add hl, bc
+ ld a, [EngineBuffer1]
+ call GetFarHalfword
+ ld de, $d041
+ ld bc, $000d
+ ld a, [EngineBuffer1]
+ call FarCopyBytes
+ xor a
+ ld [$d04d], a
+ scf
+ ret
+; 36a5d
+
+
+FacingPlayerDistance_bc: ; 36a5
+
+ push de
+ call FacingPlayerDistance
+ ld b, d
+ ld c, e
+ pop de
+ ret
+; 36ad
+
+
+FacingPlayerDistance: ; 36ad
+; Return carry if the sprite at bc is facing the player,
+; and its distance in d.
+
+ ld hl, $0010 ; x
+ add hl, bc
+ ld d, [hl]
+
+ ld hl, $0011 ; y
+ add hl, bc
+ ld e, [hl]
+
+ ld a, [MapX]
+ cp d
+ jr z, .CheckY
+
+ ld a, [MapY]
+ cp e
+ jr z, .CheckX
+
+ and a
+ ret
+
+.CheckY
+ ld a, [MapY]
+ sub e
+ jr z, .NotFacing
+ jr nc, .Above
+
+; Below
+ cpl
+ inc a
+ ld d, a
+ ld e, UP << 2
+ jr .CheckFacing
+
+.Above
+ ld d, a
+ ld e, DOWN << 2
+ jr .CheckFacing
+
+.CheckX
+ ld a, [MapX]
+ sub d
+ jr z, .NotFacing
+ jr nc, .Left
+
+; Right
+ cpl
+ inc a
+ ld d, a
+ ld e, LEFT << 2
+ jr .CheckFacing
+
+.Left
+ ld d, a
+ ld e, RIGHT << 2
+
+.CheckFacing
+ call GetSpriteDirection
+ cp e
+ jr nz, .NotFacing
+ scf
+ ret
+
+.NotFacing
+ and a
+ ret
+; 36f5
+
+
+INCBIN "baserom.gbc", $36f5, $3856 - $36f5
GetBaseData: ; 3856
@@ -5653,7 +6077,52 @@ DrawGraphic: ; 6eef
; 6f07
-INCBIN "baserom.gbc", $6f07, $7305 - $6f07
+INCBIN "baserom.gbc", $6f07, $6fd9 - $6f07
+
+
+CheckFacingObject: ; 6fd9
+
+ call GetFacingTileCoord
+
+; Double the distance for counter tiles.
+ call CheckCounterTile
+ jr nz, .asm_6ff1
+
+ ld a, [MapX]
+ sub d
+ cpl
+ inc a
+ add d
+ ld d, a
+
+ ld a, [MapY]
+ sub e
+ cpl
+ inc a
+ add e
+ ld e, a
+
+.asm_6ff1
+ ld bc, $d4d6
+ ld a, 0
+ ld [hConnectionStripLength], a
+ call $7041
+ ret nc
+ ld hl, $0007
+ add hl, bc
+ ld a, [hl]
+ cp $ff
+ jr z, .asm_7007
+ xor a
+ ret
+
+.asm_7007
+ scf
+ ret
+; 7009
+
+
+INCBIN "baserom.gbc", $7009, $7305 - $7009
SpecialGiveShuckle: ; 7305
@@ -6593,7 +7062,7 @@ GetNumberedTMHM: ; d417
; d427
-CheckTossableItem: ; d427
+_CheckTossableItem: ; d427
; Return 1 in $d142 and carry if CurItem can't be removed from the bag.
ld a, 4
call GetItemAttr
@@ -6702,7 +7171,7 @@ ClearPCItemScreen: ; e58b
INCBIN "baserom.gbc", $e5bb, $e722 - $e5bb
-DoItemEffect: ; e722
+_DoItemEffect: ; e722
ld a, [CurItem]
ld [$d265], a
call GetItemName
@@ -6712,7 +7181,7 @@ DoItemEffect: ; e722
ld a, [CurItem]
dec a
ld hl, ItemEffects
- rst $28
+ rst JumpTable
ret
; e73c
@@ -7040,54 +7509,62 @@ HalveMoney: ; 12513
INCBIN "baserom.gbc", $12527, $125cd - $12527
-OpenMenu: ; 0x125cd
+StartMenu: ; 125cd
+
call $1fbf
+
ld de, SFX_MENU
call StartSFX
+
ld a, $1
ld hl, $6454
rst FarCall
- ld hl, $d84d
- bit 2, [hl]
- ld hl, $66d3
- jr z, .asm_125e9
- ld hl, $66db ; draw the menu a little lower
-.asm_125e9
+
+ ld hl, StatusFlags2
+ bit 2, [hl] ; bug catching contest
+ ld hl, .MenuDataHeader
+ jr z, .GotMenuData
+ ld hl, .ContestMenuDataHeader
+.GotMenuData
+
call Function1d35
- call SetUpMenuItems
+ call .SetUpMenuItems
ld a, [$d0d2]
ld [$cf88], a
- call DrawMenuAccount_
- call $1e7f
- call $68d1
+ call .DrawMenuAccount_
+ call MenuFunc_1e7f
+ call .DrawBugContestStatusBox
call $2e31
call $2e20
ld a, $1
ld hl, $64bf
rst $8
- call $68de
+ call .DrawBugContestStatus
call $0485
- jr .wait
-.reopen
+ jr .Select
+
+.Reopen
call $1ad2
call $0485
- call $6829
+ call .SetUpMenuItems
ld a, [$d0d2]
ld [$cf88], a
-.wait
- call MenuWait
- jr c, .exit
- call DrawMenuAccount
+
+.Select
+ call .GetInput
+ jr c, .Exit
+ call .DrawMenuAccount
ld a, [$cf88]
ld [$d0d2], a
call PlayClickSFX
call $1bee
- call $67e5
-; code when you return from a submenu. some submenus force you to quit
-; the menu, like save. option forces it to redraw completely.
- ld hl, .MenuReturnPointerTable
+ call .OpenMenu
+
+; Menu items have different return functions.
+; For example, saving exits the menu.
+ ld hl, .MenuReturns
ld e, a
- ld d, $0
+ ld d, 0
add hl, de
add hl, de
ld a, [hli]
@@ -7095,122 +7572,182 @@ OpenMenu: ; 0x125cd
ld l, a
jp [hl]
-.MenuReturnPointerTable: ; $6644
- dw .reopen
- dw .exit
- dw $66a2 ; invalid?
- dw $6699 ; invalid?
- dw $6691 ; invalid?
- dw .end
- dw $66b1 ; redraw
-
-.exit
- ld a, [$ffd8]
+.MenuReturns
+ dw .Reopen
+ dw .Exit
+ dw .ReturnTwo
+ dw .ReturnThree
+ dw .ReturnFour
+ dw .ReturnEnd
+ dw .ReturnRedraw
+
+.Exit
+ ld a, [hOAMUpdate]
push af
- ld a, $1
+ ld a, 1
ld [hOAMUpdate], a
call $0e5f
pop af
ld [hOAMUpdate], a
-.end
+.ReturnEnd
call Function1c07
+.ReturnEnd2
call $2dcf
call $0485
ret
-MenuWait: ; 0x12669
-; returns nc if A was pressed, c if B.
+.GetInput
+; Return carry on exit, and no-carry on selection.
xor a
ld [hBGMapMode], a
- call DrawMenuAccount
+ call .DrawMenuAccount
call SetUpMenu
ld a, $ff
ld [MenuSelection], a
.loop
- call PrintMenuAccount
+ call .PrintMenuAccount
call $1f1a
ld a, [$cf73]
cp BUTTON_B
- jr z, .b_button
+ jr z, .b
cp BUTTON_A
- jr z, .a_button
+ jr z, .a
jr .loop
-.a_button
+.a
call PlayClickSFX
and a
ret
-.b_button
+.b
scf
ret
-; 0x12691
-
-
-INCBIN "baserom.gbc", $12691, $12721 - $12691
-
-MenuStringDex: ; 0x12721
- db "#DEX@"
-
-MenuStringMon: ; 0x12726
- db "#MON@"
-
-MenuStringPack: ; 0x1272b
- db "PACK@"
-
-MenuStringProfile: ; 0x12730
- db $52, "@"
-
-MenuStringSave: ; 0x12732
- db "SAVE@"
-
-MenuStringOption: ; 0x12737
- db "OPTION@"
-
-MenuStringExit: ; 0x1273e
- db "EXIT@"
+; 12691
-MenuStringGear: ; 0x12743
- db $24, "GEAR@"
-
-MenuStringQuit: ; 0x12749
- db "QUIT@"
-
-MenuStringDescDex: ; 0x1274e
- db "#MON", $4e, "database@"
-
-MenuStringDescParty: ; 0x1275c
- db "Party ", $4a, $4e, "status@"
-
-MenuStringDescPack: ; 0x1276b
- db "Contains", $4e, "items@"
-
-MenuStringDescGear: ; 0x1277a
- db "Trainer's", $4e, "key device@"
-
-MenuStringDescProfile: ; 0x1278e
- db "Your own", $4e, "status@"
-
-MenuStringDescSave: ; 0x1279e
- db "Save your", $4e, "progress@"
+.ReturnFour ; 12691
+ call Function1c07
+ ld a, $80
+ ld [$ffa0], a
+ ret
+; 12699
-MenuStringDescOption: ; 0x127b1
- db "Change", $4e, "settings@"
+.ReturnThree ; 12699
+ call Function1c07
+ ld a, $80
+ ld [$ffa0], a
+ jr .ReturnEnd2
+; 126a2
-MenuStringDescExit: ; 0x127c1
- db "Close this", $4e, "menu@"
+.ReturnTwo ; 126a2
+ call Function1c07
+ ld hl, $d0e9
+ ld a, [hli]
+ ld h, [hl]
+ ld l, a
+ ld a, [$d0e8]
+ rst FarCall
+ jr .ReturnEnd2
+; 126b1
-MenuStringDescRetire: ; 0x127d1
- db "Quit and", $4e, "be judged.@"
+.ReturnRedraw ; 126b1
+ call .Clear
+ jp .Reopen
+; 126b7
-; 0x127e5
+.Clear ; 126b7
+ call WhiteBGMap
+ call $1d7d
+ call $2bae
+ call .DrawMenuAccount_
+ call MenuFunc_1e7f
+ call .DrawBugContestStatus
+ call $1ad2
+ call $0d90
+ call $2b5c
+ ret
+; 126d3
+
+
+.MenuDataHeader
+ db $40 ; tile backup
+ db 0, 10 ; start coords
+ db 17, 19 ; end coords
+ dw .MenuData
+ db 1 ; default selection
+
+.ContestMenuDataHeader
+ db $40 ; tile backup
+ db 2, 10 ; start coords
+ db 17, 19 ; end coords
+ dw .MenuData
+ db 1 ; default selection
+
+.MenuData
+ db %10101000 ; x padding, wrap around, start can close
+ dn 0, 0 ; rows, columns
+ dw MenuItemsList
+ dw .MenuString
+ dw .Items
+
+.Items
+ dw StartMenu_Pokedex, .PokedexString, .PokedexDesc
+ dw StartMenu_Pokemon, .PartyString, .PartyDesc
+ dw StartMenu_Pack, .PackString, .PackDesc
+ dw StartMenu_Status, .StatusString, .StatusDesc
+ dw StartMenu_Save, .SaveString, .SaveDesc
+ dw StartMenu_Option, .OptionString, .OptionDesc
+ dw StartMenu_Exit, .ExitString, .ExitDesc
+ dw StartMenu_Pokegear, .PokegearString, .PokegearDesc
+ dw StartMenu_Quit, .QuitString, .QuitDesc
+
+.PokedexString db "#DEX@"
+.PartyString db "#MON@"
+.PackString db "PACK@"
+.StatusString db $52, "@"
+.SaveString db "SAVE@"
+.OptionString db "OPTION@"
+.ExitString db "EXIT@"
+.PokegearString db $24, "GEAR@"
+.QuitString db "QUIT@"
+
+.PokedexDesc db "#MON", $4e, "database@"
+.PartyDesc db "Party ", $4a, $4e, "status@"
+.PackDesc db "Contains", $4e, "items@"
+.PokegearDesc db "Trainer's", $4e, "key device@"
+.StatusDesc db "Your own", $4e, "status@"
+.SaveDesc db "Save your", $4e, "progress@"
+.OptionDesc db "Change", $4e, "settings@"
+.ExitDesc db "Close this", $4e, "menu@"
+.QuitDesc db "Quit and", $4e, "be judged.@"
+
+
+.OpenMenu ; 127e5
+ ld a, [MenuSelection]
+ call .GetMenuAccountTextPointer
+ ld a, [hli]
+ ld h, [hl]
+ ld l, a
+ jp [hl]
+; 127ef
-INCBIN "baserom.gbc", $127e5, $12800 - $127e5
+.MenuString ; 127ef
+ push de
+ ld a, [MenuSelection]
+ call .GetMenuAccountTextPointer
+ inc hl
+ inc hl
+ ld a, [hli]
+ ld d, [hl]
+ ld e, a
+ pop hl
+ call PlaceString
+ ret
+; 12800
-WriteMenuAccount:
+.MenuDesc ; 12800
push de
ld a, [MenuSelection]
cp $ff
jr z, .none
- call GetMenuAccountTextPointer
+ call .GetMenuAccountTextPointer
inc hl
inc hl
inc hl
@@ -7224,11 +7761,13 @@ WriteMenuAccount:
.none
pop de
ret
+; 12819
+
-GetMenuAccountTextPointer: ; 0x12819
+.GetMenuAccountTextPointer ; 12819
ld e, a
- ld d, $0
- ld hl, $cf97 ; table is dynamic and stored in memory
+ ld d, 0
+ ld hl, $cf97
ld a, [hli]
ld h, [hl]
ld l, a
@@ -7239,115 +7778,275 @@ GetMenuAccountTextPointer: ; 0x12819
add hl, de
add hl, de
ret
+; 12829
+
-SetUpMenuItems: ; 4:6829 = 0x12829
+.SetUpMenuItems ; 12829
xor a
ld [$cf76], a
- call $688d
+ call .FillMenuList
+
ld hl, $d84c
bit 0, [hl]
jr z, .no_pokedex
- ld a, $0
- call AppendMenuList
+ ld a, 0 ; pokedex
+ call .AppendMenuList
.no_pokedex
+
ld a, [PartyCount]
and a
jr z, .no_pokemon
- ld a, $1
- call AppendMenuList
+ ld a, 1 ; pokemon
+ call .AppendMenuList
.no_pokemon
+
ld a, [InLinkBattle]
and a
jr nz, .no_pack
- ld hl, $d84d
- bit 2, [hl]
+ ld hl, StatusFlags2
+ bit 2, [hl] ; bug catching contest
jr nz, .no_pack
- ld a, $2
- call AppendMenuList
+ ld a, 2 ; pack
+ call .AppendMenuList
.no_pack
+
ld hl, $d957
bit 7, [hl]
- jr z, .no_exit
- ld a, $7
- call AppendMenuList
-.no_exit
- ld a, $3
- call AppendMenuList
+ jr z, .no_pokegear
+ ld a, 7 ; pokegear
+ call .AppendMenuList
+.no_pokegear
+
+ ld a, 3 ; status
+ call .AppendMenuList
+
ld a, [InLinkBattle]
and a
jr nz, .no_save
- ld hl, $d84d
- bit 2, [hl]
- ld a, $8
+ ld hl, StatusFlags2
+ bit 2, [hl] ; bug catching contest
+ ld a, 8 ; quit
jr nz, .write
- ld a, $4
+ ld a, 4 ; save
.write
- call AppendMenuList
+ call .AppendMenuList
.no_save
- ld a, $5
- call AppendMenuList
- ld a, $6
- call AppendMenuList
+
+ ld a, 5 ; option
+ call .AppendMenuList
+ ld a, 6 ; exit
+ call .AppendMenuList
ld a, c
ld [MenuItemsList], a
ret
+; 1288d
-FillMenuList: ; 0x1288d
+
+.FillMenuList ; 1288d
xor a
ld hl, MenuItemsList
ld [hli], a
ld a, $ff
ld bc, $000f
call ByteFill
- ld de, MenuItemsList+1
+ ld de, MenuItemsList + 1
ld c, 0
ret
+; 128a0
-AppendMenuList: ; 0x128a0
+.AppendMenuList ; 128a0
ld [de], a
inc de
inc c
ret
+; 128a4
-DrawMenuAccount_:; 0x128a4
- jp DrawMenuAccount
+.DrawMenuAccount_ ; 128a4
+ jp .DrawMenuAccount
+; 128a7
-PrintMenuAccount: ; 4:68a7 0x128a7
- call IsMenuAccountOn
+.PrintMenuAccount ; 128a7
+ call .IsMenuAccountOn
ret z
- call DrawMenuAccount
- decoord 0, 14 ; $c5b8
- jp $6800
+ call .DrawMenuAccount
+ decoord 0, 14
+ jp .MenuDesc
+; 128b4
-DrawMenuAccount: ; 4:68b4 0x128b4
- call IsMenuAccountOn
+.DrawMenuAccount ; 128b4
+ call .IsMenuAccountOn
ret z
- hlcoord 0, 13 ; $c5a4
+ hlcoord 0, 13
ld bc, $050a
call ClearBox
- hlcoord 0, 13 ; $c5a4
- ld b, $3
- ld c, $8
+ hlcoord 0, 13
+ ld b, 3
+ ld c, 8
jp TextBoxPalette
+; 128cb
-IsMenuAccountOn: ; 0x128cb
+.IsMenuAccountOn ; 128cb
ld a, [Options2]
- and $1
+ and 1
+ ret
+; 128d1
+
+.DrawBugContestStatusBox ; 128d1
+ ld hl, StatusFlags2
+ bit 2, [hl] ; bug catching contest
+ ret z
+ ld a, $9
+ ld hl, $4bdc
+ rst FarCall
+ ret
+; 128de
+
+.DrawBugContestStatus ; 128de
+ ld hl, StatusFlags2
+ bit 2, [hl] ; bug catching contest
+ jr nz, .contest
+ ret
+.contest
+ ld a, $9
+ ld hl, $4be7
+ rst FarCall
+ ret
+; 128ed
+
+
+StartMenu_Exit: ; 128ed
+; Exit the menu.
+
+ ld a, 1
+ ret
+; 128f0
+
+
+StartMenu_Quit: ; 128f0
+; Retire from the bug catching contest.
+
+ ld hl, .EndTheContestText
+ call $6cf5
+ jr c, .asm_12903
+ ld a, $4
+ ld hl, $760b
+ call $31cf
+ ld a, 4
ret
-; 0x128d1
+.asm_12903
+ ld a, 0
+ ret
+
+.EndTheContestText
+ text_jump UnknownText_0x1c1a6c, BANK(UnknownText_0x1c1a6c)
+ db "@"
+; 1290b
+
-INCBIN "baserom.gbc", $128d1, $12976 - $128d1
+StartMenu_Save: ; 1290b
+; Save the game.
+
+ call $2879
+ ld a, $5
+ ld hl, $4a1a
+ rst FarCall
+ jr nc, .asm_12919
+ ld a, 0
+ ret
+.asm_12919
+ ld a, 1
+ ret
+; 1291c
+
+
+StartMenu_Option: ; 1291c
+; Game options.
+
+ call FadeToMenu
+ ld a, $1
+ ld hl, $5b64
+ rst FarCall
+ ld a, 6
+ ret
+; 12928
+
+
+StartMenu_Status: ; 12928
+; Player status.
+
+ call FadeToMenu
+ ld a, $9
+ ld hl, $5105
+ rst FarCall
+ call $2b3c
+ ld a, 0
+ ret
+; 12937
+
+
+StartMenu_Pokedex: ; 12937
-OpenPartyMenu: ; $12976
ld a, [PartyCount]
and a
- jr z, .return ; no pokémon in party
- call $2b29 ; fade in?
-.choosemenu ; 1297f
+ jr z, .asm_12949
+
+ call FadeToMenu
+ ld a, $10
+ ld hl, $4000
+ rst FarCall
+ call $2b3c
+
+.asm_12949
+ ld a, 0
+ ret
+; 1294c
+
+
+StartMenu_Pokegear: ; 1294c
+
+ call FadeToMenu
+ ld a, $24
+ ld hl, $4b8d
+ rst FarCall
+ call $2b3c
+ ld a, 0
+ ret
+; 1295b
+
+
+StartMenu_Pack: ; 1295b
+
+ call FadeToMenu
+ ld a, $4
+ ld hl, $4000
+ rst FarCall
+ ld a, [$cf66]
+ and a
+ jr nz, .asm_12970
+ call $2b3c
+ ld a, 0
+ ret
+.asm_12970
+ call $2b4d
+ ld a, 4
+ ret
+; 12976
+
+
+StartMenu_Pokemon: ; 12976
+
+ ld a, [PartyCount]
+ and a
+ jr z, .return
+
+ call FadeToMenu
+
+.choosemenu
xor a
ld [PartyMenuActionText], a ; Choose a POKéMON.
call WhiteBGMap
-.menu ; 12986
+
+.menu
ld a, $14
ld hl, $404f
rst FarCall ; load gfx
@@ -7357,107 +8056,670 @@ OpenPartyMenu: ; $12976
ld a, $14
ld hl, $43e0
rst FarCall ; load menu pokémon sprites
-.menunoreload ; 12998
- ld a, BANK(WritePartyMenuTilemap)
- ld hl, WritePartyMenuTilemap
- rst FarCall
- ld a, BANK(PrintPartyMenuText)
- ld hl, PrintPartyMenuText
- rst FarCall
+
+.menunoreload
+ callba WritePartyMenuTilemap
+ callba PrintPartyMenuText
call WaitBGMap
call $32f9 ; load regular palettes?
call DelayFrame
- ld a, BANK(PartyMenuSelect)
- ld hl, PartyMenuSelect
- rst FarCall
+ callba PartyMenuSelect
jr c, .return ; if cancelled or pressed B
+
call PokemonActionSubmenu
- cp $3
+ cp 3
jr z, .menu
- cp $0
+ cp 0
jr z, .choosemenu
- cp $1
+ cp 1
jr z, .menunoreload
- cp $2
+ cp 2
jr z, .quit
-.return ; 129c8
+
+.return
call $2b3c
- ld a, $0
+ ld a, 0
ret
-.quit ; 129ce
+
+.quit
ld a, b
push af
call $2b4d
pop af
ret
-; 0x129d5
+; 129d5
+
+
+INCBIN "baserom.gbc", $129d5, $12a60 - $129d5
+
+
+CantUseItem: ; 12a60
+ ld hl, CantUseItemText
+ call $2012
+ ret
+; 12a67
-INCBIN "baserom.gbc", $129d5, $12a88 - $129d5
+CantUseItemText: ; 12a67
+ text_jump UnknownText_0x1c1b03, BANK(UnknownText_0x1c1b03)
+ db "@"
+; 12a6c
-PokemonActionSubmenu ; 0x12a88
- ld hl, $c5cd ; coord
+
+PartyMonItemName: ; 12a6c
+ ld a, [CurItem]
+ ld [$d265], a
+ call GetItemName
+ call CopyName1
+ ret
+; 12a79
+
+
+CancelPokemonAction: ; 12a79
+ ld a, $14
+ ld hl, $4405
+ rst FarCall
+ ld a, $23
+ ld hl, $6a71
+ rst FarCall
+ ld a, 1
+ ret
+; 12a88
+
+
+PokemonActionSubmenu: ; 12a88
+ hlcoord 1, 15
ld bc, $0212 ; box size
- call $0fb6 ; draw box
+ call ClearBox
ld a, $9
ld hl, $4d19
rst FarCall
call $389c
ld a, [MenuSelection]
- ld hl, PokemonSubmenuActionPointerTable
- ld de, $0003 ; skip 3 bytes each time
+ ld hl, .Actions
+ ld de, 3
call IsInArray
jr nc, .nothing
+
inc hl
ld a, [hli]
ld h, [hl]
ld l, a
jp [hl]
+
.nothing
- ld a, $0
+ ld a, 0
+ ret
+
+.Actions
+ dbw $01, $6e1b
+ dbw $02, $6e30
+ dbw $03, $6ebd
+ dbw $04, $6e6a
+ dbw $06, $6e55
+ dbw $07, $6e7f
+ dbw $08, $6ed1
+ dbw $09, $6ea9
+ dbw $0a, $6ee6
+ dbw $0d, $6ee6
+ dbw $0b, $6f26
+ dbw $05, $6e94
+ dbw $0c, $6f3b
+ dbw $0e, $6f50
+ dbw $0f, OpenPartyStats
+ dbw $10, SwitchPartyMons
+ dbw $11, GiveTakePartyMonItem
+ dbw $12, CancelPokemonAction
+ dbw $13, $6fba ; move
+ dbw $14, $6d45 ; mail
+; 12aec
+
+
+SwitchPartyMons: ; 12aec
+
+; Don't try if there's nothing to switch!
+ ld a, [PartyCount]
+ cp 2
+ jr c, .DontSwitch
+
+ ld a, [CurPartyMon]
+ inc a
+ ld [$d0e3], a
+
+ ld a, $23
+ ld hl, $6a8c
+ rst FarCall
+ ld a, $14
+ ld hl, $442d
+ rst FarCall
+
+ ld a, 4
+ ld [PartyMenuActionText], a
+ callba WritePartyMenuTilemap
+ callba PrintPartyMenuText
+
+ hlcoord 0, 1
+ ld bc, 20 * 2
+ ld a, [$d0e3]
+ dec a
+ call AddNTimes
+ ld [hl], "▷"
+ call WaitBGMap
+ call $32f9
+ call DelayFrame
+
+ callba PartyMenuSelect
+ bit 1, b
+ jr c, .DontSwitch
+
+ ld a, $14
+ ld hl, $4f12
+ rst FarCall
+
+ xor a
+ ld [PartyMenuActionText], a
+
+ ld a, $14
+ ld hl, $404f
+ rst FarCall
+ ld a, $14
+ ld hl, $4405
+ rst FarCall
+ ld a, $14
+ ld hl, $43e0
+ rst FarCall
+
+ ld a, 1
+ ret
+
+.DontSwitch
+ xor a
+ ld [PartyMenuActionText], a
+ call CancelPokemonAction
+ ret
+; 12b60
+
+
+GiveTakePartyMonItem: ; 12b60
+
+; Eggs can't hold items!
+ ld a, [CurPartySpecies]
+ cp EGG
+ jr z, .asm_12ba6
+
+ ld hl, GiveTakeItemMenuData
+ call Function1d35
+ call Function1d81
+ call Function1c07
+ jr c, .asm_12ba6
+
+ call $389c
+ ld hl, StringBuffer1
+ ld de, $d050
+ ld bc, $b
+ call CopyBytes
+ ld a, [$cfa9]
+ cp 1
+ jr nz, .asm_12ba0
+
+ call $1d6e
+ call ClearPalettes
+ call Function12ba9
+ call ClearPalettes
+ call $0e58
+ call Function1c07
+ ld a, 0
+ ret
+
+.asm_12ba0
+ call TakePartyItem
+ ld a, 3
+ ret
+
+.asm_12ba6
+ ld a, 3
+ ret
+; 12ba9
+
+
+Function12ba9: ; 12ba9
+
+ ld a, $4
+ ld hl, $46a5
+ rst FarCall
+
+.loop
+ ld a, $4
+ ld hl, $46be
+ rst FarCall
+
+ ld a, [$cf66]
+ and a
+ jr z, .quit
+
+ ld a, [$cf65]
+ cp 2
+ jr z, .next
+
+ call CheckTossableItem
+ ld a, [$d142]
+ and a
+ jr nz, .next
+
+ call Function12bd9
+ jr .quit
+
+.next
+ ld hl, CantBeHeldText
+ call $1d67
+ jr .loop
+
+.quit
+ ret
+; 12bd9
+
+
+Function12bd9: ; 12bd9
+
+ call SpeechTextBox
+ call PartyMonItemName
+ call GetPartyItemLocation
+ ld a, [hl]
+ and a
+ jr z, .asm_12bf4
+
+ push hl
+ ld d, a
+ ld a, $2e
+ ld hl, $5e76
+ rst FarCall
+ pop hl
+ jr c, .asm_12c01
+ ld a, [hl]
+ jr .asm_12c08
+
+.asm_12bf4
+ call $6cea
+ ld hl, MadeHoldText
+ call $1d67
+ call GivePartyItem
ret
-; 0x12ab0
-
-PokemonSubmenuActionPointerTable: ; 0x12ab0
- dbw $01, $6e1b
- dbw $02, $6e30
- dbw $03, $6ebd
- dbw $04, $6e6a
- dbw $06, $6e55
- dbw $07, $6e7f
- dbw $08, $6ed1
- dbw $09, $6ea9
- dbw $0a, $6ee6
- dbw $0d, $6ee6
- dbw $0b, $6f26
- dbw $05, $6e94
- dbw $0c, $6f3b
- dbw $0e, $6f50
- dbw $0f, OpenPartyStats ; stats
- dbw $10, $6aec ; switch
- dbw $11, $6b60 ; item
- dbw $12, $6a79
- dbw $13, $6fba ; move
- dbw $14, $6d45 ; mail
-; no terminator?
-; 0x12aec
-
-INCBIN "baserom.gbc", $12aec, $12e00 - $12aec
+
+.asm_12c01
+ ld hl, PleaseRemoveMailText
+ call $1d67
+ ret
+
+.asm_12c08
+ ld [$d265], a
+ call GetItemName
+ ld hl, SwitchAlreadyHoldingText
+ call $6cf5
+ jr c, .asm_12c4b
+
+ call $6cea
+ ld a, [$d265]
+ push af
+ ld a, [CurItem]
+ ld [$d265], a
+ pop af
+ ld [CurItem], a
+ call $6cdf
+ jr nc, .asm_12c3c
+
+ ld hl, TookAndMadeHoldText
+ call $1d67
+ ld a, [$d265]
+ ld [CurItem], a
+ call GivePartyItem
+ ret
+
+.asm_12c3c
+ ld a, [$d265]
+ ld [CurItem], a
+ call $6cdf
+ ld hl, ItemStorageIsFullText
+ call $1d67
+
+.asm_12c4b
+ ret
+; 12c4c
+
+
+GivePartyItem: ; 12c4c
+
+ call GetPartyItemLocation
+ ld a, [CurItem]
+ ld [hl], a
+ ld d, a
+ ld a, $2e
+ ld hl, $5e76
+ rst FarCall
+ jr nc, .asm_12c5f
+ call $6cfe
+
+.asm_12c5f
+ ret
+; 12c60
+
+
+TakePartyItem: ; 12c60
+
+ call SpeechTextBox
+ call GetPartyItemLocation
+ ld a, [hl]
+ and a
+ jr z, .asm_12c8c
+
+ ld [CurItem], a
+ call $6cdf
+ jr nc, .asm_12c94
+
+ ld a, $2e
+ ld hl, $5e76
+ rst FarCall
+ call GetPartyItemLocation
+ ld a, [hl]
+ ld [$d265], a
+ ld [hl], NO_ITEM
+ call GetItemName
+ ld hl, TookFromText
+ call $1d67
+ jr .asm_12c9a
+
+.asm_12c8c
+ ld hl, IsntHoldingAnythingText
+ call $1d67
+ jr .asm_12c9a
+
+.asm_12c94
+ ld hl, ItemStorageIsFullText
+ call $1d67
+
+.asm_12c9a
+ ret
+; 12c9b
+
+
+GiveTakeItemMenuData: ; 12c9b
+ db %01010000
+ db 12, 12 ; start coords
+ db 17, 19 ; end coords
+ dw .Items
+ db 1 ; default option
+
+.Items
+ db %10000000 ; x padding
+ db 2 ; # items
+ db "GIVE@"
+ db "TAKE@"
+; 12caf
+
+
+TookAndMadeHoldText: ; 12caf
+ text_jump UnknownText_0x1c1b2c, BANK(UnknownText_0x1c1b2c)
+ db "@"
+; 12cb4
+
+MadeHoldText: ; 12cb4
+ text_jump UnknownText_0x1c1b57, BANK(UnknownText_0x1c1b57)
+ db "@"
+; 12cb9
+
+PleaseRemoveMailText: ; 12cb9
+ text_jump UnknownText_0x1c1b6f, BANK(UnknownText_0x1c1b6f)
+ db "@"
+; 12cbe
+
+IsntHoldingAnythingText: ; 12cbe
+ text_jump UnknownText_0x1c1b8e, BANK(UnknownText_0x1c1b8e)
+ db "@"
+; 12cc3
+
+ItemStorageIsFullText: ; 12cc3
+ text_jump UnknownText_0x1c1baa, BANK(UnknownText_0x1c1baa)
+ db "@"
+; 12cc8
+
+TookFromText: ; 12cc8
+ text_jump UnknownText_0x1c1bc4, BANK(UnknownText_0x1c1bc4)
+ db "@"
+; 12ccd
+
+SwitchAlreadyHoldingText: ; 12ccd
+ text_jump UnknownText_0x1c1bdc, BANK(UnknownText_0x1c1bdc)
+ db "@"
+; 12cd2
+
+CantBeHeldText: ; 12cd2
+ text_jump UnknownText_0x1c1c09, BANK(UnknownText_0x1c1c09)
+ db "@"
+; 12cd7
+
+
+GetPartyItemLocation: ; 12cd7
+ push af
+ ld a, PartyMon1Item - PartyMon1
+ call GetPartyParamLocation
+ pop af
+ ret
+; 12cdf
+
+
+INCBIN "baserom.gbc", $12cdf, $12e00 - $12cdf
+
OpenPartyStats: ; 12e00
call $1d6e
call ClearSprites
+; PartyMon
xor a
- ld [MonType], a ; partymon
+ ld [MonType], a
call LowVolume
ld a, $25
call Predef
call MaxVolume
call $1d7d
- ld a, $0
+ ld a, 0
+ ret
+; 12e1b
+
+
+INCBIN "baserom.gbc", $12e1b, $13327 - $12e1b
+
+
+SelectMenu: ; 13327
+
+ call CheckRegisteredItem
+ jr c, .NotRegistered
+ jp UseRegisteredItem
+
+.NotRegistered
+ call $2e08
+ ld b, BANK(ItemMayBeRegisteredText)
+ ld hl, ItemMayBeRegisteredText
+ call $269a
+ call $0a46
+ jp $2dcf
+; 13340
+
+
+ItemMayBeRegisteredText: ; 13340
+ text_jump UnknownText_0x1c1cf3, BANK(UnknownText_0x1c1cf3)
+ db "@"
+; 13345
+
+
+CheckRegisteredItem: ; 13345
+
+ ld a, [WhichRegisteredItem]
+ and a
+ jr z, .NoRegisteredItem
+ and REGISTERED_POCKET
+ rlca
+ rlca
+ ld hl, .Pockets
+ rst JumpTable
+ ret
+
+.Pockets
+ dw .CheckItem
+ dw .CheckBall
+ dw .CheckKeyItem
+ dw .CheckTMHM
+
+.CheckItem
+ ld hl, NumItems
+ call .CheckRegisteredNo
+ jr c, .NoRegisteredItem
+ inc hl
+ ld e, a
+ ld d, 0
+ add hl, de
+ add hl, de
+ call .IsSameItem
+ jr c, .NoRegisteredItem
+ and a
+ ret
+
+.CheckKeyItem
+ ld a, [RegisteredItem]
+ ld hl, KeyItems
+ ld de, 1
+ call IsInArray
+ jr nc, .NoRegisteredItem
+ ld a, [RegisteredItem]
+ ld [CurItem], a
+ and a
+ ret
+
+.CheckBall
+ ld hl, NumBalls
+ call .CheckRegisteredNo
+ jr nc, .NoRegisteredItem
+ inc hl
+ ld e, a
+ ld d, 0
+ add hl, de
+ add hl, de
+ call .IsSameItem
+ jr c, .NoRegisteredItem
+ ret
+
+.CheckTMHM
+ jr .NoRegisteredItem
+
+.NoRegisteredItem
+ xor a
+ ld [WhichRegisteredItem], a
+ ld [RegisteredItem], a
+ scf
+ ret
+; 133a6
+
+
+.CheckRegisteredNo ; 133a6
+ ld a, [WhichRegisteredItem]
+ and REGISTERED_NUMBER
+ dec a
+ cp [hl]
+ jr nc, .NotEnoughItems
+ ld [$d107], a
+ and a
+ ret
+
+.NotEnoughItems
+ scf
+ ret
+; 133b6
+
+
+.IsSameItem ; 133b6
+ ld a, [RegisteredItem]
+ cp [hl]
+ jr nz, .NotSameItem
+ ld [CurItem], a
+ and a
+ ret
+
+.NotSameItem
+ scf
ret
-; 0x12e1b
+; 133c3
+
+
+UseRegisteredItem: ; 133c3
+
+ callba CheckItemMenu
+ ld a, [$d142]
+ ld hl, .SwitchTo
+ rst JumpTable
+ ret
+
+.SwitchTo
+ dw .CantUse
+ dw .NoFunction
+ dw .NoFunction
+ dw .NoFunction
+ dw .Current
+ dw .Party
+ dw .Overworld
+; 133df
+
+.NoFunction ; 133df
+ call $2e08
+ call CantUseItem
+ call $2dcf
+ and a
+ ret
+; 133ea
+
+.Current ; 133ea
+ call $2e08
+ call DoItemEffect
+ call $2dcf
+ and a
+ ret
+; 133f5
+
+.Party ; 133f5
+ call ResetWindow
+ call FadeToMenu
+ call DoItemEffect
+ call $2b3c
+ call $2dcf
+ and a
+ ret
+; 13406
+
+.Overworld ; 13406
+ call ResetWindow
+ ld a, 1
+ ld [$d0ef], a
+ call DoItemEffect
+ xor a
+ ld [$d0ef], a
+ ld a, [$d0ec]
+ cp 1
+ jr nz, .asm_13425
+ scf
+ ld a, $80
+ ld [$ffa0], a
+ ret
+; 13422
+
+.CantUse ; 13422
+ call ResetWindow
+
+.asm_13425
+ call CantUseItem
+ call $2dcf
+ and a
+ ret
+; 1342d
+
+
+INCBIN "baserom.gbc", $1342d, $13b87 - $1342d
-INCBIN "baserom.gbc", $12e1b, $13b87 - $12e1b
GetSquareRoot: ; 13b87
; Return the square root of de in b.
@@ -7499,7 +8761,7 @@ INCBIN "baserom.gbc", $14000, $14032 - $14000
GetTimeOfDay: ; 14032
; get time of day based on the current hour
ld a, [hHours] ; hour
- ld hl, TimeOfDayTable
+ ld hl, TimesOfDay
.check
; if we're within the given time period,
@@ -7520,14 +8782,13 @@ GetTimeOfDay: ; 14032
ret
; 14044
-TimeOfDayTable: ; 14044
-; boundaries for the time of day
+TimesOfDay: ; 14044
+; hours for the time of day
; 04-09 morn | 10-17 day | 18-03 nite
-; hr, time of day
- db 04, $02 ; NITE
- db 10, $00 ; MORN
- db 18, $01 ; DAY
- db 24, $02 ; NITE
+ db 04, NITE
+ db 10, MORN
+ db 18, DAY
+ db 24, NITE
; 1404c
INCBIN "baserom.gbc", $1404c, $152ab - $1404c
@@ -7567,8 +8828,8 @@ INCBIN "baserom.gbc", $1531f, $15736 - $1531f
KrissPCMenuData: ; 0x15736
db %01000000
- db 0, 0 ; top left corner coords (y, x)
- db $c, $f ; bottom right corner coords (y, x)
+ db 0, 0 ; top left corner coords (y, x)
+ db 12, 15 ; bottom right corner coords (y, x)
dw .KrissPCMenuData2
db 1 ; default selected option
@@ -7581,35 +8842,29 @@ KrissPCMenuData: ; 0x15736
dw .KrissPCMenuPointers
.KrissPCMenuPointers ; 0x15746
- dw KrisWithdrawItemMenu ; 57d1
- dw .WithdrawItem
- dw KrisDepositItemMenu ; 588b
- dw .DepositItem
- dw KrisTossItemMenu ; 585f
- dw .TossItem
- dw KrisMailBoxMenu ; 587d
- dw .MailBox
- dw KrisDecorationMenu ; 597d
- dw .Decoration
- dw KrisLogOffMenu ; 5888
- dw .LogOff
- dw KrisLogOffMenu ; 5888
- dw .TurnOff
-
-.WithdrawItem
- db "WITHDRAW ITEM@"
-.DepositItem
- db "DEPOSIT ITEM@"
-.TossItem
- db "TOSS ITEM@"
-.MailBox
- db "MAIL BOX@"
-.Decoration
- db "DECORATION@"
-.TurnOff
- db "TURN OFF@"
-.LogOff
- db "LOG OFF@"
+ dw KrisWithdrawItemMenu, .WithdrawItem
+ dw KrisDepositItemMenu, .DepositItem
+ dw KrisTossItemMenu, .TossItem
+ dw KrisMailBoxMenu, .MailBox
+ dw KrisDecorationMenu, .Decoration
+ dw KrisLogOffMenu, .LogOff
+ dw KrisLogOffMenu, .TurnOff
+
+.WithdrawItem db "WITHDRAW ITEM@"
+.DepositItem db "DEPOSIT ITEM@"
+.TossItem db "TOSS ITEM@"
+.MailBox db "MAIL BOX@"
+.Decoration db "DECORATION@"
+.TurnOff db "TURN OFF@"
+.LogOff db "LOG OFF@"
+
+WITHDRAW_ITEM EQU 0
+DEPOSIT_ITEM EQU 1
+TOSS_ITEM EQU 2
+MAIL_BOX EQU 3
+DECORATION EQU 4
+TURN_OFF EQU 5
+LOG_OFF EQU 6
.KrissPCMenuList1
db 5
@@ -7618,7 +8873,7 @@ KrissPCMenuData: ; 0x15736
db TOSS_ITEM
db MAIL_BOX
db TURN_OFF
- db $FF
+ db $ff
.KrissPCMenuList2
db 6
@@ -7628,7 +8883,7 @@ KrissPCMenuData: ; 0x15736
db MAIL_BOX
db DECORATION
db LOG_OFF
- db $FF
+ db $ff
INCBIN "baserom.gbc", $157bb, $157d1 - $157bb
@@ -7651,8 +8906,8 @@ KrisWithdrawItemMenu: ; 0x157d1
Function157e9: ; 0x157e9
; check if the item has a quantity
- ld a, BANK(CheckTossableItem)
- ld hl, CheckTossableItem
+ ld a, BANK(_CheckTossableItem)
+ ld hl, _CheckTossableItem
rst $8
ld a, [$d142]
and a
@@ -7775,7 +9030,7 @@ KrisDepositItemMenu: ; 0x1588b
jr z, .asm_158b3
call Function158cc
ld a, $4
- ld hl, $7345
+ ld hl, CheckRegisteredItem
rst $8
jr .asm_1589c
@@ -7813,7 +9068,7 @@ Function158cc: ; 0x158cc
rst $8
ld a, [$d142]
ld hl, JumpTable158e7
- rst $28
+ rst JumpTable
pop af
ld [$c2ce], a
ret
@@ -8355,8 +9610,8 @@ Function24ac3: ; 0x24ac3
push de
ld a, [MenuSelection]
ld [CurItem], a
- ld a, BANK(CheckTossableItem)
- ld hl, CheckTossableItem
+ ld a, BANK(_CheckTossableItem)
+ ld hl, _CheckTossableItem
rst $8
ld a, [$d142]
pop hl
@@ -11040,7 +12295,7 @@ Function4484a: ; 0x4484a
ld a, [$cfa9]
dec a
ld hl, $4861
- rst $28
+ rst JumpTable
.asm_44860
ret
@@ -11053,7 +12308,7 @@ Function4484a: ; 0x4484a
dw .Cancel
.ReadMail ; 0x44869
- call $2b29
+ call FadeToMenu
ld a, [MenuSelection]
dec a
ld b, a
@@ -11113,7 +12368,7 @@ Function4484a: ; 0x4484a
; 0x448d2
.AttachMail ; 0x448d2
- call $2b29
+ call FadeToMenu
xor a
ld [$d141], a
call $31f3
@@ -11254,6 +12509,13 @@ Label49d60: ; 0x49d60
dw $5efc ; XXX is this MobileASM?
dw $6496 ; XXX is this MobileStudiumASM?
+CONTINUE EQU 0
+NEW_GAME EQU 1
+OPTION EQU 2
+MYSTERY_GIFT EQU 3
+MOBILE EQU 4
+MOBILE_STUDIUM EQU 5
+
NewGameMenu: ; 0x49d6c
db 2
db NEW_GAME
@@ -12153,7 +13415,7 @@ StatsScreenMain: ; 0x4dcd2
ld a, [$cf63]
and $7f
ld hl, StatsScreenPointerTable
- rst $28
+ rst JumpTable
call $5d3a ; check for keys?
ld a, [$cf63]
bit 7, a
@@ -12303,7 +13565,7 @@ WritePartyMenuTilemap: ; 0x5005f
jr z, .asm_50084 ; 0x5007a $8
push hl
ld hl, $4089
- rst $28
+ rst JumpTable
pop hl
jr .asm_50077 ; 0x50082 $f3
.asm_50084
@@ -12602,7 +13864,7 @@ GetGender: ; 50bdd
; BoxMon data is read directly from SRAM.
ld a, [MonType]
- cp 2
+ cp BOXMON
ld a, 1
call z, GetSRAMBank
@@ -12620,8 +13882,8 @@ GetGender: ; 50bdd
ld b, a
; Close SRAM if we were dealing with a BoxMon.
- ld a, [MonType] ; MonType
- cp 2 ; BOXMON
+ ld a, [MonType]
+ cp BOXMON
call z, CloseSRAM
@@ -15810,11 +17072,664 @@ INCLUDE "maps/map_headers.asm"
INCLUDE "maps/second_map_headers.asm"
-INCBIN "baserom.gbc", $966b0, $96cb1 - $966b0
+
+INCBIN "baserom.gbc", $966b0, $96795 - $966b0
+
+
+DoEvents: ; 96795
+ ld a, [$d433]
+ ld hl, .pointers
+ rst JumpTable
+ ret
+; 9679d
+
+.pointers
+ dw Function967a1
+ dw Function967ae
+
+Function967a1: ; 967a1
+ call PlayerEvents
+ call $66cb
+ callba ScriptEvents
+ ret
+; 967ae
+
+Function967ae: ; 967ae
+ ret
+; 967af
+
+
+INCBIN "baserom.gbc", $967af, $9681f - $967af
+
+
+PlayerEvents: ; 9681f
+
+; Reset carry.
+ xor a
+
+ ld a, [ScriptRunning]
+ and a
+ ret nz
+
+ call $68e4
+
+ call CheckTrainerBattle3
+ jr c, .asm_96848
+
+ call CheckTileEvent
+ jr c, .asm_96848
+
+ call $7c30
+ jr c, .asm_96848
+
+ call $68ec
+ jr c, .asm_96848
+
+ call $693a
+ jr c, .asm_96848
+
+ call OWPlayerInput
+ jr c, .asm_96848
+
+ xor a
+ ret
+
+
+.asm_96848
+ push af
+ ld a, $25
+ ld hl, $6c56
+ rst FarCall
+ pop af
+
+ ld [ScriptRunning], a
+ call $6beb
+ ld a, [ScriptRunning]
+ cp 4
+ jr z, .asm_96865
+ cp 9
+ jr z, .asm_96865
+
+ xor a
+ ld [$c2da], a
+
+.asm_96865
+ scf
+ ret
+; 96867
+
+
+CheckTrainerBattle3: ; 96867
+ nop
+ nop
+ call CheckTrainerBattle2
+ jr nc, .asm_96872
+ ld a, 1
+ scf
+ ret
+
+.asm_96872
+ xor a
+ ret
+; 96874
+
+
+CheckTileEvent: ; 96874
+; Check for warps, tile triggers or wild battles.
+
+ call $670c
+ jr z, .asm_96886
+
+ ld a, $41
+ ld hl, $4820
+ rst FarCall
+ jr c, .asm_968a6
+
+ call $2238
+ jr c, .asm_968aa
+
+.asm_96886
+ call $6712
+ jr z, .asm_96890
+
+ call $2ad4
+ jr c, .asm_968ba
+
+.asm_96890
+ call $6718
+ jr z, .asm_96899
+
+ call $6b79
+ ret c
+
+.asm_96899
+ call $671e
+ jr z, .asm_968a4
+
+ call $7cc0
+ ret c
+
+ jr .asm_968a4
+
+.asm_968a4
+ xor a
+ ret
+
+.asm_968a6
+ ld a, 4
+ scf
+ ret
+
+.asm_968aa
+ ld a, [StandingTile]
+ call $18a6
+ jr nz, .asm_968b6
+ ld a, 6
+ scf
+ ret
+
+.asm_968b6
+ ld a, 5
+ scf
+ ret
+
+.asm_968ba
+ ld hl, MovementAnimation
+ ld a, [hli]
+ ld h, [hl]
+ ld l, a
+ call $2c57
+ call PushScriptPointer
+ ret
+; 968c7
+
+
+INCBIN "baserom.gbc", $968c7, $96974 - $968c7
+
+
+OWPlayerInput: ; 96974
+
+ call PlayerMovement
+ ret c
+ and a
+ jr nz, .NoAction
+
+; Can't perform button actions while sliding on ice.
+ callba Function80404
+ jr c, .NoAction
+
+ call CheckAPressOW
+ jr c, .Action
+
+ call CheckMenuOW
+ jr c, .Action
+
+.NoAction
+ xor a
+ ret
+
+.Action
+ push af
+ callba Function80422
+ pop af
+ scf
+ ret
+; 96999
+
+
+CheckAPressOW: ; 96999
+ ld a, [hJoyPressed]
+ and BUTTON_A
+ ret z
+ call TryObjectEvent
+ ret c
+ call TryReadSign
+ ret c
+ call $7c5f
+ ret c
+ xor a
+ ret
+; 969ac
+
+
+PlayTalkObject: ; 969ac
+ push de
+ ld de, SFX_READ_TEXT_2
+ call StartSFX
+ pop de
+ ret
+; 969b5
+
+
+TryObjectEvent: ; 969b5
+ callba CheckFacingObject
+ jr c, .IsObject
+ xor a
+ ret
+
+.IsObject
+ call PlayTalkObject
+ ld a, [hConnectedMapWidth]
+ call $1ae5
+ ld hl, $0001
+ add hl, bc
+ ld a, [hl]
+ ld [$ffe0], a
+
+ ld a, [$ffe0]
+ call GetMapObject
+ ld hl, $0008
+ add hl, bc
+ ld a, [hl]
+ and $f
+
+; Bug: If IsInArray returns nc, data at bc will be executed as code.
+ push bc
+ ld de, 3
+ ld hl, .data_969ee
+ call IsInArray
+ jr nc, .asm_969ec
+ pop bc
+
+ inc hl
+ ld a, [hli]
+ ld h, [hl]
+ ld l, a
+ jp [hl]
+
+.asm_969ec
+ xor a
+ ret
+
+.data_969ee
+ dbw 0, .zero
+ dbw 1, .one
+ dbw 2, .two
+ dbw 3, .three
+ dbw 4, .four
+ dbw 5, .five
+ dbw 6, .six
+ db $ff
+; 96a04
+
+.zero ; 96a04
+ ld hl, $000a
+ add hl, bc
+ ld a, [hli]
+ ld h, [hl]
+ ld l, a
+ call $2c57
+ call PushScriptPointer
+; ld a, -1
+ ret
+; 96a12
+
+.one ; 96a12
+ ld hl, $000a
+ add hl, bc
+ ld a, [hli]
+ ld h, [hl]
+ ld l, a
+ call $2c57
+ ld de, EngineBuffer1
+ ld bc, 2
+ call FarCopyBytes
+ ld a, $3
+ scf
+ ret
+; 96a29
+
+.two ; 96a29
+ call $3674
+ ld a, $2
+ scf
+ ret
+; 96a30
+
+.three ; 96a30
+ xor a
+ ret
+; 96a32
+
+.four ; 96a32
+ xor a
+ ret
+; 96a34
+
+.five ; 96a34
+ xor a
+ ret
+; 96a36
+
+.six ; 96a36
+ xor a
+ ret
+; 96a38
+
+
+TryReadSign: ; 96a38
+ call CheckFacingSign
+ jr c, .IsSign
+ xor a
+ ret
+
+.IsSign
+ ld a, [$d040]
+ ld hl, .signs
+ rst JumpTable
+ ret
+
+.signs
+ dw .read
+ dw .up
+ dw .down
+ dw .right
+ dw .left
+ dw .ifset
+ dw .ifnotset
+ dw .itemifset
+ dw .asm_96aa2
+; 96a59
+
+.up
+ ld b, UP << 2
+ jr .checkdir
+.down
+ ld b, DOWN << 2
+ jr .checkdir
+.right
+ ld b, RIGHT << 2
+ jr .checkdir
+.left
+ ld b, LEFT << 2
+ jr .checkdir
+
+.checkdir
+ ld a, [PlayerDirection]
+ and %1100
+ cp b
+ jp nz, $6ad6
+
+.read
+ call PlayTalkObject
+ ld hl, $d041
+ ld a, [hli]
+ ld h, [hl]
+ ld l, a
+ call $2c57
+ call PushScriptPointer
+ scf
+ ret
+
+.itemifset
+ call CheckSignFlag
+ jp nz, $6ad6
+ call PlayTalkObject
+ call $2c57
+ ld de, EngineBuffer1
+ ld bc, 3
+ call FarCopyBytes
+ ld a, $4
+ ld hl, $7625
+ call PushScriptPointer
+ scf
+ ret
+
+.asm_96aa2
+ call CheckSignFlag
+ jr nz, .dontread
+ call $2c57
+ ld de, EngineBuffer1
+ ld bc, 3
+ call FarCopyBytes
+ jr .dontread
+
+.ifset
+ call CheckSignFlag
+ jr z, .dontread
+ jr .asm_96ac1
+
+.ifnotset
+ call CheckSignFlag
+ jr nz, .dontread
+
+.asm_96ac1
+ push hl
+ call PlayTalkObject
+ pop hl
+ inc hl
+ inc hl
+ call $2c57
+ call GetFarHalfword
+ call $2c57
+ call PushScriptPointer
+ scf
+ ret
+
+.dontread
+ xor a
+ ret
+; 96ad8
+
+
+CheckSignFlag: ; 96ad8
+ ld hl, $d041
+ ld a, [hli]
+ ld h, [hl]
+ ld l, a
+ push hl
+ call $2c57
+ call GetFarHalfword
+ ld e, l
+ ld d, h
+ ld b, $2
+ call BitTable1Func
+ ld a, c
+ and a
+ pop hl
+ ret
+; 96af0
+
+
+PlayerMovement: ; 96af0
+ callba DoPlayerMovement
+ ld a, c
+ ld hl, .pointers
+ rst JumpTable
+ ld a, c
+ ret
+; 96afd
+
+.pointers
+ dw .zero
+ dw .one
+ dw .two
+ dw .three
+ dw .four
+ dw .five
+ dw .six
+ dw .seven
+
+.zero
+.four ; 96b0d
+ xor a
+ ld c, a
+ ret
+; 96b10
+
+.seven ; 96b10
+ call $68d7 ; empty
+ xor a
+ ld c, a
+ ret
+; 96b16
+
+.one ; 96b16
+ ld a, 5
+ ld c, a
+ scf
+ ret
+; 96b1b
+
+.two ; 96b1b
+ ld a, 9
+ ld c, a
+ scf
+ ret
+; 96b20
+
+.three ; 96b20
+; force the player to move in some direction
+ ld a, $4
+ ld hl, $653d
+ call PushScriptPointer
+; ld a, -1
+ ld c, a
+ scf
+ ret
+; 96b2b
+
+.five
+.six ; 96b2b
+ ld a, -1
+ ld c, a
+ and a
+ ret
+; 96b30
+
+
+CheckMenuOW: ; 96b30
+ xor a
+ ld [$ffa0], a
+ ld [$ffa1], a
+ ld a, [hJoyPressed]
+
+ bit 2, a ; SELECT
+ jr nz, .Select
+
+ bit 3, a ; START
+ jr z, .NoMenu
+
+ ld a, BANK(StartMenuScript)
+ ld hl, StartMenuScript
+ call PushScriptPointer
+ scf
+ ret
+
+.NoMenu
+ xor a
+ ret
+
+.Select
+ call PlayTalkObject
+ ld a, BANK(SelectMenuScript)
+ ld hl, SelectMenuScript
+ call PushScriptPointer
+ scf
+ ret
+; 96b58
+
+
+StartMenuScript: ; 96b58
+ 3callasm BANK(StartMenu), StartMenu
+ 2jump StartMenuCallback
+; 96b5f
+
+SelectMenuScript: ; 96b5f
+ 3callasm BANK(SelectMenu), SelectMenu
+ 2jump SelectMenuCallback
+; 96b66
+
+StartMenuCallback:
+SelectMenuCallback: ; 96b66
+ copybytetovar $ffa0
+ if_equal $80, .Script
+ if_equal $ff, .Asm
+ end
+; 96b72
+
+.Script ; 96b72
+ 2ptjump $d0e8
+; 96b75
+
+.Asm ; 96b75
+ 2ptcallasm $d0e8
+ end
+; 96b79
+
+
+INCBIN "baserom.gbc", $96b79, $96c5e - $96b79
+
+
+ScriptEvents: ; 96c5e
+ call StartScript
+.loop
+ ld a, [ScriptMode]
+ ld hl, .modes
+ rst JumpTable
+ call CheckScript
+ jr nz, .loop
+ ret
+; 96c6e
+
+.modes ; 96c6e
+ dw EndScript
+ dw RunScriptCommand
+ dw WaitScriptMovement
+ dw WaitScript
+
+EndScript: ; 96c76
+ call StopScript
+ ret
+; 96c7a
+
+WaitScript: ; 96c7a
+ call StopScript
+
+ ld hl, ScriptDelay
+ dec [hl]
+ ret nz
+
+ ld a, $1
+ ld hl, $58b9
+ rst FarCall
+
+ ld a, SCRIPT_READ
+ ld [ScriptMode], a
+ call StartScript
+ ret
+; 96c91
+
+WaitScriptMovement: ; 96c91
+ call StopScript
+
+ ld hl, VramState
+ bit 7, [hl]
+ ret nz
+
+ ld a, $1
+ ld hl, $58b9
+ rst FarCall
+
+ ld a, SCRIPT_READ
+ ld [ScriptMode], a
+ call StartScript
+ ret
+; 96ca9
+
+RunScriptCommand: ; 96ca9
+ call GetScriptByte
+ ld hl, ScriptCommandTable
+ rst JumpTable
+ ret
+; 96cb1
+
INCLUDE "engine/scripting.asm"
-INCBIN "baserom.gbc", $97c20, $35e
+
+INCBIN "baserom.gbc", $97c20, $97f7e - $97c20
+
SECTION "bank26",DATA,BANK[$26]