123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855 |
- StartMenu_Pokedex:
- predef ShowPokedexMenu
- call LoadScreenTilesFromBuffer2 ; restore saved screen
- call Delay3
- call LoadGBPal
- call UpdateSprites
- jp RedisplayStartMenu
- StartMenu_Pokemon:
- ld a, [wPartyCount]
- and a
- jp z, RedisplayStartMenu
- xor a
- ld [wMenuItemToSwap], a
- ld [wPartyMenuTypeOrMessageID], a
- ld [wUpdateSpritesEnabled], a
- call DisplayPartyMenu
- jr .checkIfPokemonChosen
- .loop
- xor a
- ld [wMenuItemToSwap], a
- ld [wPartyMenuTypeOrMessageID], a
- call GoBackToPartyMenu
- .checkIfPokemonChosen
- jr nc, .chosePokemon
- .exitMenu
- call GBPalWhiteOutWithDelay3
- call RestoreScreenTilesAndReloadTilePatterns
- call LoadGBPal
- jp RedisplayStartMenu
- .chosePokemon
- call SaveScreenTilesToBuffer1
- ld a, FIELD_MOVE_MON_MENU
- ld [wTextBoxID], a
- call DisplayTextBoxID ; display pokemon menu options
- ld hl, wFieldMoves
- lb bc, 2, 12 ; max menu item ID, top menu item Y
- ld e, 5
- .adjustMenuVariablesLoop
- dec e
- jr z, .storeMenuVariables
- ld a, [hli]
- and a ; end of field moves?
- jr z, .storeMenuVariables
- inc b
- dec c
- dec c
- jr .adjustMenuVariablesLoop
- .storeMenuVariables
- ld hl, wTopMenuItemY
- ld a, c
- ld [hli], a ; top menu item Y
- ld a, [hFieldMoveMonMenuTopMenuItemX]
- ld [hli], a ; top menu item X
- xor a
- ld [hli], a ; current menu item ID
- inc hl
- ld a, b
- ld [hli], a ; max menu item ID
- ld a, A_BUTTON | B_BUTTON
- ld [hli], a ; menu watched keys
- xor a
- ld [hl], a
- call HandleMenuInput
- push af
- call LoadScreenTilesFromBuffer1 ; restore saved screen
- pop af
- bit 1, a ; was the B button pressed?
- jp nz, .loop
- ; if the B button wasn't pressed
- ld a, [wMaxMenuItem]
- ld b, a
- ld a, [wCurrentMenuItem] ; menu selection
- cp b
- jp z, .exitMenu ; if the player chose Cancel
- dec b
- cp b
- jr z, .choseSwitch
- dec b
- cp b
- jp z, .choseStats
- ld c, a
- ld b, 0
- ld hl, wFieldMoves
- add hl, bc
- jp .choseOutOfBattleMove
- .choseSwitch
- ld a, [wPartyCount]
- cp 2 ; is there more than one pokemon in the party?
- jp c, StartMenu_Pokemon ; if not, no switching
- call SwitchPartyMon_InitVarOrSwapData ; init [wMenuItemToSwap]
- ld a, SWAP_MONS_PARTY_MENU
- ld [wPartyMenuTypeOrMessageID], a
- call GoBackToPartyMenu
- jp .checkIfPokemonChosen
- .choseStats
- call ClearSprites
- xor a ; PLAYER_PARTY_DATA
- ld [wMonDataLocation], a
- predef StatusScreen
- predef StatusScreen2
- call ReloadMapData
- jp StartMenu_Pokemon
- .choseOutOfBattleMove
- push hl
- ld a, [wWhichPokemon]
- ld hl, wPartyMonNicks
- call GetPartyMonName
- pop hl
- ld a, [hl]
- dec a
- add a
- ld b, 0
- ld c, a
- ld hl, .outOfBattleMovePointers
- add hl, bc
- ld a, [hli]
- ld h, [hl]
- ld l, a
- ld a, [wObtainedBadges] ; badges obtained
- jp hl
- .outOfBattleMovePointers
- dw .cut
- dw .fly
- dw .surf
- dw .surf
- dw .strength
- dw .flash
- dw .dig
- dw .teleport
- dw .softboiled
- .fly
- bit 2, a ; does the player have the Thunder Badge?
- jp z, .newBadgeRequired
- call CheckIfInOutsideMap
- jr z, .canFly
- ld a, [wWhichPokemon]
- ld hl, wPartyMonNicks
- call GetPartyMonName
- ld hl, .cannotFlyHereText
- call PrintText
- jp .loop
- .canFly
- call ChooseFlyDestination
- ld a, [wd732]
- bit 3, a ; did the player decide to fly?
- jp nz, .goBackToMap
- call LoadFontTilePatterns
- ld hl, wd72e
- set 1, [hl]
- jp StartMenu_Pokemon
- .cut
- bit 1, a ; does the player have the Cascade Badge?
- jp z, .newBadgeRequired
- predef UsedCut
- ld a, [wActionResultOrTookBattleTurn]
- and a
- jp z, .loop
- jp CloseTextDisplay
- .surf
- bit 4, a ; does the player have the Soul Badge?
- jp z, .newBadgeRequired
- callba IsSurfingAllowed
- ld hl, wd728
- bit 1, [hl]
- res 1, [hl]
- jp z, .loop
- ld a, SURFBOARD
- ld [wcf91], a
- ld [wPseudoItemID], a
- call UseItem
- ld a, [wActionResultOrTookBattleTurn]
- and a
- jp z, .loop
- call GBPalWhiteOutWithDelay3
- jp .goBackToMap
- .strength
- bit 3, a ; does the player have the Rainbow Badge?
- jp z, .newBadgeRequired
- predef PrintStrengthTxt
- call GBPalWhiteOutWithDelay3
- jp .goBackToMap
- .flash
- bit 0, a ; does the player have the Boulder Badge?
- jp z, .newBadgeRequired
- xor a
- ld [wMapPalOffset], a
- ld hl, .flashLightsAreaText
- call PrintText
- call GBPalWhiteOutWithDelay3
- jp .goBackToMap
- .flashLightsAreaText
- TX_FAR _FlashLightsAreaText
- db "@"
- .dig
- ld a, ESCAPE_ROPE
- ld [wcf91], a
- ld [wPseudoItemID], a
- call UseItem
- ld a, [wActionResultOrTookBattleTurn]
- and a
- jp z, .loop
- call GBPalWhiteOutWithDelay3
- jp .goBackToMap
- .teleport
- call CheckIfInOutsideMap
- jr z, .canTeleport
- ld a, [wWhichPokemon]
- ld hl, wPartyMonNicks
- call GetPartyMonName
- ld hl, .cannotUseTeleportNowText
- call PrintText
- jp .loop
- .canTeleport
- ld hl, .warpToLastPokemonCenterText
- call PrintText
- ld hl, wd732
- set 3, [hl]
- set 6, [hl]
- ld hl, wd72e
- set 1, [hl]
- res 4, [hl]
- ld c, 60
- call DelayFrames
- call GBPalWhiteOutWithDelay3
- jp .goBackToMap
- .warpToLastPokemonCenterText
- TX_FAR _WarpToLastPokemonCenterText
- db "@"
- .cannotUseTeleportNowText
- TX_FAR _CannotUseTeleportNowText
- db "@"
- .cannotFlyHereText
- TX_FAR _CannotFlyHereText
- db "@"
- .softboiled
- ld hl, wPartyMon1MaxHP
- ld a, [wWhichPokemon]
- ld bc, wPartyMon2 - wPartyMon1
- call AddNTimes
- ld a, [hli]
- ld [H_DIVIDEND], a
- ld a, [hl]
- ld [H_DIVIDEND + 1], a
- ld a, 5
- ld [H_DIVISOR], a
- ld b, 2 ; number of bytes
- call Divide
- ld bc, wPartyMon1HP - wPartyMon1MaxHP
- add hl, bc
- ld a, [hld]
- ld b, a
- ld a, [H_QUOTIENT + 3]
- sub b
- ld b, [hl]
- ld a, [H_QUOTIENT + 2]
- sbc b
- jp nc, .notHealthyEnough
- ld a, [wPartyAndBillsPCSavedMenuItem]
- push af
- ld a, POTION
- ld [wcf91], a
- ld [wPseudoItemID], a
- call UseItem
- pop af
- ld [wPartyAndBillsPCSavedMenuItem], a
- jp .loop
- .notHealthyEnough ; if current HP is less than 1/5 of max HP
- ld hl, .notHealthyEnoughText
- call PrintText
- jp .loop
- .notHealthyEnoughText
- TX_FAR _NotHealthyEnoughText
- db "@"
- .goBackToMap
- call RestoreScreenTilesAndReloadTilePatterns
- jp CloseTextDisplay
- .newBadgeRequired
- ld hl, .newBadgeRequiredText
- call PrintText
- jp .loop
- .newBadgeRequiredText
- TX_FAR _NewBadgeRequiredText
- db "@"
- ; writes a blank tile to all possible menu cursor positions on the party menu
- ErasePartyMenuCursors:
- coord hl, 0, 1
- ld bc, 2 * 20 ; menu cursor positions are 2 rows apart
- ld a, 6 ; 6 menu cursor positions
- .loop
- ld [hl], " "
- add hl, bc
- dec a
- jr nz, .loop
- ret
- ItemMenuLoop:
- call LoadScreenTilesFromBuffer2DisableBGTransfer ; restore saved screen
- call RunDefaultPaletteCommand
- StartMenu_Item:
- ld a, [wLinkState]
- dec a ; is the player in the Colosseum or Trade Centre?
- jr nz, .notInCableClubRoom
- ld hl, CannotUseItemsHereText
- call PrintText
- jr .exitMenu
- .notInCableClubRoom
- ld bc, wNumBagItems
- ld hl, wListPointer
- ld a, c
- ld [hli], a
- ld [hl], b ; store item bag pointer in wListPointer (for DisplayListMenuID)
- xor a
- ld [wPrintItemPrices], a
- ld a, ITEMLISTMENU
- ld [wListMenuID], a
- ld a, [wBagSavedMenuItem]
- ld [wCurrentMenuItem], a
- call DisplayListMenuID
- ld a, [wCurrentMenuItem]
- ld [wBagSavedMenuItem], a
- jr nc, .choseItem
- .exitMenu
- call LoadScreenTilesFromBuffer2 ; restore saved screen
- call LoadTextBoxTilePatterns
- call UpdateSprites
- jp RedisplayStartMenu
- .choseItem
- ; erase menu cursor (blank each tile in front of an item name)
- ld a, " "
- Coorda 5, 4
- Coorda 5, 6
- Coorda 5, 8
- Coorda 5, 10
- call PlaceUnfilledArrowMenuCursor
- xor a
- ld [wMenuItemToSwap], a
- ld a, [wcf91]
- cp BICYCLE
- jp z, .useOrTossItem
- .notBicycle1
- ld a, USE_TOSS_MENU_TEMPLATE
- ld [wTextBoxID], a
- call DisplayTextBoxID
- ld hl, wTopMenuItemY
- ld a, 11
- ld [hli], a ; top menu item Y
- ld a, 14
- ld [hli], a ; top menu item X
- xor a
- ld [hli], a ; current menu item ID
- inc hl
- inc a ; a = 1
- ld [hli], a ; max menu item ID
- ld a, A_BUTTON | B_BUTTON
- ld [hli], a ; menu watched keys
- xor a
- ld [hl], a ; old menu item id
- call HandleMenuInput
- call PlaceUnfilledArrowMenuCursor
- bit 1, a ; was the B button pressed?
- jr z, .useOrTossItem
- jp ItemMenuLoop
- .useOrTossItem ; if the player made the choice to use or toss the item
- ld a, [wcf91]
- ld [wd11e], a
- call GetItemName
- call CopyStringToCF4B ; copy name to wcf4b
- ld a, [wcf91]
- cp BICYCLE
- jr nz, .notBicycle2
- ld a, [wd732]
- bit 5, a
- jr z, .useItem_closeMenu
- ld hl, CannotGetOffHereText
- call PrintText
- jp ItemMenuLoop
- .notBicycle2
- ld a, [wCurrentMenuItem]
- and a
- jr nz, .tossItem
- ; use item
- ld [wPseudoItemID], a ; a must be 0 due to above conditional jump
- ld a, [wcf91]
- cp HM_01
- jr nc, .useItem_partyMenu
- ld hl, UsableItems_CloseMenu
- ld de, 1
- call IsInArray
- jr c, .useItem_closeMenu
- ld a, [wcf91]
- ld hl, UsableItems_PartyMenu
- ld de, 1
- call IsInArray
- jr c, .useItem_partyMenu
- call UseItem
- jp ItemMenuLoop
- .useItem_closeMenu
- xor a
- ld [wPseudoItemID], a
- call UseItem
- ld a, [wActionResultOrTookBattleTurn]
- and a
- jp z, ItemMenuLoop
- jp CloseStartMenu
- .useItem_partyMenu
- ld a, [wUpdateSpritesEnabled]
- push af
- call UseItem
- ld a, [wActionResultOrTookBattleTurn]
- cp $02
- jp z, .partyMenuNotDisplayed
- call GBPalWhiteOutWithDelay3
- call RestoreScreenTilesAndReloadTilePatterns
- pop af
- ld [wUpdateSpritesEnabled], a
- jp StartMenu_Item
- .partyMenuNotDisplayed
- pop af
- ld [wUpdateSpritesEnabled], a
- jp ItemMenuLoop
- .tossItem
- call IsKeyItem
- ld a, [wIsKeyItem]
- and a
- jr nz, .skipAskingQuantity
- ld a, [wcf91]
- call IsItemHM
- jr c, .skipAskingQuantity
- call DisplayChooseQuantityMenu
- inc a
- jr z, .tossZeroItems
- .skipAskingQuantity
- ld hl, wNumBagItems
- call TossItem
- .tossZeroItems
- jp ItemMenuLoop
- CannotUseItemsHereText:
- TX_FAR _CannotUseItemsHereText
- db "@"
- CannotGetOffHereText:
- TX_FAR _CannotGetOffHereText
- db "@"
- ; items which bring up the party menu when used
- UsableItems_PartyMenu:
- db MOON_STONE
- db ANTIDOTE
- db BURN_HEAL
- db ICE_HEAL
- db AWAKENING
- db PARLYZ_HEAL
- db FULL_RESTORE
- db MAX_POTION
- db HYPER_POTION
- db SUPER_POTION
- db POTION
- db FIRE_STONE
- db THUNDER_STONE
- db WATER_STONE
- db HP_UP
- db PROTEIN
- db IRON
- db CARBOS
- db CALCIUM
- db RARE_CANDY
- db LEAF_STONE
- db FULL_HEAL
- db REVIVE
- db MAX_REVIVE
- db FRESH_WATER
- db SODA_POP
- db LEMONADE
- db X_ATTACK
- db X_DEFEND
- db X_SPEED
- db X_SPECIAL
- db PP_UP
- db ETHER
- db MAX_ETHER
- db ELIXER
- db MAX_ELIXER
- db $ff
- ; items which close the item menu when used
- UsableItems_CloseMenu:
- db ESCAPE_ROPE
- db ITEMFINDER
- db POKE_FLUTE
- db OLD_ROD
- db GOOD_ROD
- db SUPER_ROD
- db $ff
- StartMenu_TrainerInfo:
- call GBPalWhiteOut
- call ClearScreen
- call UpdateSprites
- ld a, [hTilesetType]
- push af
- xor a
- ld [hTilesetType], a
- call DrawTrainerInfo
- predef DrawBadges ; draw badges
- ld b, SET_PAL_TRAINER_CARD
- call RunPaletteCommand
- call GBPalNormal
- call WaitForTextScrollButtonPress ; wait for button press
- call GBPalWhiteOut
- call LoadFontTilePatterns
- call LoadScreenTilesFromBuffer2 ; restore saved screen
- call RunDefaultPaletteCommand
- call ReloadMapData
- call LoadGBPal
- pop af
- ld [hTilesetType], a
- jp RedisplayStartMenu
- ; loads tile patterns and draws everything except for gym leader faces / badges
- DrawTrainerInfo:
- ld de, RedPicFront
- lb bc, BANK(RedPicFront), $01
- predef DisplayPicCenteredOrUpperRight
- call DisableLCD
- coord hl, 0, 2
- ld a, " "
- call TrainerInfo_DrawVerticalLine
- coord hl, 1, 2
- call TrainerInfo_DrawVerticalLine
- ld hl, vChars2 + $70
- ld de, vChars2
- ld bc, $70 * 4
- call CopyData
- ld hl, TrainerInfoTextBoxTileGraphics ; trainer info text box tile patterns
- ld de, vChars2 + $770
- ld bc, $0080
- push bc
- call TrainerInfo_FarCopyData
- ld hl, BlankLeaderNames
- ld de, vChars2 + $600
- ld bc, $0170
- call TrainerInfo_FarCopyData
- pop bc
- ld hl, BadgeNumbersTileGraphics ; badge number tile patterns
- ld de, vChars1 + $580
- call TrainerInfo_FarCopyData
- ld hl, GymLeaderFaceAndBadgeTileGraphics ; gym leader face and badge tile patterns
- ld de, vChars2 + $200
- ld bc, $0400
- ld a, $03
- call FarCopyData2
- ld hl, TextBoxGraphics
- ld de, $00d0
- add hl, de ; hl = colon tile pattern
- ld de, vChars1 + $560
- ld bc, $0010
- ld a, $04
- push bc
- call FarCopyData2
- pop bc
- ld hl, TrainerInfoTextBoxTileGraphics + $80 ; background tile pattern
- ld de, vChars1 + $570
- call TrainerInfo_FarCopyData
- call EnableLCD
- ld hl, wTrainerInfoTextBoxWidthPlus1
- ld a, 18 + 1
- ld [hli], a
- dec a
- ld [hli], a
- ld [hl], 1
- coord hl, 0, 0
- call TrainerInfo_DrawTextBox
- ld hl, wTrainerInfoTextBoxWidthPlus1
- ld a, 16 + 1
- ld [hli], a
- dec a
- ld [hli], a
- ld [hl], 3
- coord hl, 1, 10
- call TrainerInfo_DrawTextBox
- coord hl, 0, 10
- ld a, $d7
- call TrainerInfo_DrawVerticalLine
- coord hl, 19, 10
- call TrainerInfo_DrawVerticalLine
- coord hl, 6, 9
- ld de, TrainerInfo_BadgesText
- call PlaceString
- coord hl, 2, 2
- ld de, TrainerInfo_NameMoneyTimeText
- call PlaceString
- coord hl, 7, 2
- ld de, wPlayerName
- call PlaceString
- coord hl, 8, 4
- ld de, wPlayerMoney
- ld c, $e3
- call PrintBCDNumber
- coord hl, 9, 6
- ld de, wPlayTimeHours ; hours
- lb bc, LEFT_ALIGN | 1, 3
- call PrintNumber
- ld [hl], $d6 ; colon tile ID
- inc hl
- ld de, wPlayTimeMinutes ; minutes
- lb bc, LEADING_ZEROES | 1, 2
- jp PrintNumber
- TrainerInfo_FarCopyData:
- ld a, BANK(TrainerInfoTextBoxTileGraphics)
- jp FarCopyData2
- TrainerInfo_NameMoneyTimeText:
- db "NAME/"
- next "MONEY/"
- next "TIME/@"
- ; $76 is a circle tile
- TrainerInfo_BadgesText:
- db $76,"BADGES",$76,"@"
- ; draws a text box on the trainer info screen
- ; height is always 6
- ; INPUT:
- ; hl = destination address
- ; [wTrainerInfoTextBoxWidthPlus1] = width
- ; [wTrainerInfoTextBoxWidth] = width - 1
- ; [wTrainerInfoTextBoxNextRowOffset] = distance from the end of a text box row to the start of the next
- TrainerInfo_DrawTextBox:
- ld a, $79 ; upper left corner tile ID
- lb de, $7a, $7b ; top edge and upper right corner tile ID's
- call TrainerInfo_DrawHorizontalEdge ; draw top edge
- call TrainerInfo_NextTextBoxRow
- ld a, [wTrainerInfoTextBoxWidthPlus1]
- ld e, a
- ld d, 0
- ld c, 6 ; height of the text box
- .loop
- ld [hl], $7c ; left edge tile ID
- add hl, de
- ld [hl], $78 ; right edge tile ID
- call TrainerInfo_NextTextBoxRow
- dec c
- jr nz, .loop
- ld a, $7d ; lower left corner tile ID
- lb de, $77, $7e ; bottom edge and lower right corner tile ID's
- TrainerInfo_DrawHorizontalEdge:
- ld [hli], a ; place left corner tile
- ld a, [wTrainerInfoTextBoxWidth]
- ld c, a
- ld a, d
- .loop
- ld [hli], a ; place edge tile
- dec c
- jr nz, .loop
- ld a, e
- ld [hl], a ; place right corner tile
- ret
- TrainerInfo_NextTextBoxRow:
- ld a, [wTrainerInfoTextBoxNextRowOffset] ; distance to the start of the next row
- .loop
- inc hl
- dec a
- jr nz, .loop
- ret
- ; draws a vertical line
- ; INPUT:
- ; hl = address of top tile in the line
- ; a = tile ID
- TrainerInfo_DrawVerticalLine:
- ld de, SCREEN_WIDTH
- ld c, 8
- .loop
- ld [hl], a
- add hl, de
- dec c
- jr nz, .loop
- ret
- StartMenu_SaveReset:
- ld a, [wd72e]
- bit 6, a ; is the player using the link feature?
- jp nz, Init
- predef SaveSAV ; save the game
- call LoadScreenTilesFromBuffer2 ; restore saved screen
- jp HoldTextDisplayOpen
- StartMenu_Option:
- xor a
- ld [H_AUTOBGTRANSFERENABLED], a
- call ClearScreen
- call UpdateSprites
- callab DisplayOptionMenu
- call LoadScreenTilesFromBuffer2 ; restore saved screen
- call LoadTextBoxTilePatterns
- call UpdateSprites
- jp RedisplayStartMenu
- SwitchPartyMon:
- call SwitchPartyMon_InitVarOrSwapData ; swap data
- ld a, [wSwappedMenuItem]
- call SwitchPartyMon_ClearGfx
- ld a, [wCurrentMenuItem]
- call SwitchPartyMon_ClearGfx
- jp RedrawPartyMenu_
- SwitchPartyMon_ClearGfx:
- push af
- coord hl, 0, 0
- ld bc, SCREEN_WIDTH * 2
- call AddNTimes
- ld c, SCREEN_WIDTH * 2
- ld a, " "
- .clearMonBGLoop ; clear the mon's row in the party menu
- ld [hli], a
- dec c
- jr nz, .clearMonBGLoop
- pop af
- ld hl, wOAMBuffer
- ld bc, $10
- call AddNTimes
- ld de, $4
- ld c, e
- .clearMonOAMLoop
- ld [hl], $a0
- add hl, de
- dec c
- jr nz, .clearMonOAMLoop
- call WaitForSoundToFinish
- ld a, SFX_SWAP
- jp PlaySound
- SwitchPartyMon_InitVarOrSwapData:
- ; This is used to initialise [wMenuItemToSwap] and to actually swap the data.
- ld a, [wMenuItemToSwap]
- and a ; has [wMenuItemToSwap] been initialised yet?
- jr nz, .pickedMonsToSwap
- ; If not, initialise [wMenuItemToSwap] so that it matches the current mon.
- ld a, [wWhichPokemon]
- inc a ; [wMenuItemToSwap] counts from 1
- ld [wMenuItemToSwap], a
- ret
- .pickedMonsToSwap
- xor a
- ld [wPartyMenuTypeOrMessageID], a
- ld a, [wMenuItemToSwap]
- dec a
- ld b, a
- ld a, [wCurrentMenuItem]
- ld [wSwappedMenuItem], a
- cp b ; swapping a mon with itself?
- jr nz, .swappingDifferentMons
- ; can't swap a mon with itself
- xor a
- ld [wMenuItemToSwap], a
- ld [wPartyMenuTypeOrMessageID], a
- ret
- .swappingDifferentMons
- ld a, b
- ld [wMenuItemToSwap], a
- push hl
- push de
- ld hl, wPartySpecies
- ld d, h
- ld e, l
- ld a, [wCurrentMenuItem]
- add l
- ld l, a
- jr nc, .noCarry
- inc h
- .noCarry
- ld a, [wMenuItemToSwap]
- add e
- ld e, a
- jr nc, .noCarry2
- inc d
- .noCarry2
- ld a, [hl]
- ld [hSwapTemp], a
- ld a, [de]
- ld [hl], a
- ld a, [hSwapTemp]
- ld [de], a
- ld hl, wPartyMons
- ld bc, wPartyMon2 - wPartyMon1
- ld a, [wCurrentMenuItem]
- call AddNTimes
- push hl
- ld de, wSwitchPartyMonTempBuffer
- ld bc, wPartyMon2 - wPartyMon1
- call CopyData
- ld hl, wPartyMons
- ld bc, wPartyMon2 - wPartyMon1
- ld a, [wMenuItemToSwap]
- call AddNTimes
- pop de
- push hl
- ld bc, wPartyMon2 - wPartyMon1
- call CopyData
- pop de
- ld hl, wSwitchPartyMonTempBuffer
- ld bc, wPartyMon2 - wPartyMon1
- call CopyData
- ld hl, wPartyMonOT
- ld a, [wCurrentMenuItem]
- call SkipFixedLengthTextEntries
- push hl
- ld de, wSwitchPartyMonTempBuffer
- ld bc, NAME_LENGTH
- call CopyData
- ld hl, wPartyMonOT
- ld a, [wMenuItemToSwap]
- call SkipFixedLengthTextEntries
- pop de
- push hl
- ld bc, NAME_LENGTH
- call CopyData
- pop de
- ld hl, wSwitchPartyMonTempBuffer
- ld bc, NAME_LENGTH
- call CopyData
- ld hl, wPartyMonNicks
- ld a, [wCurrentMenuItem]
- call SkipFixedLengthTextEntries
- push hl
- ld de, wSwitchPartyMonTempBuffer
- ld bc, NAME_LENGTH
- call CopyData
- ld hl, wPartyMonNicks
- ld a, [wMenuItemToSwap]
- call SkipFixedLengthTextEntries
- pop de
- push hl
- ld bc, NAME_LENGTH
- call CopyData
- pop de
- ld hl, wSwitchPartyMonTempBuffer
- ld bc, NAME_LENGTH
- call CopyData
- ld a, [wMenuItemToSwap]
- ld [wSwappedMenuItem], a
- xor a
- ld [wMenuItemToSwap], a
- ld [wPartyMenuTypeOrMessageID], a
- pop de
- pop hl
- ret
|