summaryrefslogtreecommitdiff
path: root/engine
diff options
context:
space:
mode:
Diffstat (limited to 'engine')
-rw-r--r--engine/billspctop.asm2
-rw-r--r--engine/events/elevator.asm215
-rwxr-xr-xengine/events/misc_scripts.asm8
-rwxr-xr-xengine/events/misc_scripts_2.asm4
-rwxr-xr-xengine/events/overworld.asm4
-rwxr-xr-xengine/events/std_collision.asm8
-rw-r--r--engine/events/sweet_scent.asm66
-rwxr-xr-xengine/items.asm30
-rw-r--r--engine/learn.asm18
-rwxr-xr-xengine/learn_tm.asm2
-rw-r--r--engine/menus/start_menu.asm541
-rwxr-xr-xengine/move_mon.asm10
-rw-r--r--engine/namingscreen.asm2
-rwxr-xr-xengine/overworld/map_objects.asm2
-rwxr-xr-xengine/overworld/player_movement.asm88
-rwxr-xr-xengine/overworld/player_object.asm2
-rw-r--r--engine/overworld/select_menu.asm172
-rwxr-xr-xengine/pack.asm81
-rw-r--r--engine/pokemon/mon_menu.asm1294
-rwxr-xr-xengine/specials.asm8
20 files changed, 2424 insertions, 133 deletions
diff --git a/engine/billspctop.asm b/engine/billspctop.asm
index b0ec59a5..749718db 100644
--- a/engine/billspctop.asm
+++ b/engine/billspctop.asm
@@ -31,7 +31,7 @@ BillsPC_LogIn: ; e3f7 (3:63f7)
call PrintText
pop af
ld [wOptions], a
- call Functionda5
+ call LoadFontsBattleExtra
ret
Text_BillsPCWhat:
diff --git a/engine/events/elevator.asm b/engine/events/elevator.asm
new file mode 100644
index 00000000..e51b6be1
--- /dev/null
+++ b/engine/events/elevator.asm
@@ -0,0 +1,215 @@
+Elevator::
+ call .LoadPointer
+ call .FindCurrentFloor
+ jr c, .quit
+ ld [wElevatorOriginFloor], a
+ call Elevator_AskWhichFloor
+ jr c, .quit
+ ld hl, wElevatorOriginFloor
+ cp [hl]
+ jr z, .quit
+ call Elevator_GoToFloor
+ and a
+ ret
+
+.quit
+ scf
+ ret
+
+.LoadPointer:
+ ld a, b
+ ld [wElevatorPointerBank], a
+ ld a, e
+ ld [wElevatorPointer], a
+ ld a, d
+ ld [wElevatorPointer + 1], a
+ call .LoadFloors
+ ret
+
+.LoadFloors:
+ ld de, wCurElevator
+ ld bc, wElevatorDataEnd - wElevatorData
+ ld hl, wElevatorPointer
+ ld a, [hli]
+ ld h, [hl]
+ ld l, a
+ ld a, [wElevatorPointerBank]
+ call GetFarByte
+ inc hl
+ ld [de], a
+ inc de
+.loop
+ ld a, [wElevatorPointerBank]
+ call GetFarByte
+ ld [de], a
+ inc de
+ add hl, bc
+ cp -1
+ jr nz, .loop
+ ret
+
+.FindCurrentFloor:
+ ld hl, wElevatorPointer
+ ld a, [hli]
+ ld h, [hl]
+ ld l, a
+ ld a, [wElevatorPointerBank]
+ call GetFarByte
+ ld c, a
+ inc hl
+ ld a, [wBackupMapGroup]
+ ld d, a
+ ld a, [wBackupMapNumber]
+ ld e, a
+ ld b, 0
+.loop2
+ ld a, [wElevatorPointerBank]
+ call GetFarByte
+ cp -1
+ jr z, .fail
+ inc hl
+ inc hl
+ ld a, [wElevatorPointerBank]
+ call GetFarByte
+ inc hl
+ cp d
+ jr nz, .next1
+ ld a, [wElevatorPointerBank]
+ call GetFarByte
+ inc hl
+ cp e
+ jr nz, .next2
+ jr .done
+
+.next1
+ inc hl
+.next2
+ inc b
+ jr .loop2
+
+.done
+ xor a
+ ld a, b
+ ret
+
+.fail
+ scf
+ ret
+
+Elevator_GoToFloor:
+ push af
+ ld hl, wElevatorPointer
+ ld a, [hli]
+ ld h, [hl]
+ ld l, a
+ inc hl
+ pop af
+ ld bc, wElevatorDataEnd - wElevatorData
+ call AddNTimes
+ inc hl
+ ld de, wBackupWarpNumber
+ ld a, [wElevatorPointerBank]
+ ld bc, wElevatorDataEnd - wElevatorData - 1
+ call FarCopyBytes
+ ret
+
+Elevator_AskWhichFloor:
+ call LoadStandardMenuHeader
+ ld hl, AskFloorElevatorText
+ call PrintText
+ call Elevator_GetCurrentFloorText
+ ld hl, Elevator_MenuHeader
+ call CopyMenuHeader
+ call InitScrollingMenu
+ call UpdateSprites
+ xor a
+ ld [wMenuScrollPosition], a
+ call ScrollingMenu
+ call CloseWindow
+ ld a, [wMenuJoypad]
+ cp B_BUTTON
+ jr z, .cancel
+ xor a
+ ld a, [wScrollingMenuCursorPosition]
+ ret
+
+.cancel
+ scf
+ ret
+
+AskFloorElevatorText:
+ text_far _AskFloorElevatorText
+ text_end
+
+Elevator_GetCurrentFloorText:
+ ld hl, wOptions
+ ld a, [hl]
+ push af
+ set NO_TEXT_SCROLL, [hl]
+ hlcoord 0, 0
+ ld b, 4
+ ld c, 8
+ call Textbox
+ hlcoord 1, 2
+ ld de, Elevator_CurrentFloorText
+ call PlaceString
+ hlcoord 4, 4
+ call Elevator_GetCurrentFloorString
+ pop af
+ ld [wOptions], a
+ ret
+
+Elevator_CurrentFloorText:
+ db "Now on:@"
+
+Elevator_GetCurrentFloorString:
+ push hl
+ ld a, [wElevatorOriginFloor]
+ ld e, a
+ ld d, 0
+ ld hl, wCurElevatorFloors
+ add hl, de
+ ld a, [hl]
+ pop de
+ call GetFloorString
+ ret
+
+Elevator_MenuHeader:
+ db MENU_BACKUP_TILES ; flags
+ menu_coords 12, 1, 18, 9
+ dw Elevator_MenuData
+ db 1 ; default option
+
+Elevator_MenuData:
+ db SCROLLINGMENU_DISPLAY_ARROWS ; flags
+ db 4, 0 ; rows, columns
+ db SCROLLINGMENU_ITEMS_NORMAL ; item format
+ dbw 0, wCurElevator
+ dba GetElevatorFloorStrings
+ dba NULL
+ dba NULL
+
+GetElevatorFloorStrings:
+ ld a, [wMenuSelection]
+GetFloorString:
+ push de
+ call FloorToString
+ ld d, h
+ ld e, l
+ pop hl
+ jp PlaceString
+
+FloorToString:
+ push de
+ ld e, a
+ ld d, 0
+ ld hl, ElevatorFloorNames
+ add hl, de
+ add hl, de
+ ld a, [hli]
+ ld h, [hl]
+ ld l, a
+ pop de
+ ret
+
+INCLUDE "data/events/elevator_floors.asm"
diff --git a/engine/events/misc_scripts.asm b/engine/events/misc_scripts.asm
index f9ba459f..b08d313e 100755
--- a/engine/events/misc_scripts.asm
+++ b/engine/events/misc_scripts.asm
@@ -38,14 +38,14 @@ FindItemInBallScript::
.TryReceiveItem:
xor a
ld [wScriptVar], a
- ld a, [wcf29]
+ ld a, [wItemBallItemID]
ld [wDeciramBuffer], a
call GetItemName
ld hl, wStringBuffer3
call CopyName2
- ld a, [wcf29]
- ld [wd002], a
- ld a, [wcf2a]
+ ld a, [wItemBallItemID]
+ ld [wCurItem], a
+ ld a, [wItemBallQuantity]
ld [wItemQuantityChangeBuffer], a
ld hl, wNumItems
call ReceiveItem
diff --git a/engine/events/misc_scripts_2.asm b/engine/events/misc_scripts_2.asm
index 4a9e9484..294dc6a0 100755
--- a/engine/events/misc_scripts_2.asm
+++ b/engine/events/misc_scripts_2.asm
@@ -11,7 +11,7 @@ RepelWoreOffScript::
HiddenItemScript::
opentext
- copybytetovar wcf2b
+ copybytetovar wHiddenItemID
itemtotext STRING_BUFFER_3, USE_SCRIPT_VAR
writetext .PlayerFoundItemText
giveitem ITEM_FROM_MEM
@@ -39,7 +39,7 @@ HiddenItemScript::
db "@"
SetMemEvent:
- ld hl, wcf29
+ ld hl, wHiddenItemEvent
ld a, [hli]
ld d, [hl]
ld e, a
diff --git a/engine/events/overworld.asm b/engine/events/overworld.asm
index 0787d094..7cc64dff 100755
--- a/engine/events/overworld.asm
+++ b/engine/events/overworld.asm
@@ -477,7 +477,7 @@ TrySurfOW::
jr z, .quit
cp PLAYER_SURF
jr z, .quit
- ld a, [wcf29]
+ ld a, [wFacingTileID]
call GetTileCollision
cp $1
jr nz, .quit
@@ -835,6 +835,7 @@ DigReturnMovementData:
return_dig 32
step_end
+TeleportFunction:
call FieldMoveBufferReset
.asm_cc67
ld hl, .Jumptable
@@ -1261,6 +1262,7 @@ Text_AskHeadbutt: ; cee9
text_far Text_AskHeadbutt_
db "@"
+RockSmashFunction:
call TryRockSmashFromMenu
and $7f
ld [wFieldMoveSucceeded], a
diff --git a/engine/events/std_collision.asm b/engine/events/std_collision.asm
index bb44687c..0e06b03c 100755
--- a/engine/events/std_collision.asm
+++ b/engine/events/std_collision.asm
@@ -7,12 +7,12 @@ CheckFacingTileForStdScript::
jr nc, .notintable
ld a, jumpstd_command
- ld [wcf2a], a
+ ld [wJumpStdScriptBuffer], a
inc hl
ld a, [hli]
- ld [wcf2b], a
+ ld [wJumpStdScriptBuffer + 1], a
ld a, [hli]
- ld [wTempTrainer], a
+ ld [wJumpStdScriptBuffer + 2], a
ld a, BANK(Script_JumpStdFromRAM)
ld hl, Script_JumpStdFromRAM
call CallScript
@@ -26,4 +26,4 @@ CheckFacingTileForStdScript::
INCLUDE "data/events/collision_stdscripts.asm"
Script_JumpStdFromRAM:
- jump wcf2a \ No newline at end of file
+ jump wJumpStdScriptBuffer
diff --git a/engine/events/sweet_scent.asm b/engine/events/sweet_scent.asm
new file mode 100644
index 00000000..d382936d
--- /dev/null
+++ b/engine/events/sweet_scent.asm
@@ -0,0 +1,66 @@
+SweetScentFromMenu:
+ ld hl, .SweetScent
+ call QueueScript
+ ld a, $1
+ ld [wFieldMoveSucceeded], a
+ ret
+
+.SweetScent:
+ reloadmappart
+ special UpdateTimePals
+ callasm GetPartyNick
+ writetext UseSweetScentText
+ waitbutton
+ callasm SweetScentEncounter
+ iffalse SweetScentNothing
+ checkflag ENGINE_BUG_CONTEST_TIMER
+ iftrue .BugCatchingContest
+ randomwildmon
+ startbattle
+ reloadmapafterbattle
+ end
+
+.BugCatchingContest:
+ farjump BugCatchingContestBattleScript
+
+SweetScentNothing:
+ writetext SweetScentNothingText
+ waitbutton
+ closetext
+ end
+
+SweetScentEncounter:
+ farcall CanUseSweetScent
+ jr nc, .no_battle
+ ld hl, wStatusFlags2
+ bit STATUSFLAGS2_BUG_CONTEST_TIMER_F, [hl]
+ jr nz, .not_in_bug_contest
+ farcall GetMapEncounterRate
+ ld a, b
+ and a
+ jr z, .no_battle
+ farcall ChooseWildEncounter
+ jr nz, .no_battle
+ jr .start_battle
+
+.not_in_bug_contest
+ farcall ChooseWildEncounter_BugContest
+
+.start_battle
+ ld a, $1
+ ld [wScriptVar], a
+ ret
+
+.no_battle
+ xor a
+ ld [wScriptVar], a
+ ld [wBattleType], a
+ ret
+
+UseSweetScentText:
+ text_far _UseSweetScentText
+ text_end
+
+SweetScentNothingText:
+ text_far _SweetScentNothingText
+ text_end
diff --git a/engine/items.asm b/engine/items.asm
index deafa60c..428f652e 100755
--- a/engine/items.asm
+++ b/engine/items.asm
@@ -33,7 +33,7 @@ ReceiveBall:
ReceiveTMHM:
ld h, d
ld l, e
- ld a, [wd002]
+ ld a, [wCurItem]
ld c, a
call GetTMHMNumber
jp PutItemInTMPocket
@@ -63,7 +63,7 @@ RemoveBall:
RemoveTMHM:
ld h, d
ld l, e
- ld a, [wd002]
+ ld a, [wCurItem]
ld c, a
call GetTMHMNumber
jp RemoveTMorHM
@@ -104,7 +104,7 @@ CheckBall:
CheckTMHM:
ld h, d
ld l, e
- ld a, [wd002]
+ ld a, [wCurItem]
ld c, a
call GetTMHMNumber
jp CheckTMorHM
@@ -152,7 +152,7 @@ PutItemInPocketOrPC: ; d2a9 (3:52a9)
ld d, h
ld e, l
inc hl
- ld a, [wd002]
+ ld a, [wCurItem]
ld c, a
ld b, $0
.asm_d2b2
@@ -184,7 +184,7 @@ PutItemInPocketOrPC: ; d2a9 (3:52a9)
.asm_d2d3
ld h, d
ld l, e
- ld a, [wd002]
+ ld a, [wCurItem]
ld c, a
ld a, [wItemQuantityChangeBuffer]
ld [wItemQuantityBuffer], a
@@ -210,7 +210,7 @@ PutItemInPocketOrPC: ; d2a9 (3:52a9)
.asm_d2fc
dec hl
- ld a, [wd002]
+ ld a, [wCurItem]
ld [hli], a
ld a, [wItemQuantityBuffer]
ld [hli], a
@@ -227,14 +227,14 @@ RemoveItemAndQuantity: ; d30c (3:530c)
ld e, l
ld a, [hli]
ld c, a
- ld a, [wd003]
+ ld a, [wCurItemQuantity]
cp c
jr nc, .asm_d325
ld c, a
ld b, $0
add hl, bc
add hl, bc
- ld a, [wd002]
+ ld a, [wCurItem]
cp [hl]
inc hl
jr z, .asm_d334
@@ -242,7 +242,7 @@ RemoveItemAndQuantity: ; d30c (3:530c)
ld l, e
inc hl
.asm_d325
- ld a, [wd002]
+ ld a, [wCurItem]
ld b, a
.asm_d329
ld a, [hli]
@@ -286,7 +286,7 @@ RemoveItemAndQuantity: ; d30c (3:530c)
ret
CheckItemWithQuantity: ; d356 (3:5356)
- ld a, [wd002]
+ ld a, [wCurItem]
ld c, a
.asm_d35a
inc hl
@@ -310,7 +310,7 @@ PutItemInKeyItemPocket: ; d367 (3:5367)
ld c, a
ld b, $0
add hl, bc
- ld a, [wd002]
+ ld a, [wCurItem]
ld [hli], a
ld [hl], $ff
ld hl, wNumKeyItems
@@ -323,7 +323,7 @@ PutItemInKeyItemPocket: ; d367 (3:5367)
ret
RemoveItemWithoutQuantity: ; d381 (3:5381)
- ld a, [wd003]
+ ld a, [wCurItemQuantity]
ld e, a
ld d, $0
ld hl, wItemsEnd
@@ -353,7 +353,7 @@ RemoveItemWithoutQuantity: ; d381 (3:5381)
FindAndTossKeyItem: ; d3a3 (3:53a3)
ld hl, wItemsEnd
- ld a, [wd002]
+ ld a, [wCurItem]
ld c, a
.asm_d3aa
inc hl
@@ -373,7 +373,7 @@ FindAndTossKeyItem: ; d3a3 (3:53a3)
ret
CheckItemWithoutQuantity: ; d3be (3:53be)
- ld a, [wd002]
+ ld a, [wCurItem]
ld c, a
ld hl, wKeyItems
.asm_d3c5
@@ -520,7 +520,7 @@ GetItemAttr: ; d46d (3:546d)
add hl, bc
xor a
ld [wItemAttributeParamBuffer], a
- ld a, [wd002]
+ ld a, [wCurItem]
dec a
ld c, a
ld a, $7
diff --git a/engine/learn.asm b/engine/learn.asm
index f61b0c6c..b28f754b 100644
--- a/engine/learn.asm
+++ b/engine/learn.asm
@@ -46,7 +46,7 @@ LearnMove:
pop de
pop hl
.asm_6643
- ld a, [wd14d]
+ ld a, [wPutativeTMHMMove]
ld [hl], a
ld bc, $15
add hl, bc
@@ -110,7 +110,7 @@ LearnMove:
ld bc, -4
add hl, bc
push hl
- ld de, wd149
+ ld de, wListMoves_MoveIndicesBuffer
ld bc, $4
call CopyBytes
pop hl
@@ -127,14 +127,14 @@ LearnMove:
ld [wBuffer1], a
predef ListMoves
ld a, $4
- ld [wMenuDataEnd], a
+ ld [w2DMenuCursorInitY], a
ld a, $6
- ld [wced9], a
- ld a, [wcfe3]
+ ld [w2DMenuCursorInitX], a
+ ld a, [wNumMoves]
inc a
- ld [wceda], a
+ ld [w2DMenuNumRows], a
ld a, $1
- ld [wcedb], a
+ ld [w2DMenuNumCols], a
ld [wMenuCursorY], a
ld [wcee1], a
ld a, $3
@@ -142,9 +142,9 @@ LearnMove:
ld a, $20
ld [w2DMenuFlags1], a
xor a
- ld [wcedd], a
+ ld [w2DMenuFlags2], a
ld a, $20
- ld [wcede], a
+ ld [w2DMenuCursorOffsets], a
call StaticMenuJoypad
push af
call SafeLoadTempTilemapToTilemap
diff --git a/engine/learn_tm.asm b/engine/learn_tm.asm
index 530ecf41..a7a135d9 100755
--- a/engine/learn_tm.asm
+++ b/engine/learn_tm.asm
@@ -4,7 +4,7 @@ CanLearnTMHMMove: ; 11a25 (4:5a25)
call GetBaseData
ld hl, wd138
push hl
- ld a, [wd14d]
+ ld a, [wPutativeTMHMMove]
ld b, a
ld c, $0
ld hl, TMMovesList
diff --git a/engine/menus/start_menu.asm b/engine/menus/start_menu.asm
new file mode 100644
index 00000000..2e5cec79
--- /dev/null
+++ b/engine/menus/start_menu.asm
@@ -0,0 +1,541 @@
+; StartMenu.Items indexes
+ const_def
+ const STARTMENUITEM_POKEDEX ; 0
+ const STARTMENUITEM_POKEMON ; 1
+ const STARTMENUITEM_PACK ; 2
+ const STARTMENUITEM_STATUS ; 3
+ const STARTMENUITEM_SAVE ; 4
+ const STARTMENUITEM_OPTION ; 5
+ const STARTMENUITEM_EXIT ; 6
+ const STARTMENUITEM_POKEGEAR ; 7
+ const STARTMENUITEM_QUIT ; 8
+
+StartMenu::
+ call ClearWindowData
+
+ ld de, SFX_MENU
+ call PlaySFX
+
+ farcall ReanchorBGMap_NoOAMUpdate
+
+ ld hl, wStatusFlags2
+ bit STATUSFLAGS2_BUG_CONTEST_TIMER_F, [hl]
+ ld hl, .MenuHeader
+ jr z, .GotMenuData
+ ld hl, .ContestMenuHeader
+
+.GotMenuData:
+ call LoadMenuHeader
+ call .SetUpMenuItems
+ ld a, [wBattleMenuCursorBuffer]
+ ld [wMenuCursorBuffer], a
+ call .DrawMenuAccount
+ call DrawVariableLengthMenuBox
+ call .DrawBugContestStatusBox
+ call SafeUpdateSprites
+ call _OpenAndCloseMenu_HDMATransferTilemapAndAttrmap
+ farcall LoadFonts_NoOAMUpdate
+ call .DrawBugContestStatus
+ call UpdateTimePals
+ jr .Select
+
+.Reopen:
+ call UpdateSprites
+ call UpdateTimePals
+ call .SetUpMenuItems
+ ld a, [wBattleMenuCursorBuffer]
+ ld [wMenuCursorBuffer], a
+
+.Select:
+ call .GetInput
+ jr c, .Exit
+ call ._DrawMenuAccount
+ ld a, [wMenuCursorBuffer]
+ ld [wBattleMenuCursorBuffer], a
+ call PlayClickSFX
+ call PlaceHollowCursor
+ call .OpenMenu
+
+; Menu items have different return functions.
+; For example, saving exits the menu.
+ ld hl, .MenuReturns
+ ld e, a
+ ld d, 0
+ add hl, de
+ add hl, de
+ ld a, [hli]
+ ld h, [hl]
+ ld l, a
+ jp hl
+
+.MenuReturns:
+ dw .Reopen
+ dw .Exit
+ dw .ExitMenuCallFuncCloseText
+ dw .ExitMenuRunScriptCloseText
+ dw .ExitMenuRunScript
+ dw .ReturnEnd
+ dw .ReturnRedraw
+
+.Exit:
+ ldh a, [hOAMUpdate]
+ push af
+ ld a, 1
+ ldh [hOAMUpdate], a
+ call LoadFontsExtra
+ pop af
+ ldh [hOAMUpdate], a
+.ReturnEnd:
+ call ExitMenu
+.ReturnEnd2:
+ call CloseText
+ call UpdateTimePals
+ ret
+
+.GetInput:
+; Return carry on exit, and no-carry on selection.
+ xor a
+ ldh [hBGMapMode], a
+ call ._DrawMenuAccount
+ call SetUpMenu
+ ld a, $ff
+ ld [wMenuSelection], a
+.loop
+ call .PrintMenuAccount
+ call GetScrollingMenuJoypad
+ ld a, [wMenuJoypad]
+ cp B_BUTTON
+ jr z, .b
+ cp A_BUTTON
+ jr z, .a
+ jr .loop
+.a
+ call PlayClickSFX
+ and a
+ ret
+.b
+ scf
+ ret
+
+.ExitMenuRunScript:
+ call ExitMenu
+ ld a, HMENURETURN_SCRIPT
+ ldh [hMenuReturn], a
+ ret
+
+.ExitMenuRunScriptCloseText:
+ call ExitMenu
+ ld a, HMENURETURN_SCRIPT
+ ldh [hMenuReturn], a
+ jr .ReturnEnd2
+
+.ExitMenuCallFuncCloseText:
+ call ExitMenu
+ ld hl, wQueuedScriptAddr
+ ld a, [hli]
+ ld h, [hl]
+ ld l, a
+ ld a, [wQueuedScriptBank]
+ rst FarCall
+ jr .ReturnEnd2
+
+.ReturnRedraw:
+ call .Clear
+ jp .Reopen
+
+.Clear:
+ call ClearBGPalettes
+ call Call_ExitMenu
+ call ReloadTilesetAndPalettes
+ call .DrawMenuAccount
+ call DrawVariableLengthMenuBox
+ call .DrawBugContestStatus
+ call UpdateSprites
+ call Functiond2a
+ call FinishExitMenu
+ ret
+
+.MenuHeader:
+ db MENU_BACKUP_TILES ; flags
+ menu_coords 10, 0, SCREEN_WIDTH - 1, SCREEN_HEIGHT - 1
+ dw .MenuData
+ db 1 ; default selection
+
+.ContestMenuHeader:
+ db MENU_BACKUP_TILES ; flags
+ menu_coords 10, 2, SCREEN_WIDTH - 1, SCREEN_HEIGHT - 1
+ dw .MenuData
+ db 1 ; default selection
+
+.MenuData:
+ db STATICMENU_CURSOR | STATICMENU_WRAP | STATICMENU_ENABLE_START ; flags
+ dn 0, 0 ; rows, columns
+ dw wMenuItemsList
+ dw .MenuString
+ dw .Items
+
+.Items:
+; entries correspond to STARTMENUITEM_* constants
+ 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 "<PLAYER>@"
+.SaveString: db "SAVE@"
+.OptionString: db "OPTION@"
+.ExitString: db "EXIT@"
+.PokegearString: db "<POKE>GEAR@"
+.QuitString: db "QUIT@"
+
+.PokedexDesc:
+ db "#MON"
+ next "database@"
+
+.PartyDesc:
+ db "Party <PKMN>"
+ next "status@"
+
+.PackDesc:
+ db "Contains"
+ next "items@"
+
+.PokegearDesc:
+ db "Trainer's"
+ next "key device@"
+
+.StatusDesc:
+ db "Your own"
+ next "status@"
+
+.SaveDesc:
+ db "Save your"
+ next "progress@"
+
+.OptionDesc:
+ db "Change"
+ next "settings@"
+
+.ExitDesc:
+ db "Close this"
+ next "menu@"
+
+.QuitDesc:
+ db "Quit and"
+ next "be judged.@"
+
+.OpenMenu:
+ ld a, [wMenuSelection]
+ call .GetMenuAccountTextPointer
+ ld a, [hli]
+ ld h, [hl]
+ ld l, a
+ jp hl
+
+.MenuString:
+ push de
+ ld a, [wMenuSelection]
+ call .GetMenuAccountTextPointer
+ inc hl
+ inc hl
+ ld a, [hli]
+ ld d, [hl]
+ ld e, a
+ pop hl
+ call PlaceString
+ ret
+
+.MenuDesc:
+ push de
+ ld a, [wMenuSelection]
+ cp $ff
+ jr z, .none
+ call .GetMenuAccountTextPointer
+rept 4
+ inc hl
+endr
+ ld a, [hli]
+ ld d, [hl]
+ ld e, a
+ pop hl
+ call PlaceString
+ ret
+.none
+ pop de
+ ret
+
+.GetMenuAccountTextPointer:
+ ld e, a
+ ld d, 0
+ ld hl, wMenuDataPointerTableAddr
+ ld a, [hli]
+ ld h, [hl]
+ ld l, a
+rept 6
+ add hl, de
+endr
+ ret
+
+.SetUpMenuItems:
+ xor a
+ ld [wWhichIndexSet], a
+ call .FillMenuList
+
+ ld hl, wStatusFlags
+ bit STATUSFLAGS_POKEDEX_F, [hl]
+ jr z, .no_pokedex
+ ld a, STARTMENUITEM_POKEDEX
+ call .AppendMenuList
+.no_pokedex
+
+ ld a, [wPartyCount]
+ and a
+ jr z, .no_pokemon
+ ld a, STARTMENUITEM_POKEMON
+ call .AppendMenuList
+.no_pokemon
+
+ ld a, [wLinkMode]
+ and a
+ jr nz, .no_pack
+ ld hl, wStatusFlags2
+ bit STATUSFLAGS2_BUG_CONTEST_TIMER_F, [hl]
+ jr nz, .no_pack
+ ld a, STARTMENUITEM_PACK
+ call .AppendMenuList
+.no_pack
+
+ ld hl, wPokegearFlags
+ bit POKEGEAR_OBTAINED_F, [hl]
+ jr z, .no_pokegear
+ ld a, STARTMENUITEM_POKEGEAR
+ call .AppendMenuList
+.no_pokegear
+
+ ld a, STARTMENUITEM_STATUS
+ call .AppendMenuList
+
+ ld a, [wLinkMode]
+ and a
+ jr nz, .no_save
+ ld hl, wStatusFlags2
+ bit STATUSFLAGS2_BUG_CONTEST_TIMER_F, [hl]
+ ld a, STARTMENUITEM_QUIT
+ jr nz, .write
+ ld a, STARTMENUITEM_SAVE
+.write
+ call .AppendMenuList
+.no_save
+
+ ld a, STARTMENUITEM_OPTION
+ call .AppendMenuList
+ ld a, STARTMENUITEM_EXIT
+ call .AppendMenuList
+ ld a, c
+ ld [wMenuItemsList], a
+ ret
+
+.FillMenuList:
+ xor a
+ ld hl, wMenuItemsList
+ ld [hli], a
+ ld a, -1
+ ld bc, wMenuItemsListEnd - (wMenuItemsList + 1)
+ call ByteFill
+ ld de, wMenuItemsList + 1
+ ld c, 0
+ ret
+
+.AppendMenuList:
+ ld [de], a
+ inc de
+ inc c
+ ret
+
+.DrawMenuAccount:
+ jp ._DrawMenuAccount
+
+.PrintMenuAccount:
+ call .IsMenuAccountOn
+ ret z
+ call ._DrawMenuAccount
+ decoord 0, 14
+ jp .MenuDesc
+
+._DrawMenuAccount:
+ call .IsMenuAccountOn
+ ret z
+ hlcoord 0, 13
+ lb bc, 5, 10
+ call ClearBox
+ hlcoord 0, 13
+ ld b, 3
+ ld c, 8
+ jp TextboxPalette
+
+.IsMenuAccountOn:
+ ld a, [wOptions2]
+ and 1 << MENU_ACCOUNT
+ ret
+
+.DrawBugContestStatusBox:
+ ld hl, wStatusFlags2
+ bit STATUSFLAGS2_BUG_CONTEST_TIMER_F, [hl]
+ ret z
+ farcall StartMenu_DrawBugContestStatusBox
+ ret
+
+.DrawBugContestStatus:
+ ld hl, wStatusFlags2
+ bit STATUSFLAGS2_BUG_CONTEST_TIMER_F, [hl]
+ jr nz, .contest
+ ret
+.contest
+ farcall StartMenu_PrintBugContestStatus
+ ret
+
+StartMenu_Exit:
+; Exit the menu.
+
+ ld a, 1
+ ret
+
+StartMenu_Quit:
+; Retire from the bug catching contest.
+
+ ld hl, .StartMenuContestEndText
+ call StartMenuYesNo
+ jr c, .DontEndContest
+ ld a, BANK(BugCatchingContestReturnToGateScript)
+ ld hl, BugCatchingContestReturnToGateScript
+ call FarQueueScript
+ ld a, 4
+ ret
+
+.DontEndContest:
+ ld a, 0
+ ret
+
+.StartMenuContestEndText:
+ text_far _StartMenuContestEndText
+ text_end
+
+StartMenu_Save:
+; Save the game.
+
+ call BufferScreen
+ farcall SaveMenu
+ jr nc, .asm_12919
+ ld a, 0
+ ret
+.asm_12919
+ ld a, 1
+ ret
+
+StartMenu_Option:
+; Game options.
+
+ call FadeToMenu
+ farcall MainMenu_Options
+ ld a, 6
+ ret
+
+StartMenu_Status:
+; Player status.
+
+ call FadeToMenu
+ farcall TrainerCard
+ call CloseSubmenu
+ ld a, 0
+ ret
+
+StartMenu_Pokedex:
+ ld a, [wPartyCount]
+ and a
+ jr z, .asm_12949
+
+ call FadeToMenu
+ farcall Pokedex
+ call CloseSubmenu
+
+.asm_12949
+ ld a, 0
+ ret
+
+StartMenu_Pokegear:
+ call FadeToMenu
+ farcall PokeGear
+ call CloseSubmenu
+ ld a, 0
+ ret
+
+StartMenu_Pack:
+ call FadeToMenu
+ farcall Pack
+ ld a, [wPackUsedItem]
+ and a
+ jr nz, .used_item
+ call CloseSubmenu
+ ld a, 0
+ ret
+
+.used_item
+ call ExitAllMenus
+ ld a, 4
+ ret
+
+StartMenu_Pokemon:
+ ld a, [wPartyCount]
+ and a
+ jr z, .return
+
+ call FadeToMenu
+
+.choosemenu
+ xor a
+ ld [wPartyMenuActionText], a ; Choose a POKéMON.
+ call ClearBGPalettes
+
+.menu
+ farcall LoadPartyMenuGFX
+ farcall InitPartyMenuWithCancel
+ farcall InitPartyMenuGFX
+
+.menunoreload
+ farcall WritePartyMenuTilemap
+ farcall PrintPartyMenuText
+ call WaitBGMap
+ call SetPalettes ; load regular palettes?
+ call DelayFrame
+ farcall PartyMenuSelect
+ jr c, .return ; if cancelled or pressed B
+
+ call PokemonActionSubmenu
+ cp 3
+ jr z, .menu
+ cp 0
+ jr z, .choosemenu
+ cp 1
+ jr z, .menunoreload
+ cp 2
+ jr z, .quit
+
+.return
+ call CloseSubmenu
+ ld a, 0
+ ret
+
+.quit
+ ld a, b
+ push af
+ call ExitAllMenus
+ pop af
+ ret
diff --git a/engine/move_mon.asm b/engine/move_mon.asm
index 7410375f..7198910d 100755
--- a/engine/move_mon.asm
+++ b/engine/move_mon.asm
@@ -1196,7 +1196,7 @@ RemoveMonFromPartyOrBox: ; e03f (3:603f)
ld a, [wCurPartyMon]
cp [hl]
jr z, .asm_e137
- ld hl, s0_a600
+ ld hl, sPartyMail
ld bc, MAIL_STRUCT_LENGTH
call AddNTimes
push hl
@@ -1502,14 +1502,14 @@ GivePoke: ; Give a Pokemon from script
push bc
push de
push af
- ld a, [wd002]
+ ld a, [wCurItem]
and a
jr z, .asm_e2fa
ld a, [wCurPartyMon]
ld hl, wPartyMon1Item
ld bc, PARTYMON_STRUCT_LENGTH
call AddNTimes
- ld a, [wd002]
+ ld a, [wCurItem]
ld [hl], a
jr .asm_e2fa
@@ -1530,10 +1530,10 @@ GivePoke: ; Give a Pokemon from script
push bc
push de
push af
- ld a, [wd002]
+ ld a, [wCurItem]
and a
jr z, .asm_e2fa
- ld a, [wd002]
+ ld a, [wCurItem]
ld [sBoxMon1Item], a
.asm_e2fa
ld a, [wCurPartySpecies]
diff --git a/engine/namingscreen.asm b/engine/namingscreen.asm
index f907c463..ca0eb213 100644
--- a/engine/namingscreen.asm
+++ b/engine/namingscreen.asm
@@ -892,7 +892,7 @@ NamingScreenGFX_ED: INCBIN "gfx/namingscreen/ed.1bpp" ; leftover from gen 1
NamingScreenGFX_MiddleLine: INCBIN "gfx/namingscreen/middleline.1bpp"
NamingScreenGFX_UnderLine: INCBIN "gfx/namingscreen/underline.1bpp"
-ComposeMailMessage:
+_ComposeMailMessage:
ld hl, wNamingScreenDestinationPointer
ld [hl], e
inc hl
diff --git a/engine/overworld/map_objects.asm b/engine/overworld/map_objects.asm
index 887fb753..774d4cd8 100755
--- a/engine/overworld/map_objects.asm
+++ b/engine/overworld/map_objects.asm
@@ -928,7 +928,7 @@ Function5730:: ; 5730 (1:5730)
ld [wce87], a
ld [wce88], a
xor a
- ld [wcf39], a
+ ld [wPlayerTurningDirection], a
ld [wPlayerObjectStepFrame], a
call Function574f
farcall Function14a44
diff --git a/engine/overworld/player_movement.asm b/engine/overworld/player_movement.asm
index 3fa38cc0..e05fbb9d 100755
--- a/engine/overworld/player_movement.asm
+++ b/engine/overworld/player_movement.asm
@@ -1,18 +1,18 @@
DoPlayerMovement:: ; 10000 (4:4000)
call Function10017
ld a, movement_step_sleep
- ld [wcf2d], a
+ ld [wMovementAnimation], a
xor a
- ld [wcf2c], a
+ ld [wWalkingIntoEdgeWarp], a
call Function1002d
ld c, a
- ld a, [wcf2d]
+ ld a, [wMovementAnimation]
ld [wce87], a
ret
Function10017: ; 10017 (4:4017)
ldh a, [hJoyDown]
- ld [wcf29], a
+ ld [wCurInput], a
CheckFlagHL ENGINE_DOWNHILL
ret z
ld c, a
@@ -20,7 +20,7 @@ Function10017: ; 10017 (4:4017)
ret nz
ld a, c
or $80
- ld [wcf29], a
+ ld [wCurInput], a
ret
Function1002d: ; 1002d (4:402d)
@@ -74,7 +74,7 @@ Function1002d: ; 1002d (4:402d)
ret c
call Function10226
ret c
- ld a, [wcf2e]
+ ld a, [wWalkingDirection]
cp $ff
jr z, .asm_10098
call Function103ee
@@ -84,10 +84,10 @@ Function1002d: ; 1002d (4:402d)
ret
.asm_1009d
- ld a, [wcf2e]
+ ld a, [wWalkingDirection]
cp $ff
jr z, .asm_100b2
- ld a, [wTempTrainer]
+ ld a, [wWalkingIntoEdgeWarp]
and a
jr nz, .asm_100ad
call Function103ee
@@ -130,7 +130,7 @@ Function100b7: ; 100b7 (4:40b7)
ld hl, .water_table
add hl, bc
ld a, [hl]
- ld [wcf2e], a
+ ld [wWalkingDirection], a
jr .asm_1013e
.water_table
@@ -149,7 +149,7 @@ Function100b7: ; 100b7 (4:40b7)
ld a, [hl]
cp $ff
jr z, .asm_1013c
- ld [wcf2e], a
+ ld [wWalkingDirection], a
jr .asm_1013e
.land1_table
@@ -172,7 +172,7 @@ Function100b7: ; 100b7 (4:40b7)
ld a, [hl]
cp $ff
jr z, .asm_1013c
- ld [wcf2e], a
+ ld [wWalkingDirection], a
jr .asm_1013e
.land2_table
@@ -197,7 +197,7 @@ Function100b7: ; 100b7 (4:40b7)
jr nz, .asm_1013c
.asm_10135
ld a, $0
- ld [wcf2e], a
+ ld [wWalkingDirection], a
jr .asm_1013e
.asm_1013c
@@ -212,10 +212,10 @@ Function100b7: ; 100b7 (4:40b7)
ret
Function10147: ; 10147 (4:4147)
- ld a, [wcf39]
+ ld a, [wPlayerTurningDirection]
cp $0
jr nz, .asm_10169
- ld a, [wcf2e]
+ ld a, [wWalkingDirection]
cp $ff
jr z, .asm_10169
ld e, a
@@ -256,7 +256,7 @@ Function1016b: ; 1016b (4:416b)
ld hl, wBikeFlags
bit 2, [hl]
jr z, .asm_101a7
- ld a, [wcf2e]
+ ld a, [wWalkingDirection]
cp $0
jr z, .asm_101a7
ld a, $1
@@ -291,15 +291,15 @@ Function1016b: ; 1016b (4:416b)
Function101c0: ; 101c0 (4:41c0)
call Function103b4
- ld [wcf2b], a
+ ld [wWalkingIntoLand], a
jr c, .asm_101f1
call Function10341
- ld [wcf2a], a
+ ld [wWalkingIntoNPC], a
and a
jr z, .asm_101f1
cp $2
jr z, .asm_101f1
- ld a, [wcf2b]
+ ld a, [wWalkingIntoLand]
and a
jr nz, .asm_101e2
ld a, $1
@@ -332,7 +332,7 @@ Function101f3: ; 101f3 (4:41f3)
ld d, $0
ld hl, .data_1021e
add hl, de
- ld a, [wcf2f]
+ ld a, [wFacingDirection]
and [hl]
jr z, .asm_1021c
ld de, $16
@@ -358,7 +358,7 @@ Function101f3: ; 101f3 (4:41f3)
db FACE_UP | FACE_LEFT
Function10226: ; 10226 (4:4226)
- ld a, [wcf2e]
+ ld a, [wWalkingDirection]
ld e, a
ld d, $0
ld hl, .edge_warps
@@ -367,8 +367,8 @@ Function10226: ; 10226 (4:4226)
cp [hl]
jr nz, .asm_10259
ld a, $1
- ld [wTempTrainer], a
- ld a, [wcf2e]
+ ld [wWalkingIntoEdgeWarp], a
+ ld a, [wWalkingDirection]
cp $ff
jr z, .asm_10259
ld e, a
@@ -401,17 +401,17 @@ Function1025f: ; 1025f (4:425f)
ld a, [hli]
ld h, [hl]
ld l, a
- ld a, [wcf2e]
+ ld a, [wWalkingDirection]
ld e, a
cp $ff
jp z, Function102b3
add hl, de
ld a, [hl]
- ld [wcf2d], a
+ ld [wMovementAnimation], a
ld hl, $42af
add hl, de
ld a, [hl]
- ld [wcf39], a
+ ld [wPlayerTurningDirection], a
ld a, $4
ret
@@ -468,24 +468,24 @@ Function1025f: ; 1025f (4:425f)
Function102b3: ; 102b3 (4:42b3)
ld a, $0
- ld [wcf39], a
+ ld [wPlayerTurningDirection], a
ld a, $3e
- ld [wcf2d], a
+ ld [wMovementAnimation], a
xor a
ret
Function102bf: ; 102bf (4:42bf)
ld a, $0
- ld [wTempTrainerEnd], a
+ ld [wPlayerTurningDirection], a
ld a, $50
- ld [wcf2d], a
+ ld [wMovementAnimation], a
xor a
ret
Function102cb: ; 102cb (4:42cb)
call Function10404
ret nc
- ld a, [wTempTrainerEnd]
+ ld a, [wPlayerTurningDirection]
.asm_102d2
cp $0
ret z
@@ -494,10 +494,10 @@ Function102cb: ; 102cb (4:42cb)
ld d, $0
ld hl, .forced_dpad
add hl, de
- ld a, [wcf29]
+ ld a, [wCurInput]
and $f
or [hl]
- ld [wcf29], a
+ ld [wCurInput], a
ret
.forced_dpad
@@ -506,7 +506,7 @@ Function102cb: ; 102cb (4:42cb)
Function102ec: ; 102ec (4:42ec)
ld hl, .table
ld de, .table2 - .table1
- ld a, [wcf29]
+ ld a, [wCurInput]
bit 7, a
jr nz, .asm_10307
bit 6, a
@@ -528,13 +528,13 @@ Function102ec: ; 102ec (4:42ec)
add hl, de
.asm_1030b
ld a, [hli]
- ld [wcf2e], a
+ ld [wWalkingDirection], a
ld a, [hli]
- ld [wcf2f], a
+ ld [wFacingDirection], a
ld a, [hli]
- ld [wcf30], a
+ ld [wWalkingX], a
ld a, [hli]
- ld [wcf31], a
+ ld [wWalkingY], a
ld a, [hli]
ld h, [hl]
ld l, a
@@ -567,12 +567,12 @@ Function10341: ; 10341 (4:4341)
ldh [hMapObjectIndexBuffer], a
ld a, [wPlayerStandingMapX]
ld d, a
- ld a, [wcf30]
+ ld a, [wWalkingX]
add d
ld d, a
ld a, [wPlayerStandingMapY]
ld e, a
- ld a, [wcf31]
+ ld a, [wWalkingY]
add e
ld e, a
ld bc, wPlayerSprite
@@ -607,7 +607,7 @@ Function1036f: ; 1036f (4:436f)
ld hl, $5
add hl, bc
set 2, [hl]
- ld a, [wcf2e]
+ ld a, [wWalkingDirection]
ld d, a
ld hl, $20
add hl, bc
@@ -625,7 +625,7 @@ Function1036f: ; 1036f (4:436f)
Function1039e: ; 1039e (4:439e)
ld a, [wTilePermissions]
ld d, a
- ld a, [wcf2f]
+ ld a, [wFacingDirection]
and d
jr nz, .asm_103b2
ld a, [wWinTextPointer]
@@ -641,7 +641,7 @@ Function1039e: ; 1039e (4:439e)
Function103b4: ; 103b4 (4:43b4)
ld a, [wTilePermissions]
ld d, a
- ld a, [wcf2f]
+ ld a, [wFacingDirection]
and d
jr nz, .asm_103c8
ld a, [wWinTextPointer]
@@ -705,7 +705,7 @@ Function103f9: ; 103f9 (4:43f9)
ret
Function10404: ; 10404 (4:4404)
- ld a, [wTempTrainerEnd]
+ ld a, [wPlayerTurningDirection]
cp $0
jr z, .asm_10420
cp $f0
@@ -731,5 +731,5 @@ StopPlayerForEvent::
ret z
ld [hl], a
ld a, $0
- ld [wcf39], a
+ ld [wPlayerTurningDirection], a
ret
diff --git a/engine/overworld/player_object.asm b/engine/overworld/player_object.asm
index 0865dbf8..26dbe9fd 100755
--- a/engine/overworld/player_object.asm
+++ b/engine/overworld/player_object.asm
@@ -478,7 +478,7 @@ TrainerWalkToPlayer:
call InitMovementBuffer
ld a, movement_step_sleep
call AppendToMovementBuffer
- ld a, [wcf2a]
+ ld a, [wWalkingIntoNPC]
dec a
jr z, .asm_892b
ldh a, [hLastTalked]
diff --git a/engine/overworld/select_menu.asm b/engine/overworld/select_menu.asm
new file mode 100644
index 00000000..18532eda
--- /dev/null
+++ b/engine/overworld/select_menu.asm
@@ -0,0 +1,172 @@
+SelectMenu::
+ call CheckRegisteredItem
+ jr c, .NotRegistered
+ jp UseRegisteredItem
+
+.NotRegistered:
+ call OpenText
+ ld b, BANK(MayRegisterItemText)
+ ld hl, MayRegisterItemText
+ call MapTextbox
+ call WaitButton
+ jp CloseText
+
+MayRegisterItemText:
+ text_far _MayRegisterItemText
+ text_end
+
+CheckRegisteredItem:
+ ld a, [wWhichRegisteredItem]
+ and a
+ jr z, .NoRegisteredItem
+ and REGISTERED_POCKET
+ rlca
+ rlca
+ ld hl, .Pockets
+ rst JumpTable
+ ret
+
+.Pockets:
+; entries correspond to *_POCKET constants
+ dw .CheckItem
+ dw .CheckBall
+ dw .CheckKeyItem
+ dw .CheckTMHM
+
+.CheckItem:
+ ld hl, wNumItems
+ 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, [wRegisteredItem]
+ ld hl, wKeyItems
+ ld de, 1
+ call IsInArray
+ jr nc, .NoRegisteredItem
+ ld a, [wRegisteredItem]
+ ld [wCurItem], a
+ and a
+ ret
+
+.CheckBall:
+ ld hl, wNumBalls
+ 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 [wWhichRegisteredItem], a
+ ld [wRegisteredItem], a
+ scf
+ ret
+
+.CheckRegisteredNo:
+ ld a, [wWhichRegisteredItem]
+ and REGISTERED_NUMBER
+ dec a
+ cp [hl]
+ jr nc, .NotEnoughItems
+ ld [wCurItemQuantity], a
+ and a
+ ret
+
+.NotEnoughItems:
+ scf
+ ret
+
+.IsSameItem:
+ ld a, [wRegisteredItem]
+ cp [hl]
+ jr nz, .NotSameItem
+ ld [wCurItem], a
+ and a
+ ret
+
+.NotSameItem:
+ scf
+ ret
+
+UseRegisteredItem:
+ farcall CheckItemMenu
+ ld a, [wItemAttributeParamBuffer]
+ ld hl, .SwitchTo
+ rst JumpTable
+ ret
+
+.SwitchTo:
+; entries correspond to ITEMMENU_* constants
+ dw .CantUse
+ dw .NoFunction
+ dw .NoFunction
+ dw .NoFunction
+ dw .Current
+ dw .Party
+ dw .Overworld
+
+.NoFunction:
+ call OpenText
+ call CantUseItem
+ call CloseText
+ and a
+ ret
+
+.Current:
+ call OpenText
+ call DoItemEffect
+ call CloseText
+ and a
+ ret
+
+.Party:
+ call RefreshScreen
+ call FadeToMenu
+ call DoItemEffect
+ call CloseSubmenu
+ call CloseText
+ and a
+ ret
+
+.Overworld:
+ call RefreshScreen
+ ld a, 1
+ ld [wUsingItemWithSelect], a
+ call DoItemEffect
+ xor a
+ ld [wUsingItemWithSelect], a
+ ld a, [wItemEffectSucceeded]
+ cp 1
+ jr nz, ._cantuse
+ scf
+ ld a, HMENURETURN_SCRIPT
+ ldh [hMenuReturn], a
+ ret
+
+.CantUse:
+ call RefreshScreen
+
+._cantuse
+ call CantUseItem
+ call CloseText
+ and a
+ ret
diff --git a/engine/pack.asm b/engine/pack.asm
index 620976a9..a8c1fedc 100755
--- a/engine/pack.asm
+++ b/engine/pack.asm
@@ -1,4 +1,4 @@
-Function10430:
+Pack:
ld hl, wOptions
set NO_TEXT_SCROLL, [hl]
call Function10aba
@@ -61,9 +61,9 @@ Pack_ItemsPocketMenu:
ld a, [wcfca]
ld [wMenuCursorBuffer], a
ld a, [wcfcf]
- ld [wcfd4], a
+ ld [wMenuScrollPosition], a
call ScrollingMenu
- ld a, [wcfd4]
+ ld a, [wMenuScrollPosition]
ld [wcfcf], a
ld a, [wMenuCursorY]
ld [wcfca], a
@@ -90,9 +90,9 @@ Pack_KeyItemsPocketMenu:
ld a, [wcfcb]
ld [wMenuCursorBuffer], a
ld a, [wcfd0]
- ld [wcfd4], a
+ ld [wMenuScrollPosition], a
call ScrollingMenu
- ld a, [wcfd4]
+ ld a, [wMenuScrollPosition]
ld [wcfd0], a
ld a, [wMenuCursorY]
ld [wcfcb], a
@@ -214,9 +214,9 @@ Pack_BallsPocketMenu:
ld a, [wcfcc]
ld [wMenuCursorBuffer], a
ld a, [wcfd1]
- ld [wcfd4], a
+ ld [wMenuScrollPosition], a
call ScrollingMenu
- ld a, [wcfd4]
+ ld a, [wMenuScrollPosition]
ld [wcfd1], a
ld a, [wMenuCursorY]
ld [wcfcc], a
@@ -484,7 +484,7 @@ TossMenu:
pop af
jr c, .asm_107cc
ld hl, wTMsHMsEnd
- ld a, [wd003]
+ ld a, [wCurItemQuantity]
call TossItem
call Function10e38
ld hl, Text_ThrewAway
@@ -530,12 +530,12 @@ RegisterItem:
rrca
and $c0
ld b, a
- ld a, [wd003]
+ ld a, [wCurItemQuantity]
inc a
and $3f
or b
ld [wWhichRegisteredItem], a
- ld a, [wd002]
+ ld a, [wCurItem]
ld [wRegisteredItem], a
call Function10e38
ld de, SFX_FULL_HEAL
@@ -588,7 +588,7 @@ GiveItem:
ld de, wMonOrItemNameBuffer
ld bc, $b
call CopyBytes
- call Function12fa0
+ call TryGiveItemToPartymon
pop af
ld [wce64], a
pop af
@@ -678,9 +678,9 @@ BattlePack_ItemsPocketMenu:
ld a, [wcfca]
ld [wMenuCursorBuffer], a
ld a, [wcfcf]
- ld [wcfd4], a
+ ld [wMenuScrollPosition], a
call ScrollingMenu
- ld a, [wcfd4]
+ ld a, [wMenuScrollPosition]
ld [wcfcf], a
ld a, [wMenuCursorY]
ld [wcfca], a
@@ -706,9 +706,9 @@ BattlePack_KeyItemsPocketMenu:
ld a, [wcfcb]
ld [wMenuCursorBuffer], a
ld a, [wcfd0]
- ld [wcfd4], a
+ ld [wMenuScrollPosition], a
call ScrollingMenu
- ld a, [wcfd4]
+ ld a, [wMenuScrollPosition]
ld [wcfd0], a
ld a, [wMenuCursorY]
ld [wcfcb], a
@@ -757,9 +757,9 @@ BattlePack_BallsPocketMenu:
ld a, [wcfcc]
ld [wMenuCursorBuffer], a
ld a, [wcfd1]
- ld [wcfd4], a
+ ld [wMenuScrollPosition], a
call ScrollingMenu
- ld a, [wcfd4]
+ ld a, [wMenuScrollPosition]
ld [wcfd1], a
ld a, [wMenuCursorY]
ld [wcfcc], a
@@ -895,33 +895,34 @@ Function10aba: ; 10aba (4:4aba)
ld [wce63], a
ld a, [wcfc8]
and $3
- ld [wce65], a
+ ld [wCurPocket], a
inc a
add a
dec a
ld [wce64], a
xor a
- ld [wce66], a
+ ld [wPackUsedItem], a
xor a
- ld [wcfd3], a
+ ld [wSwitchItem], a
ret
-Function10ad5: ; 10ad5 (4:4ad5)
+DepositSellInitPackBuffers: ; 10ad5 (4:4ad5)
xor a
ldh [hBGMapMode], a
ld [wce63], a
ld [wce64], a
- ld [wce65], a
- ld [wce66], a
- ld [wcfd3], a
+ ld [wCurPocket], a
+ ld [wPackUsedItem], a
+ ld [wSwitchItem], a
call Function10d70
call Function10e5b
ret
-.asm_10aee
+DepositSellPack
+.loop
call Function10af7
call Function10b9f
- jr c, .asm_10aee
+ jr c, .loop
ret
Function10af7: ; 10af7 (4:4af7)
@@ -944,9 +945,9 @@ DepositOrSell_ItemPocket:
ld a, [wcfca]
ld [wMenuCursorBuffer], a
ld a, [wcfcf]
- ld [wcfd4], a
+ ld [wMenuScrollPosition], a
call ScrollingMenu
- ld a, [wcfd4]
+ ld a, [wMenuScrollPosition]
ld [wcfcf], a
ld a, [wMenuCursorY]
ld [wcfca], a
@@ -960,9 +961,9 @@ DepositOrSell_KeyItemsPocket:
ld a, [wcfcb]
ld [wMenuCursorBuffer], a
ld a, [wcfd0]
- ld [wcfd4], a
+ ld [wMenuScrollPosition], a
call ScrollingMenu
- ld a, [wcfd4]
+ ld a, [wMenuScrollPosition]
ld [wcfd0], a
ld a, [wMenuCursorY]
ld [wcfcb], a
@@ -973,8 +974,8 @@ DepositOrSell_TMHMPocket:
call Function10b92
call Function10cca
farcall Pack_TMHMPocketMenu_ ; b:457a
- ld a, [wd002]
- ld [wd002], a
+ ld a, [wCurItem]
+ ld [wCurItem], a
ret
DepositOrSell_BallsPocket:
@@ -985,9 +986,9 @@ DepositOrSell_BallsPocket:
ld a, [wcfcc]
ld [wMenuCursorBuffer], a
ld a, [wcfd1]
- ld [wcfd4], a
+ ld [wMenuScrollPosition], a
call ScrollingMenu
- ld a, [wcfd4]
+ ld a, [wMenuScrollPosition]
ld [wcfd1], a
ld a, [wMenuCursorY]
ld [wcfcc], a
@@ -1054,7 +1055,7 @@ Function10b9f: ; 10b9f (4:4b9f)
ret
TutorialPack:
- call Function10ad5
+ call DepositSellInitPackBuffers
ld a, [wInputType]
or a
jr z, .asm_10bfa
@@ -1126,8 +1127,8 @@ TutorialTMHM:
call Function10b92
call Function10cca
farcall Pack_TMHMPocketMenu_
- ld a, [wd002]
- ld [wd002], a
+ ld a, [wCurItem]
+ ld [wCurItem], a
ret
TutorialBalls:
@@ -1224,7 +1225,7 @@ PackGFXPointers:
Function10cef: ; 10cef (4:4cef)
ld hl, wMenuJoypad
- ld a, [wcfd3]
+ ld a, [wSwitchItem]
and a
jr nz, .asm_10d4c
ld a, [hl]
@@ -1302,7 +1303,7 @@ Function10cef: ; 10cef (4:4cef)
call WaitPlaySFX
.asm_10d6a
xor a
- ld [wcfd3], a
+ ld [wSwitchItem], a
scf
ret
@@ -1401,7 +1402,7 @@ Function10dd6: ; 10dd6 (4:4dd6)
db $02, $05, $05, $05, $03 ; bottom border
Function10e38: ; 10e38 (4:4e38)
- ld a, [wd002]
+ ld a, [wCurItem]
ld [wd151], a
call GetItemName
call CopyName1
diff --git a/engine/pokemon/mon_menu.asm b/engine/pokemon/mon_menu.asm
new file mode 100644
index 00000000..d40940be
--- /dev/null
+++ b/engine/pokemon/mon_menu.asm
@@ -0,0 +1,1294 @@
+HasNoItems:
+ ld a, [wNumItems]
+ and a
+ ret nz
+ ld a, [wNumKeyItems]
+ and a
+ ret nz
+ ld a, [wNumBalls]
+ and a
+ ret nz
+ ld hl, wTMsHMs
+ ld b, NUM_TMS + NUM_HMS
+.loop
+ ld a, [hli]
+ and a
+ jr nz, .done
+ dec b
+ jr nz, .loop
+ scf
+ ret
+.done
+ and a
+ ret
+
+TossItemFromPC:
+ push de
+ call PartyMonItemName
+ farcall _CheckTossableItem
+ ld a, [wItemAttributeParamBuffer]
+ and a
+ jr nz, .key_item
+ ld hl, .ItemsTossOutHowManyText
+ call MenuTextbox
+ farcall SelectQuantityToToss
+ push af
+ call CloseWindow
+ call ExitMenu
+ pop af
+ jr c, .quit
+ ld hl, .ItemsThrowAwayText
+ call MenuTextbox
+ call YesNoBox
+ push af
+ call ExitMenu
+ pop af
+ jr c, .quit
+ pop hl
+ ld a, [wCurItemQuantity]
+ call TossItem
+ call PartyMonItemName
+ ld hl, .ItemsDiscardedText
+ call MenuTextbox
+ call ExitMenu
+ and a
+ ret
+
+.key_item
+ call .CantToss
+.quit
+ pop hl
+ scf
+ ret
+
+.ItemsTossOutHowManyText:
+ text_far _ItemsTossOutHowManyText
+ text_end
+
+.ItemsThrowAwayText:
+ text_far _ItemsThrowAwayText
+ text_end
+
+.ItemsDiscardedText:
+ text_far _ItemsDiscardedText
+ text_end
+
+.CantToss:
+ ld hl, .ItemsTooImportantText
+ call MenuTextboxBackup
+ ret
+
+.ItemsTooImportantText:
+ text_far _ItemsTooImportantText
+ text_end
+
+CantUseItem:
+ ld hl, ItemsOakWarningText
+ call MenuTextboxWaitButton
+ ret
+
+ItemsOakWarningText:
+ text_far _ItemsOakWarningText
+ text_end
+
+PartyMonItemName:
+ ld a, [wCurItem]
+ ld [wNamedObjectIndexBuffer], a
+ call GetItemName
+ call CopyName1
+ ret
+
+CancelPokemonAction:
+ farcall InitPartyMenuWithCancel
+ farcall UnfreezeMonIcons
+ ld a, 1
+ ret
+
+PokemonActionSubmenu:
+ hlcoord 1, 15
+ lb bc, 2, 18
+ call ClearBox
+ farcall MonSubmenu
+ call GetCurNick
+ ld a, [wMenuSelection]
+ 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
+ ret
+
+.Actions:
+ dbw MONMENUITEM_CUT, MonMenu_Cut
+ dbw MONMENUITEM_FLY, MonMenu_Fly
+ dbw MONMENUITEM_SURF, MonMenu_Surf
+ dbw MONMENUITEM_STRENGTH, MonMenu_Strength
+ dbw MONMENUITEM_FLASH, MonMenu_Flash
+ dbw MONMENUITEM_WHIRLPOOL, MonMenu_Whirlpool
+ dbw MONMENUITEM_DIG, MonMenu_Dig
+ dbw MONMENUITEM_TELEPORT, MonMenu_Teleport
+ dbw MONMENUITEM_SOFTBOILED, MonMenu_Softboiled_MilkDrink
+ dbw MONMENUITEM_MILKDRINK, MonMenu_Softboiled_MilkDrink
+ dbw MONMENUITEM_HEADBUTT, MonMenu_Headbutt
+ dbw MONMENUITEM_WATERFALL, MonMenu_Waterfall
+ dbw MONMENUITEM_ROCKSMASH, MonMenu_RockSmash
+ dbw MONMENUITEM_SWEETSCENT, MonMenu_SweetScent
+ dbw MONMENUITEM_STATS, OpenPartyStats
+ dbw MONMENUITEM_SWITCH, SwitchPartyMons
+ dbw MONMENUITEM_ITEM, GiveTakePartyMonItem
+ dbw MONMENUITEM_CANCEL, CancelPokemonAction
+ dbw MONMENUITEM_MOVE, ManagePokemonMoves
+ dbw MONMENUITEM_MAIL, MonMailAction
+
+SwitchPartyMons:
+; Don't try if there's nothing to switch!
+ ld a, [wPartyCount]
+ cp 2
+ jr c, .DontSwitch
+
+ ld a, [wCurPartyMon]
+ inc a
+ ld [wSwitchMon], a
+
+ farcall HoldSwitchmonIcon
+ farcall InitPartyMenuNoCancel
+
+ ld a, PARTYMENUACTION_MOVE
+ ld [wPartyMenuActionText], a
+ farcall WritePartyMenuTilemap
+ farcall PrintPartyMenuText
+
+ hlcoord 0, 1
+ ld bc, SCREEN_WIDTH * 2
+ ld a, [wSwitchMon]
+ dec a
+ call AddNTimes
+ ld [hl], "▷"
+ call WaitBGMap
+ call SetPalettes
+ call DelayFrame
+
+ farcall PartyMenuSelect
+ bit 1, b
+ jr c, .DontSwitch
+
+ farcall _SwitchPartyMons
+
+ xor a
+ ld [wPartyMenuActionText], a
+
+ farcall LoadPartyMenuGFX
+ farcall InitPartyMenuWithCancel
+ farcall InitPartyMenuGFX
+
+ ld a, 1
+ ret
+
+.DontSwitch:
+ xor a
+ ld [wPartyMenuActionText], a
+ call CancelPokemonAction
+ ret
+
+GiveTakePartyMonItem:
+; Eggs can't hold items!
+ ld a, [wCurPartySpecies]
+ cp EGG
+ jr z, .cancel
+
+ ld hl, GiveTakeItemMenuData
+ call LoadMenuHeader
+ call VerticalMenu
+ call ExitMenu
+ jr c, .cancel
+
+ call GetCurNick
+ ld hl, wStringBuffer1
+ ld de, wMonOrItemNameBuffer
+ ld bc, MON_NAME_LENGTH
+ call CopyBytes
+ ld a, [wMenuCursorY]
+ cp 1
+ jr nz, .take
+
+ call LoadStandardMenuHeader
+ call ClearPalettes
+ call .GiveItem
+ call ClearPalettes
+ call LoadFontsBattleExtra
+ call ExitMenu
+ ld a, 0
+ ret
+
+.take
+ call TakePartyItem
+ ld a, 3
+ ret
+
+.cancel
+ ld a, 3
+ ret
+
+.GiveItem:
+ farcall DepositSellInitPackBuffers
+
+.loop
+ farcall DepositSellPack
+
+ ld a, [wPackUsedItem]
+ and a
+ jr z, .quit
+
+ ld a, [wCurPocket]
+ cp KEY_ITEM_POCKET
+ jr z, .next
+
+ call CheckTossableItem
+ ld a, [wItemAttributeParamBuffer]
+ and a
+ jr nz, .next
+
+ call TryGiveItemToPartymon
+ jr .quit
+
+.next
+ ld hl, ItemCantHeldText
+ call MenuTextboxBackup
+ jr .loop
+
+.quit
+ ret
+
+TryGiveItemToPartymon:
+ call SpeechTextbox
+ call PartyMonItemName
+ call GetPartyItemLocation
+ ld a, [hl]
+ and a
+ jr z, .give_item_to_mon
+
+ push hl
+ ld d, a
+ farcall ItemIsMail
+ pop hl
+ jr c, .please_remove_mail
+ ld a, [hl]
+ jr .already_holding_item
+
+.give_item_to_mon
+ call GiveItemToPokemon
+ ld hl, PokemonHoldItemText
+ call MenuTextboxBackup
+ call GivePartyItem
+ ret
+
+.please_remove_mail
+ ld hl, PokemonRemoveMailText
+ call MenuTextboxBackup
+ ret
+
+.already_holding_item
+ ld [wNamedObjectIndexBuffer], a
+ call GetItemName
+ ld hl, PokemonAskSwapItemText
+ call StartMenuYesNo
+ jr c, .abort
+
+ call GiveItemToPokemon
+ ld a, [wNamedObjectIndexBuffer]
+ push af
+ ld a, [wCurItem]
+ ld [wNamedObjectIndexBuffer], a
+ pop af
+ ld [wCurItem], a
+ call ReceiveItemFromPokemon
+ jr nc, .bag_full
+
+ ld hl, PokemonSwapItemText
+ call MenuTextboxBackup
+ ld a, [wNamedObjectIndexBuffer]
+ ld [wCurItem], a
+ call GivePartyItem
+ ret
+
+.bag_full
+ ld a, [wNamedObjectIndexBuffer]
+ ld [wCurItem], a
+ call ReceiveItemFromPokemon
+ ld hl, ItemStorageFullText
+ call MenuTextboxBackup
+
+.abort
+ ret
+
+GivePartyItem:
+ call GetPartyItemLocation
+ ld a, [wCurItem]
+ ld [hl], a
+ ld d, a
+ farcall ItemIsMail
+ jr nc, .done
+ call ComposeMailMessage
+
+.done
+ ret
+
+TakePartyItem:
+ call SpeechTextbox
+ call GetPartyItemLocation
+ ld a, [hl]
+ and a
+ jr z, .asm_12c8c
+
+ ld [wCurItem], a
+ call ReceiveItemFromPokemon
+ jr nc, .asm_12c94
+
+ farcall ItemIsMail
+ call GetPartyItemLocation
+ ld a, [hl]
+ ld [wNamedObjectIndexBuffer], a
+ ld [hl], NO_ITEM
+ call GetItemName
+ ld hl, PokemonTookItemText
+ call MenuTextboxBackup
+ jr .asm_12c9a
+
+.asm_12c8c
+ ld hl, PokemonNotHoldingText
+ call MenuTextboxBackup
+ jr .asm_12c9a
+
+.asm_12c94
+ ld hl, ItemStorageFullText
+ call MenuTextboxBackup
+
+.asm_12c9a
+ ret
+
+GiveTakeItemMenuData:
+ db MENU_SPRITE_ANIMS | MENU_BACKUP_TILES ; flags
+ menu_coords 12, 12, SCREEN_WIDTH - 1, SCREEN_HEIGHT - 1
+ dw .Items
+ db 1 ; default option
+
+.Items:
+ db STATICMENU_CURSOR ; flags
+ db 2 ; # items
+ db "GIVE@"
+ db "TAKE@"
+
+PokemonSwapItemText:
+ text_far _PokemonSwapItemText
+ text_end
+
+PokemonHoldItemText:
+ text_far _PokemonHoldItemText
+ text_end
+
+PokemonRemoveMailText:
+ text_far _PokemonRemoveMailText
+ text_end
+
+PokemonNotHoldingText:
+ text_far _PokemonNotHoldingText
+ text_end
+
+ItemStorageFullText:
+ text_far _ItemStorageFullText
+ text_end
+
+PokemonTookItemText:
+ text_far _PokemonTookItemText
+ text_end
+
+PokemonAskSwapItemText:
+ text_far _PokemonAskSwapItemText
+ text_end
+
+ItemCantHeldText:
+ text_far _ItemCantHeldText
+ text_end
+
+GetPartyItemLocation:
+ push af
+ ld a, MON_ITEM
+ call GetPartyParamLocation
+ pop af
+ ret
+
+ReceiveItemFromPokemon:
+ ld a, 1
+ ld [wItemQuantityChangeBuffer], a
+ ld hl, wNumItems
+ jp ReceiveItem
+
+GiveItemToPokemon:
+ ld a, 1
+ ld [wItemQuantityChangeBuffer], a
+ ld hl, wNumItems
+ jp TossItem
+
+StartMenuYesNo:
+ call MenuTextbox
+ call YesNoBox
+ jp ExitMenu
+
+ComposeMailMessage:
+ ld de, wTempMailMessage
+ farcall _ComposeMailMessage
+ ld hl, wPlayerName
+ ld de, wTempMailAuthor
+ ld bc, NAME_LENGTH - 1
+ call CopyBytes
+ ld hl, wPlayerID
+ ld bc, 2
+ call CopyBytes
+ ld a, [wCurPartySpecies]
+ ld [de], a
+ inc de
+ ld a, [wCurItem]
+ ld [de], a
+ ld a, [wCurPartyMon]
+ ld hl, sPartyMail
+ ld bc, MAIL_STRUCT_LENGTH
+ call AddNTimes
+ ld d, h
+ ld e, l
+ ld hl, wTempMail
+ ld bc, MAIL_STRUCT_LENGTH
+ ld a, BANK(sPartyMail)
+ call OpenSRAM
+ call CopyBytes
+ call CloseSRAM
+ ret
+
+MonMailAction:
+; If in the time capsule or trade center,
+; selecting the mail only allows you to
+; read the mail.
+ ld a, [wLinkMode]
+ cp LINK_TIMECAPSULE
+ jr z, .read
+ cp LINK_TRADECENTER
+ jr z, .read
+
+; Show the READ/TAKE/QUIT menu.
+ ld hl, .MenuHeader
+ call LoadMenuHeader
+ call VerticalMenu
+ call ExitMenu
+
+; Interpret the menu.
+ jp c, .done
+ ld a, [wMenuCursorY]
+ cp $1
+ jr z, .read
+ cp $2
+ jr z, .take
+ jp .done
+
+.read
+ farcall ReadPartyMonMail
+ ld a, $0
+ ret
+
+.take
+ ld hl, .MailAskSendToPCText
+ call StartMenuYesNo
+ jr c, .RemoveMailToBag
+ ld a, [wCurPartyMon]
+ ld b, a
+ farcall SendMailToPC
+ jr c, .MailboxFull
+ ld hl, .MailSentToPCText
+ call MenuTextboxBackup
+ jr .done
+
+.MailboxFull:
+ ld hl, .MailboxFullText
+ call MenuTextboxBackup
+ jr .done
+
+.RemoveMailToBag:
+ ld hl, .MailLoseMessageText
+ call StartMenuYesNo
+ jr c, .done
+ call GetPartyItemLocation
+ ld a, [hl]
+ ld [wCurItem], a
+ call ReceiveItemFromPokemon
+ jr nc, .BagIsFull
+ call GetPartyItemLocation
+ ld [hl], $0
+ call GetCurNick
+ ld hl, .MailDetachedText
+ call MenuTextboxBackup
+ jr .done
+
+.BagIsFull:
+ ld hl, .MailNoSpaceText
+ call MenuTextboxBackup
+ jr .done
+
+.done
+ ld a, $3
+ ret
+
+.MenuHeader:
+ db MENU_BACKUP_TILES ; flags
+ menu_coords 9, 10, SCREEN_WIDTH - 1, SCREEN_HEIGHT - 1
+ dw .MenuData
+ db 1 ; default option
+
+.MenuData:
+ db STATICMENU_CURSOR ; flags
+ db 3 ; items
+ db "READ@"
+ db "TAKE@"
+ db "QUIT@"
+
+.MailLoseMessageText:
+ text_far _MailLoseMessageText
+ text_end
+
+.MailDetachedText:
+ text_far _MailDetachedText
+ text_end
+
+.MailNoSpaceText:
+ text_far _MailNoSpaceText
+ text_end
+
+.MailAskSendToPCText:
+ text_far _MailAskSendToPCText
+ text_end
+
+.MailboxFullText:
+ text_far _MailboxFullText
+ text_end
+
+.MailSentToPCText:
+ text_far _MailSentToPCText
+ text_end
+
+OpenPartyStats:
+ call LoadStandardMenuHeader
+ call ClearSprites
+; PartyMon
+ xor a
+ ld [wMonType], a
+ call LowVolume
+ predef StatsScreenInit
+ call MaxVolume
+ call Call_ExitMenu
+ ld a, 0
+ ret
+
+MonMenu_Cut:
+ farcall CutFunction
+ ld a, [wFieldMoveSucceeded]
+ cp $1
+ jr nz, .Fail
+ ld b, $4
+ ld a, $2
+ ret
+
+.Fail:
+ ld a, $3
+ ret
+
+MonMenu_Fly:
+ farcall FlyFunction
+ ld a, [wFieldMoveSucceeded]
+ cp $2
+ jr z, .Fail
+ cp $0
+ jr z, .Error
+ ;farcall StubbedTrainerRankings_Fly
+ ld b, $4
+ ld a, $2
+ ret
+
+.Fail:
+ ld a, $3
+ ret
+
+.Error:
+ ld a, $0
+ ret
+
+.Unreferenced:
+ ld a, $1
+ ret
+
+MonMenu_Flash:
+ farcall FlashFunction
+ ld a, [wFieldMoveSucceeded]
+ cp $1
+ jr nz, .Fail
+ ld b, $4
+ ld a, $2
+ ret
+
+.Fail:
+ ld a, $3
+ ret
+
+MonMenu_Strength:
+ farcall StrengthFunction
+ ld a, [wFieldMoveSucceeded]
+ cp $1
+ jr nz, .Fail
+ ld b, $4
+ ld a, $2
+ ret
+
+.Fail:
+ ld a, $3
+ ret
+
+MonMenu_Whirlpool:
+ farcall WhirlpoolFunction
+ ld a, [wFieldMoveSucceeded]
+ cp $1
+ jr nz, .Fail
+ ld b, $4
+ ld a, $2
+ ret
+
+.Fail:
+ ld a, $3
+ ret
+
+MonMenu_Waterfall:
+ farcall WaterfallFunction
+ ld a, [wFieldMoveSucceeded]
+ cp $1
+ jr nz, .Fail
+ ld b, $4
+ ld a, $2
+ ret
+
+.Fail:
+ ld a, $3
+ ret
+
+MonMenu_Teleport:
+ farcall TeleportFunction
+ ld a, [wFieldMoveSucceeded]
+ and a
+ jr z, .Fail
+ ld b, $4
+ ld a, $2
+ ret
+
+.Fail:
+ ld a, $3
+ ret
+
+MonMenu_Surf:
+ farcall SurfFunction
+ ld a, [wFieldMoveSucceeded]
+ and a
+ jr z, .Fail
+ ld b, $4
+ ld a, $2
+ ret
+
+.Fail:
+ ld a, $3
+ ret
+
+MonMenu_Dig:
+ farcall DigFunction
+ ld a, [wFieldMoveSucceeded]
+ cp $1
+ jr nz, .Fail
+ ld b, $4
+ ld a, $2
+ ret
+
+.Fail:
+ ld a, $3
+ ret
+
+MonMenu_Softboiled_MilkDrink:
+ call .CheckMonHasEnoughHP
+ jr nc, .NotEnoughHP
+ farcall Softboiled_MilkDrinkFunction
+ jr .finish
+
+.NotEnoughHP:
+ ld hl, .PokemonNotEnoughHPText
+ call PrintText
+
+.finish
+ xor a
+ ld [wPartyMenuActionText], a
+ ld a, $3
+ ret
+
+.PokemonNotEnoughHPText:
+ text_far _PokemonNotEnoughHPText
+ text_end
+
+.CheckMonHasEnoughHP:
+; Need to have at least (MaxHP / 5) HP left.
+ ld a, MON_MAXHP
+ call GetPartyParamLocation
+ ld a, [hli]
+ ldh [hDividend + 0], a
+ ld a, [hl]
+ ldh [hDividend + 1], a
+ ld a, 5
+ ldh [hDivisor], a
+ ld b, 2
+ call Divide
+ ld a, MON_HP + 1
+ call GetPartyParamLocation
+ ldh a, [hQuotient + 2]
+ sub [hl]
+ dec hl
+ ldh a, [hQuotient + 1]
+ sbc [hl]
+ ret
+
+MonMenu_Headbutt:
+ farcall HeadbuttFunction
+ ld a, [wFieldMoveSucceeded]
+ cp $1
+ jr nz, .Fail
+ ld b, $4
+ ld a, $2
+ ret
+
+.Fail:
+ ld a, $3
+ ret
+
+MonMenu_RockSmash:
+ farcall RockSmashFunction
+ ld a, [wFieldMoveSucceeded]
+ cp $1
+ jr nz, .Fail
+ ld b, $4
+ ld a, $2
+ ret
+
+.Fail:
+ ld a, $3
+ ret
+
+MonMenu_SweetScent:
+ farcall SweetScentFromMenu
+ ld b, $4
+ ld a, $2
+ ret
+
+ChooseMoveToDelete:
+ ld hl, wOptions
+ ld a, [hl]
+ push af
+ set NO_TEXT_SCROLL, [hl]
+ call LoadFontsBattleExtra
+ call .ChooseMoveToDelete
+ pop bc
+ ld a, b
+ ld [wOptions], a
+ push af
+ call ClearBGPalettes
+ pop af
+ ret
+
+.ChooseMoveToDelete
+ call SetUpMoveScreenBG
+ ld de, DeleteMoveScreenAttrs
+ call SetMenuAttributes
+ call SetUpMoveList
+ ld hl, w2DMenuFlags1
+ set 6, [hl]
+ jr .enter_loop
+
+.loop
+ call ScrollingMenuJoypad
+ bit B_BUTTON_F, a
+ jp nz, .b_button
+ bit A_BUTTON_F, a
+ jp nz, .a_button
+
+.enter_loop
+ call PrepareToPlaceMoveData
+ call PlaceMoveData
+ jp .loop
+
+.a_button
+ and a
+ jr .finish
+
+.b_button
+ scf
+
+.finish
+ push af
+ xor a
+ ld [wSwitchMon], a
+ ld hl, w2DMenuFlags1
+ res 6, [hl]
+ call ClearSprites
+ call ClearTilemap
+ pop af
+ ret
+
+DeleteMoveScreenAttrs:
+ db 3, 1
+ db 3, 1
+ db $40, $00
+ dn 2, 0
+ db D_UP | D_DOWN | A_BUTTON | B_BUTTON
+
+ManagePokemonMoves:
+ ld a, [wCurPartySpecies]
+ cp EGG
+ jr z, .egg
+ ld hl, wOptions
+ ld a, [hl]
+ push af
+ set NO_TEXT_SCROLL, [hl]
+ call MoveScreenLoop
+ pop af
+ ld [wOptions], a
+ call ClearBGPalettes
+
+.egg
+ ld a, $0
+ ret
+
+MoveScreenLoop:
+ ld a, [wCurPartyMon]
+ inc a
+ ld [wPartyMenuCursor], a
+ call SetUpMoveScreenBG
+ call PlaceMoveScreenArrows
+ ld de, MoveScreenAttributes
+ call SetMenuAttributes
+.loop
+ call SetUpMoveList
+ ld hl, w2DMenuFlags1
+ set 6, [hl]
+ jr .skip_joy
+
+.joy_loop
+ call ScrollingMenuJoypad
+ bit 1, a
+ jp nz, .b_button
+ bit 0, a
+ jp nz, .a_button
+ bit 4, a
+ jp nz, .d_right
+ bit 5, a
+ jp nz, .d_left
+
+.skip_joy
+ call PrepareToPlaceMoveData
+ ld a, [wMoveSwapBuffer]
+ and a
+ jr nz, .moving_move
+ call PlaceMoveData
+ jp .joy_loop
+
+.moving_move
+ ld a, " "
+ hlcoord 1, 11
+ ld bc, 5
+ call ByteFill
+ hlcoord 1, 12
+ lb bc, 5, SCREEN_WIDTH - 2
+ call ClearBox
+ hlcoord 1, 12
+ ld de, String_MoveWhere
+ call PlaceString
+ jp .joy_loop
+.b_button
+ call PlayClickSFX
+ call WaitSFX
+ ld a, [wMoveSwapBuffer]
+ and a
+ jp z, .exit
+
+ ld a, [wMoveSwapBuffer]
+ ld [wMenuCursorY], a
+ xor a
+ ld [wMoveSwapBuffer], a
+ hlcoord 1, 2
+ lb bc, 8, SCREEN_WIDTH - 2
+ call ClearBox
+ jp .loop
+
+.d_right
+ ld a, [wMoveSwapBuffer]
+ and a
+ jp nz, .joy_loop
+
+ ld a, [wCurPartyMon]
+ ld b, a
+ push bc
+ call .cycle_right
+ pop bc
+ ld a, [wCurPartyMon]
+ cp b
+ jp z, .joy_loop
+ jp MoveScreenLoop
+
+.d_left
+ ld a, [wMoveSwapBuffer]
+ and a
+ jp nz, .joy_loop
+ ld a, [wCurPartyMon]
+ ld b, a
+ push bc
+ call .cycle_left
+ pop bc
+ ld a, [wCurPartyMon]
+ cp b
+ jp z, .joy_loop
+ jp MoveScreenLoop
+
+.cycle_right
+ ld a, [wCurPartyMon]
+ inc a
+ ld [wCurPartyMon], a
+ ld c, a
+ ld b, 0
+ ld hl, wPartySpecies
+ add hl, bc
+ ld a, [hl]
+ cp -1
+ jr z, .cycle_left
+ cp EGG
+ ret nz
+ jr .cycle_right
+
+.cycle_left
+ ld a, [wCurPartyMon]
+ and a
+ ret z
+.cycle_left_loop
+ ld a, [wCurPartyMon]
+ dec a
+ ld [wCurPartyMon], a
+ ld c, a
+ ld b, 0
+ ld hl, wPartySpecies
+ add hl, bc
+ ld a, [hl]
+ cp EGG
+ ret nz
+ ld a, [wCurPartyMon]
+ and a
+ jr z, .cycle_right
+ jr .cycle_left_loop
+
+.a_button
+ call PlayClickSFX
+ call WaitSFX
+ ld a, [wMoveSwapBuffer]
+ and a
+ jr nz, .place_move
+ ld a, [wMenuCursorY]
+ ld [wMoveSwapBuffer], a
+ call PlaceHollowCursor
+ jp .moving_move
+
+.place_move
+ ld hl, wPartyMon1Moves
+ ld bc, PARTYMON_STRUCT_LENGTH
+ ld a, [wCurPartyMon]
+ call AddNTimes
+ push hl
+ call .copy_move
+ pop hl
+ ld bc, $15
+ add hl, bc
+ call .copy_move
+ ld a, [wBattleMode]
+ jr z, .swap_moves
+ ld hl, wBattleMonMoves
+ ld bc, $20
+ ld a, [wCurPartyMon]
+ call AddNTimes
+ push hl
+ call .copy_move
+ pop hl
+ ld bc, 6
+ add hl, bc
+ call .copy_move
+
+.swap_moves
+ ld de, SFX_SWITCH_POKEMON
+ call PlaySFX
+ call WaitSFX
+ ld de, SFX_SWITCH_POKEMON
+ call PlaySFX
+ call WaitSFX
+ hlcoord 1, 2
+ lb bc, 8, 18
+ call ClearBox
+ hlcoord 10, 10
+ lb bc, 1, 9
+ call ClearBox
+ jp .loop
+
+.copy_move
+ push hl
+ ld a, [wMenuCursorY]
+ dec a
+ ld c, a
+ ld b, $0
+ add hl, bc
+ ld d, h
+ ld e, l
+ pop hl
+ ld a, [wMoveSwapBuffer]
+ dec a
+ ld c, a
+ ld b, $0
+ add hl, bc
+ ld a, [de]
+ ld b, [hl]
+ ld [hl], a
+ ld a, b
+ ld [de], a
+ ret
+
+.exit
+ xor a
+ ld [wMoveSwapBuffer], a
+ ld hl, w2DMenuFlags1
+ res 6, [hl]
+ call ClearSprites
+ jp ClearTilemap
+
+MoveScreenAttributes:
+ db 3, 1
+ db 3, 1
+ db $40, $00
+ dn 2, 0
+ db D_UP | D_DOWN | D_LEFT | D_RIGHT | A_BUTTON | B_BUTTON
+
+String_MoveWhere:
+ db "Where?@"
+
+SetUpMoveScreenBG:
+ call ClearBGPalettes
+ call ClearTilemap
+ call ClearSprites
+ xor a
+ ldh [hBGMapMode], a
+ farcall LoadStatsScreenPageTilesGFX
+ farcall ClearSpriteAnims2
+ ld a, [wCurPartyMon]
+ ld e, a
+ ld d, $0
+ ld hl, wPartySpecies
+ add hl, de
+ ld a, [hl]
+ ld [wTempIconSpecies], a
+ ld e, MONICON_MOVES
+ farcall LoadMenuMonIcon
+ hlcoord 0, 1
+ ld b, 9
+ ld c, 18
+ call Textbox
+ hlcoord 0, 11
+ ld b, 5
+ ld c, 18
+ call Textbox
+ hlcoord 2, 0
+ lb bc, 2, 3
+ call ClearBox
+ xor a
+ ld [wMonType], a
+ ld hl, wPartyMonNicknames
+ ld a, [wCurPartyMon]
+ call GetNick
+ hlcoord 5, 1
+ call PlaceString
+ push bc
+ farcall CopyMonToTempMon
+ pop hl
+ call PrintLevel
+ ld hl, wPlayerHPPal
+ call SetHPPal
+ ld b, SCGB_MOVE_LIST
+ call GetSGBLayout
+ hlcoord 16, 0
+ lb bc, 1, 3
+ jp ClearBox
+
+SetUpMoveList:
+ xor a
+ ldh [hBGMapMode], a
+ ld [wMoveSwapBuffer], a
+ ld [wMonType], a
+ predef CopyMonToTempMon
+ ld hl, wTempMonMoves
+ ld de, wListMoves_MoveIndicesBuffer
+ ld bc, NUM_MOVES
+ call CopyBytes
+ ld a, SCREEN_WIDTH * 2
+ ld [wBuffer1], a
+ hlcoord 2, 3
+ predef ListMoves
+ hlcoord 10, 4
+ predef ListMovePP
+ call WaitBGMap
+ call SetPalettes
+ ld a, [wNumMoves]
+ inc a
+ ld [w2DMenuNumRows], a
+ hlcoord 0, 11
+ ld b, 5
+ ld c, 18
+ jp Textbox
+
+PrepareToPlaceMoveData:
+ ld hl, wPartyMon1Moves
+ ld bc, PARTYMON_STRUCT_LENGTH
+ ld a, [wCurPartyMon]
+ call AddNTimes
+ ld a, [wMenuCursorY]
+ dec a
+ ld c, a
+ ld b, $0
+ add hl, bc
+ ld a, [hl]
+ ld [wCurSpecies], a
+ hlcoord 1, 12
+ lb bc, 5, 18
+ jp ClearBox
+
+PlaceMoveData:
+ xor a
+ ldh [hBGMapMode], a
+ hlcoord 0, 10
+ ld de, String_MoveType_Top
+ call PlaceString
+ hlcoord 0, 11
+ ld de, String_MoveType_Bottom
+ call PlaceString
+ hlcoord 11, 12
+ ld de, String_MoveAtk
+ call PlaceString
+ ld a, [wCurSpecies]
+ ld b, a
+ hlcoord 2, 12
+ predef PrintMoveType
+ ld a, [wCurSpecies]
+ dec a
+ ld hl, Moves + MOVE_POWER
+ ld bc, MOVE_LENGTH
+ call AddNTimes
+ ld a, BANK(Moves)
+ call GetFarByte
+ hlcoord 16, 12
+ cp 2
+ jr c, .no_power
+ ld [wDeciramBuffer], a
+ ld de, wDeciramBuffer
+ lb bc, 1, 3
+ call PrintNum
+ jr .description
+
+.no_power
+ ld de, String_MoveNoPower
+ call PlaceString
+
+.description
+ hlcoord 1, 14
+ predef PrintMoveDesc
+ ld a, $1
+ ldh [hBGMapMode], a
+ ret
+
+String_MoveType_Top:
+ db "┌─────┐@"
+String_MoveType_Bottom:
+ db "│TYPE/└@"
+String_MoveAtk:
+ db "ATTK/@"
+String_MoveNoPower:
+ db "---@"
+
+PlaceMoveScreenArrows:
+ call PlaceMoveScreenLeftArrow
+ call PlaceMoveScreenRightArrow
+ ret
+
+PlaceMoveScreenLeftArrow:
+ ld a, [wCurPartyMon]
+ and a
+ ret z
+ ld c, a
+ ld e, a
+ ld d, 0
+ ld hl, wPartyCount
+ add hl, de
+.loop
+ ld a, [hl]
+ and a
+ jr z, .prev
+ cp EGG
+ jr z, .prev
+ cp NUM_POKEMON + 1
+ jr c, .legal
+
+.prev
+ dec hl
+ dec c
+ jr nz, .loop
+ ret
+
+.legal
+ hlcoord 16, 0
+ ld [hl], "◀"
+ ret
+
+PlaceMoveScreenRightArrow:
+ ld a, [wCurPartyMon]
+ inc a
+ ld c, a
+ ld a, [wPartyCount]
+ cp c
+ ret z
+ ld e, c
+ ld d, 0
+ ld hl, wPartySpecies
+ add hl, de
+.loop
+ ld a, [hl]
+ cp -1
+ ret z
+ and a
+ jr z, .next
+ cp EGG
+ jr z, .next
+ cp NUM_POKEMON + 1
+ jr c, .legal
+
+.next
+ inc hl
+ jr .loop
+
+.legal
+ hlcoord 18, 0
+ ld [hl], "▶"
+ ret
diff --git a/engine/specials.asm b/engine/specials.asm
index ad6c2085..bb0086bf 100755
--- a/engine/specials.asm
+++ b/engine/specials.asm
@@ -269,7 +269,7 @@ GetMysteryGiftItem: ; c463 (3:4463)
ld a, $0
call OpenSRAM
ld a, [$abe2]
- ld [wd002], a
+ ld [wCurItem], a
ld a, $1
ld [wItemQuantityChangeBuffer], a
ld hl, wNumItems
@@ -278,7 +278,7 @@ GetMysteryGiftItem: ; c463 (3:4463)
xor a
ld [$abe2], a
call CloseSRAM
- ld a, [wd002]
+ ld a, [wCurItem]
ld [wd151], a
call GetItemName
ld hl, ReceivedMysteryGiftText ; $449f
@@ -361,7 +361,7 @@ Functionc508: ; c508 (3:4508)
or [hl]
jr z, .asm_c51e
ld a, COIN_CASE
- ld [wd002], a
+ ld [wCurItem], a
ld hl, wNumItems
call CheckItem
jr nc, .asm_c523
@@ -472,7 +472,7 @@ SelectApricornForKurt: ; c5bb (3:45bb)
ld [wScriptVar], a
and a
ret z
- ld [wd002], a
+ ld [wCurItem], a
ld a, $1
ld [wItemQuantityChangeBuffer], a
ld hl, wNumItems