diff options
author | mid-kid <esteve.varela@gmail.com> | 2018-03-13 13:07:16 +0100 |
---|---|---|
committer | mid-kid <esteve.varela@gmail.com> | 2018-03-13 13:21:40 +0100 |
commit | baa0dc5a963a79843b37888bcfe1d2dfe833ade9 (patch) | |
tree | 968c86105bd67a3121d8f3f20018bfc59191f4c9 /engine/pokemon | |
parent | 12070ca50067d3abe36a730190f88ee43f2cace9 (diff) |
Organize the engine/ directory
This is an informed attempt at reorganizing the engine/ directory by
creating categorized subdirectories, in order to make it easier to
navigate and find things.
The directories created are as follows:
* engine/game: Contains all "minigames", things like the unown puzzle
and slot machine.
* engine/gfx: Contains all handling of graphics. From loading palettes
to playing animations.
* engine/link: Contains all multiplayer functionality.
* engine/menu: Contains all generic/misc. menus and menu code.
Other, more specialized menus are in their own subdirectories (pokedex,
pokegear, party menu, etc).
* engine/overworld: Contains all handling of the overworld. From loading
and connecting maps to wild encounters and the scripting engine.
* engine/pokegear: In the same vein as engine/pokedex, except it could
use some more splitting up.
* engine/pokemon: Contains everything related to manipulating pokemon
data. From the pokemon storage system to evolution and mail.
* engine/printer: Contains everything related to printing things as well
as the printer communication.
* engine/title: Contains intro sequences, title screens and credits.
Diffstat (limited to 'engine/pokemon')
-rwxr-xr-x | engine/pokemon/billspc.asm | 2618 | ||||
-rwxr-xr-x | engine/pokemon/billspctop.asm | 387 | ||||
-rwxr-xr-x | engine/pokemon/breeding.asm | 994 | ||||
-rw-r--r-- | engine/pokemon/caught_data.asm | 247 | ||||
-rw-r--r-- | engine/pokemon/european_mail.asm | 129 | ||||
-rwxr-xr-x | engine/pokemon/evolve.asm | 676 | ||||
-rw-r--r-- | engine/pokemon/experience.asm | 162 | ||||
-rwxr-xr-x | engine/pokemon/health.asm | 110 | ||||
-rwxr-xr-x | engine/pokemon/learn.asm | 256 | ||||
-rwxr-xr-x | engine/pokemon/mail.asm | 587 | ||||
-rwxr-xr-x | engine/pokemon/mail_2.asm | 949 | ||||
-rw-r--r-- | engine/pokemon/mon_stats.asm | 485 | ||||
-rwxr-xr-x | engine/pokemon/move_mon.asm | 1845 | ||||
-rwxr-xr-x | engine/pokemon/move_mon_wo_mail.asm | 133 | ||||
-rw-r--r-- | engine/pokemon/party_menu.asm | 932 | ||||
-rwxr-xr-x | engine/pokemon/search.asm | 276 | ||||
-rwxr-xr-x | engine/pokemon/search2.asm | 134 | ||||
-rwxr-xr-x | engine/pokemon/stats_screen.asm | 1173 | ||||
-rw-r--r-- | engine/pokemon/tempmon.asm | 127 | ||||
-rwxr-xr-x | engine/pokemon/tmhm.asm | 589 | ||||
-rw-r--r-- | engine/pokemon/types.asm | 99 |
21 files changed, 12908 insertions, 0 deletions
diff --git a/engine/pokemon/billspc.asm b/engine/pokemon/billspc.asm new file mode 100755 index 000000000..96d6ac310 --- /dev/null +++ b/engine/pokemon/billspc.asm @@ -0,0 +1,2618 @@ +_DepositPKMN: ; e2391 (38:6391) + ld hl, wOptions + ld a, [hl] + push af + set 4, [hl] + ld a, [wVramState] + push af + xor a + ld [wVramState], a + ld a, [hInMenu] + push af + ld a, $1 + ld [hInMenu], a + xor a + ld [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 + ld [hInMenu], a + pop af + ld [wVramState], a + pop af + ld [wOptions], a + ret + +.RunJumptable: ; e23d5 (38:63d5) + ld a, [wJumptableIndex] + ld hl, .Jumptable + call BillsPC_Jumptable + jp hl + +.Jumptable: ; e23df (38:63df) + dw .Init + dw .HandleJoypad + dw .WhatsUp + dw .Submenu + dw BillsPC_EndJumptableLoop + +.Init: ; e23e9 (38:63e9) + xor a + ld [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: ; e241a (38:641a) + ld hl, hJoyPressed ; $ffa7 + 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 + ld [hBGMapMode], a + call BillsPC_RefreshTextboxes + call PCMonInfo + ld a, $1 + ld [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 +; e2452 (38:6452) + +.go_back + ld hl, wJumptableIndex + dec [hl] + ret + +.b_button + ld a, $4 + ld [wJumptableIndex], a + ret + +.WhatsUp: ; e245d (38:645d) + xor a + ld [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: ; e247d (38:647d) + 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: ; e24a1 (38:64a1) + dw BillsPCDepositFuncDeposit ; Deposit Pokemon + dw BillsPCDepositFuncStats ; Pokemon Stats + dw BillsPCDepositFuncRelease ; Release Pokemon + dw BillsPCDepositFuncCancel ; Cancel + + +BillsPCDepositFuncDeposit: ; e24a9 (38:64a9) + 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: ; e24c8 (38:64c8) + 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: ; e24e0 (38:64e0) + 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: ; e2537 (38:6537) + ld a, $0 + ld [wJumptableIndex], a + ret +; e253d (38:653d) + +BillsPCDepositMenuHeader: ; 0xe253d (38:653d) + db MENU_BACKUP_TILES ; flags + menu_coords 9, 4, SCREEN_WIDTH - 1, 13 + dw .MenuData + db 1 ; default option +; 0xe2545 + +.MenuData: ; 0xe2545 (38:6545) + db STATICMENU_CURSOR ; flags + db 4 ; items + db "DEPOSIT@" + db "STATS@" + db "RELEASE@" + db "CANCEL@" +; 0xe2564 (38:6564) + +Unreferenced_BillsPCClearThreeBoxes: ; e2564 + 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 +; e2583 + +_WithdrawPKMN: ; e2583 (38:6583) + ld hl, wOptions + ld a, [hl] + push af + set 4, [hl] + ld a, [wVramState] + push af + xor a + ld [wVramState], a + ld a, [hInMenu] + push af + ld a, $1 + ld [hInMenu], a + xor a + ld [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 + ld [hInMenu], a + pop af + ld [wVramState], a + pop af + ld [wOptions], a + ret + +.RunJumptable: ; e25c8 (38:65c8) + ld a, [wJumptableIndex] + ld hl, .Jumptable + call BillsPC_Jumptable + jp hl + +.Jumptable: ; e25d2 (38:65d2) + dw .Init + dw .Joypad + dw .PrepSubmenu + dw BillsPC_Withdraw + dw BillsPC_EndJumptableLoop + +.Init: ; e25dc (38:65dc) + ld a, NUM_BOXES + 1 + ld [wBillsPC_LoadedBox], a + xor a + ld [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: ; e2612 (38:6612) + ld hl, hJoyPressed ; $ffa7 + 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 + ld [hBGMapMode], a + call BillsPC_RefreshTextboxes + call PCMonInfo + ld a, $1 + ld [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 ; e264a (38:664a) + +.unused + ld hl, wJumptableIndex + dec [hl] + ret + +.b_button + ld a, $4 + ld [wJumptableIndex], a + ret +; e2655 + +.PrepSubmenu: ; e2655 (38:6655) + xor a + ld [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: ; e2675 (38:6675) + 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 ; e2699 (38:6699) #mark + dw .withdraw ; Withdraw + dw .stats ; Stats + dw .release ; Release + dw .cancel ; Cancel + + +.withdraw ; e26a1 (38:66a1) + 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 ; e26c0 (38:66c0) + 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 ; e26d8 (38:66d8) + 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 ; e272b (38:672b) + ld a, $0 + ld [wJumptableIndex], a + ret +; e2731 (38:6731) + +.MenuHeader: ; 0xe2731 + db MENU_BACKUP_TILES ; flags + menu_coords 9, 4, SCREEN_WIDTH - 1, 13 + dw .MenuData + db 1 ; default option +; 0xe2739 + +.MenuData: ; 0xe2739 + db STATICMENU_CURSOR ; flags + db 4 ; items + db "WITHDRAW@" + db "STATS@" + db "RELEASE@" + db "CANCEL@" +; 0xe2759 + +_MovePKMNWithoutMail: ; e2759 + ld hl, wOptions + ld a, [hl] + push af + set 4, [hl] + ld a, [wVramState] + push af + xor a + ld [wVramState], a + ld a, [hInMenu] + push af + ld a, $1 + ld [hInMenu], a + xor a + ld [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 + ld [hInMenu], a + pop af + ld [wVramState], a + pop af + ld [wOptions], a + ret +; e27a2 + +.RunJumptable: ; e27a2 + ld a, [wJumptableIndex] + ld hl, .Jumptable + call BillsPC_Jumptable + jp hl +; e27ac + +.Jumptable: ; e27ac + dw .Init + dw .Joypad + dw .PrepSubmenu + dw .MoveMonWOMailSubmenu + dw .PrepInsertCursor + dw .Joypad2 + dw BillsPC_EndJumptableLoop +; e27ba + +.Init: ; e27ba + xor a + ld [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 +; e27eb + +.Joypad: ; e27eb + 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 + ld [hBGMapMode], a + call BillsPC_RefreshTextboxes + call PCMonInfo + ld a, $1 + ld [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 +; e283d + +.PrepSubmenu: ; e283d + xor a + ld [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 +; e285d + +.MoveMonWOMailSubmenu: ; e285d + 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 +; e2881 + +.Jumptable2: ; e2881 + dw .Move + dw .Stats + dw .Cancel +; e2887 + +.Move: ; e2887 + 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 +; e28a5 + +.Stats: ; e28a5 + call LoadStandardMenuHeader + call BillsPC_StatsScreen + call ExitMenu + call PCMonInfo + call BillsPC_GetSelectedPokemonSpecies + ld [wCurPartySpecies], a + ld a, SCGB_BILLS_PC + call BillsPC_ApplyPalettes + ret +; e28bd + +.Cancel: ; e28bd + ld a, $0 + ld [wJumptableIndex], a + ret +; e28c3 + +.MenuHeader: ; 0xe28c3 + db MENU_BACKUP_TILES ; flags + menu_coords 9, 4, SCREEN_WIDTH - 1, 13 + dw .MenuData + db 1 ; default option +; 0xe28cb + +.MenuData: ; 0xe28cb + db STATICMENU_CURSOR ; flags + db 3 ; items + db "MOVE@" + db "STATS@" + db "CANCEL@" +; 0xe28df + +.PrepInsertCursor: ; e28df + xor a + ld [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 +; e2903 + +.Joypad2: ; e2903 + 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 + ld [hBGMapMode], a + call BillsPC_RefreshTextboxes + ld a, $1 + ld [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 +; e2963 + +BillsPC_InitRAM: ; e2963 (38:6963) + call ClearBGPalettes + call ClearSprites + call ClearTileMap + call BillsPC_InitGFX + ld hl, wBillsPCPokemonList + ld bc, $338 + xor a + call ByteFill + xor a + ld [wJumptableIndex], a + ld [wcf64], a + ld [wcf65], a + ld [wcf66], a + ld [wBillsPC_CursorPosition], a + ld [wBillsPC_ScrollPosition], a + ret + +BillsPC_IncrementJumptableIndex: ; e298d (38:698d) + ld hl, wJumptableIndex + inc [hl] + ret + +BillsPC_EndJumptableLoop: ; e2992 (38:6992) + ld hl, wJumptableIndex + set 7, [hl] + ret + +_StatsScreenDPad: ; e2998 (38:6998) + 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: ; e29b5 (38:69b5) + 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 +; e29d0 (38:69d0) + +MoveMonWithoutMail_DPad: ; e29d0 + 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: ; e29f4 + 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: ; e2a18 (38:6a18) + 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: ; e2a2c (38:6a2c) + 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 +; e2a48 (38:6a48) + +BillsPC_PressLeft: ; e2a48 + 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: ; e2a56 + 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: ; e2a65 (38:6a65) + xor a + and a + ret + +BillsPC_UpDownDidSomething: ; e2a68 (38:6a68) + ld a, TRUE + and a + ret +; e2a6c (38:6a6c) + +BillsPC_LeftRightDidSomething: ; e2a6c + scf + ret +; e2a6e + +BillsPC_PlaceString: ; e2a6e (38:6a6e) + push de + hlcoord 0, 15 + lb bc, 1, 18 + call TextBox + pop de + hlcoord 1, 16 + call PlaceString + ret +; e2a80 (38:6a80) + +BillsPC_MoveMonWOMail_BoxNameAndArrows: ; e2a80 + call BillsPC_BoxName + hlcoord 8, 1 + ld [hl], $5f + hlcoord 19, 1 + ld [hl], $5e + ret +; e2a8e + +BillsPC_BoxName: ; e2a8e (38:6a8e) + 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 +; e2abd (38:6abd) + +.PartyPKMN: + db "PARTY <PK><MN>@" +; e2ac6 + +PCMonInfo: ; e2ac6 (38:6ac6) +; 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 [wd265], 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, [wd265] + 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 [wd265], 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: ; e2b6d (38:6b6d) + 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 GetSRAMBank + 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 GetSRAMBank + 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: ; e2c2c (38:6c2c) + 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 +; e2c67 (38:6c67) + +.CancelString: + db "CANCEL@" +; e2c6e + +.PlaceNickname: ; e2c6e (38:6c6e) + 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 GetSRAMBank + 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 GetSRAMBank + 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 +; e2d2a (38:6d2a) + +.Placeholder: + db "-----@" +; e2d30 + +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, [wd003] + ld [de], a + inc a + ld [wd003], a + inc de + inc hl + ld a, [wd004] + inc a + ld [wd004], a + jr .loop\@ + +.done\@ +if \1 + call CloseSRAM +endc + ld a, -1 + ld [de], a + ld a, [wd004] + inc a + ld [wBillsPC_NumMonsInBox], a +ENDM + +CopyBoxmonSpecies: ; e2d30 (38:6d30) + xor a + ld hl, wBillsPCPokemonList + ld bc, 3 * 30 + call ByteFill + ld de, wBillsPCPokemonList + xor a + ld [wd003], a + ld [wd004], 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 GetSRAMBank + inc hl + copy_box_data 1 + ret + +.party + ld hl, wPartySpecies + copy_box_data 0 + ret + +.sBox + ld a, BANK(sBox) + call GetSRAMBank + ld hl, sBoxSpecies + copy_box_data 1 + ret + +BillsPC_GetSelectedPokemonSpecies: ; e2def (38:6def) + 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: ; e2e01 (38:6e01) + 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 +; e2e2b (38:6e2b) + +.OAM: ; e2e2b + dsprite 4, 6, 10, 0, $00, 0 + dsprite 4, 6, 11, 0, $00, 0 + dsprite 4, 6, 12, 0, $00, 0 + dsprite 4, 6, 13, 0, $00, 0 + dsprite 4, 6, 14, 0, $00, 0 + dsprite 4, 6, 15, 0, $00, 0 + dsprite 4, 6, 16, 0, $00, 0 + dsprite 4, 6, 17, 0, $00, 0 + dsprite 4, 6, 18, 0, $00, 0 + dsprite 4, 6, 18, 7, $00, 0 + dsprite 7, 1, 10, 0, $00, 0 | Y_FLIP + dsprite 7, 1, 11, 0, $00, 0 | Y_FLIP + dsprite 7, 1, 12, 0, $00, 0 | Y_FLIP + dsprite 7, 1, 13, 0, $00, 0 | Y_FLIP + dsprite 7, 1, 14, 0, $00, 0 | Y_FLIP + dsprite 7, 1, 15, 0, $00, 0 | Y_FLIP + dsprite 7, 1, 16, 0, $00, 0 | Y_FLIP + dsprite 7, 1, 17, 0, $00, 0 | Y_FLIP + dsprite 7, 1, 18, 0, $00, 0 | Y_FLIP + dsprite 7, 1, 18, 7, $00, 0 | Y_FLIP + dsprite 5, 6, 9, 6, $01, 0 + dsprite 6, 1, 9, 6, $01, 0 | Y_FLIP + dsprite 5, 6, 19, 1, $01, 0 | X_FLIP + dsprite 6, 1, 19, 1, $01, 0 | X_FLIP | Y_FLIP + db -1 +; e2e8c + +BillsPC_UpdateInsertCursor: ; e2e8c + 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 +; e2eac + +.OAM: ; e2eac + dsprite 4, 7, 10, 0, $06, 0 + dsprite 5, 3, 11, 0, $00, 0 | Y_FLIP + dsprite 5, 3, 12, 0, $00, 0 | Y_FLIP + dsprite 5, 3, 13, 0, $00, 0 | Y_FLIP + dsprite 5, 3, 14, 0, $00, 0 | Y_FLIP + dsprite 5, 3, 15, 0, $00, 0 | Y_FLIP + dsprite 5, 3, 16, 0, $00, 0 | Y_FLIP + dsprite 5, 3, 17, 0, $00, 0 | Y_FLIP + dsprite 5, 3, 18, 0, $00, 0 | Y_FLIP + dsprite 4, 7, 19, 0, $07, 0 + db -1 +; e2ed5 + +Unreferenced_BillsPC_FillBox: ; e2ed5 +.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 +; e2ee5 + +BillsPC_CheckSpaceInDestination: ; e2ee5 +; 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 +; e2f18 + +BillsPC_CheckMail_PreventBlackout: ; e2f18 (38:6f18) + 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: ; e2f5f (38:6f5f) + 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: ; e2f7e (38:6f7e) + call LowVolume + call BillsPC_CopyMon + ld a, $3 + ld [wMonType], a + predef StatsScreenInit + call BillsPC_InitGFX + call MaxVolume + ret + +StatsScreenDPad: ; e2f95 (38:6f95) + ld hl, hJoyPressed ; $ffa7 + 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 [wd265], a + call BillsPC_LoadMonStats + ld a, [wd265] + 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: ; e2fd6 (38:6fd6) + 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 GetSRAMBank + 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 GetSRAMBank + 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: ; e307c (38:707c) + 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: ; e30fa (38:70fa) + ld a, [wBillsPC_CursorPosition] + ld hl, wBillsPC_ScrollPosition + add [hl] + ld [wCurPartyMon], a + ld a, BANK(sBoxMonNicknames) + call GetSRAMBank + 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, $e7 + 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: ; e3180 (38:7180) + 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 [wd265], 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], $e7 + ld c, 50 + call DelayFrames + ret +; e31e7 (38:71e7) + +MovePKMNWitoutMail_InsertMon: ; e31e7 + 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 +; e322a + +.dw_return ; e322a + pop af + ld e, a + farcall MoveMonWOMail_InsertMon_SaveGame + ret +; e3233 + +.Saving_LeaveOn: + db "Saving… Leave ON!@" +; e3245 + +.Jumptable: ; e3245 + dw .BoxToBox + dw .PartyToBox + dw .BoxToParty + dw .PartyToParty +; e324d + +.BoxToBox: ; e324d + 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 +; e3267 + +.PartyToBox: ; e3267 + call .CopyFromParty + ld a, $1 + ld [wGameLogicPaused], a + farcall SaveGameData + xor a + ld [wGameLogicPaused], a + call .CopyToBox + ret +; e327d + +.BoxToParty: ; e327d + call .CopyFromBox + call .CopyToParty + ret +; e3284 + +.PartyToParty: ; e3284 + call .CopyFromParty + call .CheckTrivialMove + call .CopyToParty + ret +; e328e + +.CheckTrivialMove: ; e328e + 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 +; e32b0 + +.CopyFromBox: ; e32b0 + 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 GetSRAMBank + 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 +; e32fa + +.CopyToBox: ; e32fa + 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 +; e3316 + +.CopyFromParty: ; e3316 + 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 +; e3346 + +.CopyToParty: ; e3346 + ld a, [wBillsPC_CursorPosition] + ld hl, wBillsPC_ScrollPosition + add [hl] + ld [wCurPartyMon], a + farcall InsertPokemonIntoParty + ret +; e3357 + +CopySpeciesToTemp: ; e3357 (38:7357) + ld a, [wCurPartyMon] + ld c, a + ld b, $0 + add hl, bc + ld a, [hl] + ld [wCurPartySpecies], a + ret + +CopyNicknameToTemp: ; e3363 (38:7363) + ld bc, MON_NAME_LENGTH + ld a, [wCurPartyMon] + call AddNTimes + ld de, wBufferMonNick + ld bc, MON_NAME_LENGTH + call CopyBytes + ret + +CopyOTNameToTemp: ; e3376 (38:7376) + ld bc, NAME_LENGTH + ld a, [wCurPartyMon] + call AddNTimes + ld de, wBufferMonOT + ld bc, NAME_LENGTH + call CopyBytes + ret + +CopyMonToTemp: ; e3389 (38:7389) + ld a, [wCurPartyMon] + call AddNTimes + ld de, wBufferMon + call CopyBytes + ret + +GetBoxPointer: ; e3396 (38:7396) + 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 +; e33a6 (38:73a6) + +.boxes ; e33a6 + ; 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 +; e33d0 + +BillsPC_ApplyPalettes: ; e33d0 (38:73d0) + ld b, a + call GetSGBLayout + ld a, %11100100 + call DmgToCgbBGPals + ld a, %11111100 + call DmgToCgbObjPal0 + ret + +BillsPC_Jumptable: ; e33df (38:73df) + ld e, a + ld d, $0 + add hl, de + add hl, de + ld a, [hli] + ld h, [hl] + ld l, a + ret + +BillsPC_InitGFX: ; e33e8 (38:73e8) + 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 +; e3419 (38:7419) + +PCSelectLZ: INCBIN "gfx/pc/pc.2bpp.lz" +PCMailGFX: INCBIN "gfx/pc/pc_mail.2bpp" +; e34dd + +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!@" +; e35aa + + +_ChangeBox: ; e35aa (38:75aa) + call LoadStandardMenuHeader + call BillsPC_ClearTilemap +.loop + xor a + ld [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: ; e35e2 (38:75e2) + xor a + ld [hBGMapMode], a + hlcoord 0, 0 + ld bc, SCREEN_WIDTH * SCREEN_HEIGHT + ld a, " " + call ByteFill + ret +; e35f1 (38:75f1) + +_ChangeBox_MenuHeader: ; 0xe35f1 + db MENU_BACKUP_TILES ; flags + menu_coords 1, 5, 9, 12 + dw .MenuData + db 1 ; default option +; 0xe35f9 + +.MenuData ; 0xe35f9 + db MENU_UNUSED_1 | MENU_UNUSED_3 ; flags + db 4, 0 + db 1 + dba .boxes + dba .boxnames + dba NULL + dba BillsPC_PrintBoxCountAndCapacity +; e3609 + +.boxes ; e3609 + db NUM_BOXES +x = 1 +rept NUM_BOXES + db x +x = x + 1 +endr + db -1 +; e3619 + +.boxnames ; e3619 + push de + ld a, [wMenuSelection] + dec a + call GetBoxName + pop hl + call PlaceString + ret +; e3626 + +GetBoxName: ; e3626 (38:7626) + ld bc, BOX_NAME_LENGTH + ld hl, wBoxNames + call AddNTimes + ld d, h + ld e, l + ret +; e3632 (38:7632) + +BillsPC_PrintBoxCountAndCapacity: ; e3632 + 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 [wd265], a + hlcoord 13, 11 + ld de, wd265 + lb bc, 1, 2 + call PrintNum + ld de, .out_of_20 + call PlaceString + ret +; e3663 + +.Pokemon: ; e3663 + db "#MON@" +; e3668 + +.out_of_20 ; e3668 + ; db "/20@" + db "/" + db "0" + MONS_PER_BOX / 10 ; "2" + db "0" + MONS_PER_BOX % 10 ; "0" + db "@" +; e366c + +GetBoxCount: ; e366c (38:766c) + 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 GetSRAMBank + 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 GetSRAMBank + ld hl, sBoxCount + ld a, [hl] + call CloseSRAM + ret +; e36a5 (38:76a5) + +.boxbanks ; e36a5 + 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 +; e36cf + +BillsPC_PrintBoxName: ; e36cf (38:76cf) + 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 +; e36f1 (38:76f1) + +.Current: ; e36f1 + db "CURRENT@" +; e36f9 + +BillsPC_ChangeBoxSubmenu: ; e36f9 (38:76f9) + 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, $4 ; box + ld de, wd002 + farcall NamingScreen + call ClearTileMap + call LoadStandardFont + call LoadFontsBattleExtra + ld a, [wMenuSelection] + dec a + call GetBoxName + ld e, l + ld d, h + ld hl, wd002 + ld c, BOX_NAME_LENGTH - 1 + call InitString + ld a, [wMenuSelection] + dec a + call GetBoxName + ld de, wd002 + call CopyName2 + ret +; e3778 (38:7778) + + hlcoord 11, 7 ; unused + +.MenuHeader: ; 0xe377b + db MENU_BACKUP_TILES ; flags + menu_coords 11, 4, SCREEN_WIDTH - 1, 13 + dw .MenuData + db 1 ; default option +; 0xe3783 + +.MenuData: ; 0xe3783 + db STATICMENU_CURSOR ; flags + db 4 ; items + db "SWITCH@" + db "NAME@" + db "PRINT@" + db "QUIT@" +; 0xe379c + +BillsPC_PlaceChooseABoxString: ; e379c (38:779c) + ld de, .ChooseABox + jr BillsPC_PlaceChangeBoxString +; e37a1 (38:77a1) + +.ChooseABox: ; e37a1 + db "Choose a BOX.@" +; e37af + +BillsPC_PlaceWhatsUpString: ; e37af (38:77af) + ld de, .WhatsUp + jr BillsPC_PlaceChangeBoxString +; e37b4 (38:77b4) + +.WhatsUp: ; e37b4 + db "What's up?@" +; e37be + +BillsPC_PlaceEmptyBoxString_SFX: ; e37be (38:77be) + ld de, .NoMonString + call BillsPC_PlaceChangeBoxString + ld de, SFX_WRONG + call WaitPlaySFX + call WaitSFX + ld c, 50 + call DelayFrames + ret +; e37d3 (38:77d3) + +.NoMonString: ; e37d3 + db "There's no #MON.@" +; e37e3 + +BillsPC_PlaceChangeBoxString: ; e37e3 (38:77e3) + push de + hlcoord 0, 14 + lb bc, 2, 18 + call TextBox + pop de + hlcoord 1, 16 + call PlaceString + ld a, $1 + ld [hBGMapMode], a + ret diff --git a/engine/pokemon/billspctop.asm b/engine/pokemon/billspctop.asm new file mode 100755 index 000000000..1e808c02c --- /dev/null +++ b/engine/pokemon/billspctop.asm @@ -0,0 +1,387 @@ +_BillsPC: ; e3fd + call .CheckCanUsePC + ret c + call .LogIn + call .UseBillsPC + jp .LogOut + +.CheckCanUsePC: ; e40a (3:640a) + ld a, [wPartyCount] + and a + ret nz + ld hl, .Text_GottaHavePokemon + call MenuTextBoxBackup + scf + ret + +.Text_GottaHavePokemon: ; 0xe417 + ; You gotta have #MON to call! + text_jump UnknownText_0x1c1006 + db "@" + +.LogIn: ; e41c (3:641c) + xor a + ld [hBGMapMode], a + call LoadStandardMenuHeader + call ClearPCItemScreen + ld hl, wOptions + ld a, [hl] + push af + set NO_TEXT_SCROLL, [hl] + ld hl, .Text_What + call PrintText + pop af + ld [wOptions], a + call LoadFontsBattleExtra + ret + +.Text_What: ; 0xe43a + ; What? + text_jump UnknownText_0x1c1024 + db "@" + +.LogOut: ; e43f (3:643f) + call CloseSubmenu + ret + +.UseBillsPC: ; e443 (3:6443) + ld hl, .MenuHeader + call LoadMenuHeader + ld a, $1 +.loop + ld [wMenuCursorBuffer], a + call SetPalettes + xor a + ld [wWhichIndexSet], a + ld [hBGMapMode], a + call DoNthMenu + jr c, .cancel + ld a, [wMenuCursorBuffer] + push af + ld a, [wMenuSelection] + ld hl, .Jumptable + rst JumpTable + pop bc + ld a, b + jr nc, .loop +.cancel + call CloseWindow + ret + +.MenuHeader: ; 0xe46f + db MENU_BACKUP_TILES ; flags + menu_coords 0, 0, SCREEN_WIDTH - 1, SCREEN_HEIGHT - 1 + dw .MenuData + db 1 ; default option + +.MenuData: ; 0xe477 + db STATICMENU_CURSOR ; flags + db 0 ; items + dw .items + dw PlaceMenuStrings + dw .strings + +.strings ; e47f + db "WITHDRAW <PK><MN>@" + db "DEPOSIT <PK><MN>@" + db "CHANGE BOX@" + db "MOVE <PK><MN> W/O MAIL@" + db "SEE YA!@" + +.Jumptable: ; e4ba (3:64ba) + dw BillsPC_WithdrawMenu + dw BillsPC_DepositMenu + dw BillsPC_ChangeBoxMenu + dw BillsPC_MovePKMNMenu + dw BillsPC_SeeYa + +.items ; e4c4 + db 5 + db 0 ; WITHDRAW + db 1; DEPOSIT + db 2 ; CHANGE BOX + db 3 ; MOVE PKMN + db 4 ; SEE YA! + db -1 + +BillsPC_SeeYa: ; e4cb + scf + ret + +BillsPC_MovePKMNMenu: ; e4cd + call LoadStandardMenuHeader + farcall IsAnyMonHoldingMail + jr nc, .no_mail + ld hl, .Text_MonHoldingMail + call PrintText + jr .quit + +.no_mail + farcall StartMoveMonWOMail_SaveGame + jr c, .quit + farcall _MovePKMNWithoutMail + call ReturnToMapFromSubmenu + call ClearPCItemScreen + +.quit + call CloseWindow + and a + ret + +.Text_MonHoldingMail: ; 0xe4f9 + ; There is a #MON holding MAIL. Please remove the MAIL. + text_jump UnknownText_0x1c102b + db "@" + +BillsPC_DepositMenu: ; e4fe (3:64fe) + call LoadStandardMenuHeader + farcall _DepositPKMN + call ReturnToMapFromSubmenu + call ClearPCItemScreen + call CloseWindow + and a + ret + +Unreferenced_Functione512: + ld a, [wPartyCount] + and a + jr z, .no_mon + cp 2 + jr c, .only_one_mon + and a + ret + +.no_mon + ld hl, .Text_NoMon + call MenuTextBoxBackup + scf + ret + +.only_one_mon + ld hl, .Text_ItsYourLastMon + call MenuTextBoxBackup + scf + ret + +.Text_NoMon: ; 0xe52e + ; You don't have a single #MON! + text_jump UnknownText_0x1c1062 + db "@" + +.Text_ItsYourLastMon: ; 0xe533 + ; You can't deposit your last #MON! + text_jump UnknownText_0x1c1080 + db "@" + +CheckCurPartyMonFainted: ; e538 + ld hl, wPartyMon1HP + ld de, PARTYMON_STRUCT_LENGTH + ld b, $0 +.loop + ld a, [wCurPartyMon] + cp b + jr z, .skip + ld a, [hli] + or [hl] + jr nz, .notfainted + dec hl + +.skip + inc b + ld a, [wPartyCount] + cp b + jr z, .done + add hl, de + jr .loop + +.done + scf + ret + +.notfainted + and a + ret + +BillsPC_WithdrawMenu: ; e559 (3:6559) + call LoadStandardMenuHeader + farcall _WithdrawPKMN + call ReturnToMapFromSubmenu + call ClearPCItemScreen + call CloseWindow + and a + ret + +Unreferenced_Functione56d: + ld a, [wPartyCount] + cp PARTY_LENGTH + jr nc, .asm_e576 + and a + ret + +.asm_e576 + ld hl, UnknownText_0xe57e + call MenuTextBoxBackup + scf + ret + +UnknownText_0xe57e: ; 0xe57e + ; You can't take any more #MON. + text_jump UnknownText_0x1c10a2 + db "@" + +BillsPC_ChangeBoxMenu: ; e583 (3:6583) + farcall _ChangeBox + and a + ret + +ClearPCItemScreen: ; e58b + call DisableSpriteUpdates + xor a + ld [hBGMapMode], a + call ClearBGPalettes + call ClearSprites + hlcoord 0, 0 + ld bc, SCREEN_HEIGHT * SCREEN_WIDTH + ld a, " " + call ByteFill + hlcoord 0, 0 + lb bc, 10, 18 + call TextBox + hlcoord 0, 12 + lb bc, 4, 18 + call TextBox + call WaitBGMap2 + call SetPalettes ; load regular palettes? + ret + +CopyBoxmonToTempMon: ; e5bb + ld a, [wCurPartyMon] + ld hl, sBoxMon1Species + ld bc, BOXMON_STRUCT_LENGTH + call AddNTimes + ld de, wTempMonSpecies + ld bc, BOXMON_STRUCT_LENGTH + ld a, BANK(sBoxMon1Species) + call GetSRAMBank + call CopyBytes + call CloseSRAM + ret + +Unreferenced_Functione5d9: + ld a, [wCurBox] + cp b + jr z, .same_box + ld a, b + ld hl, .BoxAddrs + ld bc, 3 + call AddNTimes + ld a, [hli] + push af + ld a, [hli] + ld h, [hl] + ld l, a + pop af + jr .okay + +.same_box + ld a, BANK(sBoxCount) + ld hl, sBoxCount + +.okay + call GetSRAMBank + ld a, [hl] + ld bc, 1 + MONS_PER_BOX + 1 + add hl, bc + ld b, a + ld c, $0 + ld de, wc608 + ld a, b + and a + jr z, .empty_box +.loop + push hl + push bc + ld a, c + ld bc, 0 + add hl, bc + ld bc, BOXMON_STRUCT_LENGTH + call AddNTimes + ld a, [hl] + ld [de], a + inc de + ld [wCurSpecies], a + call GetBaseData + pop bc + pop hl + + push hl + push bc + ld a, c + ld bc, MONS_PER_BOX * (BOXMON_STRUCT_LENGTH + NAME_LENGTH) + add hl, bc + call SkipNames + call CopyBytes + pop bc + pop hl + + push hl + push bc + ld a, c + ld bc, MON_LEVEL + add hl, bc + ld bc, BOXMON_STRUCT_LENGTH + call AddNTimes + ld a, [hl] + ld [de], a + inc de + pop bc + pop hl + + push hl + push bc + ld a, c + ld bc, MON_DVS + add hl, bc + ld bc, BOXMON_STRUCT_LENGTH + call AddNTimes + ld a, [hli] + and $f0 + ld b, a + ld a, [hl] + and $f0 + swap a + or b + ld b, a + ld a, [wBaseGender] + cp b + ld a, $1 + jr c, .okay2 + xor a +.okay2 + ld [de], a + inc de + pop bc + pop hl + + inc c + dec b + jr nz, .loop +.empty_box + call CloseSRAM + ret + +.BoxAddrs: ; e66e + 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 diff --git a/engine/pokemon/breeding.asm b/engine/pokemon/breeding.asm new file mode 100755 index 000000000..58b42953c --- /dev/null +++ b/engine/pokemon/breeding.asm @@ -0,0 +1,994 @@ +CheckBreedmonCompatibility: ; 16e1d + call .CheckBreedingGroupCompatibility + ld c, $0 + jp nc, .done + ld a, [wBreedMon1Species] + ld [wCurPartySpecies], a + ld a, [wBreedMon1DVs] + ld [wTempMonDVs], a + ld a, [wBreedMon1DVs + 1] + ld [wTempMonDVs + 1], a + ld a, TEMPMON + ld [wMonType], a + predef GetGender + jr c, .genderless + ld b, $1 + jr nz, .breedmon2 + inc b + +.breedmon2 + push bc + ld a, [wBreedMon2Species] + ld [wCurPartySpecies], a + ld a, [wBreedMon2DVs] + ld [wTempMonDVs], a + ld a, [wBreedMon2DVs + 1] + ld [wTempMonDVs + 1], a + ld a, $3 + ld [wMonType], a + predef GetGender + pop bc + jr c, .genderless + ld a, $1 + jr nz, .compare_gender + inc a + +.compare_gender + cp b + jr nz, .compute + +.genderless + ld c, $0 + ld a, [wBreedMon1Species] + cp DITTO + jr z, .ditto1 + ld a, [wBreedMon2Species] + cp DITTO + jr nz, .done + jr .compute + +.ditto1 + ld a, [wBreedMon2Species] + cp DITTO + jr z, .done + +.compute + call .CheckDVs + ld c, 255 + jp z, .done + ld a, [wBreedMon2Species] + ld b, a + ld a, [wBreedMon1Species] + cp b + ld c, 254 + jr z, .compare_ids + ld c, 128 +.compare_ids + ; Speed up + ld a, [wBreedMon1ID] + ld b, a + ld a, [wBreedMon2ID] + cp b + jr nz, .done + ld a, [wBreedMon1ID + 1] + ld b, a + ld a, [wBreedMon2ID + 1] + cp b + jr nz, .done + ld a, c + sub 77 + ld c, a + +.done + ld a, c + ld [wd265], a + ret +; 16ebc + + +.CheckDVs: ; 16ebc (5:6ebc) +; If Defense DVs match and the lower 3 bits of the Special DVs match, +; avoid breeding + ld a, [wBreedMon1DVs] + and %1111 + ld b, a + ld a, [wBreedMon2DVs] + and %1111 + cp b + ret nz + ld a, [wBreedMon1DVs + 1] + and %111 + ld b, a + ld a, [wBreedMon2DVs + 1] + and %111 + cp b + ret +; 16ed6 + +.CheckBreedingGroupCompatibility: ; 16ed6 +; If either mon is in the No Eggs group, +; they are not compatible. + ld a, [wBreedMon2Species] + ld [wCurSpecies], a + call GetBaseData + ld a, [wBaseEggGroups] + cp EGG_NONE * $11 + jr z, .Incompatible + + ld a, [wBreedMon1Species] + ld [wCurSpecies], a + call GetBaseData + ld a, [wBaseEggGroups] + cp EGG_NONE * $11 + jr z, .Incompatible + +; Ditto is automatically compatible with everything. +; If not Ditto, load the breeding groups into b/c and d/e. + ld a, [wBreedMon2Species] + cp DITTO + jr z, .Compatible + ld [wCurSpecies], a + call GetBaseData + ld a, [wBaseEggGroups] + push af + and $f + ld b, a + pop af + and $f0 + swap a + ld c, a + + ld a, [wBreedMon1Species] + cp DITTO + jr z, .Compatible + ld [wCurSpecies], a + push bc + call GetBaseData + pop bc + ld a, [wBaseEggGroups] + push af + and $f + ld d, a + pop af + and $f0 + swap a + ld e, a + + ld a, d + cp b + jr z, .Compatible + cp c + jr z, .Compatible + + ld a, e + cp b + jr z, .Compatible + cp c + jr z, .Compatible + +.Incompatible: + and a + ret + +.Compatible: + scf + ret +; 16f3e + +DoEggStep:: ; 16f3e + ld de, wPartySpecies + ld hl, wPartyMon1Happiness + ld c, 0 +.loop + ld a, [de] + inc de + cp -1 + ret z + cp EGG + jr nz, .next + dec [hl] + jr nz, .next + ld a, 1 + and a + ret + +.next + push de + ld de, PARTYMON_STRUCT_LENGTH + add hl, de + pop de + jr .loop +; 16f5e + +OverworldHatchEgg:: ; 16f5e + call RefreshScreen + call LoadStandardMenuHeader + call HatchEggs + call ExitAllMenus + call RestartMapMusic + jp CloseText +; 16f70 + +HatchEggs: ; 16f70 (5:6f70) + ld de, wPartySpecies + ld hl, wPartyMon1Happiness + xor a + ld [wCurPartyMon], a + +.loop ; 16f7a (5:6f7a) + ld a, [de] + inc de + cp -1 + jp z, .done + push de + push hl + cp EGG + jp nz, .next + ld a, [hl] + and a + jp nz, .next + ld [hl], $78 + + push de + + farcall SetEggMonCaughtData + farcall StubbedTrainerRankings_EggsHatched + ld a, [wCurPartyMon] + ld hl, wPartyMon1Species + ld bc, PARTYMON_STRUCT_LENGTH + call AddNTimes + ld a, [hl] + ld [wCurPartySpecies], a + dec a + call SetSeenAndCaughtMon + + ld a, [wCurPartySpecies] + cp TOGEPI + jr nz, .nottogepi + ; set the event flag for hatching togepi + ld de, EVENT_TOGEPI_HATCHED + ld b, SET_FLAG + call EventFlagAction +.nottogepi + + pop de + + ld a, [wCurPartySpecies] + dec de + ld [de], a + ld [wd265], a + ld [wCurSpecies], a + call GetPokemonName + xor a + ld [wd26b], a + call GetBaseData + ld a, [wCurPartyMon] + ld hl, wPartyMon1 + ld bc, PARTYMON_STRUCT_LENGTH + call AddNTimes + push hl + ld bc, MON_MAXHP + add hl, bc + ld d, h + ld e, l + pop hl + push hl + ld bc, MON_LEVEL + add hl, bc + ld a, [hl] + ld [wCurPartyLevel], a + pop hl + push hl + ld bc, MON_STATUS + add hl, bc + xor a + ld [hli], a + ld [hl], a + pop hl + push hl + ld bc, MON_STAT_EXP - 1 + add hl, bc + ld b, FALSE + predef CalcMonStats + pop bc + ld hl, MON_MAXHP + add hl, bc + ld d, h + ld e, l + ld hl, MON_HP + add hl, bc + ld a, [de] + inc de + ld [hli], a + ld a, [de] + ld [hl], a + ld hl, MON_ID + add hl, bc + ld a, [wPlayerID] + ld [hli], a + ld a, [wPlayerID + 1] + ld [hl], a + ld a, [wCurPartyMon] + ld hl, wPartyMonOT + ld bc, NAME_LENGTH + call AddNTimes + ld d, h + ld e, l + ld hl, wPlayerName + call CopyBytes + ld hl, .Text_HatchEgg + call PrintText + ld a, [wCurPartyMon] + ld hl, wPartyMonNicknames + ld bc, MON_NAME_LENGTH + call AddNTimes + ld d, h + ld e, l + push de + ld hl, .Text_NicknameHatchling + call PrintText + call YesNoBox + pop de + jr c, .nonickname + + ld a, $1 + ld [wd26b], a + xor a + ld [wMonType], a + push de + ld b, $0 + farcall NamingScreen + pop hl + ld de, wStringBuffer1 + call InitName + jr .next + +.nonickname + ld hl, wStringBuffer1 + ld bc, MON_NAME_LENGTH + call CopyBytes + +.next ; 1707d (5:707d) + ld hl, wCurPartyMon + inc [hl] + pop hl + ld de, PARTYMON_STRUCT_LENGTH + add hl, de + pop de + jp .loop + +.done ; 1708a (5:708a) + ret +; 1708b (5:708b) + +.Text_HatchEgg: ; 0x1708b + ; Huh? @ @ + text_jump UnknownText_0x1c0db0 + start_asm + ld hl, wVramState + res 0, [hl] + push hl + push de + push bc + ld a, [wCurPartySpecies] + push af + call EggHatch_AnimationSequence + ld hl, .ClearTextbox + call PrintText + pop af + ld [wCurPartySpecies], a + pop bc + pop de + pop hl + ld hl, .CameOutOfItsEgg + ret +; 170b0 (5:70b0) + +.ClearTextbox: ; 0x170b0 + ; + text_jump UnknownText_0x1c0db8 + db "@" +; 0x170b5 + +.CameOutOfItsEgg: ; 0x170b5 + ; came out of its EGG!@ @ + text_jump UnknownText_0x1c0dba + db "@" +; 0x170ba + +.Text_NicknameHatchling: ; 0x170ba + ; Give a nickname to @ ? + text_jump UnknownText_0x1c0dd8 + db "@" +; 0x170bf + +InitEggMoves: ; 170bf + call GetHeritableMoves + ld d, h + ld e, l + ld b, NUM_MOVES +.loop + ld a, [de] + and a + jr z, .done + ld hl, wEggMonMoves + ld c, NUM_MOVES +.next + ld a, [de] + cp [hl] + jr z, .skip + inc hl + dec c + jr nz, .next + call GetEggMove + jr nc, .skip + call LoadEggMove + +.skip + inc de + dec b + jr nz, .loop + +.done + ret +; 170e4 + +GetEggMove: ; 170e4 + push bc + ld a, [wEggMonSpecies] + dec a + ld c, a + ld b, 0 + ld hl, EggMovePointers + add hl, bc + add hl, bc + ld a, BANK(EggMovePointers) + call GetFarHalfword +.loop + ld a, BANK(EggMoves) + call GetFarByte + cp -1 + jr z, .reached_end + ld b, a + ld a, [de] + cp b + jr z, .done_carry + inc hl + jr .loop + +.reached_end + call GetBreedmonMovePointer + ld b, NUM_MOVES +.loop2 + ld a, [de] + cp [hl] + jr z, .found_eggmove + inc hl + dec b + jr z, .inherit_tmhm + jr .loop2 + +.found_eggmove + ld a, [wEggMonSpecies] + dec a + ld c, a + ld b, 0 + ld hl, EvosAttacksPointers + add hl, bc + add hl, bc + ld a, BANK(EvosAttacksPointers) + call GetFarHalfword +.loop3 + ld a, BANK(EvosAttacks) + call GetFarByte + inc hl + and a + jr nz, .loop3 +.loop4 + ld a, BANK(EvosAttacks) + call GetFarByte + and a + jr z, .inherit_tmhm + inc hl + ld a, BANK(EvosAttacks) + call GetFarByte + ld b, a + ld a, [de] + cp b + jr z, .done_carry + inc hl + jr .loop4 + +.inherit_tmhm + ld hl, TMHMMoves +.loop5 + ld a, BANK(TMHMMoves) + call GetFarByte + inc hl + and a + jr z, .done + ld b, a + ld a, [de] + cp b + jr nz, .loop5 + ld [wPutativeTMHMMove], a + predef CanLearnTMHMMove + ld a, c + and a + jr z, .done + +.done_carry + pop bc + scf + ret + +.done + pop bc + and a + ret +; 17169 + +LoadEggMove: ; 17169 + push de + push bc + ld a, [de] + ld b, a + ld hl, wEggMonMoves + ld c, NUM_MOVES +.loop + ld a, [hli] + and a + jr z, .done + dec c + jr nz, .loop + ld de, wEggMonMoves + ld hl, wEggMonMoves + 1 + ld a, [hli] + ld [de], a + inc de + ld a, [hli] + ld [de], a + inc de + ld a, [hli] + ld [de], a + +.done + dec hl + ld [hl], b + ld hl, wEggMonMoves + ld de, wEggMonPP + predef FillPP + pop bc + pop de + ret +; 17197 + +GetHeritableMoves: ; 17197 + ld hl, wBreedMon2Moves + ld a, [wBreedMon1Species] + cp DITTO + jr z, .ditto1 + ld a, [wBreedMon2Species] + cp DITTO + jr z, .ditto2 + ld a, [wBreedMotherOrNonDitto] + and a + ret z + ld hl, wBreedMon1Moves + ret + +.ditto1 + ld a, [wCurPartySpecies] + push af + ld a, [wBreedMon2Species] + ld [wCurPartySpecies], a + ld a, [wBreedMon2DVs] + ld [wTempMonDVs], a + ld a, [wBreedMon2DVs + 1] + ld [wTempMonDVs + 1], a + ld a, TEMPMON + ld [wMonType], a + predef GetGender + jr c, .inherit_mon2_moves + jr nz, .inherit_mon2_moves + jr .inherit_mon1_moves + +.ditto2 + ld a, [wCurPartySpecies] + push af + ld a, [wBreedMon1Species] + ld [wCurPartySpecies], a + ld a, [wBreedMon1DVs] + ld [wTempMonDVs], a + ld a, [wBreedMon1DVs + 1] + ld [wTempMonDVs + 1], a + ld a, TEMPMON + ld [wMonType], a + predef GetGender + jr c, .inherit_mon1_moves + jr nz, .inherit_mon1_moves + +.inherit_mon2_moves + ld hl, wBreedMon2Moves + pop af + ld [wCurPartySpecies], a + ret + +.inherit_mon1_moves + ld hl, wBreedMon1Moves + pop af + ld [wCurPartySpecies], a + ret +; 1720b + +GetBreedmonMovePointer: ; 1720b + ld hl, wBreedMon1Moves + ld a, [wBreedMon1Species] + cp DITTO + ret z + ld a, [wBreedMon2Species] + cp DITTO + jr z, .ditto + ld a, [wBreedMotherOrNonDitto] + and a + ret z + +.ditto + ld hl, wBreedMon2Moves + ret +; 17224 + + +GetEggFrontpic: ; 17224 (5:7224) + push de + ld [wCurPartySpecies], a + ld [wCurSpecies], a + call GetBaseData + ld hl, wBattleMonDVs + predef GetUnownLetter + pop de + predef_jump GetMonFrontpic + +GetHatchlingFrontpic: ; 1723c (5:723c) + push de + ld [wCurPartySpecies], a + ld [wCurSpecies], a + call GetBaseData + ld hl, wBattleMonDVs + predef GetUnownLetter + pop de + predef_jump GetAnimatedFrontpic + +Hatch_UpdateFrontpicBGMapCenter: ; 17254 (5:7254) + push af + call WaitTop + push hl + push bc + hlcoord 0, 0 + ld bc, SCREEN_HEIGHT * SCREEN_WIDTH + ld a, " " + call ByteFill + pop bc + pop hl + ld a, b + ld [hBGMapAddress + 1], a + ld a, c + ld [hGraphicStartTile], a + lb bc, 7, 7 + predef PlaceGraphic + pop af + call Hatch_LoadFrontpicPal + call SetPalettes + jp WaitBGMap + +EggHatch_DoAnimFrame: ; 1727f (5:727f) + push hl + push de + push bc + callfar PlaySpriteAnimations + call DelayFrame + pop bc + pop de + pop hl + ret + +EggHatch_AnimationSequence: ; 1728f (5:728f) + ld a, [wd265] + ld [wJumptableIndex], a + ld a, [wCurSpecies] + push af + ld de, MUSIC_NONE + call PlayMusic + farcall BlankScreen + call DisableLCD + ld hl, EggHatchGFX + ld de, vTiles0 tile $00 + ld bc, 2 tiles + ld a, BANK(EggHatchGFX) + call FarCopyBytes + farcall ClearSpriteAnims + ld de, vTiles2 tile $00 + ld a, [wJumptableIndex] + call GetHatchlingFrontpic + ld de, vTiles2 tile $31 + ld a, EGG + call GetEggFrontpic + ld de, MUSIC_EVOLUTION + call PlayMusic + call EnableLCD + hlcoord 7, 4 + ld b, HIGH(vBGMap0) + ld c, $31 ; Egg tiles start here + ld a, EGG + call Hatch_UpdateFrontpicBGMapCenter + ld c, 80 + call DelayFrames + xor a + ld [wFrameCounter], a + ld a, [hSCX] + ld b, a +.outerloop + ld hl, wFrameCounter + ld a, [hl] + inc [hl] + cp 8 + jr nc, .done + ld e, [hl] +.loop +; wobble e times + ld a, 2 + ld [hSCX], a + ld a, -2 + ld [wGlobalAnimXOffset], a + call EggHatch_DoAnimFrame + ld c, 2 + call DelayFrames + ld a, -2 + ld [hSCX], a + ld a, 2 + ld [wGlobalAnimXOffset], a + call EggHatch_DoAnimFrame + ld c, 2 + call DelayFrames + dec e + jr nz, .loop + ld c, 16 + call DelayFrames + call EggHatch_CrackShell + jr .outerloop + +.done + ld de, SFX_EGG_HATCH + call PlaySFX + xor a + ld [hSCX], a + ld [wGlobalAnimXOffset], a + call ClearSprites + call Hatch_InitShellFragments + hlcoord 6, 3 + ld b, HIGH(vBGMap0) + ld c, $00 ; Hatchling tiles start here + ld a, [wJumptableIndex] + call Hatch_UpdateFrontpicBGMapCenter + call Hatch_ShellFragmentLoop + call WaitSFX + ld a, [wJumptableIndex] + ld [wCurPartySpecies], a + hlcoord 6, 3 + ld d, $0 + ld e, ANIM_MON_HATCH + predef AnimateFrontpic + pop af + ld [wCurSpecies], a + ret + +Hatch_LoadFrontpicPal: ; 17363 (5:7363) + ld [wPlayerHPPal], a + ld b, SCGB_EVOLUTION + ld c, $0 + jp GetSGBLayout + +EggHatch_CrackShell: ; 1736d (5:736d) + ld a, [wFrameCounter] + dec a + and $7 + cp $7 + ret z + srl a + ret nc + swap a + srl a + add 9 * 8 + 4 + ld d, a + ld e, 11 * 8 + ld a, SPRITE_ANIM_INDEX_EGG_CRACK + call _InitSpriteAnimStruct + ld hl, SPRITEANIMSTRUCT_TILE_ID + add hl, bc + ld [hl], $0 + ld de, SFX_EGG_CRACK + jp PlaySFX +; 17393 (5:7393) + +EggHatchGFX: ; 17393 +INCBIN "gfx/evo/egg_hatch.2bpp" +; 173b3 + +Hatch_InitShellFragments: ; 173b3 (5:73b3) + farcall ClearSpriteAnims + ld hl, .SpriteData +.loop + ld a, [hli] + cp -1 + jr z, .done + ld e, a + ld a, [hli] + ld d, a + ld a, [hli] + ld c, a + ld a, [hli] + ld b, a + push hl + push bc + + ld a, SPRITE_ANIM_INDEX_EGG_HATCH + call _InitSpriteAnimStruct + + ld hl, SPRITEANIMSTRUCT_TILE_ID + add hl, bc + ld [hl], $0 + + pop de + ld a, e + ld hl, SPRITEANIMSTRUCT_FRAMESET_ID + add hl, bc + add [hl] + ld [hl], a + + ld hl, SPRITEANIMSTRUCT_JUMPTABLE_INDEX + add hl, bc + ld [hl], d + + pop hl + jr .loop +.done + ld de, SFX_EGG_HATCH + call PlaySFX + call EggHatch_DoAnimFrame + ret +; 173ef (5:73ef) + +shell_fragment: MACRO +; y tile, y pxl, x tile, x pxl, frameset offset, ??? + db (\1 * 8) % $100 + \2, (\3 * 8) % $100 + \4, \5 - SPRITE_ANIM_FRAMESET_EGG_HATCH_1, \6 +ENDM + +.SpriteData: ; 173ef + shell_fragment 10, 4, 9, 0, SPRITE_ANIM_FRAMESET_EGG_HATCH_1, $3c + shell_fragment 11, 4, 9, 0, SPRITE_ANIM_FRAMESET_EGG_HATCH_2, $04 + shell_fragment 10, 4, 10, 0, SPRITE_ANIM_FRAMESET_EGG_HATCH_1, $30 + shell_fragment 11, 4, 10, 0, SPRITE_ANIM_FRAMESET_EGG_HATCH_2, $10 + shell_fragment 10, 4, 11, 0, SPRITE_ANIM_FRAMESET_EGG_HATCH_3, $24 + shell_fragment 11, 4, 11, 0, SPRITE_ANIM_FRAMESET_EGG_HATCH_4, $1c + shell_fragment 10, 0, 9, 4, SPRITE_ANIM_FRAMESET_EGG_HATCH_1, $36 + shell_fragment 12, 0, 9, 4, SPRITE_ANIM_FRAMESET_EGG_HATCH_2, $0a + shell_fragment 10, 0, 10, 4, SPRITE_ANIM_FRAMESET_EGG_HATCH_3, $2a + shell_fragment 12, 0, 10, 4, SPRITE_ANIM_FRAMESET_EGG_HATCH_4, $16 + db -1 +; 17418 + +Hatch_ShellFragmentLoop: ; 17418 (5:7418) + ld c, 129 +.loop + call EggHatch_DoAnimFrame + dec c + jr nz, .loop + ret + +DayCareMon1: ; 17421 + ld hl, DayCareMon1Text + call PrintText + ld a, [wBreedMon1Species] + call PlayMonCry + ld a, [wDayCareLady] + bit DAYCARELADY_HAS_MON_F, a + jr z, DayCareMonCursor + call ButtonSound + ld hl, wBreedMon2Nick + call DayCareMonCompatibilityText + jp PrintText + +DayCareMon2: ; 17440 + ld hl, DayCareMon2Text + call PrintText + ld a, [wBreedMon2Species] + call PlayMonCry + ld a, [wDayCareMan] + bit DAYCAREMAN_HAS_MON_F, a + jr z, DayCareMonCursor + call ButtonSound + ld hl, wBreedMon1Nick + call DayCareMonCompatibilityText + jp PrintText + +DayCareMonCursor: ; 1745f + jp WaitPressAorB_BlinkCursor +; 17462 + +DayCareMon2Text: ; 0x17462 + ; It's @ that was left with the DAY-CARE LADY. + text_jump UnknownText_0x1c0df3 + db "@" +; 0x17467 + +DayCareMon1Text: ; 0x17467 + ; It's @ that was left with the DAY-CARE MAN. + text_jump UnknownText_0x1c0e24 + db "@" +; 0x1746c + +DayCareMonCompatibilityText: ; 1746c + push bc + ld de, wStringBuffer1 + ld bc, NAME_LENGTH + call CopyBytes + call CheckBreedmonCompatibility + pop bc + ld a, [wd265] + ld hl, .AllAlone + cp -1 + jr z, .done + ld hl, .Incompatible + and a + jr z, .done + ld hl, .HighCompatibility + cp 230 + jr nc, .done + cp 70 + ld hl, .ModerateCompatibility + jr nc, .done + ld hl, .SlightCompatibility + +.done + ret +; 1749c + +.AllAlone: ; 0x1749c + ; It's brimming with energy. + text_jump UnknownText_0x1c0e54 + db "@" +; 0x174a1 + +.Incompatible: ; 0x174a1 + ; It has no interest in @ . + text_jump UnknownText_0x1c0e6f + db "@" +; 0x174a6 + +.HighCompatibility: ; 0x174a6 + ; It appears to care for @ . + text_jump UnknownText_0x1c0e8d + db "@" +; 0x174ab + +.ModerateCompatibility: ; 0x174ab + ; It's friendly with @ . + text_jump UnknownText_0x1c0eac + db "@" +; 0x174b0 + +.SlightCompatibility: ; 0x174b0 + ; It shows interest in @ . + text_jump UnknownText_0x1c0ec6 + db "@" +; 0x174b5 + +Unreferenced_DayCareMonPrintEmptyString: ; 174b5 + ld hl, .string + ret +; 174b9 + +.string ; 174b9 + db "@" +; 174ba + diff --git a/engine/pokemon/caught_data.asm b/engine/pokemon/caught_data.asm new file mode 100644 index 000000000..3bfacf539 --- /dev/null +++ b/engine/pokemon/caught_data.asm @@ -0,0 +1,247 @@ +CheckPartyFullAfterContest: ; 4d9e5 + ld a, [wContestMon] + and a + jp z, .DidntCatchAnything + ld [wCurPartySpecies], a + ld [wCurSpecies], a + call GetBaseData + ld hl, wPartyCount + ld a, [hl] + cp PARTY_LENGTH + jp nc, .TryAddToBox + inc a + ld [hl], a + ld c, a + ld b, 0 + add hl, bc + ld a, [wContestMon] + ld [hli], a + ld [wCurSpecies], a + ld a, -1 + ld [hl], a + ld hl, wPartyMon1Species + ld a, [wPartyCount] + dec a + ld bc, PARTYMON_STRUCT_LENGTH + call AddNTimes + ld d, h + ld e, l + ld hl, wContestMon + ld bc, PARTYMON_STRUCT_LENGTH + call CopyBytes + ld a, [wPartyCount] + dec a + ld hl, wPartyMonOT + call SkipNames + ld d, h + ld e, l + ld hl, wPlayerName + call CopyBytes + ld a, [wCurPartySpecies] + ld [wd265], a + call GetPokemonName + ld hl, wStringBuffer1 + ld de, wMonOrItemNameBuffer + ld bc, MON_NAME_LENGTH + call CopyBytes + call GiveANickname_YesNo + jr c, .Party_SkipNickname + ld a, [wPartyCount] + dec a + ld [wCurPartyMon], a + xor a + ld [wMonType], a + ld de, wMonOrItemNameBuffer + callfar InitNickname + +.Party_SkipNickname: + ld a, [wPartyCount] + dec a + ld hl, wPartyMonNicknames + call SkipNames + ld d, h + ld e, l + ld hl, wMonOrItemNameBuffer + call CopyBytes + ld a, [wPartyCount] + dec a + ld hl, wPartyMon1Level + call GetPartyLocation + ld a, [hl] + ld [wCurPartyLevel], a + call SetCaughtData + ld a, [wPartyCount] + dec a + ld hl, wPartyMon1CaughtLocation + call GetPartyLocation + ld a, [hl] + and CAUGHT_GENDER_MASK + ld b, NATIONAL_PARK + or b + ld [hl], a + xor a + ld [wContestMon], a + and a ; BUGCONTEST_CAUGHT_MON + ld [wScriptVar], a + ret + +.TryAddToBox: ; 4daa3 + ld a, BANK(sBoxCount) + call GetSRAMBank + ld hl, sBoxCount + ld a, [hl] + cp MONS_PER_BOX + call CloseSRAM + jr nc, .BoxFull + xor a + ld [wCurPartyMon], a + ld hl, wContestMon + ld de, wBufferMon + ld bc, BOXMON_STRUCT_LENGTH + call CopyBytes + ld hl, wPlayerName + ld de, wBufferMonOT + ld bc, NAME_LENGTH + call CopyBytes + callfar InsertPokemonIntoBox + ld a, [wCurPartySpecies] + ld [wd265], a + call GetPokemonName + call GiveANickname_YesNo + ld hl, wStringBuffer1 + jr c, .Box_SkipNickname + ld a, BOXMON + ld [wMonType], a + ld de, wMonOrItemNameBuffer + callfar InitNickname + ld hl, wMonOrItemNameBuffer + +.Box_SkipNickname: + ld a, BANK(sBoxMonNicknames) + call GetSRAMBank + ld de, sBoxMonNicknames + ld bc, MON_NAME_LENGTH + call CopyBytes + call CloseSRAM + +.BoxFull: + ld a, BANK(sBoxMon1Level) + call GetSRAMBank + ld a, [sBoxMon1Level] + ld [wCurPartyLevel], a + call CloseSRAM + call SetBoxMonCaughtData + ld a, BANK(sBoxMon1CaughtLocation) + call GetSRAMBank + ld hl, sBoxMon1CaughtLocation + ld a, [hl] + and CAUGHT_GENDER_MASK + ld b, NATIONAL_PARK + or b + ld [hl], a + call CloseSRAM + xor a + ld [wContestMon], a + ld a, BUGCONTEST_BOXED_MON + ld [wScriptVar], a + ret + +.DidntCatchAnything: ; 4db35 + ld a, BUGCONTEST_NO_CATCH + ld [wScriptVar], a + ret + +GiveANickname_YesNo: ; 4db3b + ld hl, TextJump_GiveANickname + call PrintText + jp YesNoBox + +TextJump_GiveANickname: ; 0x4db44 + ; Give a nickname to the @ you received? + text_jump UnknownText_0x1c12fc + db "@" + +SetCaughtData: ; 4db49 + ld a, [wPartyCount] + dec a + ld hl, wPartyMon1CaughtLevel + call GetPartyLocation +SetBoxmonOrEggmonCaughtData: ; 4db53 + ld a, [wTimeOfDay] + inc a + rrca + rrca + ld b, a + ld a, [wCurPartyLevel] + or b + ld [hli], a + ld a, [wMapGroup] + ld b, a + ld a, [wMapNumber] + ld c, a + cp MAP_POKECENTER_2F + jr nz, .NotPokecenter2F + ld a, b + cp GROUP_POKECENTER_2F + jr nz, .NotPokecenter2F + + ld a, [wBackupMapGroup] + ld b, a + ld a, [wBackupMapNumber] + ld c, a + +.NotPokecenter2F: + call GetWorldMapLocation + ld b, a + ld a, [wPlayerGender] + rrca ; shift bit 0 (PLAYERGENDER_FEMALE_F) to bit 7 (CAUGHT_GENDER_MASK) + or b + ld [hl], a + ret + +SetBoxMonCaughtData: ; 4db83 + ld a, BANK(sBoxMon1CaughtLevel) + call GetSRAMBank + ld hl, sBoxMon1CaughtLevel + call SetBoxmonOrEggmonCaughtData + call CloseSRAM + ret + +SetGiftBoxMonCaughtData: ; 4db92 + push bc + ld a, BANK(sBoxMon1CaughtLevel) + call GetSRAMBank + ld hl, sBoxMon1CaughtLevel + pop bc + call SetGiftMonCaughtData + call CloseSRAM + ret + +SetGiftPartyMonCaughtData: ; 4dba3 + ld a, [wPartyCount] + dec a + ld hl, wPartyMon1CaughtLevel + push bc + call GetPartyLocation + pop bc +SetGiftMonCaughtData: ; 4dbaf + xor a + ld [hli], a + ld a, GIFT_LOCATION + rrc b + or b + ld [hl], a + ret + +SetEggMonCaughtData: ; 4dbb8 (13:5bb8) + ld a, [wCurPartyMon] + ld hl, wPartyMon1CaughtLevel + call GetPartyLocation + ld a, [wCurPartyLevel] + push af + ld a, CAUGHT_EGG_LEVEL + ld [wCurPartyLevel], a + call SetBoxmonOrEggmonCaughtData + pop af + ld [wCurPartyLevel], a + ret diff --git a/engine/pokemon/european_mail.asm b/engine/pokemon/european_mail.asm new file mode 100644 index 000000000..8f037cc43 --- /dev/null +++ b/engine/pokemon/european_mail.asm @@ -0,0 +1,129 @@ +IsMailEuropean: ; 1de5c8 +; return 1 if French +; return 2 if German +; return 3 if Italian +; return 4 if Spanish +; return 0 if none of the above + ld c, $0 + ld hl, sPartyMon1MailAuthorNationality - sPartyMon1Mail + add hl, de + ld a, [hli] + cp "E" + ret nz + ld a, [hli] + inc c + cp "F" + ret z + inc c + cp "G" + ret z + inc c + cp "I" + ret z + inc c + cp "S" + ret z + ld c, $0 + ret + +; The regular font. +StandardEnglishFont: ; 1de5e6 +INCBIN "gfx/font/english.1bpp" + +; An extended font. +FrenchGermanFont: ; 1de9e6 +INCBIN "gfx/font/french_german.1bpp" + +; An even more extended font. +SpanishItalianFont: ; 1dede6 +INCBIN "gfx/font/spanish_italian.1bpp" + +HandleFrenchGermanMail: ; 1df1e6 +; called if mail is french or german +; fix 's 't 'v + ld b, sPartyMon1MailAuthor - sPartyMon1Mail + ld h, d + ld l, e +.loop + ld a, [hl] + cp $dc ; 's in french/german font + jr nz, .check_intermediate_chars + ld a, "'s" + jr .replace + +.check_intermediate_chars + sub "'s" + jr c, .dont_replace + cp "'v" - "'s" + 1 + jr nc, .dont_replace + add $cd + +.replace + ld [hl], a + +.dont_replace + inc hl + dec b + jr nz, .loop + ret + +LireLeCourrierAnglais: +DeutenEnglischenPost: ; 1df203 +; Cette fonction convertit certains des caractères anglais pour +; leur équivalent dans le jeu de caractères français. +; Diese Funktion wandelt bestimmte englische Zeichen, um ihre +; Entsprechung in der Deutschen-Zeichensatz. + ld b, sPartyMon1MailAuthor - sPartyMon1Mail + ld h, d + ld l, e +.loop + ld a, [hl] + cp "'s" + jr nz, .check_intermediate_chars + ld a, $dc + jr .replace + +.check_intermediate_chars + sub $cd + jr c, .dont_replace + cp "'v" - "'s" + 1 + jr nc, .dont_replace + add "'s" + +.replace + ld [hl], a + +.dont_replace + inc hl + dec b + jr nz, .loop + ret + +HandleSpanishItalianMail: ; 1df220 +LeerCorreosIngleses: +LeggiPostaInglese: +; This function converts certain characters between +; the English and Spanish/Italian character sets. +; Esta función convierte ciertos caracteres entre +; el juego de caracteres Inglés y Español. +; Questa funzione converte alcuni caratteri tra +; l'inglese e il set di caratteri italiani. + ld b, sPartyMon1MailAuthor - sPartyMon1Mail + ld h, d + ld l, e +.loop + ld a, [hl] + and $f0 + cp $d0 + jr nz, .dont_replace + ld a, [hl] + add $8 + and $f + or $d0 + ld [hl], a + +.dont_replace + inc hl + dec b + jr nz, .loop + ret diff --git a/engine/pokemon/evolve.asm b/engine/pokemon/evolve.asm new file mode 100755 index 000000000..5a7e75dfa --- /dev/null +++ b/engine/pokemon/evolve.asm @@ -0,0 +1,676 @@ +EvolvePokemon: ; 421d8 + ld hl, wEvolvableFlags + xor a + ld [hl], a + ld a, [wCurPartyMon] + ld c, a + ld b, SET_FLAG + call EvoFlagAction +EvolveAfterBattle: ; 421e6 + xor a + ld [wMonTriedToEvolve], a + dec a + ld [wCurPartyMon], a + push hl + push bc + push de + ld hl, wPartyCount + + push hl + +EvolveAfterBattle_MasterLoop + ld hl, wCurPartyMon + inc [hl] + + pop hl + + inc hl + ld a, [hl] + cp $ff + jp z, .ReturnToMap + + ld [wEvolutionOldSpecies], a + + push hl + ld a, [wCurPartyMon] + ld c, a + ld hl, wEvolvableFlags + ld b, CHECK_FLAG + call EvoFlagAction + ld a, c + and a + jp z, EvolveAfterBattle_MasterLoop + + ld a, [wEvolutionOldSpecies] + dec a + ld b, 0 + ld c, a + ld hl, EvosAttacksPointers + add hl, bc + add hl, bc + ld a, [hli] + ld h, [hl] + ld l, a + + push hl + xor a + ld [wMonType], a + predef CopyMonToTempMon + pop hl + +.loop + ld a, [hli] + and a + jr z, EvolveAfterBattle_MasterLoop + + ld b, a + + cp EVOLVE_TRADE + jr z, .trade + + ld a, [wLinkMode] + and a + jp nz, .dont_evolve_2 + + ld a, b + cp EVOLVE_ITEM + jp z, .item + + ld a, [wForceEvolution] + and a + jp nz, .dont_evolve_2 + + ld a, b + cp EVOLVE_LEVEL + jp z, .level + + cp EVOLVE_HAPPINESS + jr z, .happiness + + +; EVOLVE_STAT + ld a, [wTempMonLevel] + cp [hl] + jp c, .dont_evolve_1 + + call IsMonHoldingEverstone + jp z, .dont_evolve_1 + + push hl + ld de, wTempMonAttack + ld hl, wTempMonDefense + ld c, 2 + call StringCmp + ld a, ATK_EQ_DEF + jr z, .got_tyrogue_evo + ld a, ATK_LT_DEF + jr c, .got_tyrogue_evo + ld a, ATK_GT_DEF +.got_tyrogue_evo + pop hl + + inc hl + cp [hl] + jp nz, .dont_evolve_2 + + inc hl + jr .proceed + + +.happiness + ld a, [wTempMonHappiness] + cp HAPPINESS_TO_EVOLVE + jp c, .dont_evolve_2 + + call IsMonHoldingEverstone + jp z, .dont_evolve_2 + + ld a, [hli] + cp TR_ANYTIME + jr z, .proceed + cp TR_MORNDAY + jr z, .happiness_daylight + +; TR_NITE + ld a, [wTimeOfDay] + cp NITE_F + jp nz, .dont_evolve_3 + jr .proceed + +.happiness_daylight + ld a, [wTimeOfDay] + cp NITE_F + jp z, .dont_evolve_3 + jr .proceed + + +.trade + ld a, [wLinkMode] + and a + jp z, .dont_evolve_2 + + call IsMonHoldingEverstone + jp z, .dont_evolve_2 + + ld a, [hli] + ld b, a + inc a + jr z, .proceed + + ld a, [wLinkMode] + cp LINK_TIMECAPSULE + jp z, .dont_evolve_3 + + ld a, [wTempMonItem] + cp b + jp nz, .dont_evolve_3 + + xor a + ld [wTempMonItem], a + jr .proceed + + +.item + ld a, [hli] + ld b, a + ld a, [wCurItem] + cp b + jp nz, .dont_evolve_3 + + ld a, [wForceEvolution] + and a + jp z, .dont_evolve_3 + ld a, [wLinkMode] + and a + jp nz, .dont_evolve_3 + jr .proceed + + +.level + ld a, [hli] + ld b, a + ld a, [wTempMonLevel] + cp b + jp c, .dont_evolve_3 + call IsMonHoldingEverstone + jp z, .dont_evolve_3 + +.proceed + ld a, [wTempMonLevel] + ld [wCurPartyLevel], a + ld a, $1 + ld [wMonTriedToEvolve], a + + push hl + + ld a, [hl] + ld [wEvolutionNewSpecies], a + ld a, [wCurPartyMon] + ld hl, wPartyMonNicknames + call GetNick + call CopyName1 + ld hl, Text_WhatEvolving + call PrintText + + ld c, 50 + call DelayFrames + + xor a + ld [hBGMapMode], a + hlcoord 0, 0 + lb bc, 12, 20 + call ClearBox + + ld a, $1 + ld [hBGMapMode], a + call ClearSprites + + farcall EvolutionAnimation + + push af + call ClearSprites + pop af + jp c, CancelEvolution + + ld hl, Text_CongratulationsYourPokemon + call PrintText + + pop hl + + ld a, [hl] + ld [wCurSpecies], a + ld [wTempMonSpecies], a + ld [wEvolutionNewSpecies], a + ld [wd265], a + call GetPokemonName + + push hl + ld hl, Text_EvolvedIntoPKMN + call PrintTextBoxText + farcall StubbedTrainerRankings_MonsEvolved + + ld de, MUSIC_NONE + call PlayMusic + ld de, SFX_CAUGHT_MON + call PlaySFX + call WaitSFX + + ld c, 40 + call DelayFrames + + call ClearTileMap + call UpdateSpeciesNameIfNotNicknamed + call GetBaseData + + ld hl, wTempMonExp + 2 + ld de, wTempMonMaxHP + ld b, TRUE + predef CalcMonStats + + ld a, [wCurPartyMon] + ld hl, wPartyMons + ld bc, PARTYMON_STRUCT_LENGTH + call AddNTimes + ld e, l + ld d, h + ld bc, MON_MAXHP + add hl, bc + ld a, [hli] + ld b, a + ld c, [hl] + ld hl, wTempMonMaxHP + 1 + ld a, [hld] + sub c + ld c, a + ld a, [hl] + sbc b + ld b, a + ld hl, wTempMonHP + 1 + ld a, [hl] + add c + ld [hld], a + ld a, [hl] + adc b + ld [hl], a + + ld hl, wTempMonSpecies + ld bc, PARTYMON_STRUCT_LENGTH + call CopyBytes + + ld a, [wCurSpecies] + ld [wd265], a + xor a + ld [wMonType], a + call LearnLevelMoves + ld a, [wd265] + dec a + call SetSeenAndCaughtMon + + ld a, [wd265] + cp UNOWN + jr nz, .skip_unown + + ld hl, wTempMonDVs + predef GetUnownLetter + callfar UpdateUnownDex + +.skip_unown + pop de + pop hl + ld a, [wTempMonSpecies] + ld [hl], a + push hl + ld l, e + ld h, d + jp EvolveAfterBattle_MasterLoop +; 423f8 + +.dont_evolve_1 + inc hl +.dont_evolve_2 + inc hl +.dont_evolve_3 + inc hl + jp .loop + +; unused + pop hl +.ReturnToMap: + pop de + pop bc + pop hl + ld a, [wLinkMode] + and a + ret nz + ld a, [wBattleMode] + and a + ret nz + ld a, [wMonTriedToEvolve] + and a + call nz, RestartMapMusic + ret +; 42414 + +UpdateSpeciesNameIfNotNicknamed: ; 42414 + ld a, [wCurSpecies] + push af + ld a, [wBaseDexNo] + ld [wd265], a + call GetPokemonName + pop af + ld [wCurSpecies], a + ld hl, wStringBuffer1 + ld de, wStringBuffer2 +.loop + ld a, [de] + inc de + cp [hl] + inc hl + ret nz + cp "@" + jr nz, .loop + + ld a, [wCurPartyMon] + ld bc, MON_NAME_LENGTH + ld hl, wPartyMonNicknames + call AddNTimes + push hl + ld a, [wCurSpecies] + ld [wd265], a + call GetPokemonName + ld hl, wStringBuffer1 + pop de + ld bc, MON_NAME_LENGTH + jp CopyBytes +; 42454 + +CancelEvolution: ; 42454 + ld hl, Text_StoppedEvolving + call PrintText + call ClearTileMap + pop hl + jp EvolveAfterBattle_MasterLoop +; 42461 + +IsMonHoldingEverstone: ; 42461 + push hl + ld a, [wCurPartyMon] + ld hl, wPartyMon1Item + ld bc, PARTYMON_STRUCT_LENGTH + call AddNTimes + ld a, [hl] + cp EVERSTONE + pop hl + ret +; 42473 + +Text_CongratulationsYourPokemon: ; 0x42473 + ; Congratulations! Your @ @ + text_jump UnknownText_0x1c4b92 + db "@" +; 0x42478 + +Text_EvolvedIntoPKMN: ; 0x42478 + ; evolved into @ ! + text_jump UnknownText_0x1c4baf + db "@" +; 0x4247d + +Text_StoppedEvolving: ; 0x4247d + ; Huh? @ stopped evolving! + text_jump UnknownText_0x1c4bc5 + db "@" +; 0x42482 + +Text_WhatEvolving: ; 0x42482 + ; What? @ is evolving! + text_jump UnknownText_0x1c4be3 + db "@" +; 0x42487 + + +LearnLevelMoves: ; 42487 + ld a, [wd265] + ld [wCurPartySpecies], a + dec a + ld b, 0 + ld c, a + ld hl, EvosAttacksPointers + add hl, bc + add hl, bc + ld a, [hli] + ld h, [hl] + ld l, a + +.skip_evos + ld a, [hli] + and a + jr nz, .skip_evos + +.find_move + ld a, [hli] + and a + jr z, .done + + ld b, a + ld a, [wCurPartyLevel] + cp b + ld a, [hli] + jr nz, .find_move + + push hl + ld d, a + ld hl, wPartyMon1Moves + ld a, [wCurPartyMon] + ld bc, PARTYMON_STRUCT_LENGTH + call AddNTimes + + ld b, NUM_MOVES +.check_move + ld a, [hli] + cp d + jr z, .has_move + dec b + jr nz, .check_move + jr .learn +.has_move + + pop hl + jr .find_move + +.learn + ld a, d + ld [wPutativeTMHMMove], a + ld [wd265], a + call GetMoveName + call CopyName1 + predef LearnMove + pop hl + jr .find_move + +.done + ld a, [wCurPartySpecies] + ld [wd265], a + ret +; 424e1 + + +FillMoves: ; 424e1 +; Fill in moves at de for wCurPartySpecies at wCurPartyLevel + + push hl + push de + push bc + ld hl, EvosAttacksPointers + ld b, 0 + ld a, [wCurPartySpecies] + dec a + add a + rl b + ld c, a + add hl, bc + ld a, [hli] + ld h, [hl] + ld l, a +.GoToAttacks: + ld a, [hli] + and a + jr nz, .GoToAttacks + jr .GetLevel + +.NextMove: + pop de +.GetMove: + inc hl +.GetLevel: + ld a, [hli] + and a + jp z, .done + ld b, a + ld a, [wCurPartyLevel] + cp b + jp c, .done + ld a, [wEvolutionOldSpecies] + and a + jr z, .CheckMove + ld a, [wd002] + cp b + jr nc, .GetMove + +.CheckMove: + push de + ld c, NUM_MOVES +.CheckRepeat: + ld a, [de] + inc de + cp [hl] + jr z, .NextMove + dec c + jr nz, .CheckRepeat + pop de + push de + ld c, NUM_MOVES +.CheckSlot: + ld a, [de] + and a + jr z, .LearnMove + inc de + dec c + jr nz, .CheckSlot + pop de + push de + push hl + ld h, d + ld l, e + call ShiftMoves + ld a, [wEvolutionOldSpecies] + and a + jr z, .ShiftedMove + push de + ld bc, wPartyMon1PP - (wPartyMon1Moves + NUM_MOVES - 1) + add hl, bc + ld d, h + ld e, l + call ShiftMoves + pop de + +.ShiftedMove: + pop hl + +.LearnMove: + ld a, [hl] + ld [de], a + ld a, [wEvolutionOldSpecies] + and a + jr z, .NextMove + push hl + ld a, [hl] + ld hl, MON_PP - MON_MOVES + add hl, de + push hl + dec a + ld hl, Moves + MOVE_PP + ld bc, MOVE_LENGTH + call AddNTimes + ld a, BANK(Moves) + call GetFarByte + pop hl + ld [hl], a + pop hl + jr .NextMove + +.done + pop bc + pop de + pop hl + ret +; 4256e + +ShiftMoves: ; 4256e + ld c, NUM_MOVES - 1 +.loop + inc de + ld a, [de] + ld [hli], a + dec c + jr nz, .loop + ret +; 42577 + + +EvoFlagAction: ; 42577 + push de + ld d, $0 + predef SmallFarFlagAction + pop de + ret +; 42581 + +GetPreEvolution: ; 42581 +; Find the first mon to evolve into wCurPartySpecies. + +; Return carry and the new species in wCurPartySpecies +; if a pre-evolution is found. + + ld c, 0 +.loop ; For each Pokemon... + ld hl, EvosAttacksPointers + ld b, 0 + add hl, bc + add hl, bc + ld a, [hli] + ld h, [hl] + ld l, a +.loop2 ; For each evolution... + ld a, [hli] + and a + jr z, .no_evolve ; If we jump, this Pokemon does not evolve into wCurPartySpecies. + cp EVOLVE_STAT ; This evolution type has the extra parameter of stat comparison. + jr nz, .not_tyrogue + inc hl + +.not_tyrogue + inc hl + ld a, [wCurPartySpecies] + cp [hl] + jr z, .found_preevo + inc hl + ld a, [hl] + and a + jr nz, .loop2 + +.no_evolve + inc c + ld a, c + cp NUM_POKEMON + jr c, .loop + and a + ret + +.found_preevo + inc c + ld a, c + ld [wCurPartySpecies], a + scf + ret +; 425b1 diff --git a/engine/pokemon/experience.asm b/engine/pokemon/experience.asm new file mode 100644 index 000000000..6b94ed357 --- /dev/null +++ b/engine/pokemon/experience.asm @@ -0,0 +1,162 @@ +CalcLevel: ; 50e1b + ld a, [wTempMonSpecies] + ld [wCurSpecies], a + call GetBaseData + ld d, 1 +.next_level + inc d + ld a, d + cp LOW(MAX_LEVEL + 1) + jr z, .got_level + call CalcExpAtLevel + push hl + ld hl, wTempMonExp + 2 + ld a, [hProduct + 3] + ld c, a + ld a, [hld] + sub c + ld a, [hProduct + 2] + ld c, a + ld a, [hld] + sbc c + ld a, [hProduct + 1] + ld c, a + ld a, [hl] + sbc c + pop hl + jr nc, .next_level + +.got_level + dec d + ret + +CalcExpAtLevel: ; 50e47 +; (a/b)*n**3 + c*n**2 + d*n - e + ld a, [wBaseGrowthRate] + add a + add a + ld c, a + ld b, 0 + ld hl, GrowthRates + add hl, bc +; Cube the level + call .LevelSquared + ld a, d + ld [hMultiplier], a + call Multiply + +; Multiply by a + ld a, [hl] + and $f0 + swap a + ld [hMultiplier], a + call Multiply +; Divide by b + ld a, [hli] + and $f + ld [hDivisor], a + ld b, 4 + call Divide +; Push the cubic term to the stack + ld a, [hQuotient + 0] + push af + ld a, [hQuotient + 1] + push af + ld a, [hQuotient + 2] + push af +; Square the level and multiply by the lower 7 bits of c + call .LevelSquared + ld a, [hl] + and $7f + ld [hMultiplier], a + call Multiply +; Push the absolute value of the quadratic term to the stack + ld a, [hProduct + 1] + push af + ld a, [hProduct + 2] + push af + ld a, [hProduct + 3] + push af + ld a, [hli] + push af +; Multiply the level by d + xor a + ld [hMultiplicand + 0], a + ld [hMultiplicand + 1], a + ld a, d + ld [hMultiplicand + 2], a + ld a, [hli] + ld [hMultiplier], a + call Multiply +; Subtract e + ld b, [hl] + ld a, [hProduct + 3] + sub b + ld [hMultiplicand + 2], a + ld b, $0 + ld a, [hProduct + 2] + sbc b + ld [hMultiplicand + 1], a + ld a, [hProduct + 1] + sbc b + ld [hMultiplicand], a +; If bit 7 of c is set, c is negative; otherwise, it's positive + pop af + and $80 + jr nz, .subtract +; Add c*n**2 to (d*n - e) + pop bc + ld a, [hProduct + 3] + add b + ld [hMultiplicand + 2], a + pop bc + ld a, [hProduct + 2] + adc b + ld [hMultiplicand + 1], a + pop bc + ld a, [hProduct + 1] + adc b + ld [hMultiplicand], a + jr .done_quadratic + +.subtract +; Subtract c*n**2 from (d*n - e) + pop bc + ld a, [hProduct + 3] + sub b + ld [hMultiplicand + 2], a + pop bc + ld a, [hProduct + 2] + sbc b + ld [hMultiplicand + 1], a + pop bc + ld a, [hProduct + 1] + sbc b + ld [hMultiplicand], a + +.done_quadratic +; Add (a/b)*n**3 to (d*n - e +/- c*n**2) + pop bc + ld a, [hProduct + 3] + add b + ld [hMultiplicand + 2], a + pop bc + ld a, [hProduct + 2] + adc b + ld [hMultiplicand + 1], a + pop bc + ld a, [hProduct + 1] + adc b + ld [hMultiplicand], a + ret + +.LevelSquared: ; 50eed + xor a + ld [hMultiplicand + 0], a + ld [hMultiplicand + 1], a + ld a, d + ld [hMultiplicand + 2], a + ld [hMultiplier], a + jp Multiply + +INCLUDE "data/growth_rates.asm" diff --git a/engine/pokemon/health.asm b/engine/pokemon/health.asm new file mode 100755 index 000000000..cc47e8252 --- /dev/null +++ b/engine/pokemon/health.asm @@ -0,0 +1,110 @@ +HealParty: ; c658 + xor a + ld [wCurPartyMon], a + ld hl, wPartySpecies +.loop + ld a, [hli] + cp -1 + jr z, .done + cp EGG + jr z, .next + + push hl + call HealPartyMon + pop hl + +.next + ld a, [wCurPartyMon] + inc a + ld [wCurPartyMon], a + jr .loop + +.done + ret + +HealPartyMon: ; c677 + ld a, MON_SPECIES + call GetPartyParamLocation + ld d, h + ld e, l + + ld hl, MON_STATUS + add hl, de + xor a + ld [hli], a + ld [hl], a + + ld hl, MON_MAXHP + add hl, de + + ; bc = MON_HP + ld b, h + ld c, l + dec bc + dec bc + + ld a, [hli] + ld [bc], a + inc bc + ld a, [hl] + ld [bc], a + + farcall RestoreAllPP + ret + +ComputeHPBarPixels: ; c699 +; e = bc * (6 * 8) / de + ld a, b + or c + jr z, .zero + push hl + xor a + ld [hMultiplicand + 0], a + ld a, b + ld [hMultiplicand + 1], a + ld a, c + ld [hMultiplicand + 2], a + ld a, 6 * 8 + ld [hMultiplier], a + call Multiply + ; We need de to be under 256 because hDivisor is only 1 byte. + ld a, d + and a + jr z, .divide + ; divide de and hProduct by 4 + srl d + rr e + srl d + rr e + ld a, [hProduct + 2] + ld b, a + ld a, [hProduct + 3] + srl b + rr a + srl b + rr a + ld [hDividend + 3], a + ld a, b + ld [hDividend + 2], a +.divide + ld a, e + ld [hDivisor], a + ld b, 4 + call Divide + ld a, [hQuotient + 2] + ld e, a + pop hl + and a + ret nz + ld e, 1 + ret + +.zero + ld e, 0 + ret + +AnimateHPBar: ; c6e0 + call WaitBGMap + call _AnimateHPBar + call WaitBGMap + ret diff --git a/engine/pokemon/learn.asm b/engine/pokemon/learn.asm new file mode 100755 index 000000000..fb62289a7 --- /dev/null +++ b/engine/pokemon/learn.asm @@ -0,0 +1,256 @@ +LearnMove: ; 6508 + call LoadTileMapToTempTileMap + ld a, [wCurPartyMon] + ld hl, wPartyMonNicknames + call GetNick + ld hl, wStringBuffer1 + ld de, wMonOrItemNameBuffer + ld bc, MON_NAME_LENGTH + call CopyBytes + +.loop + ld hl, wPartyMon1Moves + ld bc, PARTYMON_STRUCT_LENGTH + ld a, [wCurPartyMon] + call AddNTimes + ld d, h + ld e, l + ld b, NUM_MOVES +; Get the first empty move slot. This routine also serves to +; determine whether the Pokemon learning the moves already has +; all four slots occupied, in which case one would need to be +; deleted. +.next + ld a, [hl] + and a + jr z, .learn + inc hl + dec b + jr nz, .next +; If we're here, we enter the routine for forgetting a move +; to make room for the new move we're trying to learn. + push de + call ForgetMove + pop de + jp c, .cancel + + push hl + push de + ld [wd265], a + + ld b, a + ld a, [wBattleMode] + and a + jr z, .not_disabled + ld a, [wDisabledMove] + cp b + jr nz, .not_disabled + xor a + ld [wDisabledMove], a + ld [wPlayerDisableCount], a +.not_disabled + + call GetMoveName + ld hl, Text_1_2_and_Poof ; 1, 2 and… + call PrintText + pop de + pop hl + +.learn + ld a, [wPutativeTMHMMove] + ld [hl], a + ld bc, MON_PP - MON_MOVES + add hl, bc + + push hl + push de + dec a + ld hl, Moves + MOVE_PP + ld bc, MOVE_LENGTH + call AddNTimes + ld a, BANK(Moves) + call GetFarByte + pop de + pop hl + + ld [hl], a + + ld a, [wBattleMode] + and a + jp z, .learned + + ld a, [wCurPartyMon] + ld b, a + ld a, [wCurBattleMon] + cp b + jp nz, .learned + + ld a, [wPlayerSubStatus5] + bit SUBSTATUS_TRANSFORMED, a + jp nz, .learned + + ld h, d + ld l, e + ld de, wBattleMonMoves + ld bc, NUM_MOVES + call CopyBytes + ld bc, wPartyMon1PP - (wPartyMon1Moves + NUM_MOVES) + add hl, bc + ld de, wBattleMonPP + ld bc, NUM_MOVES + call CopyBytes + jp .learned + +.cancel + ld hl, Text_StopLearning ; Stop learning <MOVE>? + call PrintText + call YesNoBox + jp c, .loop + + ld hl, Text_DidNotLearn ; <MON> did not learn <MOVE>. + call PrintText + ld b, 0 + ret + +.learned + ld hl, Text_LearnedMove ; <MON> learned <MOVE>! + call PrintText + ld b, 1 + ret +; 65d3 + +ForgetMove: ; 65d3 + push hl + ld hl, Text_TryingToLearn + call PrintText + call YesNoBox + pop hl + ret c + ld bc, -NUM_MOVES + add hl, bc + push hl + ld de, wListMoves_MoveIndicesBuffer + ld bc, NUM_MOVES + call CopyBytes + pop hl +.loop + push hl + ld hl, Text_ForgetWhich + call PrintText + hlcoord 5, 2 + ld b, NUM_MOVES * 2 + ld c, MOVE_NAME_LENGTH + call TextBox + hlcoord 5 + 2, 2 + 2 + ld a, SCREEN_WIDTH * 2 + ld [wBuffer1], a + predef ListMoves + ; w2DMenuData + ld a, $4 + ld [w2DMenuCursorInitY], a + ld a, $6 + ld [w2DMenuCursorInitX], a + ld a, [wNumMoves] + inc a + ld [w2DMenuNumRows], a + ld a, $1 + ld [w2DMenuNumCols], a + ld [wMenuCursorY], a + ld [wMenuCursorX], a + ld a, $3 + ld [wMenuJoypadFilter], a + ld a, $20 + ld [w2DMenuFlags1], a + xor a + ld [w2DMenuFlags2], a + ld a, $20 + ld [w2DMenuCursorOffsets], a + call StaticMenuJoypad + push af + call Call_LoadTempTileMapToTileMap + pop af + pop hl + bit 1, a + jr nz, .cancel + push hl + ld a, [wMenuCursorY] + dec a + ld c, a + ld b, 0 + add hl, bc + ld a, [hl] + push af + push bc + call IsHMMove + pop bc + pop de + ld a, d + jr c, .hmmove + pop hl + add hl, bc + and a + ret + +.hmmove + ld hl, Text_CantForgetHM + call PrintText + pop hl + jr .loop + +.cancel + scf + ret +; 666b + +Text_LearnedMove: ; 666b +; <MON> learned <MOVE>! + text_jump UnknownText_0x1c5660 + db "@" +; 6670 + +Text_ForgetWhich: ; 6670 +; Which move should be forgotten? + text_jump UnknownText_0x1c5678 + db "@" +; 6675 + +Text_StopLearning: ; 6675 +; Stop learning <MOVE>? + text_jump UnknownText_0x1c5699 + db "@" +; 667a + +Text_DidNotLearn: ; 667a +; <MON> did not learn <MOVE>. + text_jump UnknownText_0x1c56af + db "@" +; 667f + +Text_TryingToLearn: ; 667f +; <MON> is trying to learn <MOVE>. But <MON> can't learn more than +; four moves. Delete an older move to make room for <MOVE>? + text_jump UnknownText_0x1c56c9 + db "@" +; 6684 + +Text_1_2_and_Poof: ; 6684 + text_jump UnknownText_0x1c5740 ; 1, 2 and… + start_asm + push de + ld de, SFX_SWITCH_POKEMON + call PlaySFX + pop de + ld hl, .PoofForgot + ret + +.PoofForgot: +; Poof! <MON> forgot <MOVE>. And… + text_jump UnknownText_0x1c574e + db "@" +; 669a + +Text_CantForgetHM: ; 669a +; HM moves can't be forgotten now. + text_jump UnknownText_0x1c5772 + db "@" +; 669f diff --git a/engine/pokemon/mail.asm b/engine/pokemon/mail.asm new file mode 100755 index 000000000..b8685c0df --- /dev/null +++ b/engine/pokemon/mail.asm @@ -0,0 +1,587 @@ +SendMailToPC: ; 4456e + ld a, MON_ITEM + call GetPartyParamLocation + ld d, [hl] + farcall ItemIsMail + jr nc, .full + call GetMailboxCount + cp MAILBOX_CAPACITY + jr nc, .full + ld bc, MAIL_STRUCT_LENGTH + ld hl, sMailbox + call AddNTimes + ld d, h + ld e, l + ld a, [wCurPartyMon] + ld bc, MAIL_STRUCT_LENGTH + ld hl, sPartyMail + call AddNTimes + push hl + ld a, BANK(sMailboxCount) + call GetSRAMBank + ld bc, MAIL_STRUCT_LENGTH + call CopyBytes + pop hl + xor a + ld bc, MAIL_STRUCT_LENGTH + call ByteFill + ld a, MON_ITEM + call GetPartyParamLocation + ld [hl], 0 + ld hl, sMailboxCount + inc [hl] + call CloseSRAM + xor a + ret + +.full + scf + ret +; 445c0 + +DeleteMailFromPC: ; 445c0 (11:45c0) +; Shift all mail messages in the mailbox + ld a, BANK(sMailboxCount) + call GetSRAMBank + ld a, b + push bc + ld hl, sMailbox + ld bc, MAIL_STRUCT_LENGTH + call AddNTimes + push hl + add hl, bc + pop de + pop bc +.loop + ld a, b + cp MAILBOX_CAPACITY - 1 + jr z, .done + push bc + ld bc, MAIL_STRUCT_LENGTH + call CopyBytes + pop bc + inc b + jr .loop +.done + ld h, d + ld l, e + xor a + ld bc, MAIL_STRUCT_LENGTH + call ByteFill + ld hl, sMailboxCount + dec [hl] + jp CloseSRAM +; 445f4 (11:45f4) + +ReadMailMessage: ; 445f4 + ld a, b + ld hl, sMailbox + ld bc, MAIL_STRUCT_LENGTH + call AddNTimes + ld d, h + ld e, l + farcall ReadAnyMail + ret + +MoveMailFromPCToParty: ; 44607 + ld a, BANK(sMailboxCount) + call GetSRAMBank + push bc + ld a, b + ld bc, MAIL_STRUCT_LENGTH + ld hl, sMailbox + call AddNTimes + push hl + ld a, [wCurPartyMon] + ld bc, MAIL_STRUCT_LENGTH + ld hl, sPartyMail + call AddNTimes + ld d, h + ld e, l + pop hl + push hl + ld bc, MAIL_STRUCT_LENGTH + call CopyBytes + pop hl + ld de, PARTYMON_STRUCT_LENGTH - MON_MOVES + add hl, de + ld d, [hl] + ld a, [wCurPartyMon] + ld hl, wPartyMon1Item + ld bc, PARTYMON_STRUCT_LENGTH + call AddNTimes + ld [hl], d + call CloseSRAM + pop bc + jp DeleteMailFromPC +; 44648 (11:4648) + +GetMailboxCount: ; 44648 + ld a, BANK(sMailboxCount) + call GetSRAMBank + ld a, [sMailboxCount] + ld c, a + jp CloseSRAM +; 44654 + +CheckPokeItem:: ; 44654 + push bc + push de + farcall SelectMonFromParty + ld a, POKEMAIL_REFUSED + jr c, .pop_return + + ld a, [wCurPartyMon] + ld hl, wPartyMon1Item + ld bc, PARTYMON_STRUCT_LENGTH + call AddNTimes + ld d, [hl] + farcall ItemIsMail + ld a, POKEMAIL_NO_MAIL + jr nc, .pop_return + + ld a, BANK(sPartyMail) + call GetSRAMBank + ld a, [wCurPartyMon] + ld hl, sPartyMail + ld bc, MAIL_STRUCT_LENGTH + call AddNTimes + ld d, h + ld e, l + pop hl + pop bc + +; Compare the mail message, byte for byte, with the expected message. + ld a, MAIL_MSG_LENGTH + ld [wd265], a +.loop + ld a, [de] + ld c, a + ld a, b + call GetFarByte + cp "@" + jr z, .done + cp c + ld a, POKEMAIL_WRONG_MAIL + jr nz, .close_sram_return + inc hl + inc de + ld a, [wd265] + dec a + ld [wd265], a + jr nz, .loop + +.done + farcall CheckCurPartyMonFainted + ld a, POKEMAIL_LAST_MON + jr c, .close_sram_return + xor a ; REMOVE_PARTY + ld [wPokemonWithdrawDepositParameter], a + farcall RemoveMonFromPartyOrBox + ld a, POKEMAIL_CORRECT + +.close_sram_return + call CloseSRAM + jr .return + +.pop_return + pop de + pop bc + +.return + ld [wScriptVar], a + ret +; 446cc + + +GivePokeItem:: ; 446cc + ld a, [wPartyCount] + dec a + push af + push bc + ld hl, wPartyMon1Item + ld bc, PARTYMON_STRUCT_LENGTH + call AddNTimes + pop bc + ld [hl], b + pop af + push bc + push af + ld hl, sPartyMail + ld bc, MAIL_STRUCT_LENGTH + call AddNTimes + ld d, h + ld e, l + ld hl, wd002 + ld bc, MAIL_MSG_LENGTH + 1 + ld a, BANK(sPartyMail) + call GetSRAMBank + call CopyBytes + pop af + push af + ld hl, wPartyMonOT + ld bc, NAME_LENGTH + call AddNTimes + ld bc, NAME_LENGTH - 1 + call CopyBytes + pop af + ld hl, wPartyMon1ID + ld bc, PARTYMON_STRUCT_LENGTH + call AddNTimes + ld a, [hli] + ld [de], a + inc de + ld a, [hl] + ld [de], a + inc de + ld a, [wCurPartySpecies] + ld [de], a + inc de + pop bc + ld a, b + ld [de], a + jp CloseSRAM +; 44725 + + +BackupPartyMonMail: ; 44725 + ld a, BANK(sPartyMail) + call GetSRAMBank + ld hl, sPartyMail + ld de, sPartyMailBackup + ld bc, 6 * MAIL_STRUCT_LENGTH + call CopyBytes + ld hl, sMailboxCount + ld de, sMailboxCountBackup + ld bc, 1 + 10 * MAIL_STRUCT_LENGTH + call CopyBytes + jp CloseSRAM +; 44745 + +RestorePartyMonMail: ; 44745 (11:4745) + ld a, BANK(sPartyMail) + call GetSRAMBank + ld hl, sPartyMailBackup + ld de, sPartyMail + ld bc, 6 * MAIL_STRUCT_LENGTH + call CopyBytes + ld hl, sMailboxCountBackup + ld de, sMailboxCount + ld bc, 1 + 10 * MAIL_STRUCT_LENGTH + call CopyBytes + jp CloseSRAM + +DeletePartyMonMail: ; 44765 (11:4765) + ld a, BANK(sPartyMail) + call GetSRAMBank + xor a + ld hl, sPartyMail + ld bc, 6 * MAIL_STRUCT_LENGTH + call ByteFill + xor a + ld hl, sMailboxCount + ld bc, 1 + 10 * MAIL_STRUCT_LENGTH + call ByteFill + jp CloseSRAM +; 44781 (11:4781) + + +IsAnyMonHoldingMail: ; 44781 + ld a, [wPartyCount] + and a + jr z, .no_mons + ld e, a + ld hl, wPartyMon1Item +.loop + ld d, [hl] + push hl + push de + farcall ItemIsMail + pop de + pop hl + ret c + ld bc, PARTYMON_STRUCT_LENGTH + add hl, bc + dec e + jr nz, .loop + +.no_mons + and a + ret +; 447a0 + +_PlayerMailBoxMenu: ; 0x447a0 + call InitMail + jr z, .nomail + call LoadStandardMenuHeader + call MailboxPC + jp CloseWindow + +.nomail + ld hl, .EmptyMailboxText + jp MenuTextBoxBackup +; 0x447b4 + +.EmptyMailboxText: ; 0x447b4 + text_jump _EmptyMailboxText + db "@" + +InitMail: ; 0x447b9 +; initialize wMailboxCount and beyond with incrementing values, one per mail +; set z if no mail + ld a, BANK(sMailboxCount) + call GetSRAMBank + ld a, [sMailboxCount] + call CloseSRAM + ld hl, wMailboxCount + ld [hli], a + and a + + jr z, .done ; if no mail, we're done + + ; load values in memory with incrementing values starting at wMailboxCount + ld b, a + ld a, 1 +.loop + ld [hli], a + inc a + dec b + jr nz, .loop +.done + ld [hl], -1 ; terminate + + ld a, [wMailboxCount] + and a + ret +; 0x447da + +MailboxPC_GetMailAuthor: ; 0x447da + dec a + ld hl, sMailbox1Author + ld bc, MAIL_STRUCT_LENGTH + call AddNTimes + ld a, BANK(sMailboxCount) + call GetSRAMBank + ld de, wStringBuffer2 + push de + ld bc, NAME_LENGTH - 1 + call CopyBytes + ld a, "@" + ld [de], a + call CloseSRAM + pop de + ret +; 0x447fb + +MailboxPC_PrintMailAuthor: ; 0x447fb + push de + ld a, [wMenuSelection] + call MailboxPC_GetMailAuthor + pop hl + jp PlaceString +; 0x44806 + +MailboxPC: ; 0x44806 + xor a + ld [wCurMessageScrollPosition], a + ld a, 1 + ld [wCurMessageIndex], a +.loop + call InitMail + ld hl, .TopMenuHeader + call CopyMenuHeader + xor a + ld [hBGMapMode], a + call InitScrollingMenu + call UpdateSprites + + ld a, [wCurMessageIndex] + ld [wMenuCursorBuffer], a + ld a, [wCurMessageScrollPosition] + ld [wMenuScrollPosition], a + call ScrollingMenu + ld a, [wMenuScrollPosition] + ld [wCurMessageScrollPosition], a + ld a, [wMenuCursorY] + ld [wCurMessageIndex], a + + ld a, [wMenuJoypad] + cp B_BUTTON + jr z, .exit + call .Submenu + jr .loop + +.exit + xor a + ret +; 0x4484a + +.Submenu: ; 0x4484a + ld hl, .SubMenuHeader + call LoadMenuHeader + call VerticalMenu + call ExitMenu + jr c, .subexit + ld a, [wMenuCursorY] + dec a + ld hl, .JumpTable + rst JumpTable + +.subexit + ret +; 0x44861 + +.JumpTable: + dw .ReadMail + dw .PutInPack + dw .AttachMail + dw .Cancel + +.ReadMail: ; 0x44869 + call FadeToMenu + ld a, [wMenuSelection] + dec a + ld b, a + call ReadMailMessage + jp CloseSubmenu +; 0x44877 + +.PutInPack: ; 0x44877 + ld hl, .MessageLostText + call MenuTextBox + call YesNoBox + call ExitMenu + ret c + ld a, [wMenuSelection] + dec a + call .GetMailType + ld a, 1 + ld [wItemQuantityChangeBuffer], a + ld hl, wNumItems + call ReceiveItem + jr c, .put_in_bag + ld hl, .PackFullText + jp MenuTextBoxBackup + +.put_in_bag + ld a, [wMenuSelection] + dec a + ld b, a + call DeleteMailFromPC + ld hl, .PutAwayText + jp MenuTextBoxBackup +; 0x448ac + +.PutAwayText: ; 0x448ac + text_jump ClearedMailPutAwayText + db "@" + +.PackFullText: ; 0x448b1 + text_jump MailPackFullText + db "@" + +.MessageLostText: ; 0x448b6 + text_jump MailMessageLostText + db "@" + +.GetMailType: ; 0x448bb + push af + ld a, BANK(sMailboxCount) + call GetSRAMBank + pop af + ld hl, sMailbox1Type + ld bc, MAIL_STRUCT_LENGTH + call AddNTimes + ld a, [hl] + ld [wCurItem], a + jp CloseSRAM +; 0x448d2 + +.AttachMail: ; 0x448d2 + call FadeToMenu + xor a + ld [wPartyMenuActionText], a + call ClearBGPalettes +.try_again + farcall LoadPartyMenuGFX + farcall InitPartyMenuWithCancel + farcall InitPartyMenuGFX + farcall WritePartyMenuTilemap + farcall PrintPartyMenuText + call WaitBGMap + call SetPalettes + call DelayFrame + farcall PartyMenuSelect + jr c, .exit2 + ld a, [wCurPartySpecies] + cp EGG + jr z, .egg + ld a, MON_ITEM + call GetPartyParamLocation + ld a, [hl] + and a + jr z, .attach_mail + ld hl, .HoldingMailText + call PrintText + jr .try_again + +.egg + ld hl, .EggText + call PrintText + jr .try_again + +.attach_mail + ld a, [wMenuSelection] + dec a + ld b, a + call MoveMailFromPCToParty + ld hl, .MailMovedText + call PrintText + +.exit2 + jp CloseSubmenu +; 0x4493c + +.HoldingMailText: ; 0x4493c + text_jump MailAlreadyHoldingItemText + db "@" + +.EggText: ; 0x44941 + text_jump MailEggText + db "@" + +.MailMovedText: ; 0x44946 + text_jump MailMovedFromBoxText + db "@" + +.Cancel: + ret + +.TopMenuHeader: ; 0x4494c + db MENU_BACKUP_TILES ; flags + menu_coords 8, 1, SCREEN_WIDTH - 2, 10 + dw .TopMenuData + db 1 ; default option + +.TopMenuData: + db SCROLLINGMENU_DISPLAY_ARROWS ; flags + db 4, 0 ; rows/columns? + db 1 ; horizontal spacing? + dbw 0, wMailboxCount ; text pointer + dba MailboxPC_PrintMailAuthor + dba NULL + dba NULL + +.SubMenuHeader: ; 0x44964 + db MENU_BACKUP_TILES ; flags + menu_coords 0, 0, 13, 9 + dw .SubMenuData + db 1 ; default option + +.SubMenuData: + db STATICMENU_CURSOR ; flags + db 4 ; items + db "READ MAIL@" + db "PUT IN PACK@" + db "ATTACH MAIL@" + db "CANCEL@" diff --git a/engine/pokemon/mail_2.asm b/engine/pokemon/mail_2.asm new file mode 100755 index 000000000..6e326641b --- /dev/null +++ b/engine/pokemon/mail_2.asm @@ -0,0 +1,949 @@ +ReadPartyMonMail: ; b9229 + ld a, [wCurPartyMon] + ld hl, sPartyMail + ld bc, MAIL_STRUCT_LENGTH + call AddNTimes + ld d, h + ld e, l +ReadAnyMail: ; b9237 + push de + call ClearBGPalettes + call ClearSprites + call ClearTileMap + call DisableLCD + call LoadFontsExtra + pop de + push de + ld a, BANK(sPartyMail) + call GetSRAMBank + farcall IsMailEuropean + call CloseSRAM + ld a, c + ld de, StandardEnglishFont + or a + jr z, .got_font + ld de, FrenchGermanFont + sub $3 + jr c, .got_font + ld de, SpanishItalianFont + +.got_font + ld hl, vTiles1 + lb bc, BANK(StandardEnglishFont), $80 + call Get1bpp + pop de + call .LoadGFX + call EnableLCD + call WaitBGMap + ld a, [wBuffer3] + ld e, a + farcall LoadMailPalettes + call SetPalettes + xor a + ld [hJoyPressed], a + call .loop + call ClearBGPalettes + call DisableLCD + call LoadStandardFont + jp EnableLCD + +.loop + call GetJoypad + ld a, [hJoyPressed] + and A_BUTTON | B_BUTTON | START + jr z, .loop + and START + jr nz, .pressed_start + ret + +.pressed_start + ld a, [wJumptableIndex] + push af + callfar PrintMail ; printer + pop af + ld [wJumptableIndex], a + jr .loop +; b92b8 + +.LoadGFX: ; b92b8 + ld h, d + ld l, e + push hl + ld a, BANK(sPartyMail) + call GetSRAMBank + ld de, sPartyMon1MailAuthorID - sPartyMon1Mail + add hl, de + ld a, [hli] + ld [wBuffer1], a + ld a, [hli] + ld [wBuffer2], a + ld a, [hli] + ld [wCurPartySpecies], a + ld b, [hl] + call CloseSRAM + ld hl, MailGFXPointers + ld c, 0 +.loop2 + ld a, [hli] + cp b + jr z, .got_pointer + cp -1 + jr z, .invalid + inc c + inc hl + inc hl + jr .loop2 + +.invalid + ld hl, MailGFXPointers + inc hl + +.got_pointer + ld a, c + ld [wBuffer3], a + ld a, [hli] + ld h, [hl] + ld l, a + ld de, .done + pop bc + push de + jp hl +.done + ret +; b92f8 + +MailGFXPointers: ; b92f8 + dbw FLOWER_MAIL, LoadFlowerMailGFX + dbw SURF_MAIL, LoadSurfMailGFX + dbw LITEBLUEMAIL, LoadLiteBlueMailGFX + dbw PORTRAITMAIL, LoadPortraitMailGFX + dbw LOVELY_MAIL, LoadLovelyMailGFX + dbw EON_MAIL, LoadEonMailGFX + dbw MORPH_MAIL, LoadMorphMailGFX + dbw BLUESKY_MAIL, LoadBlueSkyMailGFX + dbw MUSIC_MAIL, LoadMusicMailGFX + dbw MIRAGE_MAIL, LoadMirageMailGFX + db -1 +; b9317 + +LoadSurfMailGFX: ; b9317 + push bc + ld hl, vTiles2 tile $31 + ld de, SurfMailBorderGFX + ld c, 8 * 8 + call LoadMailGFX_Color2 + ld de, MailLaprasGFX + ld c, 6 * 8 + call LoadMailGFX_Color3 + ld de, SurfMailWaveGFX + ld c, 1 * 8 + call LoadMailGFX_Color2 + jr FinishLoadingSurfLiteBlueMailGFX + +LoadLiteBlueMailGFX: ; b9335 + push bc + ld hl, vTiles2 tile $31 + ld de, LiteBlueMailBorderGFX + ld c, 8 * 8 + call LoadMailGFX_Color2 + ld de, MailDratiniGFX + ld c, 6 * 8 + call LoadMailGFX_Color3 + ld de, PortraitMailUnderlineGFX + ld c, 1 * 8 + call LoadMailGFX_Color2 + +FinishLoadingSurfLiteBlueMailGFX: ; b9351 + ld de, SurfLiteBlueMailSmallShapesGFX + ld c, 2 * 8 + call LoadMailGFX_Color2 + ld c, 2 * 8 + call LoadMailGFX_Color1 + ld de, SurfLiteBlueMailLargeShapesGFX + ld c, 8 * 8 + call LoadMailGFX_Color1 + ld c, 8 * 8 + call LoadMailGFX_Color2 + + call DrawMailBorder + hlcoord 2, 15 + ld a, $3f + call Mail_Draw16TileRow + ld a, $39 + hlcoord 15, 14 + call Mail_Draw3x2Graphic + ld a, $44 + hlcoord 2, 2 + call Mail_Draw2x2Graphic + hlcoord 15, 11 + call Mail_Draw2x2Graphic + ld a, $4c + hlcoord 3, 12 + call Mail_Draw2x2Graphic + hlcoord 15, 2 + call Mail_Draw2x2Graphic + ld a, $50 + hlcoord 6, 3 + call Mail_Draw2x2Graphic + ld a, $40 + hlcoord 13, 2 + ld [hli], a + hlcoord 6, 14 + ld [hl], a + ld a, $41 + hlcoord 4, 5 + ld [hli], a + hlcoord 17, 5 + ld [hli], a + hlcoord 13, 12 + ld [hl], a + ld a, $42 + hlcoord 9, 2 + ld [hli], a + hlcoord 14, 5 + ld [hli], a + hlcoord 3, 10 + ld [hl], a + ld a, $43 + hlcoord 6, 11 + ld [hli], a + pop hl + jp MailGFX_PlaceMessage +; b93d2 + +LoadEonMailGFX: ; b93d2 + push bc + ld hl, vTiles2 tile $31 + ld de, EonMailBorder1GFX + ld c, 1 * 8 + call LoadMailGFX_Color2 + ld de, EonMailBorder2GFX + ld c, 1 * 8 + call LoadMailGFX_Color1 + ld de, EonMailBorder2GFX + ld c, 1 * 8 + call LoadMailGFX_Color1 + ld de, EonMailBorder1GFX + ld c, 1 * 8 + call LoadMailGFX_Color2 + ld de, SurfMailBorderGFX + 6 * 8 + ld c, 1 * 8 + call LoadMailGFX_Color2 + ld de, MailEeveeGFX + ld c, 6 * 8 + call LoadMailGFX_Color3 + ld hl, vTiles2 tile $3d + ld de, MailLargeCircleGFX + ld c, 4 * 8 + call LoadMailGFX_Color1 + ld de, EonMailBorder2GFX + ld c, 1 * 8 + call LoadMailGFX_Color2 + + ld a, $31 + hlcoord 0, 0 + call Mail_Place18TileAlternatingRow + hlcoord 1, 17 + call Mail_Place18TileAlternatingRow + ld a, $33 + hlcoord 0, 1 + call Mail_Place16TileAlternatingColumn + hlcoord 19, 0 + call Mail_Place16TileAlternatingColumn + hlcoord 2, 15 + ld a, $35 + call Mail_Draw16TileRow + inc a + hlcoord 15, 14 + call Mail_Draw3x2Graphic + call LovelyEonMail_PlaceIcons + pop hl + jp MailGFX_PlaceMessage +; b944b + +LoadLovelyMailGFX: ; b944b + push bc + ld hl, vTiles2 tile $31 + ld de, LovelyMailBorderGFX + ld c, 5 * 8 + call LoadMailGFX_Color2 + ld de, MailPoliwagGFX + ld c, 6 * 8 + call LoadMailGFX_Color3 + ld de, LovelyMailUnderlineGFX + ld c, 1 * 8 + call LoadMailGFX_Color2 + ld de, LovelyMailLargeHeartGFX + ld c, 4 * 8 + call LoadMailGFX_Color2 + ld de, LovelyMailSmallHeartGFX + ld c, 1 * 8 + call LoadMailGFX_Color1 + + call DrawMailBorder2 + hlcoord 2, 15 + ld a, $3c + call Mail_Draw16TileRow + ld a, $36 + hlcoord 15, 14 + call Mail_Draw3x2Graphic + call LovelyEonMail_PlaceIcons + pop hl + jp MailGFX_PlaceMessage +; b9491 + +LovelyEonMail_PlaceIcons: ; b9491 + ld a, $3d + hlcoord 2, 2 + call Mail_Draw2x2Graphic + hlcoord 16, 2 + call Mail_Draw2x2Graphic + hlcoord 9, 4 + call Mail_Draw2x2Graphic + hlcoord 2, 11 + call Mail_Draw2x2Graphic + hlcoord 6, 12 + call Mail_Draw2x2Graphic + hlcoord 12, 11 + call Mail_Draw2x2Graphic + ld a, $41 + hlcoord 5, 4 + ld [hl], a + hlcoord 6, 2 + ld [hl], a + hlcoord 12, 4 + ld [hl], a + hlcoord 14, 2 + ld [hl], a + hlcoord 3, 13 + ld [hl], a + hlcoord 9, 11 + ld [hl], a + hlcoord 16, 12 + ld [hl], a + ret +; b94d6 + +LoadMorphMailGFX: ; b94d6 + push bc + ld hl, vTiles2 tile $31 + ld bc, 5 * 8 + call MailGFX_GenerateMonochromeTilesColor2 + ld de, MorphMailBorderCornerGFX + 3 * 8 + ld c, 1 * 8 + call LoadMailGFX_Color2 + ld de, MorphMailBorderCornerGFX + ld c, 1 * 8 + call LoadMailGFX_Color2 + ld de, MorphMailBorderGFX + ld c, 1 * 8 + call LoadMailGFX_Color2 + ld de, EonMailBorder1GFX + ld c, 1 * 8 + call LoadMailGFX_Color1 + ld de, MorphMailDividerGFX + ld c, 1 * 8 + call LoadMailGFX_Color2 + ld de, MailDittoGFX + ld c, 6 * 8 + call LoadMailGFX_Color3 + call DrawMailBorder2 + ld a, $31 + hlcoord 1, 1 + call Mail_Draw2x2Graphic + hlcoord 17, 15 + call Mail_Draw2x2Graphic + hlcoord 1, 3 + ld [hl], a + hlcoord 3, 1 + ld [hl], a + hlcoord 16, 16 + ld [hl], a + hlcoord 18, 14 + ld [hl], a + ld a, $36 + hlcoord 1, 4 + ld [hl], a + hlcoord 2, 3 + ld [hl], a + hlcoord 3, 2 + ld [hl], a + hlcoord 4, 1 + ld [hl], a + inc a + hlcoord 15, 16 + ld [hl], a + hlcoord 16, 15 + ld [hl], a + hlcoord 17, 14 + ld [hl], a + hlcoord 18, 13 + ld [hl], a + inc a + hlcoord 2, 15 + ld b, $e + call Mail_DrawRowLoop + inc a + hlcoord 2, 11 + call Mail_Draw16TileRow + hlcoord 2, 5 + call Mail_Draw16TileRow + inc a + hlcoord 6, 1 + call Mail_Draw13TileRow + hlcoord 1, 16 + call Mail_Draw13TileRow + inc a + hlcoord 3, 13 + call Mail_Draw3x2Graphic + pop hl + jp MailGFX_PlaceMessage +; b9582 + +LoadBlueSkyMailGFX: ; b9582 + push bc + ld hl, vTiles2 tile $31 + ld de, EonMailBorder1GFX + ld c, 1 * 8 + call LoadMailGFX_Color2 + ld a, $ff + ld bc, 1 tiles + call ByteFill + ld de, BlueSkyMailGrassGFX + ld c, 1 * 8 + call LoadMailGFX_Color3 + ld de, MailDragoniteGFX + ld c, 23 * 8 + call LoadMailGFX_Color3 + ld de, MailCloudGFX + ld c, 6 * 8 + call LoadMailGFX_Color1 + ld de, FlowerMailBorderGFX + 6 * 8 + ld c, 1 * 8 + call LoadMailGFX_Color1 + ld de, MailCloudGFX + ld c, 1 * 8 + call LoadMailGFX_Color1 + ld de, MailCloudGFX + 2 * 8 + ld c, 2 * 8 + call LoadMailGFX_Color1 + ld de, MailCloudGFX + 5 * 8 + ld c, 1 * 8 + call LoadMailGFX_Color1 + + ld a, $31 + hlcoord 0, 0 + call Mail_DrawFullWidthBorder + hlcoord 0, 1 + call Mail_DrawLeftRightBorder + hlcoord 19, 1 + call Mail_DrawLeftRightBorder + inc a + hlcoord 0, 17 + call Mail_DrawFullWidthBorder + inc a + hlcoord 0, 16 + call Mail_DrawFullWidthBorder + inc a + hlcoord 2, 2 + call Mail_Place6TileRow + hlcoord 3, 3 + call Mail_Place6TileRow + hlcoord 4, 4 + call Mail_Place6TileRow + dec hl + ld [hl], $7f + dec a + hlcoord 15, 14 + call Mail_Draw2x2Graphic + add $4 + hlcoord 15, 16 + ld [hli], a + inc a + ld [hl], a + inc a + push af + hlcoord 12, 1 + call Mail_Draw3x2Graphic + pop af + hlcoord 15, 4 + call Mail_Draw3x2Graphic + inc a + hlcoord 2, 11 + call Mail_Draw16TileRow + inc a + hlcoord 10, 3 + call Mail_Draw2x2Graphic + pop hl + jp MailGFX_PlaceMessage +; b9636 + +Mail_Place6TileRow: ; b9636 + ld b, $6 +.loop + ld [hli], a + inc a + dec b + jr nz, .loop + ret +; b963e + +LoadFlowerMailGFX: ; b963e + push bc + ld hl, vTiles2 tile $31 + ld de, FlowerMailBorderGFX + ld c, 8 * 8 + call LoadMailGFX_Color1 + ld de, MailOddishGFX + ld c, 4 * 8 + call LoadMailGFX_Color3 + ld de, FlowerMailBorderGFX + 6 * 8 + ld c, 1 * 8 + call LoadMailGFX_Color2 + ld de, FlowerMailFlowerGFX + ld c, 4 * 8 + call LoadMailGFX_Color1 + ld c, 4 * 8 + call LoadMailGFX_Color2 + + call DrawMailBorder + hlcoord 2, 15 + ld a, $3d ; underline + call Mail_Draw16TileRow + ld a, $39 ; oddish + hlcoord 16, 13 + call Mail_Draw2x2Graphic + hlcoord 2, 13 + call Mail_Draw2x2Graphic + ld a, $3e + hlcoord 2, 2 + call Mail_Draw2x2Graphic + hlcoord 5, 3 + call Mail_Draw2x2Graphic + hlcoord 10, 2 + call Mail_Draw2x2Graphic + hlcoord 16, 3 + call Mail_Draw2x2Graphic + hlcoord 5, 11 + call Mail_Draw2x2Graphic + hlcoord 16, 10 + call Mail_Draw2x2Graphic + ld a, $42 + hlcoord 3, 4 + call Mail_Draw2x2Graphic + hlcoord 12, 3 + call Mail_Draw2x2Graphic + hlcoord 14, 2 + call Mail_Draw2x2Graphic + hlcoord 2, 10 + call Mail_Draw2x2Graphic + hlcoord 14, 11 + call Mail_Draw2x2Graphic + pop hl + jp MailGFX_PlaceMessage +; b96ca + +LoadPortraitMailGFX: ; b96ca + push bc + ld hl, vTiles2 tile $31 + ld de, PortraitMailBorderGFX + ld c, 5 * 8 + call LoadMailGFX_Color2 + ld de, PortraitMailUnderlineGFX + ld c, 1 * 8 + call LoadMailGFX_Color2 + ld hl, vTiles2 tile $3d + ld de, PortraitMailLargePokeballGFX + ld c, 4 * 8 + call LoadMailGFX_Color1 + ld de, PortraitMailSmallPokeballGFX + ld c, 1 * 8 + call LoadMailGFX_Color2 + + call DrawMailBorder2 + hlcoord 8, 15 + ld a, $36 + ld b, $a + call Mail_DrawRowLoop + call LovelyEonMail_PlaceIcons + ld a, $1 + ld [wUnownLetter], a + hlcoord 1, 10 + call PrepMonFrontpic + pop hl + jp MailGFX_PlaceMessage +; b9710 + +LoadMusicMailGFX: ; b9710 + push bc + ld hl, vTiles2 tile $31 + ld de, MusicMailBorderGFX + ld c, 4 * 8 + call LoadMailGFX_Color2 + ld de, MorphMailBorderGFX + ld c, 2 * 8 + call LoadMailGFX_Color2 + ld de, MailNatuGFX + ld c, 6 * 8 + call LoadMailGFX_Color3 + xor a + ld bc, 1 tiles + call ByteFill + ld de, MusicMailLargeNoteGFX + ld c, 3 * 8 + call LoadMailGFX_Color1 + ld de, MusicMailSmallNoteGFX + ld c, 1 * 8 + call LoadMailGFX_Color1 + + ld a, $31 + hlcoord 0, 0 + call Mail_Place18TileAlternatingRow + hlcoord 1, 17 + call Mail_Place18TileAlternatingRow + ld a, $33 + hlcoord 0, 1 + call Mail_Place16TileAlternatingColumn + hlcoord 19, 0 + call Mail_Place16TileAlternatingColumn + ld a, $35 + hlcoord 2, 15 + call Mail_Place14TileAlternatingRow + ld a, $37 + hlcoord 15, 14 + call Mail_Draw3x2Graphic + call LovelyEonMail_PlaceIcons + pop hl + jp MailGFX_PlaceMessage +; b9776 + +LoadMirageMailGFX: ; b9776 + push bc + ld hl, vTiles2 tile $31 + ld bc, 5 * 8 + call MailGFX_GenerateMonochromeTilesColor2 + ld de, BlueSkyMailGrassGFX + ld c, 1 * 8 + call LoadMailGFX_Color2 + ld de, MailMewGFX + ld c, 18 * 8 + call LoadMailGFX_Color2 + ld de, LiteBlueMailBorderGFX + 1 * 8 + ld c, 1 * 8 + call LoadMailGFX_Color1 + ld de, LiteBlueMailBorderGFX + 6 * 8 + ld c, 1 * 8 + call LoadMailGFX_Color1 + + call DrawMailBorder2 + ld a, $36 + hlcoord 1, 16 + call Mail_DrawTopBottomBorder + inc a + hlcoord 15, 14 + call Mail_Draw3x2Graphic + inc a + hlcoord 15, 16 + ld [hli], a + inc a + ld [hl], a + ld a, $3f + hlcoord 1, 1 + call Mail_Place18TileAlternatingRow + ld a, $41 + hlcoord 0, 2 + call Mail_Place14TileAlternatingColumn + ld a, $43 + hlcoord 19, 2 + call Mail_Place14TileAlternatingColumn + ld a, $45 + hlcoord 0, 1 + ld [hl], a + inc a + hlcoord 19, 1 + ld [hl], a + inc a + hlcoord 0, 16 + ld [hl], a + inc a + hlcoord 19, 16 + ld [hl], a + inc a + hlcoord 2, 5 + call Mail_Draw16TileRow + inc a + hlcoord 2, 11 + call Mail_Draw16TileRow + pop hl + jp MailGFX_PlaceMessage +; b97f8 + +MailGFX_GenerateMonochromeTilesColor2: ; b97f8 +.loop + xor a + ld [hli], a + ld a, $ff + ld [hli], a + dec bc + ld a, b + or c + jr nz, .loop + ret +; b9803 + +MailGFX_PlaceMessage: ; b9803 + ld bc, MAIL_STRUCT_LENGTH + ld de, wTempMail + ld a, BANK(sPartyMail) + call GetSRAMBank + call CopyBytes + call CloseSRAM + ld hl, wTempMailAuthor + ld de, wMonOrItemNameBuffer + ld bc, NAME_LENGTH - 1 + call CopyBytes + ld a, "@" + ld [wTempMailAuthor], a + ld [wMonOrItemNameBuffer + NAME_LENGTH - 1], a + ld de, wTempMailMessage + hlcoord 2, 7 + call PlaceString + ld de, wMonOrItemNameBuffer + ld a, [de] + and a + ret z + ld a, [wBuffer3] + hlcoord 8, 14 + cp $3 ; PORTRAITMAIL + jr z, .place_author + hlcoord 6, 14 + cp $6 ; MORPH_MAIL + jr z, .place_author + hlcoord 5, 14 + +.place_author + jp PlaceString +; b984e + +Unreferenced_Functionb984e: ; b984e +.loop + ld a, [hl] + xor $ff + ld [hli], a + dec bc + ld a, b + or c + jr nz, .loop + ret +; b9858 + +DrawMailBorder: ; b9858 + hlcoord 0, 0 + ld a, $31 + ld [hli], a + inc a + call Mail_DrawTopBottomBorder + inc a + ld [hli], a + inc a + call Mail_DrawLeftRightBorder + ld a, $36 + ld [hli], a + inc a + call Mail_DrawTopBottomBorder + hlcoord 19, 1 + ld a, $35 + call Mail_DrawLeftRightBorder + ld a, $38 + ld [hl], a + ret +; b987b + +DrawMailBorder2: ; b987b + hlcoord 0, 0 + ld a, $31 + ld [hli], a + inc a + call Mail_DrawTopBottomBorder + ld [hl], $31 + inc hl + inc a + call Mail_DrawLeftRightBorder + ld [hl], $31 + inc hl + inc a + call Mail_DrawTopBottomBorder + hlcoord 19, 1 + ld a, $35 + call Mail_DrawLeftRightBorder + ld [hl], $31 + ret +; b989e + +Mail_Place14TileAlternatingRow: ; b989e + push af + ld b, 14 / 2 + jr Mail_PlaceAlternatingRow + +Mail_Place16TileAlternatingRow: ; b98a3 + push af + ld b, 16 / 2 + jr Mail_PlaceAlternatingRow + +Mail_Place18TileAlternatingRow: ; b98a8 + push af + ld b, 18 / 2 + +Mail_PlaceAlternatingRow: ; b98ab +.loop + ld [hli], a + inc a + ld [hli], a + dec a + dec b + jr nz, .loop + ld [hl], a + pop af + ret +; b98b5 + +Mail_Place14TileAlternatingColumn: ; b98b5 + push af + ld b, 14 / 2 + jr Mail_PlaceAlternatingColumn + +Mail_Place16TileAlternatingColumn: ; b98ba + push af + ld b, 16 / 2 + +Mail_PlaceAlternatingColumn: ; b98bd +.loop + ld [hl], a + ld de, SCREEN_WIDTH + add hl, de + inc a + ld [hl], a + add hl, de + dec a + dec b + jr nz, .loop + ld [hl], a + pop af + ret +; b98cc + +Mail_Draw7TileRow: ; b98cc + ld b, $7 + jr Mail_DrawRowLoop + +Mail_Draw13TileRow: ; b98d0 + ld b, $d + jr Mail_DrawRowLoop + +Mail_Draw16TileRow: ; b98d4 + ld b, $10 + jr Mail_DrawRowLoop + +Mail_DrawTopBottomBorder: ; b98d8 + ld b, SCREEN_WIDTH - 2 + jr Mail_DrawRowLoop + +Mail_DrawFullWidthBorder: ; b98dc + ld b, SCREEN_WIDTH + +Mail_DrawRowLoop: ; b98de +.loop + ld [hli], a + dec b + jr nz, .loop + ret +; b98e3 + +Mail_DrawLeftRightBorder: ; b98e3 + ld b, SCREEN_HEIGHT - 2 + ld de, SCREEN_WIDTH +.loop + ld [hl], a + add hl, de + dec b + jr nz, .loop + ret +; b98ee + +Mail_Draw2x2Graphic: ; b98ee + push af + ld [hli], a + inc a + ld [hl], a + ld bc, SCREEN_WIDTH - 1 + add hl, bc + inc a + ld [hli], a + inc a + ld [hl], a + pop af + ret +; b98fc + +Mail_Draw3x2Graphic: ; b98fc + ld [hli], a + inc a + ld [hli], a + inc a + ld [hl], a + ld bc, SCREEN_WIDTH - 2 + add hl, bc + inc a + ld [hli], a + inc a + ld [hli], a + inc a + ld [hl], a + ret +; b990c + +LoadMailGFX_Color1: ; b990c +.loop + ld a, [de] + inc de + ld [hli], a + xor a + ld [hli], a + dec c + jr nz, .loop + ret +; b9915 + +LoadMailGFX_Color2: ; b9915 +.loop + xor a + ld [hli], a + ld a, [de] + inc de + ld [hli], a + dec c + jr nz, .loop + ret +; b991e + +LoadMailGFX_Color3: ; b991e +.loop + ld a, [de] + inc de + ld [hli], a + ld [hli], a + dec c + jr nz, .loop + ret +; b9926 + +INCLUDE "gfx/mail.asm" + +ItemIsMail: ; b9e76 + ld a, d + ld hl, MailItems + ld de, 1 + jp IsInArray +; b9e80 + +INCLUDE "data/items/mail_items.asm" diff --git a/engine/pokemon/mon_stats.asm b/engine/pokemon/mon_stats.asm new file mode 100644 index 000000000..2b5586c51 --- /dev/null +++ b/engine/pokemon/mon_stats.asm @@ -0,0 +1,485 @@ +DrawPlayerHP: ; 50b0a + ld a, $1 + jr DrawHP + +DrawEnemyHP: ; 50b0e + ld a, $2 + +DrawHP: ; 50b10 + ld [wWhichHPBar], a + push hl + push bc + ; box mons have full HP + ld a, [wMonType] + cp BOXMON + jr z, .at_least_1_hp + + ld a, [wTempMonHP] + ld b, a + ld a, [wTempMonHP + 1] + ld c, a + +; Any HP? + or b + jr nz, .at_least_1_hp + + xor a + ld c, a + ld e, a + ld a, 6 + ld d, a + jp .fainted + +.at_least_1_hp + ld a, [wTempMonMaxHP] + ld d, a + ld a, [wTempMonMaxHP + 1] + ld e, a + ld a, [wMonType] + cp BOXMON + jr nz, .not_boxmon + + ld b, d + ld c, e + +.not_boxmon + predef ComputeHPBarPixels + ld a, 6 + ld d, a + ld c, a + +.fainted + ld a, c + pop bc + ld c, a + pop hl + push de + push hl + push hl + call DrawBattleHPBar + pop hl + +; Print HP + bccoord 1, 1, 0 + add hl, bc + ld de, wTempMonHP + ld a, [wMonType] + cp BOXMON + jr nz, .not_boxmon_2 + ld de, wTempMonMaxHP +.not_boxmon_2 + lb bc, 2, 3 + call PrintNum + + ld a, "/" + ld [hli], a + +; Print max HP + ld de, wTempMonMaxHP + lb bc, 2, 3 + call PrintNum + pop hl + pop de + ret + +PrintTempMonStats: ; 50b7b +; Print wTempMon's stats at hl, with spacing bc. + push bc + push hl + ld de, .StatNames + call PlaceString + pop hl + pop bc + add hl, bc + ld bc, SCREEN_WIDTH + add hl, bc + ld de, wTempMonAttack + lb bc, 2, 3 + call .PrintStat + ld de, wTempMonDefense + call .PrintStat + ld de, wTempMonSpclAtk + call .PrintStat + ld de, wTempMonSpclDef + call .PrintStat + ld de, wTempMonSpeed + jp PrintNum + +.PrintStat: ; 50bab + push hl + call PrintNum + pop hl + ld de, SCREEN_WIDTH * 2 + add hl, de + ret + +.StatNames: ; 50bb5 + db "ATTACK" + next "DEFENSE" + next "SPCL.ATK" + next "SPCL.DEF" + next "SPEED" + next "@" + +GetGender: ; 50bdd +; Return the gender of a given monster (wCurPartyMon/wCurOTMon/wCurWildMon). +; When calling this function, a should be set to an appropriate wMonType value. + +; return values: +; a = 1: f = nc|nz; male +; a = 0: f = nc|z; female +; f = c: genderless + +; This is determined by comparing the Attack and Speed DVs +; with the species' gender ratio. + +; Figure out what type of monster struct we're looking at. + +; 0: PartyMon + ld hl, wPartyMon1DVs + ld bc, PARTYMON_STRUCT_LENGTH + ld a, [wMonType] + and a + jr z, .PartyMon + +; 1: OTPartyMon + ld hl, wOTPartyMon1DVs + dec a + jr z, .PartyMon + +; 2: sBoxMon + ld hl, sBoxMon1DVs + ld bc, BOXMON_STRUCT_LENGTH + dec a + jr z, .sBoxMon + +; 3: Unknown + ld hl, wTempMonDVs + dec a + jr z, .DVs + +; else: WildMon + ld hl, wEnemyMonDVs + jr .DVs + +; Get our place in the party/box. + +.PartyMon: +.sBoxMon + ld a, [wCurPartyMon] + call AddNTimes + +.DVs: + +; sBoxMon data is read directly from SRAM. + ld a, [wMonType] + cp BOXMON + ld a, BANK(sBox) + call z, GetSRAMBank + +; Attack DV + ld a, [hli] + and $f0 + ld b, a +; Speed DV + ld a, [hl] + and $f0 + swap a + +; Put our DVs together. + or b + ld b, a + +; Close SRAM if we were dealing with a sBoxMon. + ld a, [wMonType] + cp BOXMON + call z, CloseSRAM + +; We need the gender ratio to do anything with this. + push bc + ld a, [wCurPartySpecies] + dec a + ld hl, BaseData + BASE_GENDER + ld bc, BASE_DATA_SIZE + call AddNTimes + pop bc + + ld a, BANK(BaseData) + call GetFarByte + +; The higher the ratio, the more likely the monster is to be female. + + cp GENDERLESS + jr z, .Genderless + + and a ; GENDER_F0? + jr z, .Male + + cp GENDER_F100 + jr z, .Female + +; Values below the ratio are male, and vice versa. + cp b + jr c, .Male + +.Female: + xor a + ret + +.Male: + ld a, 1 + and a + ret + +.Genderless: + scf + ret + +ListMovePP: ; 50c50 + ld a, [wNumMoves] + inc a + ld c, a + ld a, NUM_MOVES + sub c + ld b, a + push hl + ld a, [wBuffer1] + ld e, a + ld d, $0 + ld a, $3e ; P + call .load_loop + ld a, b + and a + jr z, .skip + ld c, a + ld a, "-" + call .load_loop + +.skip + pop hl + inc hl + inc hl + inc hl + ld d, h + ld e, l + ld hl, wTempMonMoves + ld b, 0 +.loop + ld a, [hli] + and a + jr z, .done + push bc + push hl + push de + ld hl, wMenuCursorY + ld a, [hl] + push af + ld [hl], b + push hl + callfar GetMaxPPOfMove + pop hl + pop af + ld [hl], a + pop de + pop hl + push hl + ld bc, wTempMonPP - (wTempMonMoves + 1) + add hl, bc + ld a, [hl] + and $3f + ld [wStringBuffer1 + 4], a + ld h, d + ld l, e + push hl + ld de, wStringBuffer1 + 4 + lb bc, 1, 2 + call PrintNum + ld a, "/" + ld [hli], a + ld de, wd265 + lb bc, 1, 2 + call PrintNum + pop hl + ld a, [wBuffer1] + ld e, a + ld d, 0 + add hl, de + ld d, h + ld e, l + pop hl + pop bc + inc b + ld a, b + cp NUM_MOVES + jr nz, .loop + +.done + ret + +.load_loop ; 50cc9 + ld [hli], a + ld [hld], a + add hl, de + dec c + jr nz, .load_loop + ret + +Unreferenced_Function50cd0: ; 50cd0 +.loop + ld [hl], $32 + inc hl + ld [hl], $3e + dec hl + add hl, de + dec c + jr nz, .loop + ret + +Unused_PlaceEnemyHPLevel: + push hl + push hl + ld hl, wPartyMonNicknames + ld a, [wCurPartyMon] + call GetNick + pop hl + call PlaceString + call CopyMonToTempMon + pop hl + ld a, [wCurPartySpecies] + cp EGG + jr z, .egg + push hl + ld bc, -12 + add hl, bc + ld b, $0 + call DrawEnemyHP + pop hl + ld bc, 5 + add hl, bc + push de + call PrintLevel + pop de + +.egg + ret + +PlaceStatusString: ; 50d0a + push de + inc de + inc de + ld a, [de] + ld b, a + inc de + ld a, [de] + or b + pop de + jr nz, PlaceNonFaintStatus + push de + ld de, FntString + call CopyStatusString + pop de + ld a, $1 + and a + ret + +FntString: ; 50d22 + db "FNT@" + +CopyStatusString: ; 50d25 + ld a, [de] + inc de + ld [hli], a + ld a, [de] + inc de + ld [hli], a + ld a, [de] + ld [hl], a + ret + +PlaceNonFaintStatus: ; 50d2e + push de + ld a, [de] + ld de, PsnString + bit PSN, a + jr nz, .place + ld de, BrnString + bit BRN, a + jr nz, .place + ld de, FrzString + bit FRZ, a + jr nz, .place + ld de, ParString + bit PAR, a + jr nz, .place + ld de, SlpString + and SLP + jr z, .no_status + +.place + call CopyStatusString + ld a, $1 + and a + +.no_status + pop de + ret + +SlpString: db "SLP@" +PsnString: db "PSN@" +BrnString: db "BRN@" +FrzString: db "FRZ@" +ParString: db "PAR@" + +ListMoves: ; 50d6f +; List moves at hl, spaced every [wBuffer1] tiles. + ld de, wListMoves_MoveIndicesBuffer + ld b, $0 +.moves_loop + ld a, [de] + inc de + and a + jr z, .no_more_moves + push de + push hl + push hl + ld [wCurSpecies], a + ld a, MOVE_NAME + ld [wNamedObjectTypeBuffer], a + call GetName + ld de, wStringBuffer1 + pop hl + push bc + call PlaceString + pop bc + ld a, b + ld [wNumMoves], a + inc b + pop hl + push bc + ld a, [wBuffer1] + ld c, a + ld b, 0 + add hl, bc + pop bc + pop de + ld a, b + cp NUM_MOVES + jr z, .done + jr .moves_loop + +.no_more_moves + ld a, b +.nonmove_loop + push af + ld [hl], "-" + ld a, [wBuffer1] + ld c, a + ld b, 0 + add hl, bc + pop af + inc a + cp NUM_MOVES + jr nz, .nonmove_loop + +.done + ret diff --git a/engine/pokemon/move_mon.asm b/engine/pokemon/move_mon.asm new file mode 100755 index 000000000..8ccf319f0 --- /dev/null +++ b/engine/pokemon/move_mon.asm @@ -0,0 +1,1845 @@ +TryAddMonToParty: ; d88c +; Check if to copy wild mon or generate a new one + ; Whose is it? + ld de, wPartyCount + ld a, [wMonType] + and $f + jr z, .getpartylocation ; PARTYMON + ld de, wOTPartyCount + +.getpartylocation + ; Do we have room for it? + ld a, [de] + inc a + cp PARTY_LENGTH + 1 + ret nc + ; Increase the party count + ld [de], a + ld a, [de] ; Why are we doing this? + ld [hMoveMon], a ; HRAM backup + add e + ld e, a + jr nc, .loadspecies + inc d + +.loadspecies + ; Load the species of the Pokemon into the party list. + ; The terminator is usually here, but it'll be back. + ld a, [wCurPartySpecies] + ld [de], a + ; Load the terminator into the next slot. + inc de + ld a, -1 + ld [de], a + ; Now let's load the OT name. + ld hl, wPartyMonOT + ld a, [wMonType] + and $f + jr z, .loadOTname + ld hl, wOTPartyMonOT + +.loadOTname + ld a, [hMoveMon] ; Restore index from backup + dec a + call SkipNames + ld d, h + ld e, l + ld hl, wPlayerName + ld bc, NAME_LENGTH + call CopyBytes + ; Only initialize the nickname for party mon + ld a, [wMonType] + and a + jr nz, .skipnickname + ld a, [wCurPartySpecies] + ld [wd265], a + call GetPokemonName + ld hl, wPartyMonNicknames + ld a, [hMoveMon] + dec a + call SkipNames + ld d, h + ld e, l + ld hl, wStringBuffer1 + ld bc, MON_NAME_LENGTH + call CopyBytes + +.skipnickname + ld hl, wPartyMon1Species + ld a, [wMonType] + and $f + jr z, .initializeStats + ld hl, wOTPartyMon1Species + +.initializeStats + ld a, [hMoveMon] + dec a + ld bc, PARTYMON_STRUCT_LENGTH + call AddNTimes +GeneratePartyMonStats: ; d906 +; wBattleMode specifies whether it's a wild mon or not. +; wMonType specifies whether it's an opposing mon or not. +; wCurPartySpecies/wCurPartyLevel specify the species and level. +; hl points to the wPartyMon struct to fill. + + ld e, l + ld d, h + push hl + + ; Initialize the species + ld a, [wCurPartySpecies] + ld [wCurSpecies], a + call GetBaseData + ld a, [wBaseDexNo] + ld [de], a + inc de + + ; Copy the item if it's a wild mon + ld a, [wBattleMode] + and a + ld a, $0 + jr z, .skipitem + ld a, [wEnemyMonItem] +.skipitem + ld [de], a + inc de + + ; Copy the moves if it's a wild mon + push de + ld h, d + ld l, e + ld a, [wBattleMode] + and a + jr z, .randomlygeneratemoves + ld a, [wMonType] + and a + jr nz, .randomlygeneratemoves + ld de, wEnemyMonMoves + rept NUM_MOVES + -1 + ld a, [de] + inc de + ld [hli], a + endr + ld a, [de] + ld [hl], a + jr .next + +.randomlygeneratemoves + xor a + rept NUM_MOVES + -1 + ld [hli], a + endr + ld [hl], a + ld [wBuffer1], a + predef FillMoves + +.next + pop de +rept NUM_MOVES + inc de +endr + + ; Initialize ID. + ld a, [wPlayerID] + ld [de], a + inc de + ld a, [wPlayerID + 1] + ld [de], a + inc de + + ; Initialize Exp. + push de + ld a, [wCurPartyLevel] + ld d, a + callfar CalcExpAtLevel + pop de + ld a, [hProduct + 1] + ld [de], a + inc de + ld a, [hProduct + 2] + ld [de], a + inc de + ld a, [hProduct + 3] + ld [de], a + inc de + + ; Initialize stat experience. + xor a + ld b, MON_DVS - MON_STAT_EXP +.loop + ld [de], a + inc de + dec b + jr nz, .loop + + pop hl + push hl + ld a, [wMonType] + and $f + jr z, .registerpokedex + + push hl + farcall GetTrainerDVs + pop hl + jr .initializeDVs + +.registerpokedex + ld a, [wCurPartySpecies] + ld [wd265], a + dec a + push de + call CheckCaughtMon + ld a, [wd265] + dec a + call SetSeenAndCaughtMon + pop de + + pop hl + push hl + ld a, [wBattleMode] + and a + jr nz, .copywildmonDVs + + call Random + ld b, a + call Random + ld c, a +.initializeDVs + ld a, b + ld [de], a + inc de + ld a, c + ld [de], a + inc de + + ; Initialize PP. + push hl + push de + inc hl + inc hl + call FillPP + pop de + pop hl +rept 4 + inc de +endr + + ; Initialize happiness. + ld a, BASE_HAPPINESS + ld [de], a + inc de + + xor a + ; PokerusStatus + ld [de], a + inc de + ; CaughtData/CaughtTime/CaughtLevel + ld [de], a + inc de + ; CaughtGender/CaughtLocation + ld [de], a + inc de + + ; Initialize level. + ld a, [wCurPartyLevel] + ld [de], a + inc de + + xor a + ; Status + ld [de], a + inc de + ; Unused + ld [de], a + inc de + + ; Initialize HP. + ld bc, MON_STAT_EXP - 1 + add hl, bc + ld a, 1 + ld c, a + ld b, FALSE + call CalcMonStatC + ld a, [hProduct + 2] + ld [de], a + inc de + ld a, [hProduct + 3] + ld [de], a + inc de + jr .initstats + +.copywildmonDVs + ld a, [wEnemyMonDVs] + ld [de], a + inc de + ld a, [wEnemyMonDVs + 1] + ld [de], a + inc de + + push hl + ld hl, wEnemyMonPP + ld b, NUM_MOVES +.wildmonpploop + ld a, [hli] + ld [de], a + inc de + dec b + jr nz, .wildmonpploop + pop hl + + ; Initialize happiness. + ld a, BASE_HAPPINESS + ld [de], a + inc de + + xor a + ; PokerusStatus + ld [de], a + inc de + ; CaughtData/CaughtTime/CaughtLevel + ld [de], a + inc de + ; CaughtGender/CaughtLocation + ld [de], a + inc de + + ; Initialize level. + ld a, [wCurPartyLevel] + ld [de], a + inc de + + ld hl, wEnemyMonStatus + ; Copy wEnemyMonStatus + ld a, [hli] + ld [de], a + inc de + ; Copy EnemyMonUnused + ld a, [hli] + ld [de], a + inc de + ; Copy wEnemyMonHP + ld a, [hli] + ld [de], a + inc de + ld a, [hl] + ld [de], a + inc de + +.initstats + ld a, [wBattleMode] + dec a + jr nz, .generatestats + ld hl, wEnemyMonMaxHP + ld bc, PARTYMON_STRUCT_LENGTH - MON_MAXHP + call CopyBytes + pop hl + jr .registerunowndex + +.generatestats + pop hl + ld bc, MON_STAT_EXP - 1 + add hl, bc + ld b, FALSE + call CalcMonStats + +.registerunowndex + ld a, [wMonType] + and $f + jr nz, .done + ld a, [wCurPartySpecies] + cp UNOWN + jr nz, .done + ld hl, wPartyMon1DVs + ld a, [wPartyCount] + dec a + ld bc, PARTYMON_STRUCT_LENGTH + call AddNTimes + predef GetUnownLetter + callfar UpdateUnownDex + +.done + scf ; When this function returns, the carry flag indicates success vs failure. + ret +; da6d + +FillPP: ; da6d + push bc + ld b, NUM_MOVES +.loop + ld a, [hli] + and a + jr z, .next + dec a + push hl + push de + push bc + ld hl, Moves + ld bc, MOVE_LENGTH + call AddNTimes + ld de, wStringBuffer1 + ld a, BANK(Moves) + call FarCopyBytes + pop bc + pop de + pop hl + ld a, [wStringBuffer1 + MOVE_PP] + +.next + ld [de], a + inc de + dec b + jr nz, .loop + pop bc + ret +; da96 + +AddTempmonToParty: ; da96 + ld hl, wPartyCount + ld a, [hl] + cp PARTY_LENGTH + scf + ret z + + inc a + ld [hl], a + ld c, a + ld b, 0 + add hl, bc + ld a, [wCurPartySpecies] + ld [hli], a + ld [hl], $ff + + ld hl, wPartyMon1Species + ld a, [wPartyCount] + dec a + ld bc, PARTYMON_STRUCT_LENGTH + call AddNTimes + ld e, l + ld d, h + ld hl, wTempMonSpecies + call CopyBytes + + ld hl, wPartyMonOT + ld a, [wPartyCount] + dec a + call SkipNames + ld d, h + ld e, l + ld hl, wOTPartyMonOT + ld a, [wCurPartyMon] + call SkipNames + ld bc, NAME_LENGTH + call CopyBytes + + ld hl, wPartyMonNicknames + ld a, [wPartyCount] + dec a + call SkipNames + ld d, h + ld e, l + ld hl, wOTPartyMonNicknames + ld a, [wCurPartyMon] + call SkipNames + ld bc, MON_NAME_LENGTH + call CopyBytes + + ld a, [wCurPartySpecies] + ld [wNamedObjectIndexBuffer], a + cp EGG + jr z, .egg + dec a + call SetSeenAndCaughtMon + ld hl, wPartyMon1Happiness + ld a, [wPartyCount] + dec a + ld bc, PARTYMON_STRUCT_LENGTH + call AddNTimes + ld [hl], BASE_HAPPINESS +.egg + + ld a, [wCurPartySpecies] + cp UNOWN + jr nz, .done + ld hl, wPartyMon1DVs + ld a, [wPartyCount] + dec a + ld bc, PARTYMON_STRUCT_LENGTH + call AddNTimes + predef GetUnownLetter + callfar UpdateUnownDex + ld a, [wFirstUnownSeen] + and a + jr nz, .done + ld a, [wUnownLetter] + ld [wFirstUnownSeen], a +.done + + and a + ret + +SendGetMonIntoFromBox: ; db3f +; Sents/Gets mon into/from Box depending on Parameter +; wPokemonWithdrawDepositParameter == 0: get mon into Party +; wPokemonWithdrawDepositParameter == 1: sent mon into Box +; wPokemonWithdrawDepositParameter == 2: get mon from DayCare +; wPokemonWithdrawDepositParameter == 3: put mon into DayCare + + ld a, BANK(sBoxCount) + call GetSRAMBank + ld a, [wPokemonWithdrawDepositParameter] + and a + jr z, .check_IfPartyIsFull + cp DAY_CARE_WITHDRAW + jr z, .check_IfPartyIsFull + cp DAY_CARE_DEPOSIT + ld hl, wBreedMon1Species + jr z, .breedmon + + ; we want to sent a mon into the Box + ; so check if there's enough space + ld hl, sBoxCount + ld a, [hl] + cp MONS_PER_BOX + jr nz, .there_is_room + jp CloseSRAM_And_SetCarryFlag + +.check_IfPartyIsFull + ld hl, wPartyCount + ld a, [hl] + cp PARTY_LENGTH + jp z, CloseSRAM_And_SetCarryFlag + +.there_is_room + inc a + ld [hl], a + ld c, a + ld b, 0 + add hl, bc + ld a, [wPokemonWithdrawDepositParameter] + cp DAY_CARE_WITHDRAW + ld a, [wBreedMon1Species] + jr z, .okay1 + ld a, [wCurPartySpecies] + +.okay1 + ld [hli], a + ld [hl], $ff + ld a, [wPokemonWithdrawDepositParameter] + dec a + ld hl, wPartyMon1Species + ld bc, PARTYMON_STRUCT_LENGTH + ld a, [wPartyCount] + jr nz, .okay2 + ld hl, sBoxMon1Species + ld bc, BOXMON_STRUCT_LENGTH + ld a, [sBoxCount] + +.okay2 + dec a ; wPartyCount - 1 + call AddNTimes + +.breedmon + push hl + ld e, l + ld d, h + ld a, [wPokemonWithdrawDepositParameter] + and a + ld hl, sBoxMon1Species + ld bc, BOXMON_STRUCT_LENGTH + jr z, .okay3 + cp DAY_CARE_WITHDRAW + ld hl, wBreedMon1Species + jr z, .okay4 + ld hl, wPartyMon1Species + ld bc, PARTYMON_STRUCT_LENGTH + +.okay3 + ld a, [wCurPartyMon] + call AddNTimes + +.okay4 + ld bc, BOXMON_STRUCT_LENGTH + call CopyBytes + ld a, [wPokemonWithdrawDepositParameter] + cp DAY_CARE_DEPOSIT + ld de, wBreedMon1OT + jr z, .okay5 + dec a + ld hl, wPartyMonOT + ld a, [wPartyCount] + jr nz, .okay6 + ld hl, sBoxMonOT + ld a, [sBoxCount] + +.okay6 + dec a + call SkipNames + ld d, h + ld e, l + +.okay5 + ld hl, sBoxMonOT + ld a, [wPokemonWithdrawDepositParameter] + and a + jr z, .okay7 + ld hl, wBreedMon1OT + cp DAY_CARE_WITHDRAW + jr z, .okay8 + ld hl, wPartyMonOT + +.okay7 + ld a, [wCurPartyMon] + call SkipNames + +.okay8 + ld bc, NAME_LENGTH + call CopyBytes + ld a, [wPokemonWithdrawDepositParameter] + cp DAY_CARE_DEPOSIT + ld de, wBreedMon1Nick + jr z, .okay9 + dec a + ld hl, wPartyMonNicknames + ld a, [wPartyCount] + jr nz, .okay10 + ld hl, sBoxMonNicknames + ld a, [sBoxCount] + +.okay10 + dec a + call SkipNames + ld d, h + ld e, l + +.okay9 + ld hl, sBoxMonNicknames + ld a, [wPokemonWithdrawDepositParameter] + and a + jr z, .okay11 + ld hl, wBreedMon1Nick + cp DAY_CARE_WITHDRAW + jr z, .okay12 + ld hl, wPartyMonNicknames + +.okay11 + ld a, [wCurPartyMon] + call SkipNames + +.okay12 + ld bc, MON_NAME_LENGTH + call CopyBytes + pop hl + + ld a, [wPokemonWithdrawDepositParameter] + cp PC_DEPOSIT + jr z, .took_out_of_box + cp DAY_CARE_DEPOSIT + jp z, .CloseSRAM_And_ClearCarryFlag + + push hl + srl a + add $2 + ld [wMonType], a + predef CopyMonToTempMon + callfar CalcLevel + ld a, d + ld [wCurPartyLevel], a + pop hl + + ld b, h + ld c, l + ld hl, MON_LEVEL + add hl, bc + ld [hl], a + ld hl, MON_MAXHP + add hl, bc + ld d, h + ld e, l + ld hl, MON_STAT_EXP - 1 + add hl, bc + + push bc + ld b, TRUE + call CalcMonStats + pop bc + + ld a, [wPokemonWithdrawDepositParameter] + and a + jr nz, .CloseSRAM_And_ClearCarryFlag + ld hl, MON_STATUS + add hl, bc + xor a + ld [hl], a + ld hl, MON_HP + add hl, bc + ld d, h + ld e, l + ld a, [wCurPartySpecies] + cp EGG + jr z, .egg + inc hl + inc hl + ld a, [hli] + ld [de], a + ld a, [hl] + inc de + ld [de], a + jr .CloseSRAM_And_ClearCarryFlag + +.egg + xor a + ld [de], a + inc de + ld [de], a + jr .CloseSRAM_And_ClearCarryFlag + +.took_out_of_box + ld a, [sBoxCount] + dec a + ld b, a + call RestorePPofDepositedPokemon +.CloseSRAM_And_ClearCarryFlag: + call CloseSRAM + and a + ret +; dcb1 + +CloseSRAM_And_SetCarryFlag: ; dcb1 + call CloseSRAM + scf + ret +; dcb6 + +RestorePPofDepositedPokemon: ; dcb6 + ld a, b + ld hl, sBoxMons + ld bc, BOXMON_STRUCT_LENGTH + call AddNTimes + ld b, h + ld c, l + ld hl, MON_PP + add hl, bc + push hl + push bc + ld de, wTempMonPP + ld bc, NUM_MOVES + call CopyBytes + pop bc + ld hl, MON_MOVES + add hl, bc + push hl + ld de, wTempMonMoves + ld bc, NUM_MOVES + call CopyBytes + pop hl + pop de + + ld a, [wMenuCursorY] + push af + ld a, [wMonType] + push af + ld b, 0 +.loop + ld a, [hli] + and a + jr z, .done + ld [wTempMonMoves], a + ld a, BOXMON + ld [wMonType], a + ld a, b + ld [wMenuCursorY], a + push bc + push hl + push de + farcall GetMaxPPOfMove + pop de + pop hl + ld a, [wd265] + ld b, a + ld a, [de] + and %11000000 + add b + ld [de], a + pop bc + inc de + inc b + ld a, b + cp NUM_MOVES + jr c, .loop + +.done + pop af + ld [wMonType], a + pop af + ld [wMenuCursorY], a + ret +; dd21 + +RetrieveMonFromDayCareMan: ; dd21 + ld a, [wBreedMon1Species] + ld [wCurPartySpecies], a + ld de, SFX_TRANSACTION + call PlaySFX + call WaitSFX + call GetBreedMon1LevelGrowth + ld a, b + ld [wd002], a + ld a, e + ld [wCurPartyLevel], a + xor a + ld [wPokemonWithdrawDepositParameter], a + jp RetrieveBreedmon +; dd42 + +RetrieveMonFromDayCareLady: ; dd42 + ld a, [wBreedMon2Species] + ld [wCurPartySpecies], a + ld de, SFX_TRANSACTION + call PlaySFX + call WaitSFX + call GetBreedMon2LevelGrowth + ld a, b + ld [wd002], a + ld a, e + ld [wCurPartyLevel], a + ld a, PC_DEPOSIT + ld [wPokemonWithdrawDepositParameter], a + jp RetrieveBreedmon +; dd64 + +RetrieveBreedmon: ; dd64 + ld hl, wPartyCount + ld a, [hl] + cp PARTY_LENGTH + jr nz, .room_in_party + scf + ret + +.room_in_party + inc a + ld [hl], a + ld c, a + ld b, 0 + add hl, bc + ld a, [wPokemonWithdrawDepositParameter] + and a + ld a, [wBreedMon1Species] + ld de, wBreedMon1Nick + jr z, .okay + ld a, [wBreedMon2Species] + ld de, wBreedMon2Nick + +.okay + ld [hli], a + ld [wCurSpecies], a + ld a, $ff + ld [hl], a + ld hl, wPartyMonNicknames + ld a, [wPartyCount] + dec a + call SkipNames + push hl + ld h, d + ld l, e + pop de + call CopyBytes + push hl + ld hl, wPartyMonOT + ld a, [wPartyCount] + dec a + call SkipNames + ld d, h + ld e, l + pop hl + call CopyBytes + push hl + call GetLastPartyMon + pop hl + ld bc, BOXMON_STRUCT_LENGTH + call CopyBytes + call GetBaseData + call GetLastPartyMon + ld b, d + ld c, e + ld hl, MON_LEVEL + add hl, bc + ld a, [wCurPartyLevel] + ld [hl], a + ld hl, MON_MAXHP + add hl, bc + ld d, h + ld e, l + ld hl, $a + add hl, bc + push bc + ld b, TRUE + call CalcMonStats + ld hl, wPartyMon1Moves + ld a, [wPartyCount] + dec a + ld bc, PARTYMON_STRUCT_LENGTH + call AddNTimes + ld d, h + ld e, l + ld a, $1 + ld [wBuffer1], a + predef FillMoves + ld a, [wPartyCount] + dec a + ld [wCurPartyMon], a + farcall HealPartyMon + ld a, [wCurPartyLevel] + ld d, a + callfar CalcExpAtLevel + pop bc + ld hl, $8 + add hl, bc + ld a, [hMultiplicand] + ld [hli], a + ld a, [hMultiplicand + 1] + ld [hli], a + ld a, [hMultiplicand + 2] + ld [hl], a + and a + ret +; de1a + +GetLastPartyMon: ; de1a + ld a, [wPartyCount] + dec a + ld hl, wPartyMon1Species + ld bc, PARTYMON_STRUCT_LENGTH + call AddNTimes + ld d, h + ld e, l + ret +; de2a + +DepositMonWithDayCareMan: ; de2a + ld de, wBreedMon1Nick + call DepositBreedmon + xor a ; REMOVE_PARTY + ld [wPokemonWithdrawDepositParameter], a + jp RemoveMonFromPartyOrBox +; de37 + +DepositMonWithDayCareLady: ; de37 + ld de, wBreedMon2Nick + call DepositBreedmon + xor a ; REMOVE_PARTY + ld [wPokemonWithdrawDepositParameter], a + jp RemoveMonFromPartyOrBox +; de44 + +DepositBreedmon: ; de44 + ld a, [wCurPartyMon] + ld hl, wPartyMonNicknames + call SkipNames + call CopyBytes + ld a, [wCurPartyMon] + ld hl, wPartyMonOT + call SkipNames + call CopyBytes + ld a, [wCurPartyMon] + ld hl, wPartyMon1Species + ld bc, PARTYMON_STRUCT_LENGTH + call AddNTimes + ld bc, BOXMON_STRUCT_LENGTH + jp CopyBytes + +SendMonIntoBox: ; de6e +; Sends the mon into one of Bills Boxes +; the data comes mainly from 'wEnemyMon:' + ld a, BANK(sBoxCount) + call GetSRAMBank + ld de, sBoxCount + ld a, [de] + cp MONS_PER_BOX + jp nc, .full + inc a + ld [de], a + + ld a, [wCurPartySpecies] + ld [wCurSpecies], a + ld c, a +.loop + inc de + ld a, [de] + ld b, a + ld a, c + ld c, b + ld [de], a + inc a + jr nz, .loop + + call GetBaseData + call ShiftBoxMon + + ld hl, wPlayerName + ld de, sBoxMonOT + ld bc, NAME_LENGTH + call CopyBytes + + ld a, [wCurPartySpecies] + ld [wd265], a + call GetPokemonName + + ld de, sBoxMonNicknames + ld hl, wStringBuffer1 + ld bc, MON_NAME_LENGTH + call CopyBytes + + ld hl, wEnemyMon + ld de, sBoxMon1 + ld bc, 1 + 1 + NUM_MOVES ; species + item + moves + call CopyBytes + + ld hl, wPlayerID + ld a, [hli] + ld [de], a + inc de + ld a, [hl] + ld [de], a + inc de + push de + ld a, [wCurPartyLevel] + ld d, a + callfar CalcExpAtLevel + pop de + ld a, [hProduct + 1] + ld [de], a + inc de + ld a, [hProduct + 2] + ld [de], a + inc de + ld a, [hProduct + 3] + ld [de], a + inc de + + ; Set all 5 Experience Values to 0 + xor a + ld b, 2 * 5 +.loop2 + ld [de], a + inc de + dec b + jr nz, .loop2 + + ld hl, wEnemyMonDVs + ld b, 2 + NUM_MOVES ; DVs and PP ; wEnemyMonHappiness - wEnemyMonDVs +.loop3 + ld a, [hli] + ld [de], a + inc de + dec b + jr nz, .loop3 + + ld a, BASE_HAPPINESS + ld [de], a + inc de + xor a + ld [de], a + inc de + ld [de], a + inc de + ld [de], a + inc de + ld a, [wCurPartyLevel] + ld [de], a + ld a, [wCurPartySpecies] + dec a + call SetSeenAndCaughtMon + ld a, [wCurPartySpecies] + cp UNOWN + jr nz, .not_unown + ld hl, sBoxMon1DVs + predef GetUnownLetter + callfar UpdateUnownDex + +.not_unown + ld hl, sBoxMon1Moves + ld de, wTempMonMoves + ld bc, NUM_MOVES + call CopyBytes + + ld hl, sBoxMon1PP + ld de, wTempMonPP + ld bc, NUM_MOVES + call CopyBytes + + ld b, 0 + call RestorePPofDepositedPokemon + + call CloseSRAM + scf + ret +; df42 + +.full ; df42 + call CloseSRAM + and a + ret +; df47 + +ShiftBoxMon: ; df47 + ld hl, sBoxMonOT + ld bc, NAME_LENGTH + call .shift + + ld hl, sBoxMonNicknames + ld bc, MON_NAME_LENGTH + call .shift + + ld hl, sBoxMons + ld bc, BOXMON_STRUCT_LENGTH + +.shift + ld a, [sBoxCount] + cp 2 + ret c + + push hl + call AddNTimes + dec hl + ld e, l + ld d, h + pop hl + + ld a, [sBoxCount] + dec a + call AddNTimes + dec hl + + push hl + ld a, [sBoxCount] + dec a + ld hl, 0 + call AddNTimes + ld c, l + ld b, h + pop hl +.loop + ld a, [hld] + ld [de], a + dec de + dec bc + ld a, c + or b + jr nz, .loop + ret +; df8c + +GiveEgg:: ; df8c + ld a, [wCurPartySpecies] + push af + callfar GetPreEvolution + callfar GetPreEvolution + ld a, [wCurPartySpecies] + dec a + +; TryAddMonToParty sets Seen and Caught flags +; when it is successful. This routine will make +; sure that we aren't newly setting flags. + push af + call CheckCaughtMon + pop af + push bc + call CheckSeenMon + push bc + + call TryAddMonToParty + +; If we haven't caught this Pokemon before receiving +; the Egg, reset the flag that was just set by +; TryAddMonToParty. + pop bc + ld a, c + and a + jr nz, .skip_caught_flag + ld a, [wCurPartySpecies] + dec a + ld c, a + ld d, $0 + ld hl, wPokedexCaught + ld b, RESET_FLAG + predef SmallFarFlagAction + +.skip_caught_flag +; If we haven't seen this Pokemon before receiving +; the Egg, reset the flag that was just set by +; TryAddMonToParty. + pop bc + ld a, c + and a + jr nz, .skip_seen_flag + ld a, [wCurPartySpecies] + dec a + ld c, a + ld d, $0 + ld hl, wPokedexSeen + ld b, RESET_FLAG + predef SmallFarFlagAction + +.skip_seen_flag + pop af + ld [wCurPartySpecies], a + ld a, [wPartyCount] + dec a + ld bc, PARTYMON_STRUCT_LENGTH + ld hl, wPartyMon1Species + call AddNTimes + ld a, [wCurPartySpecies] + ld [hl], a + ld hl, wPartyCount + ld a, [hl] + ld b, 0 + ld c, a + add hl, bc + ld a, EGG + ld [hl], a + ld a, [wPartyCount] + dec a + ld hl, wPartyMonNicknames + call SkipNames + ld de, String_Egg + call CopyName2 + ld a, [wPartyCount] + dec a + ld hl, wPartyMon1Happiness + ld bc, PARTYMON_STRUCT_LENGTH + call AddNTimes + ld a, [wMonStatusFlags] + bit 1, a + ld a, 1 + jr nz, .got_init_happiness + ld a, [wBaseEggSteps] + +.got_init_happiness + ld [hl], a + ld a, [wPartyCount] + dec a + ld hl, wPartyMon1HP + ld bc, PARTYMON_STRUCT_LENGTH + call AddNTimes + xor a + ld [hli], a + ld [hl], a + and a + ret +; e035 + +String_Egg: ; e035 + db "EGG@" +; e039 + +RemoveMonFromPartyOrBox: ; e039 + ld hl, wPartyCount + + ld a, [wPokemonWithdrawDepositParameter] + and a + jr z, .okay + + ld a, BANK(sBoxCount) + call GetSRAMBank + ld hl, sBoxCount + +.okay + ld a, [hl] + dec a + ld [hli], a + ld a, [wCurPartyMon] + ld c, a + ld b, 0 + add hl, bc + ld e, l + ld d, h + inc de +.loop + ld a, [de] + inc de + ld [hli], a + inc a + jr nz, .loop + ld hl, wPartyMonOT + ld d, PARTY_LENGTH - 1 + ld a, [wPokemonWithdrawDepositParameter] + and a + jr z, .party + ld hl, sBoxMonOT + ld d, MONS_PER_BOX - 1 + +.party + ; If this is the last mon in our party (box), + ; shift all the other mons up to close the gap. + ld a, [wCurPartyMon] + call SkipNames + ld a, [wCurPartyMon] + cp d + jr nz, .delete_inside + ld [hl], -1 + jp .finish + +.delete_inside + ; Shift the OT names + ld d, h + ld e, l + ld bc, MON_NAME_LENGTH + add hl, bc + ld bc, wPartyMonNicknames + ld a, [wPokemonWithdrawDepositParameter] + and a + jr z, .party2 + ld bc, sBoxMonNicknames +.party2 + call CopyDataUntil + ; Shift the struct + ld hl, wPartyMons + ld bc, PARTYMON_STRUCT_LENGTH + ld a, [wPokemonWithdrawDepositParameter] + and a + jr z, .party4 + ld hl, sBoxMons + ld bc, BOXMON_STRUCT_LENGTH +.party4 + ld a, [wCurPartyMon] + call AddNTimes + ld d, h + ld e, l + ld a, [wPokemonWithdrawDepositParameter] + and a + jr z, .party5 + ld bc, BOXMON_STRUCT_LENGTH + add hl, bc + ld bc, sBoxMonOT + jr .copy + +.party5 + ld bc, PARTYMON_STRUCT_LENGTH + add hl, bc + ld bc, wPartyMonOT +.copy + call CopyDataUntil + ; Shift the nicknames + ld hl, wPartyMonNicknames + ld a, [wPokemonWithdrawDepositParameter] + and a + jr z, .party6 + ld hl, sBoxMonNicknames +.party6 + ld bc, MON_NAME_LENGTH + ld a, [wCurPartyMon] + call AddNTimes + ld d, h + ld e, l + ld bc, MON_NAME_LENGTH + add hl, bc + ld bc, wPartyMonNicknamesEnd + ld a, [wPokemonWithdrawDepositParameter] + and a + jr z, .party7 + ld bc, sBoxMonNicknamesEnd +.party7 + call CopyDataUntil + ; Mail time! +.finish + ld a, [wPokemonWithdrawDepositParameter] + and a + jp nz, CloseSRAM + ld a, [wLinkMode] + and a + ret nz + ; Shift mail + ld a, BANK(sPartyMail) + call GetSRAMBank + ; If this is the last mon in our party, no need to shift mail. + ld hl, wPartyCount + ld a, [wCurPartyMon] + cp [hl] + jr z, .close_sram + ; Shift our mail messages up. + ld hl, sPartyMail + ld bc, MAIL_STRUCT_LENGTH + call AddNTimes + push hl + add hl, bc + pop de + ld a, [wCurPartyMon] + ld b, a +.loop2 + push bc + push hl + ld bc, MAIL_STRUCT_LENGTH + call CopyBytes + pop hl + push hl + ld bc, MAIL_STRUCT_LENGTH + add hl, bc + pop de + pop bc + inc b + ld a, [wPartyCount] + cp b + jr nz, .loop2 +.close_sram + jp CloseSRAM +; e134 + + +ComputeNPCTrademonStats: ; e134 + ld a, MON_LEVEL + call GetPartyParamLocation + ld a, [hl] + ld [MON_LEVEL], a ; wow + ld a, MON_SPECIES + call GetPartyParamLocation + ld a, [hl] + ld [wCurSpecies], a + call GetBaseData + ld a, MON_MAXHP + call GetPartyParamLocation + ld d, h + ld e, l + push de + ld a, MON_STAT_EXP - 1 + call GetPartyParamLocation + ld b, TRUE + call CalcMonStats + pop de + ld a, MON_HP + call GetPartyParamLocation + ld a, [de] + inc de + ld [hli], a + ld a, [de] + ld [hl], a + ret +; e167 + +CalcMonStats: ; e167 +; Calculates all 6 Stats of a mon +; b: Take into account stat EXP if TRUE +; 'c' counts from 1-6 and points with 'wBaseStats' to the base value +; hl is the path to the Stat EXP +; de points to where the final stats will be saved + + ld c, $0 +.loop + inc c + call CalcMonStatC + ld a, [hMultiplicand + 1] + ld [de], a + inc de + ld a, [hMultiplicand + 2] + ld [de], a + inc de + ld a, c + cp STAT_SDEF + jr nz, .loop + ret +; e17b + +CalcMonStatC: ; e17b +; 'c' is 1-6 and points to the BaseStat +; 1: HP +; 2: Attack +; 3: Defense +; 4: Speed +; 5: SpAtk +; 6: SpDef + push hl + push de + push bc + ld a, b + ld d, a + push hl + ld hl, wBaseStats + dec hl ; has to be decreased, because 'c' begins with 1 + ld b, $0 + add hl, bc + ld a, [hl] + ld e, a + pop hl + push hl + ld a, c + cp STAT_SDEF + jr nz, .not_spdef + dec hl + dec hl + +.not_spdef + sla c + ld a, d + and a + jr z, .no_stat_exp + add hl, bc + push de + ld a, [hld] + ld e, a + ld d, [hl] + farcall GetSquareRoot + pop de + +.no_stat_exp + srl c + pop hl + push bc + ld bc, MON_DVS - MON_HP_EXP + 1 + add hl, bc + pop bc + ld a, c + cp STAT_ATK + jr z, .Attack + cp STAT_DEF + jr z, .Defense + cp STAT_SPD + jr z, .Speed + cp STAT_SATK + jr z, .Special + cp STAT_SDEF + jr z, .Special +; DV_HP = (DV_ATK & 1) << 3 + (DV_DEF & 1) << 2 + (DV_SPD & 1) << 1 + (DV_SPC & 1) + push bc + ld a, [hl] + swap a + and $1 + add a + add a + add a + ld b, a + ld a, [hli] + and $1 + add a + add a + add b + ld b, a + ld a, [hl] + swap a + and $1 + add a + add b + ld b, a + ld a, [hl] + and $1 + add b + pop bc + jr .GotDV + +.Attack: + ld a, [hl] + swap a + and $f + jr .GotDV + +.Defense: + ld a, [hl] + and $f + jr .GotDV + +.Speed: + inc hl + ld a, [hl] + swap a + and $f + jr .GotDV + +.Special: + inc hl + ld a, [hl] + and $f + +.GotDV: + ld d, 0 + add e + ld e, a + jr nc, .no_overflow_1 + inc d + +.no_overflow_1 + sla e + rl d + srl b + srl b + ld a, b + add e + jr nc, .no_overflow_2 + inc d + +.no_overflow_2 + ld [hMultiplicand + 2], a + ld a, d + ld [hMultiplicand + 1], a + xor a + ld [hMultiplicand + 0], a + ld a, [wCurPartyLevel] + ld [hMultiplier], a + call Multiply + ld a, [hProduct + 1] + ld [hDividend + 0], a + ld a, [hProduct + 2] + ld [hDividend + 1], a + ld a, [hProduct + 3] + ld [hDividend + 2], a + ld a, 100 + ld [hDivisor], a + ld a, 3 + ld b, a + call Divide + ld a, c + cp STAT_HP + ld a, STAT_MIN_NORMAL + jr nz, .not_hp + ld a, [wCurPartyLevel] + ld b, a + ld a, [hQuotient + 2] + add b + ld [hMultiplicand + 2], a + jr nc, .no_overflow_3 + ld a, [hQuotient + 1] + inc a + ld [hMultiplicand + 1], a + +.no_overflow_3 + ld a, STAT_MIN_HP + +.not_hp + ld b, a + ld a, [hQuotient + 2] + add b + ld [hMultiplicand + 2], a + jr nc, .no_overflow_4 + ld a, [hQuotient + 1] + inc a + ld [hMultiplicand + 1], a + +.no_overflow_4 + ld a, [hQuotient + 1] + cp HIGH(MAX_STAT_VALUE + 1) + 1 + jr nc, .max_stat + cp HIGH(MAX_STAT_VALUE + 1) + jr c, .stat_value_okay + ld a, [hQuotient + 2] + cp LOW(MAX_STAT_VALUE + 1) + jr c, .stat_value_okay + +.max_stat + ld a, HIGH(MAX_STAT_VALUE) + ld [hMultiplicand + 1], a + ld a, LOW(MAX_STAT_VALUE) + ld [hMultiplicand + 2], a + +.stat_value_okay + pop bc + pop de + pop hl + ret +; e277 + +GivePoke:: ; e277 + push de + push bc + xor a ; PARTYMON + ld [wMonType], a + call TryAddMonToParty + jr nc, .failed + ld hl, wPartyMonNicknames + ld a, [wPartyCount] + dec a + ld [wCurPartyMon], a + call SkipNames + ld d, h + ld e, l + pop bc + ld a, b + ld b, 0 + push bc + push de + push af + ld a, [wCurItem] + and a + jr z, .done + ld a, [wCurPartyMon] + ld hl, wPartyMon1Item + ld bc, PARTYMON_STRUCT_LENGTH + call AddNTimes + ld a, [wCurItem] + ld [hl], a + jr .done + +.failed + ld a, [wCurPartySpecies] + ld [wTempEnemyMonSpecies], a + callfar LoadEnemyMon + call SendMonIntoBox + jp nc, .FailedToGiveMon + ld a, BOXMON + ld [wMonType], a + xor a + ld [wCurPartyMon], a + ld de, wMonOrItemNameBuffer + pop bc + ld a, b + ld b, 1 + push bc + push de + push af + ld a, [wCurItem] + and a + jr z, .done + ld a, [wCurItem] + ld [sBoxMon1Item], a + +.done + ld a, [wCurPartySpecies] + ld [wd265], a + ld [wTempEnemyMonSpecies], a + call GetPokemonName + ld hl, wStringBuffer1 + ld de, wMonOrItemNameBuffer + ld bc, MON_NAME_LENGTH + call CopyBytes + pop af + and a + jp z, .wildmon + pop de + pop bc + pop hl + push bc + push hl + ld a, [wScriptBank] + call GetFarHalfword + ld bc, MON_NAME_LENGTH + ld a, [wScriptBank] + call FarCopyBytes + pop hl + inc hl + inc hl + ld a, [wScriptBank] + call GetFarHalfword + pop bc + ld a, b + and a + push de + push bc + jr nz, .send_to_box + + push hl + ld a, [wCurPartyMon] + ld hl, wPartyMonOT + call SkipNames + ld d, h + ld e, l + pop hl +.otnameloop + ld a, [wScriptBank] + call GetFarByte + ld [de], a + inc hl + inc de + cp "@" + jr nz, .otnameloop + ld a, [wScriptBank] + call GetFarByte + ld b, a + push bc + ld a, [wCurPartyMon] + ld hl, wPartyMon1ID + ld bc, PARTYMON_STRUCT_LENGTH + call AddNTimes + ld a, HIGH(01001) + ld [hli], a + ld [hl], LOW(01001) + pop bc + farcall SetGiftPartyMonCaughtData + jr .skip_nickname + +.send_to_box + ld a, BANK(sBoxMonOT) + call GetSRAMBank + ld de, sBoxMonOT +.loop + ld a, [wScriptBank] + call GetFarByte + ld [de], a + inc hl + inc de + cp "@" + jr nz, .loop + ld a, [wScriptBank] + call GetFarByte + ld b, a + ld hl, sBoxMon1ID + call Random + ld [hli], a + call Random + ld [hl], a + call CloseSRAM + farcall SetGiftBoxMonCaughtData + jr .skip_nickname + +.wildmon + pop de + pop bc + push bc + push de + ld a, b + and a + jr z, .party + farcall SetBoxMonCaughtData + jr .set_caught_data + +.party + farcall SetCaughtData +.set_caught_data + farcall GiveANickname_YesNo + pop de + jr c, .skip_nickname + call InitNickname + +.skip_nickname + pop bc + pop de + ld a, b + and a + ret z + ld hl, TextJump_WasSentToBillsPC + call PrintText + ld a, BANK(sBoxMonNicknames) + call GetSRAMBank + ld hl, wMonOrItemNameBuffer + ld de, sBoxMonNicknames + ld bc, MON_NAME_LENGTH + call CopyBytes + call CloseSRAM + ld b, $1 + ret +; e3d4 + +.FailedToGiveMon: ; e3d4 + pop bc + pop de + ld b, $2 + ret +; e3d9 + +TextJump_WasSentToBillsPC: ; 0xe3d9 + ; was sent to BILL's PC. + text_jump Text_WasSentToBillsPC + db "@" +; 0xe3de + +InitNickname: ; e3de + push de + call LoadStandardMenuHeader + call DisableSpriteUpdates + pop de + push de + ld b, $0 + farcall NamingScreen + pop hl + ld de, wStringBuffer1 + call InitName + ld a, $4 ; ExitAllMenus is in bank 0, XXX could this be in bank 4 in pokered? + ld hl, ExitAllMenus + rst FarCall + ret +; e3fd diff --git a/engine/pokemon/move_mon_wo_mail.asm b/engine/pokemon/move_mon_wo_mail.asm new file mode 100755 index 000000000..5d81da8a0 --- /dev/null +++ b/engine/pokemon/move_mon_wo_mail.asm @@ -0,0 +1,133 @@ +InsertPokemonIntoBox: ; 51322 + ld a, BANK(sBoxCount) + call GetSRAMBank + ld hl, sBoxCount + call InsertSpeciesIntoBoxOrParty + ld a, [sBoxCount] + dec a + ld [wd265], a + ld hl, sBoxMonNicknames + ld bc, MON_NAME_LENGTH + ld de, wBufferMonNick + call InsertDataIntoBoxOrParty + ld a, [sBoxCount] + dec a + ld [wd265], a + ld hl, sBoxMonOT + ld bc, NAME_LENGTH + ld de, wBufferMonOT + call InsertDataIntoBoxOrParty + ld a, [sBoxCount] + dec a + ld [wd265], a + ld hl, sBoxMons + ld bc, BOXMON_STRUCT_LENGTH + ld de, wBufferMon + call InsertDataIntoBoxOrParty + ld hl, wBufferMonMoves + ld de, wTempMonMoves + ld bc, NUM_MOVES + call CopyBytes + ld hl, wBufferMonPP + ld de, wTempMonPP + ld bc, NUM_MOVES + call CopyBytes + ld a, [wCurPartyMon] + ld b, a + farcall RestorePPofDepositedPokemon + jp CloseSRAM + +InsertPokemonIntoParty: ; 5138b + ld hl, wPartyCount + call InsertSpeciesIntoBoxOrParty + ld a, [wPartyCount] + dec a + ld [wd265], a + ld hl, wPartyMonNicknames + ld bc, MON_NAME_LENGTH + ld de, wBufferMonNick + call InsertDataIntoBoxOrParty + ld a, [wPartyCount] + dec a + ld [wd265], a + ld hl, wPartyMonOT + ld bc, NAME_LENGTH + ld de, wBufferMonOT + call InsertDataIntoBoxOrParty + ld a, [wPartyCount] + dec a + ld [wd265], a + ld hl, wPartyMons + ld bc, PARTYMON_STRUCT_LENGTH + ld de, wBufferMon + call InsertDataIntoBoxOrParty + ret + +InsertSpeciesIntoBoxOrParty: ; 513cb + inc [hl] + inc hl + ld a, [wCurPartyMon] + ld c, a + ld b, 0 + add hl, bc + ld a, [wCurPartySpecies] + ld c, a +.loop + ld a, [hl] + ld [hl], c + inc hl + inc c + ld c, a + jr nz, .loop + ret + +InsertDataIntoBoxOrParty: ; 513e0 + push de + push hl + push bc + ld a, [wd265] + dec a + call AddNTimes + push hl + add hl, bc + ld d, h + ld e, l + pop hl +.loop + push bc + ld a, [wd265] + ld b, a + ld a, [wCurPartyMon] + cp b + pop bc + jr z, .insert + push hl + push de + push bc + call CopyBytes + pop bc + pop de + pop hl + push hl + ld a, l + sub c + ld l, a + ld a, h + sbc b + ld h, a + pop de + ld a, [wd265] + dec a + ld [wd265], a + jr .loop + +.insert + pop bc + pop hl + ld a, [wCurPartyMon] + call AddNTimes + ld d, h + ld e, l + pop hl + call CopyBytes + ret diff --git a/engine/pokemon/party_menu.asm b/engine/pokemon/party_menu.asm new file mode 100644 index 000000000..fc1783c71 --- /dev/null +++ b/engine/pokemon/party_menu.asm @@ -0,0 +1,932 @@ +SelectMonFromParty: ; 50000 + call DisableSpriteUpdates + xor a + ld [wPartyMenuActionText], a + call ClearBGPalettes + call InitPartyMenuLayout + call WaitBGMap + call SetPalettes + call DelayFrame + call PartyMenuSelect + call ReturnToMapWithSpeechTextbox + ret +; 5001d + + +SelectTradeOrDayCareMon: ; 5001d + ld a, b + ld [wPartyMenuActionText], a + call DisableSpriteUpdates + call ClearBGPalettes + call InitPartyMenuLayout + call WaitBGMap + ld b, SCGB_PARTY_MENU + call GetSGBLayout + call SetPalettes + call DelayFrame + call PartyMenuSelect + call ReturnToMapWithSpeechTextbox + ret +; 5003f + +InitPartyMenuLayout: ; 5003f + call LoadPartyMenuGFX + call InitPartyMenuWithCancel + call InitPartyMenuGFX + call WritePartyMenuTilemap + call PrintPartyMenuText + ret +; 5004f + +LoadPartyMenuGFX: ; 5004f + call LoadFontsBattleExtra + callfar InitPartyMenuPalettes ; engine/color.asm + callfar ClearSpriteAnims2 + ret +; 5005f + + +WritePartyMenuTilemap: ; 0x5005f + ld hl, wOptions + ld a, [hl] + push af + set NO_TEXT_SCROLL, [hl] + xor a + ld [hBGMapMode], a + hlcoord 0, 0 + ld bc, SCREEN_WIDTH * SCREEN_HEIGHT + ld a, " " + call ByteFill ; blank the tilemap + call GetPartyMenuQualityIndexes +.loop + ld a, [hli] + cp -1 + jr z, .end + push hl + ld hl, .Jumptable + rst JumpTable + pop hl + jr .loop +.end + pop af + ld [wOptions], a + ret +; 0x50089 + +.Jumptable: ; 50089 +; entries correspond to PARTYMENUQUALITY_* constants + dw PlacePartyNicknames + dw PlacePartyHPBar + dw PlacePartyMenuHPDigits + dw PlacePartyMonLevel + dw PlacePartyMonStatus + dw PlacePartyMonTMHMCompatibility + dw PlacePartyMonEvoStoneCompatibility + dw PlacePartyMonGender + dw PlacePartyMonMobileBattleSelection +; 5009b + +PlacePartyNicknames: ; 5009b + hlcoord 3, 1 + ld a, [wPartyCount] + and a + jr z, .end + ld c, a + ld b, $0 +.loop + push bc + push hl + push hl + ld hl, wPartyMonNicknames + ld a, b + call GetNick + pop hl + call PlaceString + pop hl + ld de, 2 * SCREEN_WIDTH + add hl, de + pop bc + inc b + dec c + jr nz, .loop + +.end + dec hl + dec hl + ld de, .CANCEL + call PlaceString + ret +; 500c8 + +.CANCEL: ; 500c8 + db "CANCEL@" +; 500cf + + +PlacePartyHPBar: ; 500cf + xor a + ld [wSGBPals], a + ld a, [wPartyCount] + and a + ret z + ld c, a + ld b, $0 + hlcoord 11, 2 +.loop + push bc + push hl + call PartyMenuCheckEgg + jr z, .skip + push hl + call PlacePartymonHPBar + pop hl + ld d, $6 + ld b, $0 + call DrawBattleHPBar + ld hl, wHPPals + ld a, [wSGBPals] + ld c, a + ld b, $0 + add hl, bc + call SetHPPal + ld b, SCGB_PARTY_MENU_HP_PALS + call GetSGBLayout +.skip + ld hl, wSGBPals + inc [hl] + pop hl + ld de, 2 * SCREEN_WIDTH + add hl, de + pop bc + inc b + dec c + jr nz, .loop + ld b, SCGB_PARTY_MENU + call GetSGBLayout + ret +; 50117 + +PlacePartymonHPBar: ; 50117 + ld a, b + ld bc, PARTYMON_STRUCT_LENGTH + ld hl, wPartyMon1HP + call AddNTimes + ld a, [hli] + or [hl] + jr nz, .not_fainted + xor a + ld e, a + ld c, a + ret + +.not_fainted + dec hl + ld a, [hli] + ld b, a + ld a, [hli] + ld c, a + ld a, [hli] + ld d, a + ld a, [hli] + ld e, a + predef ComputeHPBarPixels + ret +; 50138 + +PlacePartyMenuHPDigits: ; 50138 + ld a, [wPartyCount] + and a + ret z + ld c, a + ld b, $0 + hlcoord 13, 1 +.loop + push bc + push hl + call PartyMenuCheckEgg + jr z, .next + push hl + ld a, b + ld bc, PARTYMON_STRUCT_LENGTH + ld hl, wPartyMon1HP + call AddNTimes + ld e, l + ld d, h + pop hl + push de + lb bc, 2, 3 + call PrintNum + pop de + ld a, "/" + ld [hli], a + inc de + inc de + lb bc, 2, 3 + call PrintNum + +.next + pop hl + ld de, 2 * SCREEN_WIDTH + add hl, de + pop bc + inc b + dec c + jr nz, .loop + ret +; 50176 + +PlacePartyMonLevel: ; 50176 + ld a, [wPartyCount] + and a + ret z + ld c, a + ld b, 0 + hlcoord 8, 2 +.loop + push bc + push hl + call PartyMenuCheckEgg + jr z, .next + push hl + ld a, b + ld bc, PARTYMON_STRUCT_LENGTH + ld hl, wPartyMon1Level + call AddNTimes + ld e, l + ld d, h + pop hl + ld a, [de] + cp 100 ; This is distinct from MAX_LEVEL. + jr nc, .ThreeDigits + ld a, "<LV>" + ld [hli], a + lb bc, PRINTNUM_RIGHTALIGN | 1, 2 + ; jr .okay +.ThreeDigits: + lb bc, PRINTNUM_RIGHTALIGN | 1, 3 +; .okay + call PrintNum + +.next + pop hl + ld de, SCREEN_WIDTH * 2 + add hl, de + pop bc + inc b + dec c + jr nz, .loop + ret +; 501b2 + +PlacePartyMonStatus: ; 501b2 + ld a, [wPartyCount] + and a + ret z + ld c, a + ld b, 0 + hlcoord 5, 2 +.loop + push bc + push hl + call PartyMenuCheckEgg + jr z, .next + push hl + ld a, b + ld bc, PARTYMON_STRUCT_LENGTH + ld hl, wPartyMon1Status + call AddNTimes + ld e, l + ld d, h + pop hl + call PlaceStatusString + +.next + pop hl + ld de, SCREEN_WIDTH * 2 + add hl, de + pop bc + inc b + dec c + jr nz, .loop + ret +; 501e0 + +PlacePartyMonTMHMCompatibility: ; 501e0 + ld a, [wPartyCount] + and a + ret z + ld c, a + ld b, 0 + hlcoord 12, 2 +.loop + push bc + push hl + call PartyMenuCheckEgg + jr z, .next + push hl + ld hl, wPartySpecies + ld e, b + ld d, 0 + add hl, de + ld a, [hl] + ld [wCurPartySpecies], a + predef CanLearnTMHMMove + pop hl + call .PlaceAbleNotAble + call PlaceString + +.next + pop hl + ld de, SCREEN_WIDTH * 2 + add hl, de + pop bc + inc b + dec c + jr nz, .loop + ret +; 50215 + +.PlaceAbleNotAble: ; 50215 + ld a, c + and a + jr nz, .able + ld de, .string_not_able + ret + +.able + ld de, .string_able + ret +; 50221 + +.string_able ; 50221 + db "ABLE@" +; 50226 + +.string_not_able ; 50226 + db "NOT ABLE@" +; 5022f + + +PlacePartyMonEvoStoneCompatibility: ; 5022f + ld a, [wPartyCount] + and a + ret z + ld c, a + ld b, 0 + hlcoord 12, 2 +.loop + push bc + push hl + call PartyMenuCheckEgg + jr z, .next + push hl + ld a, b + ld bc, PARTYMON_STRUCT_LENGTH + ld hl, wPartyMon1Species + call AddNTimes + ld a, [hl] + dec a + ld e, a + ld d, 0 + ld hl, EvosAttacksPointers + add hl, de + add hl, de + call .DetermineCompatibility + pop hl + call PlaceString + +.next + pop hl + ld de, 2 * SCREEN_WIDTH + add hl, de + pop bc + inc b + dec c + jr nz, .loop + ret +; 50268 + +.DetermineCompatibility: ; 50268 + ld de, wStringBuffer1 + ld a, BANK(EvosAttacksPointers) + ld bc, 2 + call FarCopyBytes + ld hl, wStringBuffer1 + ld a, [hli] + ld h, [hl] + ld l, a + ld de, wStringBuffer1 + ld a, BANK(EvosAttacks) + ld bc, 10 + call FarCopyBytes + ld hl, wStringBuffer1 +.loop2 + ld a, [hli] + and a + jr z, .nope + inc hl + inc hl + cp EVOLVE_ITEM + jr nz, .loop2 + dec hl + dec hl + ld a, [wCurItem] + cp [hl] + inc hl + inc hl + jr nz, .loop2 + ld de, .string_able + ret + +.nope + ld de, .string_not_able + ret +; 502a3 + +.string_able ; 502a3 + db "ABLE@" +; 502a8 +.string_not_able ; 502a8 + db "NOT ABLE@" +; 502b1 + + +PlacePartyMonGender: ; 502b1 + ld a, [wPartyCount] + and a + ret z + ld c, a + ld b, 0 + hlcoord 12, 2 +.loop + push bc + push hl + call PartyMenuCheckEgg + jr z, .next + ld [wCurPartySpecies], a + push hl + ld a, b + ld [wCurPartyMon], a + xor a + ld [wMonType], a + call GetGender + ld de, .unknown + jr c, .got_gender + ld de, .male + jr nz, .got_gender + ld de, .female + +.got_gender + pop hl + call PlaceString + +.next + pop hl + ld de, 2 * SCREEN_WIDTH + add hl, de + pop bc + inc b + dec c + jr nz, .loop + ret +; 502ee + +.male ; 502ee + db "♂…MALE@" +; 502f5 + +.female ; 502f5 + db "♀…FEMALE@" +; 502fe + +.unknown ; 502fe + db "…UNKNOWN@" +; 50307 + + +PlacePartyMonMobileBattleSelection: ; 50307 + ld a, [wPartyCount] + and a + ret z + ld c, a + ld b, 0 + hlcoord 12, 1 +.loop + push bc + push hl + ld de, .String_Sanka_Shinai + call PlaceString + pop hl + ld de, 2 * SCREEN_WIDTH + add hl, de + pop bc + inc b + dec c + jr nz, .loop + ld a, l + ld e, MON_NAME_LENGTH + sub e + ld l, a + ld a, h + sbc $0 + ld h, a + ld de, .String_Kettei_Yameru + call PlaceString + ld b, $3 + ld c, $0 + ld hl, wd002 + ld a, [hl] +.loop2 + push hl + push bc + hlcoord 12, 1 +.loop3 + and a + jr z, .done + ld de, 2 * SCREEN_WIDTH + add hl, de + dec a + jr .loop3 + +.done + ld de, .String_Banme + push hl + call PlaceString + pop hl + pop bc + push bc + push hl + ld a, c + ld hl, .Strings_1_2_3 + call GetNthString + ld d, h + ld e, l + pop hl + call PlaceString + pop bc + pop hl + inc hl + ld a, [hl] + inc c + dec b + ret z + jr .loop2 +; 5036b + +.String_Banme: ; 5036b + db " ばんめ @" ; Place +; 50372 +.String_Sanka_Shinai: ; 50372 + db "さんかしない@" ; Cancel +; 50379 +.String_Kettei_Yameru: ; 50379 + db "けってい やめる@" ; Quit +; 50383 +.Strings_1_2_3: ; 50383 + db "1@", "2@", "3@" ; 1st, 2nd, 3rd +; 50389 + + +PartyMenuCheckEgg: ; 50389 + ld a, LOW(wPartySpecies) + add b + ld e, a + ld a, HIGH(wPartySpecies) + adc 0 + ld d, a + ld a, [de] + cp EGG + ret +; 50396 + +GetPartyMenuQualityIndexes: ; 50396 + ld a, [wPartyMenuActionText] + and $f0 + jr nz, .skip + ld a, [wPartyMenuActionText] + and $f + ld e, a + ld d, 0 + ld hl, PartyMenuQualityPointers + add hl, de + add hl, de + ld a, [hli] + ld h, [hl] + ld l, a + ret + +.skip + ld hl, PartyMenuQualityPointers.Default + ret +; 503b2 + +INCLUDE "data/party_menu_qualities.asm" + + +InitPartyMenuGFX: ; 503e0 + ld hl, wPartyCount + ld a, [hli] + and a + ret z + ld c, a + xor a + ld [hObjectStructIndexBuffer], a +.loop + push bc + push hl + ld hl, LoadMenuMonIcon + ld a, BANK(LoadMenuMonIcon) + ld e, $0 + rst FarCall + ld a, [hObjectStructIndexBuffer] + inc a + ld [hObjectStructIndexBuffer], a + pop hl + pop bc + dec c + jr nz, .loop + callfar PlaySpriteAnimations + ret +; 50405 + +InitPartyMenuWithCancel: ; 50405 +; with cancel + xor a + ld [wSwitchMon], a + ld de, PartyMenuAttributes + call SetMenuAttributes + ld a, [wPartyCount] + inc a + ld [w2DMenuNumRows], a ; list length + dec a + ld b, a + ld a, [wPartyMenuCursor] + and a + jr z, .skip + inc b + cp b + jr c, .done + +.skip + ld a, 1 + +.done + ld [wMenuCursorY], a + ld a, A_BUTTON | B_BUTTON + ld [wMenuJoypadFilter], a + ret +; 5042d + +InitPartyMenuNoCancel: ; 0x5042d +; no cancel + ld de, PartyMenuAttributes + call SetMenuAttributes + ld a, [wPartyCount] + ld [w2DMenuNumRows], a ; list length + ld b, a + ld a, [wPartyMenuCursor] + and a + jr z, .skip + inc b + cp b + jr c, .done +.skip + ld a, 1 +.done + ld [wMenuCursorY], a + ld a, A_BUTTON | B_BUTTON + ld [wMenuJoypadFilter], a + ret +; 5044f (14:444f) + +PartyMenuAttributes: ; 5044f +; cursor y +; cursor x +; num rows +; num cols +; bit 6: animate sprites bit 5: wrap around +; ? +; distance between items (hi: y, lo: x) +; allowed buttons (mask) + db 1, 0 + db 0, 1 + db $60, $00 + dn 2, 0 + db 0 +; 50457 + +PartyMenuSelect: ; 0x50457 +; sets carry if exitted menu. + call StaticMenuJoypad + call PlaceHollowCursor + ld a, [wPartyCount] + inc a + ld b, a + ld a, [wMenuCursorY] ; menu selection? + cp b + jr z, .exitmenu ; CANCEL + ld [wPartyMenuCursor], a + ld a, [hJoyLast] + ld b, a + bit B_BUTTON_F, b + jr nz, .exitmenu ; B button + ld a, [wMenuCursorY] + dec a + ld [wCurPartyMon], a + ld c, a + ld b, $0 + ld hl, wPartySpecies + add hl, bc + ld a, [hl] + ld [wCurPartySpecies], a + + ld de, SFX_READ_TEXT_2 + call PlaySFX + call WaitSFX + and a + ret + +.exitmenu + ld de, SFX_READ_TEXT_2 + call PlaySFX + call WaitSFX + scf + ret +; 0x5049a + + +PrintPartyMenuText: ; 5049a + hlcoord 0, 14 + lb bc, 2, 18 + call TextBox + ld a, [wPartyCount] + and a + jr nz, .haspokemon + ld de, YouHaveNoPKMNString + jr .gotstring +.haspokemon ; 504ae + ld a, [wPartyMenuActionText] + and $f ; drop high nibble + ld hl, PartyMenuStrings + ld e, a + ld d, $0 + add hl, de + add hl, de + ld a, [hli] + ld d, [hl] + ld e, a +.gotstring ; 504be + ld a, [wOptions] + push af + set 4, a ; disable text delay + ld [wOptions], a + hlcoord 1, 16 ; Coord + call PlaceString + pop af + ld [wOptions], a + ret +; 0x504d2 + +PartyMenuStrings: ; 0x504d2 + dw ChooseAMonString + dw UseOnWhichPKMNString + dw WhichPKMNString + dw TeachWhichPKMNString + dw MoveToWhereString + dw UseOnWhichPKMNString + dw ChooseAMonString ; Probably used to be ChooseAFemalePKMNString + dw ChooseAMonString ; Probably used to be ChooseAMalePKMNString + dw ToWhichPKMNString + +ChooseAMonString: ; 0x504e4 + db "Choose a #MON.@" + +UseOnWhichPKMNString: ; 0x504f3 + db "Use on which <PK><MN>?@" + +WhichPKMNString: ; 0x50504 + db "Which <PK><MN>?@" + +TeachWhichPKMNString: ; 0x5050e + db "Teach which <PK><MN>?@" + +MoveToWhereString: ; 0x5051e + db "Move to where?@" + +ChooseAFemalePKMNString: ; 0x5052d +; unused + db "Choose a ♀<PK><MN>.@" + +ChooseAMalePKMNString: ; 0x5053b +; unused + db "Choose a ♂<PK><MN>.@" + +ToWhichPKMNString: ; 0x50549 + db "To which <PK><MN>?@" + +YouHaveNoPKMNString: ; 0x50556 + db "You have no <PK><MN>!@" + +PrintPartyMenuActionText: ; 50566 + ld a, [wCurPartyMon] + ld hl, wPartyMonNicknames + call GetNick + ld a, [wPartyMenuActionText] + and $f + ld hl, .MenuActionTexts + call .PrintText + ret +; 5057b + +.MenuActionTexts: ; 5057b +; entries correspond to PARTYMENUTEXT_* constants + dw .Text_CuredOfPoison + dw .Text_BurnWasHealed + dw .Text_Defrosted + dw .Text_WokeUp + dw .Text_RidOfParalysis + dw .Text_RecoveredSomeHP + dw .Text_HealthReturned + dw .Text_Revitalized + dw .Text_GrewToLevel + dw .Text_CameToItsSenses +; 5058f + +.Text_RecoveredSomeHP: ; 0x5058f + ; recovered @ HP! + text_jump UnknownText_0x1bc0a2 + db "@" +; 0x50594 + +.Text_CuredOfPoison: ; 0x50594 + ; 's cured of poison. + text_jump UnknownText_0x1bc0bb + db "@" +; 0x50599 + +.Text_RidOfParalysis: ; 0x50599 + ; 's rid of paralysis. + text_jump UnknownText_0x1bc0d2 + db "@" +; 0x5059e + +.Text_BurnWasHealed: ; 0x5059e + ; 's burn was healed. + text_jump UnknownText_0x1bc0ea + db "@" +; 0x505a3 + +.Text_Defrosted: ; 0x505a3 + ; was defrosted. + text_jump UnknownText_0x1bc101 + db "@" +; 0x505a8 + +.Text_WokeUp: ; 0x505a8 + ; woke up. + text_jump UnknownText_0x1bc115 + db "@" +; 0x505ad + +.Text_HealthReturned: ; 0x505ad + ; 's health returned. + text_jump UnknownText_0x1bc123 + db "@" +; 0x505b2 + +.Text_Revitalized: ; 0x505b2 + ; is revitalized. + text_jump UnknownText_0x1bc13a + db "@" +; 0x505b7 + +.Text_GrewToLevel: ; 0x505b7 + ; grew to level @ !@ @ + text_jump UnknownText_0x1bc14f + db "@" +; 0x505bc + +.Text_CameToItsSenses: ; 0x505bc + ; came to its senses. + text_jump UnknownText_0x1bc16e + db "@" +; 0x505c1 + + +.PrintText: ; 505c1 + ld e, a + ld d, 0 + add hl, de + add hl, de + ld a, [hli] + ld h, [hl] + ld l, a + ld a, [wOptions] + push af + set NO_TEXT_SCROLL, a + ld [wOptions], a + call PrintText + pop af + ld [wOptions], a + ret +; 505da diff --git a/engine/pokemon/search.asm b/engine/pokemon/search.asm new file mode 100755 index 000000000..57b489a37 --- /dev/null +++ b/engine/pokemon/search.asm @@ -0,0 +1,276 @@ +BeastsCheck: ; 0x4a6e8 +; Check if the player owns all three legendary beasts. +; They must exist in either party or PC, and have the player's OT and ID. +; Return the result in wScriptVar. + + ld a, RAIKOU + ld [wScriptVar], a + call CheckOwnMonAnywhere + jr nc, .notexist + + ld a, ENTEI + ld [wScriptVar], a + call CheckOwnMonAnywhere + jr nc, .notexist + + ld a, SUICUNE + ld [wScriptVar], a + call CheckOwnMonAnywhere + jr nc, .notexist + + ; they exist + ld a, 1 + ld [wScriptVar], a + ret + +.notexist + xor a + ld [wScriptVar], a + ret + + +MonCheck: ; 0x4a711 +; Check if the player owns any Pokémon of the species in wScriptVar. +; Return the result in wScriptVar. + + call CheckOwnMonAnywhere + jr c, .exists + + ; doesn't exist + xor a + ld [wScriptVar], a + ret + +.exists + ld a, 1 + ld [wScriptVar], a + ret + + +CheckOwnMonAnywhere: ; 0x4a721 +; Check if the player owns any monsters of the species in wScriptVar. +; It must exist in either party or PC, and have the player's OT and ID. + + ; If there are no monsters in the party, + ; the player must not own any yet. + ld a, [wPartyCount] + and a + ret z + + ld d, a + ld e, 0 + ld hl, wPartyMon1Species + ld bc, wPartyMonOT + + ; Run CheckOwnMon on each Pokémon in the party. +.partymon + call CheckOwnMon + ret c ; found! + + push bc + ld bc, PARTYMON_STRUCT_LENGTH + add hl, bc + pop bc + call UpdateOTPointer + dec d + jr nz, .partymon + + ; Run CheckOwnMon on each Pokémon in the PC. + ld a, BANK(sBoxCount) + call GetSRAMBank + ld a, [sBoxCount] + and a + jr z, .boxes + + ld d, a + ld hl, sBoxMon1Species + ld bc, sBoxMonOT +.openboxmon + call CheckOwnMon + jr nc, .loop + + ; found! + call CloseSRAM + ret + +.loop + push bc + ld bc, BOXMON_STRUCT_LENGTH + add hl, bc + pop bc + call UpdateOTPointer + dec d + jr nz, .openboxmon + + ; Run CheckOwnMon on each monster in the other 13 PC boxes. +.boxes + call CloseSRAM + + ld c, 0 +.box + ; Don't search the current box again. + ld a, [wCurBox] + and $f + cp c + jr z, .loopbox + + ; Load the box. + ld hl, BoxAddressTable1 + ld b, 0 + add hl, bc + add hl, bc + add hl, bc + ld a, [hli] + call GetSRAMBank + ld a, [hli] + ld h, [hl] + ld l, a + + ; Number of monsters in the box + ld a, [hl] + and a + jr z, .loopbox + + push bc + + push hl + ld de, sBoxMons - sBoxCount + add hl, de + ld d, h + ld e, l + pop hl + push de + ld de, sBoxMonOT - sBoxCount + add hl, de + ld b, h + ld c, l + pop hl + + ld d, a + +.boxmon + call CheckOwnMon + jr nc, .loopboxmon + + ; found! + pop bc + call CloseSRAM + ret + +.loopboxmon + push bc + ld bc, BOXMON_STRUCT_LENGTH + add hl, bc + pop bc + call UpdateOTPointer + dec d + jr nz, .boxmon + pop bc + +.loopbox + inc c + ld a, c + cp NUM_BOXES + jr c, .box + + ; not found + call CloseSRAM + and a + ret + + +CheckOwnMon: ; 0x4a7ba +; Check if a Pokémon belongs to the player and is of a specific species. + +; inputs: +; hl, pointer to PartyMonNSpecies +; bc, pointer to PartyMonNOT +; wScriptVar should contain the species we're looking for + +; outputs: +; sets carry if monster matches species, ID, and OT name. + + push bc + push hl + push de + ld d, b + ld e, c + +; check species + ld a, [wScriptVar] ; species we're looking for + ld b, [hl] ; species we have + cp b + jr nz, .notfound ; species doesn't match + +; check ID number + ld bc, MON_ID + add hl, bc ; now hl points to ID number + ld a, [wPlayerID] + cp [hl] + jr nz, .notfound ; ID doesn't match + inc hl + ld a, [wPlayerID + 1] + cp [hl] + jr nz, .notfound ; ID doesn't match + +; check OT +; This only checks five characters, which is fine for the Japanese version, +; but in the English version the player name is 7 characters, so this is wrong. + + ld hl, wPlayerName + +rept NAME_LENGTH_JAPANESE + -2 ; should be PLAYER_NAME_LENGTH + -2 + ld a, [de] + cp [hl] + jr nz, .notfound + cp "@" + jr z, .found ; reached end of string + inc hl + inc de +endr + + ld a, [de] + cp [hl] + jr z, .found + +.notfound + pop de + pop hl + pop bc + and a + ret + +.found + pop de + pop hl + pop bc + scf + ret +; 0x4a810 + +BoxAddressTable1: ; 4a810 + 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 +; 4a83a + +UpdateOTPointer: ; 0x4a83a + push hl + ld hl, NAME_LENGTH + add hl, bc + ld b, h + ld c, l + pop hl + ret +; 0x4a843 diff --git a/engine/pokemon/search2.asm b/engine/pokemon/search2.asm new file mode 100755 index 000000000..b7112f1f8 --- /dev/null +++ b/engine/pokemon/search2.asm @@ -0,0 +1,134 @@ +_FindPartyMonAboveLevel: ; 4dbd2 + ld hl, wPartyMon1Level + call FindAboveLevel + ret + +_FindPartyMonAtLeastThatHappy: ; 4dbd9 + ld hl, wPartyMon1Happiness + call FindAtLeastThatHappy + ret + +_FindPartyMonThatSpecies: ; 4dbe0 + ld hl, wPartyMon1Species + jp FindThatSpecies + +_FindPartyMonThatSpeciesYourTrainerID: ; 4dbe6 + ld hl, wPartyMon1Species + call FindThatSpecies + ret z + ld a, c + ld hl, wPartyMon1ID + ld bc, PARTYMON_STRUCT_LENGTH + call AddNTimes + ld a, [wPlayerID] + cp [hl] + jr nz, .nope + inc hl + ld a, [wPlayerID + 1] + cp [hl] + jr nz, .nope + ld a, $1 + and a + ret + +.nope + xor a + ret + +FindAtLeastThatHappy: ; 4dc0a +; Sets the bits for the Pokemon that have a happiness greater than or equal to b. +; The lowest bits are used. Sets z if no Pokemon in your party is at least that happy. + ld c, $0 + ld a, [wPartyCount] + ld d, a +.loop + ld a, d + dec a + push hl + push bc + ld bc, PARTYMON_STRUCT_LENGTH + call AddNTimes + pop bc + ld a, b + cp [hl] + pop hl + jr z, .greater_equal + jr nc, .lower + +.greater_equal + ld a, c + or $1 + ld c, a + +.lower + sla c + dec d + jr nz, .loop + call RetroactivelyIgnoreEggs + ld a, c + and a + ret + +FindAboveLevel: ; 4dc31 + ld c, $0 + ld a, [wPartyCount] + ld d, a +.loop + ld a, d + dec a + push hl + push bc + ld bc, PARTYMON_STRUCT_LENGTH + call AddNTimes + pop bc + ld a, b + cp [hl] + pop hl + jr c, .greater + ld a, c + or $1 + ld c, a + +.greater + sla c + dec d + jr nz, .loop + call RetroactivelyIgnoreEggs + ld a, c + and a + ret + +FindThatSpecies: ; 4dc56 +; Find species b in your party. +; If you have no Pokemon, returns c = -1 and z. +; If that species is in your party, returns its location in c, and nz. +; Otherwise, returns z. + ld c, -1 + ld hl, wPartySpecies +.loop + ld a, [hli] + cp -1 + ret z + inc c + cp b + jr nz, .loop + ld a, $1 + and a + ret + +RetroactivelyIgnoreEggs: ; 4dc67 + ld e, -2 + ld hl, wPartySpecies +.loop + ld a, [hli] + cp -1 + ret z + cp EGG + jr nz, .skip_notegg + ld a, c + and e + ld c, a + +.skip_notegg + rlc e + jr .loop diff --git a/engine/pokemon/stats_screen.asm b/engine/pokemon/stats_screen.asm new file mode 100755 index 000000000..59d96999f --- /dev/null +++ b/engine/pokemon/stats_screen.asm @@ -0,0 +1,1173 @@ + const_def 1 + const PINK_PAGE ; 1 + const GREEN_PAGE ; 2 + const BLUE_PAGE ; 3 +NUM_STAT_PAGES EQU const_value + -1 + +BattleStatsScreenInit: ; 4dc7b (13:5c7b) + ld a, [wLinkMode] + cp LINK_MOBILE + jr nz, StatsScreenInit + + ld a, [wBattleMode] + and a + jr z, StatsScreenInit + jr _MobileStatsScreenInit + +StatsScreenInit: ; 4dc8a + ld hl, StatsScreenMain + jr StatsScreenInit_gotaddress + +_MobileStatsScreenInit: ; 4dc8f + ld hl, StatsScreenMobile + jr StatsScreenInit_gotaddress + +StatsScreenInit_gotaddress: ; 4dc94 + ld a, [hMapAnims] + push af + xor a + ld [hMapAnims], a ; disable overworld tile animations + ld a, [wBoxAlignment] ; whether sprite is to be mirrorred + push af + ld a, [wJumptableIndex] + ld b, a + ld a, [wcf64] + ld c, a + + push bc + push hl + call ClearBGPalettes + call ClearTileMap + call UpdateSprites + farcall StatsScreen_LoadFont + pop hl + call _hl_ + call ClearBGPalettes + call ClearTileMap + pop bc + + ; restore old values + ld a, b + ld [wJumptableIndex], a + ld a, c + ld [wcf64], a + pop af + ld [wBoxAlignment], a + pop af + ld [hMapAnims], a + ret +; 0x4dcd2 + +StatsScreenMain: ; 0x4dcd2 + xor a + ld [wJumptableIndex], a + ; stupid interns + ld [wcf64], a + ld a, [wcf64] + and %11111100 + or 1 + ld [wcf64], a +.loop ; 4dce3 + ld a, [wJumptableIndex] + and $ff ^ (1 << 7) + ld hl, StatsScreenPointerTable + rst JumpTable + call StatsScreen_WaitAnim ; check for keys? + ld a, [wJumptableIndex] + bit 7, a + jr z, .loop + ret +; 0x4dcf7 + +StatsScreenMobile: ; 4dcf7 + xor a + ld [wJumptableIndex], a + ; stupid interns + ld [wcf64], a + ld a, [wcf64] + and %11111100 + or 1 + ld [wcf64], a +.loop + farcall Mobile_SetOverworldDelay + ld a, [wJumptableIndex] + and $ff ^ (1 << 7) + ld hl, StatsScreenPointerTable + rst JumpTable + call StatsScreen_WaitAnim + farcall MobileComms_CheckInactivityTimer + jr c, .exit + ld a, [wJumptableIndex] + bit 7, a + jr z, .loop + +.exit + ret +; 4dd2a + +StatsScreenPointerTable: ; 4dd2a + dw MonStatsInit ; regular pokémon + dw EggStatsInit ; egg + dw StatsScreenWaitCry + dw EggStatsJoypad + dw StatsScreen_LoadPage + dw StatsScreenWaitCry + dw MonStatsJoypad + dw StatsScreen_Exit +; 4dd3a + + +StatsScreen_WaitAnim: ; 4dd3a (13:5d3a) + ld hl, wcf64 + bit 6, [hl] + jr nz, .try_anim + bit 5, [hl] + jr nz, .finish + call DelayFrame + ret + +.try_anim + farcall SetUpPokeAnim + jr nc, .finish + ld hl, wcf64 + res 6, [hl] +.finish + ld hl, wcf64 + res 5, [hl] + farcall HDMATransferTileMapToWRAMBank3 + ret + +StatsScreen_SetJumptableIndex: ; 4dd62 (13:5d62) + ld a, [wJumptableIndex] + and $80 + or h + ld [wJumptableIndex], a + ret + +StatsScreen_Exit: ; 4dd6c (13:5d6c) + ld hl, wJumptableIndex + set 7, [hl] + ret + +MonStatsInit: ; 4dd72 (13:5d72) + ld hl, wcf64 + res 6, [hl] + call ClearBGPalettes + call ClearTileMap + farcall HDMATransferTileMapToWRAMBank3 + call StatsScreen_CopyToTempMon + ld a, [wCurPartySpecies] + cp EGG + jr z, .egg + call StatsScreen_InitUpperHalf + ld hl, wcf64 + set 4, [hl] + ld h, 4 + call StatsScreen_SetJumptableIndex + ret + +.egg + ld h, 1 + call StatsScreen_SetJumptableIndex + ret + +EggStatsInit: ; 4dda1 + call EggStatsScreen + ld a, [wJumptableIndex] + inc a + ld [wJumptableIndex], a + ret +; 0x4ddac + + +EggStatsJoypad: ; 4ddac (13:5dac) + call StatsScreen_GetJoypad + jr nc, .check + ld h, 0 + call StatsScreen_SetJumptableIndex + ret + +.check + bit A_BUTTON_F, a + jr nz, .quit + and D_DOWN | D_UP | A_BUTTON | B_BUTTON + jp StatsScreen_JoypadAction + +.quit + ld h, 7 + call StatsScreen_SetJumptableIndex + ret + +StatsScreen_LoadPage: ; 4ddc6 (13:5dc6) + call StatsScreen_LoadGFX + ld hl, wcf64 + res 4, [hl] + ld a, [wJumptableIndex] + inc a + ld [wJumptableIndex], a + ret + +MonStatsJoypad: ; 4ddd6 (13:5dd6) + call StatsScreen_GetJoypad + jr nc, .next + ld h, 0 + call StatsScreen_SetJumptableIndex + ret + +.next + and D_DOWN | D_UP | D_LEFT | D_RIGHT | A_BUTTON | B_BUTTON + jp StatsScreen_JoypadAction + +StatsScreenWaitCry: ; 4dde6 (13:5de6) + call IsSFXPlaying + ret nc + ld a, [wJumptableIndex] + inc a + ld [wJumptableIndex], a + ret + +StatsScreen_CopyToTempMon: ; 4ddf2 (13:5df2) + ld a, [wMonType] + cp TEMPMON + jr nz, .breedmon + ld a, [wBufferMonSpecies] + ld [wCurSpecies], a + call GetBaseData + ld hl, wBufferMon + ld de, wTempMon + ld bc, PARTYMON_STRUCT_LENGTH + call CopyBytes + jr .done + +.breedmon + farcall CopyMonToTempMon + ld a, [wCurPartySpecies] + cp EGG + jr z, .done + ld a, [wMonType] + cp BOXMON + jr c, .done + farcall CalcTempmonStats +.done + and a + ret + +StatsScreen_GetJoypad: ; 4de2c (13:5e2c) + call GetJoypad + ld a, [wMonType] + cp TEMPMON + jr nz, .notbreedmon + push hl + push de + push bc + farcall StatsScreenDPad + pop bc + pop de + pop hl + ld a, [wMenuJoypad] + and D_DOWN | D_UP + jr nz, .set_carry + ld a, [wMenuJoypad] + jr .clear_flags + +.notbreedmon + ld a, [hJoyPressed] +.clear_flags + and a + ret + +.set_carry + scf + ret + +StatsScreen_JoypadAction: ; 4de54 (13:5e54) + push af + ld a, [wcf64] + maskbits NUM_STAT_PAGES + ld c, a + pop af + bit B_BUTTON_F, a + jp nz, .b_button + bit D_LEFT_F, a + jr nz, .d_left + bit D_RIGHT_F, a + jr nz, .d_right + bit A_BUTTON_F, a + jr nz, .a_button + bit D_UP_F, a + jr nz, .d_up + bit D_DOWN_F, a + jr nz, .d_down + jr .done + +.d_down + ld a, [wMonType] + cp BOXMON + jr nc, .done + and a + ld a, [wPartyCount] + jr z, .next_mon + ld a, [wOTPartyCount] +.next_mon + ld b, a + ld a, [wCurPartyMon] + inc a + cp b + jr z, .done + ld [wCurPartyMon], a + ld b, a + ld a, [wMonType] + and a + jr nz, .load_mon + ld a, b + inc a + ld [wPartyMenuCursor], a + jr .load_mon + +.d_up + ld a, [wCurPartyMon] + and a + jr z, .done + dec a + ld [wCurPartyMon], a + ld b, a + ld a, [wMonType] + and a + jr nz, .load_mon + ld a, b + inc a + ld [wPartyMenuCursor], a + jr .load_mon + +.a_button + ld a, c + cp BLUE_PAGE ; last page + jr z, .b_button +.d_right + inc c + ld a, BLUE_PAGE ; last page + cp c + jr nc, .set_page + ld c, PINK_PAGE ; first page + jr .set_page + +.d_left + dec c + jr nz, .set_page + ld c, BLUE_PAGE ; last page + jr .set_page + +.done + ret + +.set_page + ld a, [wcf64] + and %11111100 + or c + ld [wcf64], a + ld h, 4 + call StatsScreen_SetJumptableIndex + ret + +.load_mon + ld h, 0 + call StatsScreen_SetJumptableIndex + ret + +.b_button ; 4dee4 (13:5ee4) + ld h, 7 + call StatsScreen_SetJumptableIndex + ret + +StatsScreen_InitUpperHalf: ; 4deea (13:5eea) + call .PlaceHPBar + xor a + ld [hBGMapMode], a + ld a, [wBaseDexNo] + ld [wd265], a + ld [wCurSpecies], a + hlcoord 8, 0 + ld [hl], "№" + inc hl + ld [hl], "." + inc hl + hlcoord 10, 0 + lb bc, PRINTNUM_LEADINGZEROS | 1, 3 + ld de, wd265 + call PrintNum + hlcoord 14, 0 + call PrintLevel + ld hl, .NicknamePointers + call GetNicknamePointer + call CopyNickname + hlcoord 8, 2 + call PlaceString + hlcoord 18, 0 + call .PlaceGenderChar + hlcoord 9, 4 + ld a, "/" + ld [hli], a + ld a, [wBaseDexNo] + ld [wd265], a + call GetPokemonName + call PlaceString + call StatsScreen_PlaceHorizontalDivider + call StatsScreen_PlacePageSwitchArrows + call StatsScreen_PlaceShinyIcon + ret + +.PlaceHPBar: ; 4df45 (13:5f45) + ld hl, wTempMonHP + ld a, [hli] + ld b, a + ld c, [hl] + ld hl, wTempMonMaxHP + ld a, [hli] + ld d, a + ld e, [hl] + farcall ComputeHPBarPixels + ld hl, wCurHPPal + call SetHPPal + ld b, SCGB_STATS_SCREEN_HP_PALS + call GetSGBLayout + call DelayFrame + ret + +.PlaceGenderChar: ; 4df66 (13:5f66) + push hl + farcall GetGender + pop hl + ret c + ld a, "♂" + jr nz, .got_gender + ld a, "♀" +.got_gender + ld [hl], a + ret +; 4df77 (13:5f77) + +.NicknamePointers: ; 4df77 + dw wPartyMonNicknames + dw wOTPartyMonNicknames + dw sBoxMonNicknames + dw wBufferMonNick +; 4df7f + +Unreferenced_Function4df7f: ; 4df7f + hlcoord 7, 0 + ld bc, SCREEN_WIDTH + ld d, SCREEN_HEIGHT +.loop + ld a, $31 ; vertical divider + ld [hl], a + add hl, bc + dec d + jr nz, .loop + ret +; 4df8f + +StatsScreen_PlaceHorizontalDivider: ; 4df8f (13:5f8f) + hlcoord 0, 7 + ld b, SCREEN_WIDTH + ld a, $62 ; horizontal divider (empty HP/exp bar) +.loop + ld [hli], a + dec b + jr nz, .loop + ret + +StatsScreen_PlacePageSwitchArrows: ; 4df9b (13:5f9b) + hlcoord 12, 6 + ld [hl], "◀" + hlcoord 19, 6 + ld [hl], "▶" + ret + +StatsScreen_PlaceShinyIcon: ; 4dfa6 (13:5fa6) + ld bc, wTempMonDVs + farcall CheckShininess + ret nc + hlcoord 19, 0 + ld [hl], "⁂" + ret + +StatsScreen_LoadGFX: ; 4dfb6 (13:5fb6) + ld a, [wBaseDexNo] + ld [wd265], a + ld [wCurSpecies], a + xor a + ld [hBGMapMode], a + call .ClearBox + call .PageTilemap + call .LoadPals + ld hl, wcf64 + bit 4, [hl] + jr nz, .place_frontpic + call SetPalettes + ret + +.place_frontpic + call StatsScreen_PlaceFrontpic + ret + +.ClearBox: ; 4dfda (13:5fda) + ld a, [wcf64] + maskbits NUM_STAT_PAGES + ld c, a + call StatsScreen_LoadPageIndicators + hlcoord 0, 8 + lb bc, 10, 20 + call ClearBox + ret + +.LoadPals: ; 4dfed (13:5fed) + ld a, [wcf64] + maskbits NUM_STAT_PAGES + ld c, a + farcall LoadStatsScreenPals + call DelayFrame + ld hl, wcf64 + set 5, [hl] + ret + +.PageTilemap: ; 4e002 (13:6002) + ld a, [wcf64] + maskbits NUM_STAT_PAGES + dec a + ld hl, .Jumptable + rst JumpTable + ret + +.Jumptable: ; 4e00d (13:600d) +; entries correspond to *_PAGE constants + dw .PinkPage + dw .GreenPage + dw .BluePage + +.PinkPage: ; 4e013 (13:6013) + hlcoord 0, 9 + ld b, $0 + predef DrawPlayerHP + hlcoord 8, 9 + ld [hl], $41 ; right HP/exp bar end cap + ld de, .Status_Type + hlcoord 0, 12 + call PlaceString + ld a, [wTempMonPokerusStatus] + ld b, a + and $f + jr nz, .HasPokerus + ld a, b + and $f0 + jr z, .NotImmuneToPkrs + hlcoord 8, 8 + ld [hl], "." ; Pokérus immunity dot +.NotImmuneToPkrs: + ld a, [wMonType] + cp BOXMON + jr z, .StatusOK + hlcoord 6, 13 + push hl + ld de, wTempMonStatus + predef PlaceStatusString + pop hl + jr nz, .done_status + jr .StatusOK +.HasPokerus: + ld de, .PkrsStr + hlcoord 1, 13 + call PlaceString + jr .done_status +.StatusOK: + ld de, .OK_str + call PlaceString +.done_status + hlcoord 1, 15 + predef PrintMonTypes + hlcoord 9, 8 + ld de, SCREEN_WIDTH + ld b, 10 + ld a, $31 ; vertical divider +.vertical_divider + ld [hl], a + add hl, de + dec b + jr nz, .vertical_divider + ld de, .ExpPointStr + hlcoord 10, 9 + call PlaceString + hlcoord 17, 14 + call .PrintNextLevel + hlcoord 13, 10 + lb bc, 3, 7 + ld de, wTempMonExp + call PrintNum + call .CalcExpToNextLevel + hlcoord 13, 13 + lb bc, 3, 7 + ld de, wBuffer1 + call PrintNum + ld de, .LevelUpStr + hlcoord 10, 12 + call PlaceString + ld de, .ToStr + hlcoord 14, 14 + call PlaceString + hlcoord 11, 16 + ld a, [wTempMonLevel] + ld b, a + ld de, wTempMonExp + 2 + predef FillInExpBar + hlcoord 10, 16 + ld [hl], $40 ; left exp bar end cap + hlcoord 19, 16 + ld [hl], $41 ; right exp bar end cap + ret + +.PrintNextLevel: ; 4e0d3 (13:60d3) + ld a, [wTempMonLevel] + push af + cp MAX_LEVEL + jr z, .AtMaxLevel + inc a + ld [wTempMonLevel], a +.AtMaxLevel: + call PrintLevel + pop af + ld [wTempMonLevel], a + ret + +.CalcExpToNextLevel: ; 4e0e7 (13:60e7) + ld a, [wTempMonLevel] + cp MAX_LEVEL + jr z, .AlreadyAtMaxLevel + inc a + ld d, a + farcall CalcExpAtLevel + ld hl, wTempMonExp + 2 + ld hl, wTempMonExp + 2 + ld a, [hQuotient + 2] + sub [hl] + dec hl + ld [wBuffer3], a + ld a, [hQuotient + 1] + sbc [hl] + dec hl + ld [wBuffer2], a + ld a, [hQuotient] + sbc [hl] + ld [wBuffer1], a + ret + +.AlreadyAtMaxLevel: + ld hl, wBuffer1 + xor a + ld [hli], a + ld [hli], a + ld [hl], a + ret +; 4e119 (13:6119) + +.Status_Type: ; 4e119 + db "STATUS/" + next "TYPE/@" +; 4e127 + +.OK_str: ; 4e127 + db "OK @" +; 4e12b + +.ExpPointStr: ; 4e12b + db "EXP POINTS@" +; 4e136 + +.LevelUpStr: ; 4e136 + db "LEVEL UP@" +; 4e13f + +.ToStr: ; 4e13f + db "TO@" +; 4e142 + +.PkrsStr: ; 4e142 + db "#RUS@" +; 4e147 + +.GreenPage: ; 4e147 (13:6147) + ld de, .Item + hlcoord 0, 8 + call PlaceString + call .GetItemName + hlcoord 8, 8 + call PlaceString + ld de, .Move + hlcoord 0, 10 + call PlaceString + ld hl, wTempMonMoves + ld de, wListMoves_MoveIndicesBuffer + ld bc, NUM_MOVES + call CopyBytes + hlcoord 8, 10 + ld a, SCREEN_WIDTH * 2 + ld [wBuffer1], a + predef ListMoves + hlcoord 12, 11 + ld a, SCREEN_WIDTH * 2 + ld [wBuffer1], a + predef ListMovePP + ret + +.GetItemName: ; 4e189 (13:6189) + ld de, .ThreeDashes + ld a, [wTempMonItem] + and a + ret z + ld b, a + farcall TimeCapsule_ReplaceTeruSama + ld a, b + ld [wd265], a + call GetItemName + ret +; 4e1a0 (13:61a0) + +.Item: ; 4e1a0 + db "ITEM@" +; 4e1a5 + +.ThreeDashes: ; 4e1a5 + db "---@" +; 4e1a9 + +.Move: ; 4e1a9 + db "MOVE@" +; 4e1ae + +.BluePage: ; 4e1ae (13:61ae) + call .PlaceOTInfo + hlcoord 10, 8 + ld de, SCREEN_WIDTH + ld b, 10 + ld a, $31 ; vertical divider +.BluePageVerticalDivider: + ld [hl], a + add hl, de + dec b + jr nz, .BluePageVerticalDivider + hlcoord 11, 8 + ld bc, 6 + predef PrintTempMonStats + ret + +.PlaceOTInfo: ; 4e1cc (13:61cc) + ld de, IDNoString + hlcoord 0, 9 + call PlaceString + ld de, OTString + hlcoord 0, 12 + call PlaceString + hlcoord 2, 10 + lb bc, PRINTNUM_LEADINGZEROS | 2, 5 + ld de, wTempMonID + call PrintNum + ld hl, .OTNamePointers + call GetNicknamePointer + call CopyNickname + farcall CheckNickErrors + hlcoord 2, 13 + call PlaceString + ld a, [wTempMonCaughtGender] + and a + jr z, .done + cp $7f + jr z, .done + and $80 + ld a, "♂" + jr z, .got_gender + ld a, "♀" +.got_gender + hlcoord 9, 13 + ld [hl], a +.done + ret +; 4e216 (13:6216) + +.OTNamePointers: ; 4e216 + dw wPartyMonOT + dw wOTPartyMonOT + dw sBoxMonOT + dw wBufferMonOT +; 4e21e + +IDNoString: ; 4e21e + db "<ID>№.@" + +OTString: ; 4e222 + db "OT/@" +; 4e226 + + +StatsScreen_PlaceFrontpic: ; 4e226 (13:6226) + ld hl, wTempMonDVs + predef GetUnownLetter + call StatsScreen_GetAnimationParam + jr c, .egg + and a + jr z, .no_cry + jr .cry + +.egg + call .AnimateEgg + call SetPalettes + ret + +.no_cry + call .AnimateMon + call SetPalettes + ret + +.cry + call SetPalettes + call .AnimateMon + ld a, [wCurPartySpecies] + call PlayMonCry2 + ret + +.AnimateMon: ; 4e253 (13:6253) + ld hl, wcf64 + set 5, [hl] + ld a, [wCurPartySpecies] + cp UNOWN + jr z, .unown + hlcoord 0, 0 + call PrepMonFrontpic + ret + +.unown + xor a + ld [wBoxAlignment], a + hlcoord 0, 0 + call _PrepMonFrontpic + ret + +.AnimateEgg: ; 4e271 (13:6271) + ld a, [wCurPartySpecies] + cp UNOWN + jr z, .unownegg + ld a, TRUE + ld [wBoxAlignment], a + call .get_animation + ret + +.unownegg + xor a + ld [wBoxAlignment], a + call .get_animation + ret + +.get_animation ; 4e289 (13:6289) + ld a, [wCurPartySpecies] + call IsAPokemon + ret c + call StatsScreen_LoadTextBoxSpaceGFX + ld de, vTiles2 tile $00 + predef GetAnimatedFrontpic + hlcoord 0, 0 + ld d, $0 + ld e, ANIM_MON_MENU + predef LoadMonAnimation + ld hl, wcf64 + set 6, [hl] + ret + +StatsScreen_GetAnimationParam: ; 4e2ad (13:62ad) + ld a, [wMonType] + ld hl, .Jumptable + rst JumpTable + ret + +.Jumptable: ; 4e2b5 (13:62b5) + dw .PartyMon + dw .OTPartyMon + dw .BoxMon + dw .Tempmon + dw .Wildmon + +.PartyMon: ; 4e2bf (13:62bf) + ld a, [wCurPartyMon] + ld hl, wPartyMon1 + ld bc, PARTYMON_STRUCT_LENGTH + call AddNTimes + ld b, h + ld c, l + jr .CheckEggFaintedFrzSlp + +.OTPartyMon: ; 4e2cf (13:62cf) + xor a + ret + +.BoxMon: ; 4e2d1 (13:62d1) + ld hl, sBoxMons + ld bc, PARTYMON_STRUCT_LENGTH + ld a, [wCurPartyMon] + call AddNTimes + ld b, h + ld c, l + ld a, BANK(sBoxMons) + call GetSRAMBank + call .CheckEggFaintedFrzSlp + push af + call CloseSRAM + pop af + ret + +.Tempmon: ; 4e2ed (13:62ed) + ld bc, wTempMonSpecies + jr .CheckEggFaintedFrzSlp ; utterly pointless + +.CheckEggFaintedFrzSlp: ; 4e2f2 (13:62f2) + ld a, [wCurPartySpecies] + cp EGG + jr z, .egg + call CheckFaintedFrzSlp + jr c, .FaintedFrzSlp +.egg + xor a + scf + ret + +.Wildmon: ; 4e301 (13:6301) + ld a, $1 + and a + ret + +.FaintedFrzSlp: ; 4e305 (13:6305) + xor a + ret + +StatsScreen_LoadTextBoxSpaceGFX: ; 4e307 (13:6307) + nop + push hl + push de + push bc + push af + call DelayFrame + ld a, [rVBK] + push af + ld a, $1 + ld [rVBK], a + ld de, TextBoxSpaceGFX + lb bc, BANK(TextBoxSpaceGFX), 1 + ld hl, vTiles2 tile " " + call Get2bpp + pop af + ld [rVBK], a + pop af + pop bc + pop de + pop hl + ret +; 4e32a (13:632a) + +Unreferenced_4e32a: ; 4e32a +; A blank space tile? + ds 16 +; 4e33a + +EggStatsScreen: ; 4e33a + xor a + ld [hBGMapMode], a + ld hl, wCurHPPal + call SetHPPal + ld b, SCGB_STATS_SCREEN_HP_PALS + call GetSGBLayout + call StatsScreen_PlaceHorizontalDivider + ld de, EggString + hlcoord 8, 1 + call PlaceString + ld de, IDNoString + hlcoord 8, 3 + call PlaceString + ld de, OTString + hlcoord 8, 5 + call PlaceString + ld de, FiveQMarkString + hlcoord 11, 3 + call PlaceString + ld de, FiveQMarkString + hlcoord 11, 5 + call PlaceString + ld a, [wTempMonHappiness] ; egg status + ld de, EggSoonString + cp $6 + jr c, .picked + ld de, EggCloseString + cp $b + jr c, .picked + ld de, EggMoreTimeString + cp $29 + jr c, .picked + ld de, EggALotMoreTimeString +.picked + hlcoord 1, 9 + call PlaceString + ld hl, wcf64 + set 5, [hl] + call SetPalettes ; pals + call DelayFrame + hlcoord 0, 0 + call PrepMonFrontpic + farcall HDMATransferTileMapToWRAMBank3 + call StatsScreen_AnimateEgg + + ld a, [wTempMonHappiness] + cp 6 + ret nc + ld de, SFX_2_BOOPS + call PlaySFX + ret +; 0x4e3c0 + +EggString: ; 4e3c0 + db "EGG@" + +FiveQMarkString: ; 4e3c4 + db "?????@" + +EggSoonString: ; 0x4e3ca + db "It's making sounds" + next "inside. It's going" + next "to hatch soon!@" + +EggCloseString: ; 0x4e3fd + db "It moves around" + next "inside sometimes." + next "It must be close" + next "to hatching.@" + +EggMoreTimeString: ; 0x4e43d + db "Wonder what's" + next "inside? It needs" + next "more time, though.@" + +EggALotMoreTimeString: ; 0x4e46e + db "This EGG needs a" + next "lot more time to" + next "hatch.@" +; 0x4e497 + + +StatsScreen_AnimateEgg: ; 4e497 (13:6497) + call StatsScreen_GetAnimationParam + ret nc + ld a, [wTempMonHappiness] + ld e, $7 + cp 6 + jr c, .animate + ld e, $8 + cp 11 + jr c, .animate + ret + +.animate + push de + ld a, $1 + ld [wBoxAlignment], a + call StatsScreen_LoadTextBoxSpaceGFX + ld de, vTiles2 tile $00 + predef GetAnimatedFrontpic + pop de + hlcoord 0, 0 + ld d, $0 + predef LoadMonAnimation + ld hl, wcf64 + set 6, [hl] + ret + +StatsScreen_LoadPageIndicators: ; 4e4cd (13:64cd) + hlcoord 13, 5 + ld a, $36 ; first of 4 small square tiles + call .load_square + hlcoord 15, 5 + ld a, $36 ; " " " " + call .load_square + hlcoord 17, 5 + ld a, $36 ; " " " " + call .load_square + ld a, c + cp GREEN_PAGE + ld a, $3a ; first of 4 large square tiles + hlcoord 13, 5 ; PINK_PAGE (< GREEN_PAGE) + jr c, .load_square + hlcoord 15, 5 ; GREEN_PAGE (= GREEN_PAGE) + jr z, .load_square + hlcoord 17, 5 ; BLUE_PAGE (> GREEN_PAGE) +.load_square ; 4e4f7 (13:64f7) + push bc + ld [hli], a + inc a + ld [hld], a + ld bc, SCREEN_WIDTH + add hl, bc + inc a + ld [hli], a + inc a + ld [hl], a + pop bc + ret + +CopyNickname: ; 4e505 (13:6505) + ld de, wStringBuffer1 + ld bc, MON_NAME_LENGTH + jr .okay ; utterly pointless +.okay + ld a, [wMonType] + cp BOXMON + jr nz, .partymon + ld a, BANK(sBoxMonNicknames) + call GetSRAMBank + push de + call CopyBytes + pop de + call CloseSRAM + ret + +.partymon + push de + call CopyBytes + pop de + ret + +GetNicknamePointer: ; 4e528 (13:6528) + ld a, [wMonType] + add a + ld c, a + ld b, 0 + add hl, bc + ld a, [hli] + ld h, [hl] + ld l, a + ld a, [wMonType] + cp TEMPMON + ret z + ld a, [wCurPartyMon] + jp SkipNames + + +CheckFaintedFrzSlp: ; 4e53f + ld hl, MON_HP + add hl, bc + ld a, [hli] + or [hl] + jr z, .fainted_frz_slp + ld hl, MON_STATUS + add hl, bc + ld a, [hl] + and 1 << FRZ | SLP + jr nz, .fainted_frz_slp + and a + ret + +.fainted_frz_slp + scf + ret +; 4e554 diff --git a/engine/pokemon/tempmon.asm b/engine/pokemon/tempmon.asm new file mode 100644 index 000000000..723bfb1dd --- /dev/null +++ b/engine/pokemon/tempmon.asm @@ -0,0 +1,127 @@ +CopyMonToTempMon: ; 5084a +; gets the BaseData of a mon +; and copies the party_struct to wTempMon + + ld a, [wCurPartyMon] + ld e, a + call GetMonSpecies + ld a, [wCurPartySpecies] + ld [wCurSpecies], a + call GetBaseData + + ld a, [wMonType] + ld hl, wPartyMon1Species + ld bc, PARTYMON_STRUCT_LENGTH + and a + jr z, .copywholestruct + ld hl, wOTPartyMon1Species + ld bc, PARTYMON_STRUCT_LENGTH + cp OTPARTYMON + jr z, .copywholestruct + ld bc, BOXMON_STRUCT_LENGTH + callfar CopyBoxmonToTempMon + jr .done + +.copywholestruct + ld a, [wCurPartyMon] + call AddNTimes + ld de, wTempMon + ld bc, PARTYMON_STRUCT_LENGTH + call CopyBytes + +.done + ret + +CalcBufferMonStats: ; 5088b + ld bc, wBufferMon + jr _TempMonStatsCalculation + +CalcTempmonStats: ; 50890 + ld bc, wTempMon +_TempMonStatsCalculation: ; 50893 + ld hl, MON_LEVEL + add hl, bc + ld a, [hl] + ld [wCurPartyLevel], a + ld hl, MON_MAXHP + add hl, bc + ld d, h + ld e, l + ld hl, MON_STAT_EXP - 1 + add hl, bc + push bc + ld b, TRUE + predef CalcMonStats + pop bc + ld hl, MON_HP + add hl, bc + ld d, h + ld e, l + ld a, [wCurPartySpecies] + cp EGG + jr nz, .not_egg + xor a + ld [de], a + inc de + ld [de], a + jr .zero_status + +.not_egg + push bc + ld hl, MON_MAXHP + add hl, bc + ld bc, 2 + call CopyBytes + pop bc + +.zero_status + ld hl, MON_STATUS + add hl, bc + xor a + ld [hli], a + ld [hl], a + ret + +GetMonSpecies: ; 508d5 +; [wMonType] has the type of the mon +; e = Nr. of mon (i.e. [wCurPartyMon]) + + ld a, [wMonType] + and a ; PARTYMON + jr z, .partymon + cp OTPARTYMON + jr z, .otpartymon + cp BOXMON + jr z, .boxmon + cp TEMPMON + jr z, .breedmon + ; WILDMON + +.partymon + ld hl, wPartySpecies + jr .done + +.otpartymon + ld hl, wOTPartySpecies + jr .done + +.boxmon + ld a, BANK(sBoxSpecies) + call GetSRAMBank + ld hl, sBoxSpecies + call .done + call CloseSRAM + ret + +.breedmon + ld a, [wBreedMon1Species] + jr .done2 + +.done + ld d, 0 + add hl, de + ld a, [hl] + +.done2 + ld [wCurPartySpecies], a + ret diff --git a/engine/pokemon/tmhm.asm b/engine/pokemon/tmhm.asm new file mode 100755 index 000000000..442f73cfa --- /dev/null +++ b/engine/pokemon/tmhm.asm @@ -0,0 +1,589 @@ +TMHMPocket: ; 2c76f (b:476f) + ld a, $1 + ld [hInMenu], a + call TMHM_PocketLoop + ld a, $0 + ld [hInMenu], a + ret nc + call PlaceHollowCursor + call WaitBGMap + ld a, [wCurItem] + dec a + ld [wCurItemQuantity], a + ld hl, wTMsHMs + ld c, a + ld b, 0 + add hl, bc + ld a, [hl] + ld [wItemQuantityBuffer], a + call .ConvertItemToTMHMNumber + scf + ret + +.ConvertItemToTMHMNumber: ; 2c798 (b:4798) + ld a, [wCurItem] + ld c, a + callfar GetNumberedTMHM + ld a, c + ld [wCurItem], a + ret + +ConvertCurItemIntoCurTMHM: ; 2c7a7 (b:47a7) + ld a, [wCurItem] + ld c, a + callfar GetTMHMNumber + ld a, c + ld [wCurTMHM], a + ret + +GetTMHMItemMove: ; 2c7b6 (b:47b6) + call ConvertCurItemIntoCurTMHM + predef GetTMHMMove + ret + +AskTeachTMHM: ; 2c7bf (b:47bf) + ld hl, wOptions + ld a, [hl] + push af + res NO_TEXT_SCROLL, [hl] + ld a, [wCurItem] + cp TM01 + jr c, .NotTMHM + call GetTMHMItemMove + ld a, [wCurTMHM] + ld [wPutativeTMHMMove], a + call GetMoveName + call CopyName1 + ld hl, Text_BootedTM ; Booted up a TM + ld a, [wCurItem] + cp HM01 + jr c, .TM + ld hl, Text_BootedHM ; Booted up an HM +.TM: + call PrintText + ld hl, Text_ItContained + call PrintText + call YesNoBox +.NotTMHM: + pop bc + ld a, b + ld [wOptions], a + ret + +ChooseMonToLearnTMHM: ; 2c7fb + ld hl, wStringBuffer2 + ld de, wTMHMMoveNameBackup + ld bc, 12 + call CopyBytes + call ClearBGPalettes +ChooseMonToLearnTMHM_NoRefresh: ; 2c80a + farcall LoadPartyMenuGFX + farcall InitPartyMenuWithCancel + farcall InitPartyMenuGFX + ld a, PARTYMENUACTION_TEACH_TMHM + ld [wPartyMenuActionText], a +.loopback + farcall WritePartyMenuTilemap + farcall PrintPartyMenuText + call WaitBGMap + call SetPalettes + call DelayFrame + farcall PartyMenuSelect + push af + ld a, [wCurPartySpecies] + cp EGG + pop bc ; now contains the former contents of af + jr z, .egg + push bc + ld hl, wTMHMMoveNameBackup + ld de, wStringBuffer2 + ld bc, 12 + call CopyBytes + pop af ; now contains the original contents of af + ret + +.egg + push hl + push de + push bc + push af + ld de, SFX_WRONG + call PlaySFX + call WaitSFX + pop af + pop bc + pop de + pop hl + jr .loopback +; 2c867 + +TeachTMHM: ; 2c867 + predef CanLearnTMHMMove + + push bc + ld a, [wCurPartyMon] + ld hl, wPartyMonNicknames + call GetNick + pop bc + + ld a, c + and a + jr nz, .compatible + push de + ld de, SFX_WRONG + call PlaySFX + pop de + ld hl, Text_TMHMNotCompatible + call PrintText + jr .nope + +.compatible + callfar KnowsMove + jr c, .nope + + predef LearnMove + ld a, b + and a + jr z, .nope + + farcall StubbedTrainerRankings_TMsHMsTaught + ld a, [wCurItem] + call IsHM + ret c + + ld c, HAPPINESS_LEARNMOVE + callfar ChangeHappiness + call ConsumeTM + jr .learned_move + +.nope + and a + ret + +.unused + ld a, 2 + ld [wItemEffectSucceeded], a +.learned_move + scf + ret +; 2c8bf (b:48bf) + +Text_BootedTM: ; 0x2c8bf + ; Booted up a TM. + text_jump UnknownText_0x1c0373 + db "@" +; 0x2c8c4 + +Text_BootedHM: ; 0x2c8c4 + ; Booted up an HM. + text_jump UnknownText_0x1c0384 + db "@" +; 0x2c8c9 + +Text_ItContained: ; 0x2c8c9 + ; It contained @ . Teach @ to a #MON? + text_jump UnknownText_0x1c0396 + db "@" +; 0x2c8ce + +Text_TMHMNotCompatible: ; 0x2c8ce + ; is not compatible with @ . It can't learn @ . + text_jump UnknownText_0x1c03c2 + db "@" +; 0x2c8d3 + +TMHM_PocketLoop: ; 2c8d3 (b:48d3) + xor a + ld [hBGMapMode], a + call TMHM_DisplayPocketItems + ld a, 2 + ld [w2DMenuCursorInitY], a + ld a, 7 + ld [w2DMenuCursorInitX], a + ld a, 1 + ld [w2DMenuNumCols], a + ld a, 5 + sub d + inc a + cp 6 + jr nz, .okay + dec a +.okay + ld [w2DMenuNumRows], a + ld a, $c + ld [w2DMenuFlags1], a + xor a + ld [w2DMenuFlags2], a + ld a, $20 + ld [w2DMenuCursorOffsets], a + ld a, A_BUTTON | B_BUTTON | D_UP | D_DOWN | D_LEFT | D_RIGHT + ld [wMenuJoypadFilter], a + ld a, [wTMHMPocketCursor] + inc a + ld [wMenuCursorY], a + ld a, $1 + ld [wMenuCursorX], a + jr TMHM_ShowTMMoveDescription + +TMHM_JoypadLoop: ; 2c915 (b:4915) + call TMHM_DisplayPocketItems + call StaticMenuJoypad + ld b, a + ld a, [wMenuCursorY] + dec a + ld [wTMHMPocketCursor], a + xor a + ld [hBGMapMode], a + ld a, [w2DMenuFlags2] + bit 7, a + jp nz, TMHM_ScrollPocket + ld a, b + ld [wMenuJoypad], a + bit A_BUTTON_F, a + jp nz, TMHM_ChooseTMorHM + bit B_BUTTON_F, a + jp nz, TMHM_ExitPack + bit D_RIGHT_F, a + jp nz, TMHM_ExitPocket + bit D_LEFT_F, a + jp nz, TMHM_ExitPocket +TMHM_ShowTMMoveDescription: ; 2c946 (b:4946) + call TMHM_CheckHoveringOverCancel + jp nc, TMHM_ExitPocket + hlcoord 0, 12 + ld b, 4 + ld c, SCREEN_WIDTH - 2 + call TextBox + ld a, [wCurItem] + cp NUM_TMS + NUM_HMS + 1 + jr nc, TMHM_JoypadLoop + ld [wd265], a + predef GetTMHMMove + ld a, [wd265] + ld [wCurSpecies], a + hlcoord 1, 14 + call PrintMoveDesc + jp TMHM_JoypadLoop + +TMHM_ChooseTMorHM: ; 2c974 (b:4974) + call TMHM_PlaySFX_ReadText2 + call CountTMsHMs ; This stores the count to wd265. + ld a, [wMenuCursorY] + dec a + ld b, a + ld a, [wTMHMPocketScrollPosition] + add b + ld b, a + ld a, [wd265] + cp b + jr z, _TMHM_ExitPack ; our cursor was hovering over CANCEL +TMHM_CheckHoveringOverCancel: ; 2c98a (b:498a) + call TMHM_GetCurrentPocketPosition + ld a, [wMenuCursorY] + ld b, a +.loop + inc c + ld a, c + cp NUM_TMS + NUM_HMS + 1 + jr nc, .okay + ld a, [hli] + and a + jr z, .loop + dec b + jr nz, .loop + ld a, c +.okay + ld [wCurItem], a + cp -1 + ret + +TMHM_ExitPack: ; 2c9a5 (b:49a5) + call TMHM_PlaySFX_ReadText2 +_TMHM_ExitPack: ; 2c9a8 (b:49a8) + ld a, $2 + ld [wMenuJoypad], a + and a + ret + +TMHM_ExitPocket: ; 2c9af (b:49af) + and a + ret + +TMHM_ScrollPocket: ; 2c9b1 (b:49b1) + ld a, b + bit 7, a + jr nz, .skip + ld hl, wTMHMPocketScrollPosition + ld a, [hl] + and a + jp z, TMHM_JoypadLoop + dec [hl] + call TMHM_DisplayPocketItems + jp TMHM_ShowTMMoveDescription + +.skip + call TMHM_GetCurrentPocketPosition + ld b, 5 +.loop + inc c + ld a, c + cp NUM_TMS + NUM_HMS + 1 + jp nc, TMHM_JoypadLoop + ld a, [hli] + and a + jr z, .loop + dec b + jr nz, .loop + ld hl, wTMHMPocketScrollPosition + inc [hl] + call TMHM_DisplayPocketItems + jp TMHM_ShowTMMoveDescription + +TMHM_DisplayPocketItems: ; 2c9e2 (b:49e2) + ld a, [wBattleType] + cp BATTLETYPE_TUTORIAL + jp z, Tutorial_TMHMPocket + + hlcoord 5, 2 + lb bc, 10, 15 + ld a, " " + call ClearBox + call TMHM_GetCurrentPocketPosition + ld d, $5 +.loop2 + inc c + ld a, c + cp NUM_TMS + NUM_HMS + 1 + jr nc, .NotTMHM + ld a, [hli] + and a + jr z, .loop2 + ld b, a + ld a, c + ld [wd265], a + push hl + push de + push bc + call TMHMPocket_GetCurrentLineCoord + push hl + ld a, [wd265] + cp NUM_TMS + 1 + jr nc, .HM + ld de, wd265 + lb bc, PRINTNUM_LEADINGZEROS | 1, 2 + call PrintNum + jr .okay + +.HM: + push af + sub NUM_TMS + ld [wd265], a + ld [hl], "H" + inc hl + ld de, wd265 + lb bc, PRINTNUM_RIGHTALIGN | 1, 2 + call PrintNum + pop af + ld [wd265], a +.okay + predef GetTMHMMove + ld a, [wd265] + ld [wPutativeTMHMMove], a + call GetMoveName + pop hl + ld bc, 3 + add hl, bc + push hl + call PlaceString + pop hl + pop bc + ld a, c + push bc + cp NUM_TMS + 1 + jr nc, .hm2 + ld bc, SCREEN_WIDTH + 9 + add hl, bc + ld [hl], "×" + inc hl + ld a, "0" ; why are we doing this? + pop bc + push bc + ld a, b + ld [wd265], a + ld de, wd265 + lb bc, 1, 2 + call PrintNum +.hm2 + pop bc + pop de + pop hl + dec d + jr nz, .loop2 + jr .done + +.NotTMHM: + call TMHMPocket_GetCurrentLineCoord + inc hl + inc hl + inc hl + push de + ld de, TMHM_String_Cancel + call PlaceString + pop de +.done + ret + +TMHMPocket_GetCurrentLineCoord: ; 2ca86 (b:4a86) + hlcoord 5, 0 + ld bc, 2 * SCREEN_WIDTH + ld a, 6 + sub d + ld e, a + ; AddNTimes +.loop + add hl, bc + dec e + jr nz, .loop + ret +; 2ca95 (b:4a95) + +Unreferenced_Function2ca95: ; 2ca95 + pop hl + ld bc, 3 + add hl, bc + predef GetTMHMMove + ld a, [wd265] + ld [wPutativeTMHMMove], a + call GetMoveName + push hl + call PlaceString + pop hl + ret +; 2caae + +TMHM_String_Cancel: ; 2caae + db "CANCEL@" +; 2cab5 + +TMHM_GetCurrentPocketPosition: ; 2cab5 (b:4ab5) + ld hl, wTMsHMs + ld a, [wTMHMPocketScrollPosition] + ld b, a + inc b + ld c, 0 +.loop + inc c + ld a, [hli] + and a + jr z, .loop + dec b + jr nz, .loop + dec hl + dec c + ret + +Tutorial_TMHMPocket: ; 2caca (b:4aca) + hlcoord 9, 3 + push de + ld de, TMHM_String_Cancel + call PlaceString + pop de + ret + +TMHM_PlaySFX_ReadText2: ; 2cad6 (b:4ad6) + push de + ld de, SFX_READ_TEXT_2 + call PlaySFX + pop de + ret +; 2cadf (b:4adf) + +Unreferenced_Function2cadf: ; 2cadf + call ConvertCurItemIntoCurTMHM + call .CheckHaveRoomForTMHM + ld hl, .NoRoomText + jr nc, .print + ld hl, .ReceivedText +.print + jp PrintText +; 2caf0 + +.NoRoomText: ; 0x2caf0 + ; You have no room for any more @ S. + text_jump UnknownText_0x1c03fa + db "@" +; 0x2caf5 + +.ReceivedText: ; 0x2caf5 + ; You received @ ! + text_jump UnknownText_0x1c0421 + db "@" +; 0x2cafa + +.CheckHaveRoomForTMHM: ; 2cafa + ld a, [wd265] + dec a + ld hl, wTMsHMs + ld b, 0 + ld c, a + add hl, bc + ld a, [hl] + inc a + cp NUM_TMS * 2 + ret nc + ld [hl], a + ret +; 2cb0c + +ConsumeTM: ; 2cb0c (b:4b0c) + call ConvertCurItemIntoCurTMHM + ld a, [wd265] + dec a + ld hl, wTMsHMs + ld b, 0 + ld c, a + add hl, bc + ld a, [hl] + and a + ret z + dec a + ld [hl], a + ret nz + ld a, [wTMHMPocketScrollPosition] + and a + ret z + dec a + ld [wTMHMPocketScrollPosition], a + ret + +CountTMsHMs: ; 2cb2a (b:4b2a) + ld b, 0 + ld c, NUM_TMS + NUM_HMS + ld hl, wTMsHMs +.loop + ld a, [hli] + and a + jr z, .skip + inc b +.skip + dec c + jr nz, .loop + ld a, b + ld [wd265], a + ret + +PrintMoveDesc: ; 2cb3e + push hl + ld hl, MoveDescriptions + ld a, [wCurSpecies] + dec a + ld c, a + ld b, 0 + add hl, bc + add hl, bc + ld a, [hli] + ld e, a + ld d, [hl] + pop hl + jp PlaceString +; 2cb52 diff --git a/engine/pokemon/types.asm b/engine/pokemon/types.asm new file mode 100644 index 000000000..dc0df61ae --- /dev/null +++ b/engine/pokemon/types.asm @@ -0,0 +1,99 @@ +PrintMonTypes: ; 5090d +; Print one or both types of [wCurSpecies] +; on the stats screen at hl. + + push hl + call GetBaseData + pop hl + + push hl + ld a, [wBaseType1] + call .Print + + ; Single-typed monsters really + ; have two of the same type. + ld a, [wBaseType1] + ld b, a + ld a, [wBaseType2] + cp b + pop hl + jr z, .hide_type_2 + + ld bc, SCREEN_WIDTH + add hl, bc + +.Print: + ld b, a + jr PrintType + +.hide_type_2 + ; Erase any type name that was here before. + ; Seems to be pointless in localized versions. + ld a, " " + ld bc, SCREEN_WIDTH - 3 + add hl, bc + ld [hl], a + inc bc + add hl, bc + ld bc, NAME_LENGTH_JAPANESE - 1 + jp ByteFill +; 5093a + + +PrintMoveType: ; 5093a +; Print the type of move b at hl. + + push hl + ld a, b + dec a + ld bc, MOVE_LENGTH + ld hl, Moves + call AddNTimes + ld de, wStringBuffer1 + ld a, BANK(Moves) + call FarCopyBytes + ld a, [wStringBuffer1 + MOVE_TYPE] + pop hl + + ld b, a + + +PrintType: ; 50953 +; Print type b at hl. + + ld a, b + + push hl + add a + ld hl, TypeNames + ld e, a + ld d, 0 + add hl, de + ld a, [hli] + ld e, a + ld d, [hl] + pop hl + + jp PlaceString +; 50964 + + +GetTypeName: ; 50964 +; Copy the name of type [wd265] to wStringBuffer1. + + ld a, [wd265] + ld hl, TypeNames + ld e, a + ld d, 0 + add hl, de + add hl, de + ld a, [hli] + ld h, [hl] + ld l, a + ld de, wStringBuffer1 + ld bc, MOVE_NAME_LENGTH + jp CopyBytes +; 5097b + + +INCLUDE "data/types/names.asm" |