summaryrefslogtreecommitdiff
path: root/engine/pokemon
diff options
context:
space:
mode:
Diffstat (limited to 'engine/pokemon')
-rwxr-xr-xengine/pokemon/bills_pc.asm2509
1 files changed, 2509 insertions, 0 deletions
diff --git a/engine/pokemon/bills_pc.asm b/engine/pokemon/bills_pc.asm
new file mode 100755
index 00000000..fa610df1
--- /dev/null
+++ b/engine/pokemon/bills_pc.asm
@@ -0,0 +1,2509 @@
+_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
+ 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 StoreTo_wMenuCursorBuffer
+ 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@"
+
+_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
+
+.unused
+ 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 StoreTo_wMenuCursorBuffer
+ 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
+.asm_e2781
+ call JoyTextDelay
+ ld a, [wJumptableIndex]
+ bit 7, a
+ jr nz, .asm_e2793
+ call .RunJumptable
+ call DelayFrame
+ jr .asm_e2781
+
+.asm_e2793
+ 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
+
+.unused
+ 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 StoreTo_wMenuCursorBuffer
+ 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 MovePKMNWitoutMail_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 [wce64], a
+ ld [wce65], a
+ ld [wce66], 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
+ inc de
+ ld a, [wBillsPC_LoadedBox]
+ ld [de], a
+ inc de
+ ld a, [wceee]
+ ld [de], a
+ inc a
+ ld [wceee], a
+ inc de
+ inc hl
+ ld a, [wceef]
+ inc a
+ ld [wceef], a
+ jr .loop\@
+
+.done\@
+if \1
+ call CloseSRAM
+endc
+ ld a, -1
+ ld [de], a
+ ld a, [wceef]
+ 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 [wceee], a
+ ld [wceef], 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 9, 5, 7, 1, $00, 0
+ dbsprite 10, 5, 7, 1, $01, 0
+ dbsprite 11, 5, 7, 1, $01, 0
+ dbsprite 12, 5, 7, 1, $01, 0
+ dbsprite 13, 5, 7, 1, $01, 0
+ dbsprite 14, 5, 7, 1, $01, 0
+ dbsprite 15, 5, 7, 1, $01, 0
+ dbsprite 16, 5, 7, 1, $01, 0
+ dbsprite 17, 5, 7, 1, $01, 0
+ dbsprite 18, 5, 7, 1, $02, 0
+ dbsprite 9, 6, 7, 1, $03, 0
+ dbsprite 10, 6, 7, 1, $04, 0
+ dbsprite 11, 6, 7, 1, $04, 0
+ dbsprite 12, 6, 7, 1, $04, 0
+ dbsprite 13, 6, 7, 1, $04, 0
+ dbsprite 14, 6, 7, 1, $04, 0
+ dbsprite 15, 6, 7, 1, $04, 0
+ dbsprite 16, 6, 7, 1, $04, 0
+ dbsprite 17, 6, 7, 1, $04, 0
+ dbsprite 18, 6, 7, 1, $05, 0
+ 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, $01, 0
+ dbsprite 12, 5, 0, 3, $01, 0
+ dbsprite 13, 5, 0, 3, $01, 0
+ dbsprite 14, 5, 0, 3, $01, 0
+ dbsprite 15, 5, 0, 3, $01, 0
+ dbsprite 16, 5, 0, 3, $01, 0
+ dbsprite 17, 5, 0, 3, $01, 0
+ dbsprite 18, 5, 0, 3, $01, 0
+ dbsprite 19, 4, 0, 7, $07, 0
+ db -1
+
+Unreferenced_BillsPC_FillBox:
+.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, 3
+ ld [wMonType], a
+ predef StatsScreenInit
+ call BillsPC_InitGFX
+ call MaxVolume
+ ret
+
+StatsScreenDPad:
+ call JoyTextDelay
+ 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
+ call DelayFrame
+ jr StatsScreenDPad
+
+.pressed_down_up
+ call _StatsScreenDPad
+ and a
+ jr z, StatsScreenDPad
+ 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
+
+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, sBoxMonOT
+ 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, wPartyMonOT
+ 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, sBoxMonOT - 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 GetNick
+ ld a, PC_DEPOSIT
+ ld [wPokemonWithdrawDepositParameter], a
+ predef SendGetMonIntoFromBox
+ jr c, .asm_boxisfull
+ 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
+
+.asm_boxisfull
+ 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 GetNick
+ 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
+
+MovePKMNWitoutMail_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, sBoxMonOT
+ 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, wPartyMonOT
+ 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, wBufferMonNick
+ 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, .boxes
+ 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
+
+.boxes
+ ; bank, address
+ 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
+
+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.@"
+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 .boxnames
+ dba NULL
+ dba BillsPC_PrintBoxCountAndCapacity
+
+.boxes
+ db NUM_BOXES
+x = 1
+rept NUM_BOXES
+ db x
+x = x + 1
+endr
+ db -1
+
+.boxnames
+ 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 [wDeciramBuffer], a
+ hlcoord 13, 11
+ ld de, wDeciramBuffer
+ lb bc, 1, 2
+ call PrintNum
+ ld de, .out_of_20
+ call PlaceString
+ ret
+
+.Pokemon:
+ db "#MON@"
+
+.out_of_20
+ ; db "/20@"
+ db "/"
+ db "0" + MONS_PER_BOX / 10 ; "2"
+ db "0" + MONS_PER_BOX % 10 ; "0"
+ db "@"
+
+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, .boxbanks
+ 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
+
+.boxbanks
+ 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
+
+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, wceed
+ farcall NamingScreen
+ call ClearTilemap
+ call LoadStandardFont
+ call LoadFontsBattleExtra
+ ld a, [wMenuSelection]
+ dec a
+ call GetBoxName
+ ld e, l
+ ld d, h
+ ld hl, wceed
+ ld c, BOX_NAME_LENGTH - 1
+ call InitString
+ ld a, [wMenuSelection]
+ dec a
+ call GetBoxName
+ ld de, wceed
+ call CopyName2
+ ret
+
+ hlcoord 11, 7 ; unused
+
+.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