summaryrefslogtreecommitdiff
path: root/engine/pokemon/mail.asm
diff options
context:
space:
mode:
Diffstat (limited to 'engine/pokemon/mail.asm')
-rwxr-xr-xengine/pokemon/mail.asm587
1 files changed, 587 insertions, 0 deletions
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@"