pokecrystal-board/engine/pokemon/bills_pc.asm
2022-04-17 11:36:30 -04:00

2529 lines
40 KiB
NASM

_DepositPKMN:
ld hl, wOptions
ld a, [hl]
push af
set NO_TEXT_SCROLL, [hl]
ld a, [wVramState]
push af
xor a
ld [wVramState], a
ldh a, [hInMenu]
push af
ld a, $1
ldh [hInMenu], a
xor a
ldh [hMapAnims], a
call BillsPC_InitRAM
xor a
ld [wBillsPC_LoadedBox], a
call DelayFrame
.loop
call JoyTextDelay
ld a, [wJumptableIndex]
bit 7, a
jr nz, .done
call .RunJumptable
call DelayFrame
jr .loop
.done
call ClearSprites
pop af
ldh [hInMenu], a
pop af
ld [wVramState], a
pop af
ld [wOptions], a
ret
.RunJumptable:
ld a, [wJumptableIndex]
ld hl, .Jumptable
call BillsPC_Jumptable
jp hl
.Jumptable:
dw .Init
dw .HandleJoypad
dw .WhatsUp
dw .Submenu
dw BillsPC_EndJumptableLoop
.Init:
xor a
ldh [hBGMapMode], a
call ClearSprites
call CopyBoxmonSpecies
call BillsPC_BoxName
ld de, PCString_ChooseaPKMN
call BillsPC_PlaceString
ld a, $5
ld [wBillsPC_NumMonsOnScreen], a
call BillsPC_RefreshTextboxes
call PCMonInfo
ld a, $ff
ld [wCurPartySpecies], a
ld a, SCGB_BILLS_PC
call BillsPC_ApplyPalettes
call WaitBGMap
call BillsPC_UpdateSelectionCursor
call BillsPC_IncrementJumptableIndex
ret
.HandleJoypad:
ld hl, hJoyPressed
ld a, [hl]
and B_BUTTON
jr nz, .b_button
ld a, [hl]
and A_BUTTON
jr nz, .a_button
call Withdraw_UpDown
and a
ret z
call BillsPC_UpdateSelectionCursor
xor a
ldh [hBGMapMode], a
call BillsPC_RefreshTextboxes
call PCMonInfo
ld a, $1
ldh [hBGMapMode], a
call DelayFrame
call DelayFrame
ret
.a_button
call BillsPC_GetSelectedPokemonSpecies
and a
ret z
cp -1
jr z, .b_button
ld a, $2
ld [wJumptableIndex], a
ret
.go_back ; unreferenced
ld hl, wJumptableIndex
dec [hl]
ret
.b_button
ld a, $4
ld [wJumptableIndex], a
ret
.WhatsUp:
xor a
ldh [hBGMapMode], a
call ClearSprites
call BillsPC_GetSelectedPokemonSpecies
ld [wCurPartySpecies], a
ld a, SCGB_BILLS_PC
call BillsPC_ApplyPalettes
ld de, PCString_WhatsUp
call BillsPC_PlaceString
ld a, $1
ld [wMenuCursorY], a
call BillsPC_IncrementJumptableIndex
ret
.Submenu:
ld hl, BillsPCDepositMenuHeader
call CopyMenuHeader
ld a, [wMenuCursorY]
call StoreMenuCursorPosition
call VerticalMenu
jp c, BillsPCDepositFuncCancel
ld a, [wMenuCursorY]
dec a
and %11
ld e, a
ld d, 0
ld hl, BillsPCDepositJumptable
add hl, de
add hl, de
ld a, [hli]
ld h, [hl]
ld l, a
jp hl
BillsPCDepositJumptable:
dw BillsPCDepositFuncDeposit ; Deposit Pokemon
dw BillsPCDepositFuncStats ; Pokemon Stats
dw BillsPCDepositFuncRelease ; Release Pokemon
dw BillsPCDepositFuncCancel ; Cancel
BillsPCDepositFuncDeposit:
call BillsPC_CheckMail_PreventBlackout
jp c, BillsPCDepositFuncCancel
call DepositPokemon
jr c, .box_full
ld a, $0
ld [wJumptableIndex], a
xor a
ld [wBillsPC_CursorPosition], a
ld [wBillsPC_ScrollPosition], a
ret
.box_full
ld de, PCString_WhatsUp
call BillsPC_PlaceString
ret
BillsPCDepositFuncStats:
call LoadStandardMenuHeader
call BillsPC_StatsScreen
call ExitMenu
call PCMonInfo
call BillsPC_GetSelectedPokemonSpecies
ld [wCurPartySpecies], a
ld a, SCGB_BILLS_PC
call BillsPC_ApplyPalettes
ret
BillsPCDepositFuncRelease:
call BillsPC_CheckMail_PreventBlackout
jr c, BillsPCDepositFuncCancel
call BillsPC_IsMonAnEgg
jr c, BillsPCDepositFuncCancel
ld a, [wMenuCursorY]
push af
ld de, PCString_ReleasePKMN
call BillsPC_PlaceString
call LoadStandardMenuHeader
lb bc, 14, 11
call PlaceYesNoBox
ld a, [wMenuCursorY]
dec a
call ExitMenu
and a
jr nz, .failed_release
ld a, [wBillsPC_CursorPosition]
ld hl, wBillsPC_ScrollPosition
add [hl]
ld [wCurPartyMon], a
xor a ; REMOVE_PARTY
ld [wPokemonWithdrawDepositParameter], a
farcall RemoveMonFromPartyOrBox
call ReleasePKMN_ByePKMN
ld a, $0
ld [wJumptableIndex], a
xor a
ld [wBillsPC_CursorPosition], a
ld [wBillsPC_ScrollPosition], a
pop af
ret
.failed_release
ld de, PCString_WhatsUp
call BillsPC_PlaceString
pop af
ld [wMenuCursorY], a
ret
BillsPCDepositFuncCancel:
ld a, $0
ld [wJumptableIndex], a
ret
BillsPCDepositMenuHeader:
db MENU_BACKUP_TILES ; flags
menu_coords 9, 4, SCREEN_WIDTH - 1, 13
dw .MenuData
db 1 ; default option
.MenuData:
db STATICMENU_CURSOR ; flags
db 4 ; items
db "DEPOSIT@"
db "STATS@"
db "RELEASE@"
db "CANCEL@"
BillsPCClearThreeBoxes: ; unreferenced
hlcoord 0, 0
ld b, 4
ld c, 8
call ClearBox
hlcoord 0, 4
ld b, 10
ld c, 9
call ClearBox
hlcoord 0, 14
ld b, 2
ld c, 8
call ClearBox
ret
_WithdrawPKMN:
ld hl, wOptions
ld a, [hl]
push af
set NO_TEXT_SCROLL, [hl]
ld a, [wVramState]
push af
xor a
ld [wVramState], a
ldh a, [hInMenu]
push af
ld a, $1
ldh [hInMenu], a
xor a
ldh [hMapAnims], a
call BillsPC_InitRAM
ld a, NUM_BOXES + 1
ld [wBillsPC_LoadedBox], a
call DelayFrame
.loop
call JoyTextDelay
ld a, [wJumptableIndex]
bit 7, a
jr nz, .done
call .RunJumptable
call DelayFrame
jr .loop
.done
call ClearSprites
pop af
ldh [hInMenu], a
pop af
ld [wVramState], a
pop af
ld [wOptions], a
ret
.RunJumptable:
ld a, [wJumptableIndex]
ld hl, .Jumptable
call BillsPC_Jumptable
jp hl
.Jumptable:
dw .Init
dw .Joypad
dw .PrepSubmenu
dw BillsPC_Withdraw
dw BillsPC_EndJumptableLoop
.Init:
ld a, NUM_BOXES + 1
ld [wBillsPC_LoadedBox], a
xor a
ldh [hBGMapMode], a
call ClearSprites
call CopyBoxmonSpecies
call BillsPC_BoxName
ld de, PCString_ChooseaPKMN
call BillsPC_PlaceString
ld a, $5
ld [wBillsPC_NumMonsOnScreen], a
call BillsPC_RefreshTextboxes
call PCMonInfo
ld a, $ff
ld [wCurPartySpecies], a
ld a, SCGB_BILLS_PC
call BillsPC_ApplyPalettes
call WaitBGMap
call BillsPC_UpdateSelectionCursor
call BillsPC_IncrementJumptableIndex
ret
.Joypad:
ld hl, hJoyPressed
ld a, [hl]
and B_BUTTON
jr nz, .b_button
ld a, [hl]
and A_BUTTON
jr nz, .a_button
call Withdraw_UpDown
and a
ret z
call BillsPC_UpdateSelectionCursor
xor a
ldh [hBGMapMode], a
call BillsPC_RefreshTextboxes
call PCMonInfo
ld a, $1
ldh [hBGMapMode], a
call DelayFrame
call DelayFrame
ret
.a_button
call BillsPC_GetSelectedPokemonSpecies
and a
ret z
cp -1
jr z, .b_button
ld a, $2
ld [wJumptableIndex], a
ret
.go_back ; unreferenced
ld hl, wJumptableIndex
dec [hl]
ret
.b_button
ld a, $4
ld [wJumptableIndex], a
ret
.PrepSubmenu:
xor a
ldh [hBGMapMode], a
call ClearSprites
call BillsPC_GetSelectedPokemonSpecies
ld [wCurPartySpecies], a
ld a, SCGB_BILLS_PC
call BillsPC_ApplyPalettes
ld de, PCString_WhatsUp
call BillsPC_PlaceString
ld a, $1
ld [wMenuCursorY], a
call BillsPC_IncrementJumptableIndex
ret
BillsPC_Withdraw:
ld hl, .MenuHeader
call CopyMenuHeader
ld a, [wMenuCursorY]
call StoreMenuCursorPosition
call VerticalMenu
jp c, .cancel
ld a, [wMenuCursorY]
dec a
and %11
ld e, a
ld d, 0
ld hl, .dw
add hl, de
add hl, de
ld a, [hli]
ld h, [hl]
ld l, a
jp hl
.dw
dw .withdraw ; Withdraw
dw .stats ; Stats
dw .release ; Release
dw .cancel ; Cancel
.withdraw
call BillsPC_CheckMail_PreventBlackout
jp c, .cancel
call TryWithdrawPokemon
jr c, .FailedWithdraw
ld a, $0
ld [wJumptableIndex], a
xor a
ld [wBillsPC_CursorPosition], a
ld [wBillsPC_ScrollPosition], a
ret
.FailedWithdraw:
ld de, PCString_WhatsUp
call BillsPC_PlaceString
ret
.stats
call LoadStandardMenuHeader
call BillsPC_StatsScreen
call ExitMenu
call PCMonInfo
call BillsPC_GetSelectedPokemonSpecies
ld [wCurPartySpecies], a
ld a, SCGB_BILLS_PC
call BillsPC_ApplyPalettes
ret
.release
ld a, [wMenuCursorY]
push af
call BillsPC_IsMonAnEgg
jr c, .FailedRelease
ld de, PCString_ReleasePKMN
call BillsPC_PlaceString
call LoadStandardMenuHeader
lb bc, 14, 11
call PlaceYesNoBox
ld a, [wMenuCursorY]
dec a
call ExitMenu
and a
jr nz, .FailedRelease
ld a, [wBillsPC_CursorPosition]
ld hl, wBillsPC_ScrollPosition
add [hl]
ld [wCurPartyMon], a
ld a, REMOVE_BOX
ld [wPokemonWithdrawDepositParameter], a
farcall RemoveMonFromPartyOrBox
call ReleasePKMN_ByePKMN
ld a, $0
ld [wJumptableIndex], a
xor a
ld [wBillsPC_CursorPosition], a
ld [wBillsPC_ScrollPosition], a
pop af
ret
.FailedRelease:
ld de, PCString_WhatsUp
call BillsPC_PlaceString
pop af
ld [wMenuCursorY], a
ret
.cancel
ld a, $0
ld [wJumptableIndex], a
ret
.MenuHeader:
db MENU_BACKUP_TILES ; flags
menu_coords 9, 4, SCREEN_WIDTH - 1, 13
dw .MenuData
db 1 ; default option
.MenuData:
db STATICMENU_CURSOR ; flags
db 4 ; items
db "WITHDRAW@"
db "STATS@"
db "RELEASE@"
db "CANCEL@"
_MovePKMNWithoutMail:
ld hl, wOptions
ld a, [hl]
push af
set NO_TEXT_SCROLL, [hl]
ld a, [wVramState]
push af
xor a
ld [wVramState], a
ldh a, [hInMenu]
push af
ld a, $1
ldh [hInMenu], a
xor a
ldh [hMapAnims], a
call BillsPC_InitRAM
ld a, [wCurBox]
and $f
inc a
ld [wBillsPC_LoadedBox], a
call DelayFrame
.loop
call JoyTextDelay
ld a, [wJumptableIndex]
bit 7, a
jr nz, .done
call .RunJumptable
call DelayFrame
jr .loop
.done
call ClearSprites
pop af
ldh [hInMenu], a
pop af
ld [wVramState], a
pop af
ld [wOptions], a
ret
.RunJumptable:
ld a, [wJumptableIndex]
ld hl, .Jumptable
call BillsPC_Jumptable
jp hl
.Jumptable:
dw .Init
dw .Joypad
dw .PrepSubmenu
dw .MoveMonWOMailSubmenu
dw .PrepInsertCursor
dw .Joypad2
dw BillsPC_EndJumptableLoop
.Init:
xor a
ldh [hBGMapMode], a
call ClearSprites
call CopyBoxmonSpecies
ld de, PCString_ChooseaPKMN
call BillsPC_PlaceString
ld a, 5
ld [wBillsPC_NumMonsOnScreen], a
call BillsPC_RefreshTextboxes
call BillsPC_MoveMonWOMail_BoxNameAndArrows
call PCMonInfo
ld a, $ff
ld [wCurPartySpecies], a
ld a, SCGB_BILLS_PC
call BillsPC_ApplyPalettes
call WaitBGMap
call BillsPC_UpdateSelectionCursor
call BillsPC_IncrementJumptableIndex
ret
.Joypad:
ld hl, hJoyPressed
ld a, [hl]
and B_BUTTON
jr nz, .b_button
ld a, [hl]
and A_BUTTON
jr nz, .a_button
call MoveMonWithoutMail_DPad
jr c, .d_pad
and a
ret z
call BillsPC_UpdateSelectionCursor
xor a
ldh [hBGMapMode], a
call BillsPC_RefreshTextboxes
call PCMonInfo
ld a, $1
ldh [hBGMapMode], a
call DelayFrame
call DelayFrame
ret
.d_pad
xor a
ld [wBillsPC_CursorPosition], a
ld [wBillsPC_ScrollPosition], a
ld a, $0
ld [wJumptableIndex], a
ret
.a_button
call BillsPC_GetSelectedPokemonSpecies
and a
ret z
cp -1
jr z, .b_button
ld a, $2
ld [wJumptableIndex], a
ret
.go_back ; unreferenced
ld hl, wJumptableIndex
dec [hl]
ret
.b_button
ld a, $6
ld [wJumptableIndex], a
ret
.PrepSubmenu:
xor a
ldh [hBGMapMode], a
call ClearSprites
call BillsPC_GetSelectedPokemonSpecies
ld [wCurPartySpecies], a
ld a, SCGB_BILLS_PC
call BillsPC_ApplyPalettes
ld de, PCString_WhatsUp
call BillsPC_PlaceString
ld a, $1
ld [wMenuCursorY], a
call BillsPC_IncrementJumptableIndex
ret
.MoveMonWOMailSubmenu:
ld hl, .MenuHeader
call CopyMenuHeader
ld a, [wMenuCursorY]
call StoreMenuCursorPosition
call VerticalMenu
jp c, .Cancel
ld a, [wMenuCursorY]
dec a
and %11
ld e, a
ld d, 0
ld hl, .Jumptable2
add hl, de
add hl, de
ld a, [hli]
ld h, [hl]
ld l, a
jp hl
.Jumptable2:
dw .Move
dw .Stats
dw .Cancel
.Move:
call BillsPC_CheckMail_PreventBlackout
jp c, .Cancel
ld a, [wBillsPC_ScrollPosition]
ld [wBillsPC_BackupScrollPosition], a
ld a, [wBillsPC_CursorPosition]
ld [wBillsPC_BackupCursorPosition], a
ld a, [wBillsPC_LoadedBox]
ld [wBillsPC_BackupLoadedBox], a
ld a, $4
ld [wJumptableIndex], a
ret
.Stats:
call LoadStandardMenuHeader
call BillsPC_StatsScreen
call ExitMenu
call PCMonInfo
call BillsPC_GetSelectedPokemonSpecies
ld [wCurPartySpecies], a
ld a, SCGB_BILLS_PC
call BillsPC_ApplyPalettes
ret
.Cancel:
ld a, $0
ld [wJumptableIndex], a
ret
.MenuHeader:
db MENU_BACKUP_TILES ; flags
menu_coords 9, 4, SCREEN_WIDTH - 1, 13
dw .MenuData
db 1 ; default option
.MenuData:
db STATICMENU_CURSOR ; flags
db 3 ; items
db "MOVE@"
db "STATS@"
db "CANCEL@"
.PrepInsertCursor:
xor a
ldh [hBGMapMode], a
call CopyBoxmonSpecies
ld de, PCString_MoveToWhere
call BillsPC_PlaceString
ld a, $5
ld [wBillsPC_NumMonsOnScreen], a
call BillsPC_RefreshTextboxes
call BillsPC_MoveMonWOMail_BoxNameAndArrows
call ClearSprites
call BillsPC_UpdateInsertCursor
call WaitBGMap
call BillsPC_IncrementJumptableIndex
ret
.Joypad2:
ld hl, hJoyPressed
ld a, [hl]
and B_BUTTON
jr nz, .b_button_2
ld a, [hl]
and A_BUTTON
jr nz, .a_button_2
call MoveMonWithoutMail_DPad_2
jr c, .dpad_2
and a
ret z
call BillsPC_UpdateInsertCursor
xor a
ldh [hBGMapMode], a
call BillsPC_RefreshTextboxes
ld a, $1
ldh [hBGMapMode], a
call DelayFrame
call DelayFrame
ret
.dpad_2
xor a
ld [wBillsPC_CursorPosition], a
ld [wBillsPC_ScrollPosition], a
ld a, $4
ld [wJumptableIndex], a
ret
.a_button_2
call BillsPC_CheckSpaceInDestination
jr c, .no_space
call MovePKMNWithoutMail_InsertMon
ld a, $0
ld [wJumptableIndex], a
ret
.no_space
ld hl, wJumptableIndex
dec [hl]
ret
.b_button_2
ld a, [wBillsPC_BackupScrollPosition]
ld [wBillsPC_ScrollPosition], a
ld a, [wBillsPC_BackupCursorPosition]
ld [wBillsPC_CursorPosition], a
ld a, [wBillsPC_BackupLoadedBox]
ld [wBillsPC_LoadedBox], a
ld a, $0
ld [wJumptableIndex], a
ret
BillsPC_InitRAM:
call ClearBGPalettes
call ClearSprites
call ClearTilemap
call BillsPC_InitGFX
ld hl, wBillsPCData
ld bc, wBillsPCDataEnd - wBillsPCData
xor a
call ByteFill
xor a
ld [wJumptableIndex], a
ld [wUnusedBillsPCData], a
ld [wUnusedBillsPCData+1], a
ld [wUnusedBillsPCData+2], a
ld [wBillsPC_CursorPosition], a
ld [wBillsPC_ScrollPosition], a
ret
BillsPC_IncrementJumptableIndex:
ld hl, wJumptableIndex
inc [hl]
ret
BillsPC_EndJumptableLoop:
ld hl, wJumptableIndex
set 7, [hl]
ret
_StatsScreenDPad:
ld a, [wBillsPC_NumMonsOnScreen]
ld d, a
ld a, [wBillsPC_NumMonsInBox]
and a
jr z, .empty
dec a
cp $1
jr z, .empty
ld e, a
ld a, [hl]
and D_UP
jr nz, BillsPC_PressUp
ld a, [hl]
and D_DOWN
jr nz, BillsPC_PressDown
.empty
jp BillsPC_JoypadDidNothing
Withdraw_UpDown:
ld hl, hJoyLast
ld a, [wBillsPC_NumMonsOnScreen]
ld d, a
ld a, [wBillsPC_NumMonsInBox]
ld e, a
and a
jr z, .empty
ld a, [hl]
and D_UP
jr nz, BillsPC_PressUp
ld a, [hl]
and D_DOWN
jr nz, BillsPC_PressDown
.empty
jp BillsPC_JoypadDidNothing
MoveMonWithoutMail_DPad:
ld hl, hJoyLast
ld a, [wBillsPC_NumMonsOnScreen]
ld d, a
ld a, [wBillsPC_NumMonsInBox]
ld e, a
and a
jr z, .check_left_right
ld a, [hl]
and D_UP
jr nz, BillsPC_PressUp
ld a, [hl]
and D_DOWN
jr nz, BillsPC_PressDown
.check_left_right
ld a, [hl]
and D_LEFT
jr nz, BillsPC_PressLeft
ld a, [hl]
and D_RIGHT
jr nz, BillsPC_PressRight
jr BillsPC_JoypadDidNothing
MoveMonWithoutMail_DPad_2:
ld hl, hJoyLast
ld a, [wBillsPC_NumMonsOnScreen]
ld d, a
ld a, [wBillsPC_NumMonsInBox]
ld e, a
and a
jr z, .check_left_right
ld a, [hl]
and D_UP
jr nz, BillsPC_PressUp
ld a, [hl]
and D_DOWN
jr nz, BillsPC_PressDown
.check_left_right
ld a, [hl]
and D_LEFT
jr nz, BillsPC_PressLeft
ld a, [hl]
and D_RIGHT
jr nz, BillsPC_PressRight
jr BillsPC_JoypadDidNothing
BillsPC_PressUp:
ld hl, wBillsPC_CursorPosition
ld a, [hl]
and a
jr z, .top
dec [hl]
jr BillsPC_UpDownDidSomething
.top
ld hl, wBillsPC_ScrollPosition
ld a, [hl]
and a
jr z, BillsPC_JoypadDidNothing
dec [hl]
jr BillsPC_UpDownDidSomething
BillsPC_PressDown:
ld a, [wBillsPC_CursorPosition]
ld hl, wBillsPC_ScrollPosition
add [hl]
inc a
cp e
jr nc, BillsPC_JoypadDidNothing
ld hl, wBillsPC_CursorPosition
ld a, [hl]
inc a
cp d
jr nc, .not_bottom
inc [hl]
jr BillsPC_UpDownDidSomething
.not_bottom
ld hl, wBillsPC_ScrollPosition
inc [hl]
jr BillsPC_UpDownDidSomething
BillsPC_PressLeft:
ld hl, wBillsPC_LoadedBox
ld a, [hl]
and a
jr z, .wrap_around
dec [hl]
jr BillsPC_LeftRightDidSomething
.wrap_around
ld [hl], NUM_BOXES
jr BillsPC_LeftRightDidSomething
BillsPC_PressRight:
ld hl, wBillsPC_LoadedBox
ld a, [hl]
cp NUM_BOXES
jr z, .wrap_around
inc [hl]
jr BillsPC_LeftRightDidSomething
.wrap_around
ld [hl], 0
jr BillsPC_LeftRightDidSomething
BillsPC_JoypadDidNothing:
xor a
and a
ret
BillsPC_UpDownDidSomething:
ld a, TRUE
and a
ret
BillsPC_LeftRightDidSomething:
scf
ret
BillsPC_PlaceString:
push de
hlcoord 0, 15
lb bc, 1, 18
call Textbox
pop de
hlcoord 1, 16
call PlaceString
ret
BillsPC_MoveMonWOMail_BoxNameAndArrows:
call BillsPC_BoxName
hlcoord 8, 1
ld [hl], $5f
hlcoord 19, 1
ld [hl], $5e
ret
BillsPC_BoxName:
hlcoord 8, 0
lb bc, 1, 10
call Textbox
ld a, [wBillsPC_LoadedBox]
and a
jr z, .party
cp NUM_BOXES + 1
jr nz, .gotbox
ld a, [wCurBox]
inc a
.gotbox
dec a
ld hl, wBoxNames
ld bc, BOX_NAME_LENGTH
call AddNTimes
ld e, l
ld d, h
jr .print
.party
ld de, .PartyPKMN
.print
hlcoord 10, 1
call PlaceString
ret
.PartyPKMN:
db "PARTY <PK><MN>@"
PCMonInfo:
; Display a monster's pic and
; attributes when highlighting
; it in a PC menu.
; Includes the neat cascading
; effect when showing the pic.
; Example: Species, level, gender,
; whether it's holding an item.
hlcoord 0, 0
lb bc, 15, 8
call ClearBox
hlcoord 8, 14
lb bc, 1, 3
call ClearBox
call BillsPC_GetSelectedPokemonSpecies
and a
ret z
cp -1
ret z
ld [wTempSpecies], a
hlcoord 1, 4
xor a
ld b, 7
.row
ld c, 7
push af
push hl
.col
ld [hli], a
add 7
dec c
jr nz, .col
pop hl
ld de, SCREEN_WIDTH
add hl, de
pop af
inc a
dec b
jr nz, .row
call BillsPC_LoadMonStats
ld a, [wTempSpecies]
ld [wCurPartySpecies], a
ld [wCurSpecies], a
ld hl, wTempMonDVs
predef GetUnownLetter
call GetBaseData
ld de, vTiles2 tile $00
predef GetMonFrontpic
xor a
ld [wBillsPC_MonHasMail], a
ld a, [wCurPartySpecies]
ld [wTempSpecies], a
cp EGG
ret z
call GetBasePokemonName
hlcoord 1, 14
call PlaceString
hlcoord 1, 12
call PrintLevel
ld a, $3
ld [wMonType], a
farcall GetGender
jr c, .skip_gender
ld a, "♂"
jr nz, .printgender
ld a, "♀"
.printgender
hlcoord 5, 12
ld [hl], a
.skip_gender
ld a, [wTempMonItem]
and a
ret z
ld d, a
callfar ItemIsMail
jr c, .mail
ld a, $5d ; item icon
jr .printitem
.mail
ld a, $1
ld [wBillsPC_MonHasMail], a
ld a, $5c ; mail icon
.printitem
hlcoord 7, 12
ld [hl], a
ret
BillsPC_LoadMonStats:
ld a, [wBillsPC_CursorPosition]
ld hl, wBillsPC_ScrollPosition
add [hl]
ld e, a
ld d, 0
ld hl, wBillsPCPokemonList + 1 ; box number
add hl, de
add hl, de
add hl, de
ld a, [hl]
and a
jr z, .party
cp NUM_BOXES + 1
jr z, .sBox
ld b, a
call GetBoxPointer
ld a, b
call OpenSRAM
push hl
ld bc, sBoxMon1Level - sBox
add hl, bc
ld bc, BOXMON_STRUCT_LENGTH
ld a, e
call AddNTimes
ld a, [hl]
ld [wTempMonLevel], a
pop hl
push hl
ld bc, sBoxMon1Item - sBox
add hl, bc
ld bc, BOXMON_STRUCT_LENGTH
ld a, e
call AddNTimes
ld a, [hl]
ld [wTempMonItem], a
pop hl
ld bc, sBoxMon1DVs - sBox
add hl, bc
ld bc, BOXMON_STRUCT_LENGTH
ld a, e
call AddNTimes
ld de, wTempMonDVs
ld a, [hli]
ld [de], a
inc de
ld a, [hl]
ld [de], a
call CloseSRAM
ret
.party
ld hl, wPartyMon1Level
ld bc, PARTYMON_STRUCT_LENGTH
ld a, e
call AddNTimes
ld a, [hl]
ld [wTempMonLevel], a
ld hl, wPartyMon1Item
ld bc, PARTYMON_STRUCT_LENGTH
ld a, e
call AddNTimes
ld a, [hl]
ld [wTempMonItem], a
ld hl, wPartyMon1DVs
ld bc, PARTYMON_STRUCT_LENGTH
ld a, e
call AddNTimes
ld de, wTempMonDVs
ld a, [hli]
ld [de], a
inc de
ld a, [hl]
ld [de], a
ret
.sBox
ld a, BANK(sBox)
call OpenSRAM
ld hl, sBoxMon1Level
ld bc, BOXMON_STRUCT_LENGTH
ld a, e
call AddNTimes
ld a, [hl]
ld [wTempMonLevel], a
ld hl, sBoxMon1Item
ld bc, BOXMON_STRUCT_LENGTH
ld a, e
call AddNTimes
ld a, [hl]
ld [wTempMonItem], a
ld hl, sBoxMon1DVs
ld bc, BOXMON_STRUCT_LENGTH
ld a, e
call AddNTimes
ld de, wTempMonDVs
ld a, [hli]
ld [de], a
inc de
ld a, [hl]
ld [de], a
call CloseSRAM
ret
BillsPC_RefreshTextboxes:
hlcoord 8, 2
lb bc, 10, 10
call Textbox
hlcoord 8, 2
ld [hl], "â””"
hlcoord 19, 2
ld [hl], "┘"
ld a, [wBillsPC_ScrollPosition]
ld e, a
ld d, 0
ld hl, wBillsPCPokemonList
add hl, de
add hl, de
add hl, de
ld e, l
ld d, h
hlcoord 9, 4
ld a, [wBillsPC_NumMonsOnScreen]
.loop
push af
push de
push hl
call .PlaceNickname
pop hl
ld de, 2 * SCREEN_WIDTH
add hl, de
pop de
inc de
inc de
inc de
pop af
dec a
jr nz, .loop
ret
.CancelString:
db "CANCEL@"
.PlaceNickname:
ld a, [de]
and a
ret z
cp -1
jr nz, .get_nickname
ld de, .CancelString
call PlaceString
ret
.get_nickname
inc de
ld a, [de]
ld b, a
inc de
ld a, [de]
ld e, a
ld a, b
and a
jr z, .party
cp NUM_BOXES + 1
jr z, .sBox
push hl
call GetBoxPointer
ld a, b
call OpenSRAM
push hl
ld bc, sBoxMons - sBox
add hl, bc
ld bc, BOXMON_STRUCT_LENGTH
ld a, e
call AddNTimes
ld a, [hl]
pop hl
and a
jr z, .boxfail
ld bc, sBoxMonNicknames - sBox
add hl, bc
ld bc, MON_NAME_LENGTH
ld a, e
call AddNTimes
ld de, wStringBuffer1
ld bc, MON_NAME_LENGTH
call CopyBytes
call CloseSRAM
pop hl
ld de, wStringBuffer1
call PlaceString
ret
.boxfail
call CloseSRAM
pop hl
jr .placeholder_string
.party
push hl
ld hl, wPartySpecies
ld d, $0
add hl, de
ld a, [hl]
and a
jr z, .partyfail
ld hl, wPartyMonNicknames
ld bc, MON_NAME_LENGTH
ld a, e
call AddNTimes
ld de, wStringBuffer1
ld bc, MON_NAME_LENGTH
call CopyBytes
pop hl
ld de, wStringBuffer1
call PlaceString
ret
.partyfail
pop hl
jr .placeholder_string
.sBox
push hl
ld a, BANK(sBox)
call OpenSRAM
ld hl, sBoxSpecies
ld d, $0
add hl, de
ld a, [hl]
and a
jr z, .sBoxFail
ld hl, sBoxMonNicknames
ld bc, MON_NAME_LENGTH
ld a, e
call AddNTimes
ld de, wStringBuffer1
ld bc, MON_NAME_LENGTH
call CopyBytes
call CloseSRAM
pop hl
ld de, wStringBuffer1
call PlaceString
ret
.sBoxFail
call CloseSRAM
pop hl
.placeholder_string
ld de, .Placeholder
call PlaceString
ret
.Placeholder:
db "-----@"
copy_box_data: MACRO
.loop\@
ld a, [hl]
cp -1
jr z, .done\@
and a
jr z, .done\@
ld [de], a ; species
inc de
ld a, [wBillsPC_LoadedBox]
ld [de], a ; box number
inc de
ld a, [wBillsPCTempListIndex]
ld [de], a ; list index
inc a
ld [wBillsPCTempListIndex], a
inc de
inc hl
ld a, [wBillsPCTempBoxCount]
inc a
ld [wBillsPCTempBoxCount], a
jr .loop\@
.done\@
if \1
call CloseSRAM
endc
ld a, -1
ld [de], a
ld a, [wBillsPCTempBoxCount]
inc a
ld [wBillsPC_NumMonsInBox], a
ENDM
CopyBoxmonSpecies:
xor a
ld hl, wBillsPCPokemonList
ld bc, 3 * 30
call ByteFill
ld de, wBillsPCPokemonList
xor a
ld [wBillsPCTempListIndex], a
ld [wBillsPCTempBoxCount], a
ld a, [wBillsPC_LoadedBox]
and a
jr z, .party
cp NUM_BOXES + 1
jr z, .sBox
ld b, a
call GetBoxPointer
ld a, b
call OpenSRAM
inc hl
copy_box_data 1
ret
.party
ld hl, wPartySpecies
copy_box_data 0
ret
.sBox
ld a, BANK(sBox)
call OpenSRAM
ld hl, sBoxSpecies
copy_box_data 1
ret
BillsPC_GetSelectedPokemonSpecies:
ld a, [wBillsPC_CursorPosition]
ld hl, wBillsPC_ScrollPosition
add [hl]
ld e, a
ld d, 0
ld hl, wBillsPCPokemonList
add hl, de
add hl, de
add hl, de
ld a, [hl]
ret
BillsPC_UpdateSelectionCursor:
ld a, [wBillsPC_NumMonsInBox]
and a
jr nz, .place_cursor
call ClearSprites
ret
.place_cursor
ld hl, .OAM
ld de, wVirtualOAMSprite00
.loop
ld a, [hl]
cp -1
ret z
ld a, [wBillsPC_CursorPosition]
and $7
swap a
add [hl]
inc hl
ld [de], a ; y
inc de
rept SPRITEOAMSTRUCT_LENGTH - 1
ld a, [hli]
ld [de], a
inc de
endr
jr .loop
.OAM:
dbsprite 10, 4, 0, 6, $00, 0
dbsprite 11, 4, 0, 6, $00, 0
dbsprite 12, 4, 0, 6, $00, 0
dbsprite 13, 4, 0, 6, $00, 0
dbsprite 14, 4, 0, 6, $00, 0
dbsprite 15, 4, 0, 6, $00, 0
dbsprite 16, 4, 0, 6, $00, 0
dbsprite 17, 4, 0, 6, $00, 0
dbsprite 18, 4, 0, 6, $00, 0
dbsprite 18, 4, 7, 6, $00, 0
dbsprite 10, 7, 0, 1, $00, 0 | Y_FLIP
dbsprite 11, 7, 0, 1, $00, 0 | Y_FLIP
dbsprite 12, 7, 0, 1, $00, 0 | Y_FLIP
dbsprite 13, 7, 0, 1, $00, 0 | Y_FLIP
dbsprite 14, 7, 0, 1, $00, 0 | Y_FLIP
dbsprite 15, 7, 0, 1, $00, 0 | Y_FLIP
dbsprite 16, 7, 0, 1, $00, 0 | Y_FLIP
dbsprite 17, 7, 0, 1, $00, 0 | Y_FLIP
dbsprite 18, 7, 0, 1, $00, 0 | Y_FLIP
dbsprite 18, 7, 7, 1, $00, 0 | Y_FLIP
dbsprite 9, 5, 6, 6, $01, 0
dbsprite 9, 6, 6, 1, $01, 0 | Y_FLIP
dbsprite 19, 5, 1, 6, $01, 0 | X_FLIP
dbsprite 19, 6, 1, 1, $01, 0 | X_FLIP | Y_FLIP
db -1
BillsPC_UpdateInsertCursor:
ld hl, .OAM
ld de, wVirtualOAMSprite00
.loop
ld a, [hl]
cp -1
ret z
ld a, [wBillsPC_CursorPosition]
and $7
swap a
add [hl]
inc hl
ld [de], a ; y
inc de
rept SPRITEOAMSTRUCT_LENGTH - 1
ld a, [hli]
ld [de], a
inc de
endr
jr .loop
.OAM:
dbsprite 10, 4, 0, 7, $06, 0
dbsprite 11, 5, 0, 3, $00, 0 | Y_FLIP
dbsprite 12, 5, 0, 3, $00, 0 | Y_FLIP
dbsprite 13, 5, 0, 3, $00, 0 | Y_FLIP
dbsprite 14, 5, 0, 3, $00, 0 | Y_FLIP
dbsprite 15, 5, 0, 3, $00, 0 | Y_FLIP
dbsprite 16, 5, 0, 3, $00, 0 | Y_FLIP
dbsprite 17, 5, 0, 3, $00, 0 | Y_FLIP
dbsprite 18, 5, 0, 3, $00, 0 | Y_FLIP
dbsprite 19, 4, 0, 7, $07, 0
db -1
BillsPC_FillBox: ; unreferenced
.row
push bc
push hl
.col
ld [hli], a
dec c
jr nz, .col
pop hl
ld bc, SCREEN_WIDTH
add hl, bc
pop bc
dec b
jr nz, .row
ret
BillsPC_CheckSpaceInDestination:
; If moving within a box, no need to be here.
ld hl, wBillsPC_LoadedBox
ld a, [wBillsPC_BackupLoadedBox]
cp [hl]
jr z, .same_box
; Exceeding box or party capacity is a big no-no.
ld a, [wBillsPC_LoadedBox]
and a
jr z, .party
ld e, MONS_PER_BOX + 1
jr .compare
.party
ld e, PARTY_LENGTH + 1
.compare
ld a, [wBillsPC_NumMonsInBox]
cp e
jr nc, .no_room
.same_box
and a
ret
.no_room
ld de, PCString_TheresNoRoom
call BillsPC_PlaceString
ld de, SFX_WRONG
call WaitPlaySFX
call WaitSFX
ld c, 50
call DelayFrames
scf
ret
BillsPC_CheckMail_PreventBlackout:
ld a, [wBillsPC_LoadedBox]
and a
jr nz, .Okay
ld a, [wBillsPC_NumMonsInBox]
cp $3
jr c, .ItsYourLastPokemon
ld a, [wBillsPC_CursorPosition]
ld hl, wBillsPC_ScrollPosition
add [hl]
ld [wCurPartyMon], a
farcall CheckCurPartyMonFainted
jr c, .AllOthersFainted
ld a, [wBillsPC_MonHasMail]
and a
jr nz, .HasMail
.Okay:
and a
ret
.HasMail:
ld de, PCString_RemoveMail
jr .NotOkay
.AllOthersFainted:
ld de, PCString_NoMoreUsablePKMN
jr .NotOkay
.ItsYourLastPokemon:
ld de, PCString_ItsYourLastPKMN
.NotOkay:
call BillsPC_PlaceString
ld de, SFX_WRONG
call WaitPlaySFX
call WaitSFX
ld c, 50
call DelayFrames
scf
ret
BillsPC_IsMonAnEgg:
ld a, [wCurPartySpecies]
cp EGG
jr z, .egg
and a
ret
.egg
ld de, PCString_NoReleasingEGGS
call BillsPC_PlaceString
ld de, SFX_WRONG
call WaitPlaySFX
call WaitSFX
ld c, 50
call DelayFrames
scf
ret
BillsPC_StatsScreen:
call LowVolume
call BillsPC_CopyMon
ld a, TEMPMON
ld [wMonType], a
predef StatsScreenInit
call BillsPC_InitGFX
call MaxVolume
ret
StatsScreenDPad:
ld hl, hJoyPressed
ld a, [hl]
and A_BUTTON | B_BUTTON | D_RIGHT | D_LEFT
ld [wMenuJoypad], a
jr nz, .pressed_a_b_right_left
ld a, [hl]
and D_DOWN | D_UP
ld [wMenuJoypad], a
jr nz, .pressed_down_up
jr .pressed_a_b_right_left
.pressed_down_up
call _StatsScreenDPad
and a
jr z, .did_nothing
call BillsPC_GetSelectedPokemonSpecies
ld [wTempSpecies], a
call BillsPC_LoadMonStats
ld a, [wTempSpecies]
ld [wCurPartySpecies], a
ld [wCurSpecies], a
ld hl, wTempMonDVs
predef GetUnownLetter
call GetBaseData
call BillsPC_CopyMon
.pressed_a_b_right_left
ret
.did_nothing
xor a
ld [wMenuJoypad], a
ret
BillsPC_CopyMon:
ld a, [wBillsPC_CursorPosition]
ld hl, wBillsPC_ScrollPosition
add [hl]
ld [wCurPartyMon], a
ld a, [wBillsPC_LoadedBox]
and a
jr z, .party
cp NUM_BOXES + 1
jr nz, .box
ld a, BANK(sBox)
call OpenSRAM
ld hl, sBoxSpecies
call CopySpeciesToTemp
ld hl, sBoxMonNicknames
call CopyNicknameToTemp
ld hl, sBoxMonOTs
call CopyOTNameToTemp
ld hl, sBoxMons
ld bc, BOXMON_STRUCT_LENGTH
ld a, [wCurPartyMon]
call AddNTimes
ld de, wBufferMon
ld bc, PARTYMON_STRUCT_LENGTH
call CopyBytes
call CloseSRAM
farcall CalcBufferMonStats
ret
.party
ld hl, wPartySpecies
call CopySpeciesToTemp
ld hl, wPartyMonNicknames
call CopyNicknameToTemp
ld hl, wPartyMonOTs
call CopyOTNameToTemp
ld hl, wPartyMon1
ld bc, PARTYMON_STRUCT_LENGTH
ld a, [wCurPartyMon]
call AddNTimes
ld de, wBufferMon
ld bc, PARTYMON_STRUCT_LENGTH
call CopyBytes
ret
.box
ld b, a
call GetBoxPointer
ld a, b
call OpenSRAM
push hl
inc hl
call CopySpeciesToTemp
pop hl
push hl
ld bc, sBoxMonNicknames - sBox
add hl, bc
call CopyNicknameToTemp
pop hl
push hl
ld bc, sBoxMonOTs - sBox
add hl, bc
call CopyOTNameToTemp
pop hl
ld bc, sBoxMons - sBox
add hl, bc
ld bc, BOXMON_STRUCT_LENGTH
call CopyMonToTemp
call CloseSRAM
farcall CalcBufferMonStats
ret
DepositPokemon:
ld a, [wBillsPC_CursorPosition]
ld hl, wBillsPC_ScrollPosition
add [hl]
ld [wCurPartyMon], a
ld hl, wPartyMonNicknames
ld a, [wCurPartyMon]
call GetNickname
ld a, PC_DEPOSIT
ld [wPokemonWithdrawDepositParameter], a
predef SendGetMonIntoFromBox
jr c, .BoxFull
xor a ; REMOVE_PARTY
ld [wPokemonWithdrawDepositParameter], a
farcall RemoveMonFromPartyOrBox
ld a, [wCurPartySpecies]
call PlayMonCry
hlcoord 0, 0
lb bc, 15, 8
call ClearBox
hlcoord 8, 14
lb bc, 1, 3
call ClearBox
hlcoord 0, 15
lb bc, 1, 18
call Textbox
call WaitBGMap
hlcoord 1, 16
ld de, PCString_Stored
call PlaceString
ld l, c
ld h, b
ld de, wStringBuffer1
call PlaceString
ld a, "!"
ld [bc], a
ld c, 50
call DelayFrames
and a
ret
.BoxFull:
ld de, PCString_BoxFull
call BillsPC_PlaceString
ld de, SFX_WRONG
call WaitPlaySFX
call WaitSFX
ld c, 50
call DelayFrames
scf
ret
TryWithdrawPokemon:
ld a, [wBillsPC_CursorPosition]
ld hl, wBillsPC_ScrollPosition
add [hl]
ld [wCurPartyMon], a
ld a, BANK(sBoxMonNicknames)
call OpenSRAM
ld a, [wCurPartyMon]
ld hl, sBoxMonNicknames
call GetNickname
call CloseSRAM
xor a
ld [wPokemonWithdrawDepositParameter], a
predef SendGetMonIntoFromBox
jr c, .PartyFull
ld a, REMOVE_BOX
ld [wPokemonWithdrawDepositParameter], a
farcall RemoveMonFromPartyOrBox
ld a, [wCurPartySpecies]
call PlayMonCry
hlcoord 0, 0
lb bc, 15, 8
call ClearBox
hlcoord 8, 14
lb bc, 1, 3
call ClearBox
hlcoord 0, 15
lb bc, 1, 18
call Textbox
call WaitBGMap
hlcoord 1, 16
ld de, PCString_Got
call PlaceString
ld l, c
ld h, b
ld de, wStringBuffer1
call PlaceString
ld a, "!"
ld [bc], a
ld c, 50
call DelayFrames
and a
ret
.PartyFull:
ld de, PCString_PartyFull
call BillsPC_PlaceString
ld de, SFX_WRONG
call WaitPlaySFX
call WaitSFX
ld c, 50
call DelayFrames
scf
ret
ReleasePKMN_ByePKMN:
hlcoord 0, 0
lb bc, 15, 8
call ClearBox
hlcoord 8, 14
lb bc, 1, 3
call ClearBox
hlcoord 0, 15
lb bc, 1, 18
call Textbox
call WaitBGMap
ld a, [wCurPartySpecies]
call GetCryIndex
jr c, .skip_cry
ld e, c
ld d, b
call PlayCry
.skip_cry
ld a, [wCurPartySpecies]
ld [wTempSpecies], a
call GetPokemonName
hlcoord 1, 16
ld de, PCString_ReleasedPKMN
call PlaceString
ld c, 80
call DelayFrames
hlcoord 0, 15
lb bc, 1, 18
call Textbox
hlcoord 1, 16
ld de, PCString_Bye
call PlaceString
ld l, c
ld h, b
inc hl
ld de, wStringBuffer1
call PlaceString
ld l, c
ld h, b
ld [hl], "!"
ld c, 50
call DelayFrames
ret
MovePKMNWithoutMail_InsertMon:
push hl
push de
push bc
push af
hlcoord 0, 15
lb bc, 1, 18
call Textbox
hlcoord 1, 16
ld de, .Saving_LeaveOn
call PlaceString
ld c, 20
call DelayFrames
pop af
pop bc
pop de
pop hl
ld a, [wCurBox]
push af
ld bc, 0
ld a, [wBillsPC_BackupLoadedBox]
and a
jr nz, .moving_from_box
set 0, c
.moving_from_box
ld a, [wBillsPC_LoadedBox]
and a
jr nz, .moving_to_box
set 1, c
.moving_to_box
ld hl, .Jumptable
add hl, bc
add hl, bc
ld a, [hli]
ld h, [hl]
ld l, a
ld de, .dw_return
push de
jp hl
.dw_return
pop af
ld e, a
farcall MoveMonWOMail_InsertMon_SaveGame
ret
.Saving_LeaveOn:
db "Saving… Leave ON!@"
.Jumptable:
dw .BoxToBox
dw .PartyToBox
dw .BoxToParty
dw .PartyToParty
.BoxToBox:
ld hl, wBillsPC_BackupLoadedBox
ld a, [wBillsPC_LoadedBox]
cp [hl]
jr z, .same_box
call .CopyFromBox
call .CopyToBox
ret
.same_box
call .CopyFromBox
call .CheckTrivialMove
call .CopyToBox
ret
.PartyToBox:
call .CopyFromParty
ld a, $1
ld [wGameLogicPaused], a
farcall SaveGameData
xor a
ld [wGameLogicPaused], a
call .CopyToBox
ret
.BoxToParty:
call .CopyFromBox
call .CopyToParty
ret
.PartyToParty:
call .CopyFromParty
call .CheckTrivialMove
call .CopyToParty
ret
.CheckTrivialMove:
ld a, [wBillsPC_CursorPosition]
ld hl, wBillsPC_ScrollPosition
add [hl]
ld e, a
ld a, [wBillsPC_BackupCursorPosition]
ld hl, wBillsPC_BackupScrollPosition
add [hl]
cp e
ret nc
ld hl, wBillsPC_CursorPosition
ld a, [hl]
and a
jr z, .top_of_screen
dec [hl]
ret
.top_of_screen
ld hl, wBillsPC_ScrollPosition
ld a, [hl]
and a
ret z
dec [hl]
ret
.CopyFromBox:
ld a, [wBillsPC_BackupLoadedBox]
dec a
ld e, a
farcall MoveMonWOMail_SaveGame
ld a, [wBillsPC_BackupCursorPosition]
ld hl, wBillsPC_BackupScrollPosition
add [hl]
ld [wCurPartyMon], a
ld a, BANK(sBox)
call OpenSRAM
ld hl, sBoxSpecies
call CopySpeciesToTemp
ld hl, sBoxMonNicknames
call CopyNicknameToTemp
ld hl, sBoxMonOTs
call CopyOTNameToTemp
ld hl, sBoxMons
ld bc, BOXMON_STRUCT_LENGTH
call CopyMonToTemp
call CloseSRAM
farcall CalcBufferMonStats
ld a, REMOVE_BOX
ld [wPokemonWithdrawDepositParameter], a
farcall RemoveMonFromPartyOrBox
ret
.CopyToBox:
ld a, [wBillsPC_LoadedBox]
dec a
ld e, a
farcall MoveMonWOMail_SaveGame
ld a, [wBillsPC_CursorPosition]
ld hl, wBillsPC_ScrollPosition
add [hl]
ld [wCurPartyMon], a
farcall InsertPokemonIntoBox
ret
.CopyFromParty:
ld a, [wBillsPC_BackupCursorPosition]
ld hl, wBillsPC_BackupScrollPosition
add [hl]
ld [wCurPartyMon], a
ld hl, wPartySpecies
call CopySpeciesToTemp
ld hl, wPartyMonNicknames
call CopyNicknameToTemp
ld hl, wPartyMonOTs
call CopyOTNameToTemp
ld hl, wPartyMon1Species
ld bc, PARTYMON_STRUCT_LENGTH
call CopyMonToTemp
xor a ; REMOVE_PARTY
ld [wPokemonWithdrawDepositParameter], a
farcall RemoveMonFromPartyOrBox
ret
.CopyToParty:
ld a, [wBillsPC_CursorPosition]
ld hl, wBillsPC_ScrollPosition
add [hl]
ld [wCurPartyMon], a
farcall InsertPokemonIntoParty
ret
CopySpeciesToTemp:
ld a, [wCurPartyMon]
ld c, a
ld b, 0
add hl, bc
ld a, [hl]
ld [wCurPartySpecies], a
ret
CopyNicknameToTemp:
ld bc, MON_NAME_LENGTH
ld a, [wCurPartyMon]
call AddNTimes
ld de, wBufferMonNickname
ld bc, MON_NAME_LENGTH
call CopyBytes
ret
CopyOTNameToTemp:
ld bc, NAME_LENGTH
ld a, [wCurPartyMon]
call AddNTimes
ld de, wBufferMonOT
ld bc, NAME_LENGTH
call CopyBytes
ret
CopyMonToTemp:
ld a, [wCurPartyMon]
call AddNTimes
ld de, wBufferMon
call CopyBytes
ret
GetBoxPointer:
dec b
ld c, b
ld b, 0
ld hl, .BoxBankAddresses
add hl, bc
add hl, bc
add hl, bc
ld a, [hli]
ld b, a
ld a, [hli]
ld h, [hl]
ld l, a
ret
.BoxBankAddresses:
table_width 3, GetBoxPointer.BoxBankAddresses
dba sBox1
dba sBox2
dba sBox3
dba sBox4
dba sBox5
dba sBox6
dba sBox7
dba sBox8
dba sBox9
dba sBox10
dba sBox11
dba sBox12
dba sBox13
dba sBox14
assert_table_length NUM_BOXES
BillsPC_ApplyPalettes:
ld b, a
call GetSGBLayout
ld a, %11100100
call DmgToCgbBGPals
ld a, %11111100
call DmgToCgbObjPal0
ret
BillsPC_Jumptable:
ld e, a
ld d, 0
add hl, de
add hl, de
ld a, [hli]
ld h, [hl]
ld l, a
ret
BillsPC_InitGFX:
call DisableLCD
ld hl, vTiles2 tile $00
ld bc, $31 tiles
xor a
call ByteFill
call LoadStandardFont
call LoadFontsBattleExtra
ld hl, PCMailGFX
ld de, vTiles2 tile $5c
ld bc, 4 tiles
call CopyBytes
ld hl, PCSelectLZ
ld de, vTiles0 tile $00
call Decompress
ld a, 6
call SkipMusic
call EnableLCD
ret
PCSelectLZ: INCBIN "gfx/pc/pc.2bpp.lz"
PCMailGFX: INCBIN "gfx/pc/pc_mail.2bpp"
PCString_ChooseaPKMN: db "Choose a <PK><MN>.@"
PCString_WhatsUp: db "What's up?@"
PCString_ReleasePKMN: db "Release <PK><MN>?@"
PCString_MoveToWhere: db "Move to where?@"
PCString_ItsYourLastPKMN: db "It's your last <PK><MN>!@"
PCString_TheresNoRoom: db "There's no room!@"
PCString_NoMoreUsablePKMN: db "No more usable <PK><MN>!@"
PCString_RemoveMail: db "Remove MAIL.@"
PCString_ReleasedPKMN: db "Released <PK><MN>.@"
PCString_Bye: db "Bye,@"
PCString_Stored: db "Stored @"
PCString_Got: db "Got @"
PCString_Non: db "Non.@" ; unreferenced
PCString_BoxFull: db "The BOX is full.@"
PCString_PartyFull: db "The party's full!@"
PCString_NoReleasingEGGS: db "No releasing EGGS!@"
_ChangeBox:
call LoadStandardMenuHeader
call BillsPC_ClearTilemap
.loop
xor a
ldh [hBGMapMode], a
call BillsPC_PrintBoxName
call BillsPC_PlaceChooseABoxString
ld hl, _ChangeBox_MenuHeader
call CopyMenuHeader
xor a
ld [wMenuScrollPosition], a
hlcoord 0, 4
lb bc, 8, 9
call Textbox
call ScrollingMenu
ld a, [wMenuJoypad]
cp B_BUTTON
jr z, .done
call BillsPC_PlaceWhatsUpString
call BillsPC_ChangeBoxSubmenu
jr .loop
.done
call CloseWindow
ret
BillsPC_ClearTilemap:
xor a
ldh [hBGMapMode], a
hlcoord 0, 0
ld bc, SCREEN_WIDTH * SCREEN_HEIGHT
ld a, " "
call ByteFill
ret
_ChangeBox_MenuHeader:
db MENU_BACKUP_TILES ; flags
menu_coords 1, 5, 9, 12
dw .MenuData
db 1 ; default option
.MenuData:
db SCROLLINGMENU_CALL_FUNCTION3_NO_SWITCH | SCROLLINGMENU_ENABLE_FUNCTION3 ; flags
db 4, 0 ; rows, columns
db SCROLLINGMENU_ITEMS_NORMAL ; item format
dba .Boxes
dba .PrintBoxNames
dba NULL
dba BillsPC_PrintBoxCountAndCapacity
.Boxes:
db NUM_BOXES
for x, NUM_BOXES
db x + 1
endr
db -1
.PrintBoxNames:
push de
ld a, [wMenuSelection]
dec a
call GetBoxName
pop hl
call PlaceString
ret
GetBoxName:
ld bc, BOX_NAME_LENGTH
ld hl, wBoxNames
call AddNTimes
ld d, h
ld e, l
ret
BillsPC_PrintBoxCountAndCapacity:
hlcoord 11, 7
lb bc, 5, 7
call Textbox
ld a, [wMenuSelection]
cp -1
ret z
hlcoord 12, 9
ld de, .Pokemon
call PlaceString
call GetBoxCount
ld [wTextDecimalByte], a
hlcoord 13, 11
ld de, wTextDecimalByte
lb bc, 1, 2
call PrintNum
ld de, .OutOf20
call PlaceString
ret
.Pokemon:
db "#MON@"
.OutOf20:
db "/{d:MONS_PER_BOX}@" ; "/20@"
GetBoxCount:
ld a, [wCurBox]
ld c, a
ld a, [wMenuSelection]
dec a
cp c
jr z, .activebox
ld c, a
ld b, 0
ld hl, .BoxBankAddresses
add hl, bc
add hl, bc
add hl, bc
ld a, [hli]
ld b, a
call OpenSRAM
ld a, [hli]
ld h, [hl]
ld l, a
ld a, [hl]
call CloseSRAM
ld c, a
ld a, [wSavedAtLeastOnce]
and a
jr z, .newfile
ld a, c
ret
.newfile
xor a
ret
.activebox
ld a, BANK(sBoxCount)
ld b, a
call OpenSRAM
ld hl, sBoxCount
ld a, [hl]
call CloseSRAM
ret
.BoxBankAddresses:
table_width 3, GetBoxCount.BoxBankAddresses
dba sBox1
dba sBox2
dba sBox3
dba sBox4
dba sBox5
dba sBox6
dba sBox7
dba sBox8
dba sBox9
dba sBox10
dba sBox11
dba sBox12
dba sBox13
dba sBox14
assert_table_length NUM_BOXES
BillsPC_PrintBoxName:
hlcoord 0, 0
ld b, 2
ld c, 18
call Textbox
hlcoord 1, 2
ld de, .Current
call PlaceString
ld a, [wCurBox]
and $f
call GetBoxName
hlcoord 11, 2
call PlaceString
ret
.Current:
db "CURRENT@"
BillsPC_ChangeBoxSubmenu:
ld hl, .MenuHeader
call LoadMenuHeader
call VerticalMenu
call ExitMenu
ret c
ld a, [wMenuCursorY]
cp $1
jr z, .Switch
cp $2
jr z, .Name
cp $3
jr z, .Print
and a
ret
.Print:
call GetBoxCount
and a
jr z, .EmptyBox
ld e, l
ld d, h
ld a, [wMenuSelection]
dec a
ld c, a
farcall PrintPCBox
call BillsPC_ClearTilemap
and a
ret
.EmptyBox:
call BillsPC_PlaceEmptyBoxString_SFX
and a
ret
.Switch:
ld a, [wMenuSelection]
dec a
ld e, a
ld a, [wCurBox]
cp e
ret z
farcall ChangeBoxSaveGame
ret
.Name:
ld b, NAME_BOX
ld de, wBoxNameBuffer
farcall NamingScreen
call ClearTilemap
call LoadStandardFont
call LoadFontsBattleExtra
ld a, [wMenuSelection]
dec a
call GetBoxName
ld e, l
ld d, h
ld hl, wBoxNameBuffer
ld c, BOX_NAME_LENGTH - 1
call InitString
ld a, [wMenuSelection]
dec a
call GetBoxName
ld de, wBoxNameBuffer
call CopyName2
ret
hlcoord 11, 7 ; unreferenced
.MenuHeader:
db MENU_BACKUP_TILES ; flags
menu_coords 11, 4, SCREEN_WIDTH - 1, 13
dw .MenuData
db 1 ; default option
.MenuData:
db STATICMENU_CURSOR ; flags
db 4 ; items
db "SWITCH@"
db "NAME@"
db "PRINT@"
db "QUIT@"
BillsPC_PlaceChooseABoxString:
ld de, .ChooseABox
jr BillsPC_PlaceChangeBoxString
.ChooseABox:
db "Choose a BOX.@"
BillsPC_PlaceWhatsUpString:
ld de, .WhatsUp
jr BillsPC_PlaceChangeBoxString
.WhatsUp:
db "What's up?@"
BillsPC_PlaceEmptyBoxString_SFX:
ld de, .NoMonString
call BillsPC_PlaceChangeBoxString
ld de, SFX_WRONG
call WaitPlaySFX
call WaitSFX
ld c, 50
call DelayFrames
ret
.NoMonString:
db "There's no #MON.@"
BillsPC_PlaceChangeBoxString:
push de
hlcoord 0, 14
lb bc, 2, 18
call Textbox
pop de
hlcoord 1, 16
call PlaceString
ld a, $1
ldh [hBGMapMode], a
ret