diff options
Diffstat (limited to 'engine')
-rw-r--r-- | engine/billspctop.asm | 2 | ||||
-rw-r--r-- | engine/events/elevator.asm | 215 | ||||
-rwxr-xr-x | engine/events/misc_scripts.asm | 8 | ||||
-rwxr-xr-x | engine/events/misc_scripts_2.asm | 4 | ||||
-rwxr-xr-x | engine/events/overworld.asm | 4 | ||||
-rwxr-xr-x | engine/events/std_collision.asm | 8 | ||||
-rw-r--r-- | engine/events/sweet_scent.asm | 66 | ||||
-rwxr-xr-x | engine/items.asm | 30 | ||||
-rw-r--r-- | engine/learn.asm | 18 | ||||
-rwxr-xr-x | engine/learn_tm.asm | 2 | ||||
-rw-r--r-- | engine/menus/start_menu.asm | 541 | ||||
-rwxr-xr-x | engine/move_mon.asm | 10 | ||||
-rw-r--r-- | engine/namingscreen.asm | 2 | ||||
-rwxr-xr-x | engine/overworld/map_objects.asm | 2 | ||||
-rwxr-xr-x | engine/overworld/player_movement.asm | 88 | ||||
-rwxr-xr-x | engine/overworld/player_object.asm | 2 | ||||
-rw-r--r-- | engine/overworld/select_menu.asm | 172 | ||||
-rwxr-xr-x | engine/pack.asm | 81 | ||||
-rw-r--r-- | engine/pokemon/mon_menu.asm | 1294 | ||||
-rwxr-xr-x | engine/specials.asm | 8 |
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 |