mirror of https://github.com/pret/pokecrystal.git
1295 lines
19 KiB
NASM
1295 lines
19 KiB
NASM
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 GetSRAMBank
|
|
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 12, 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 + 3]
|
|
sub [hl]
|
|
dec hl
|
|
ldh a, [hQuotient + 2]
|
|
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 12, 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 "ATK/@"
|
|
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
|