; clears all PC packs in WRAM ; and then gives the 1st pack ; this doesn't clear in SRAM so ; it's not done to clear PC pack data InitPCPacks: push hl push bc xor a ld [wPCPackSelection], a ld hl, wPCPacks ld c, NUM_PC_PACKS .loop_packs ld [hli], a dec c jr nz, .loop_packs ld a, $1 call TryGivePCPack pop bc pop hl ret _PCMenu_ReadMail: ld a, [wd291] push af call InitMenuScreen lb de, $30, $ff call SetupText lb de, 0, 0 lb bc, 20, 12 call DrawRegularTextBox lb de, 0, 12 lb bc, 20, 6 call DrawRegularTextBox ld hl, MailScreenLabels call PrintLabels call PrintObtainedPCPacks xor a ld [wCursorBlinkTimer], a call FlashWhiteScreen .asm_1079c call DoFrameIfLCDEnabled ld a, [wPCPackSelection] call UpdateMailMenuCursor call BlinkUnopenedPCPacks ld hl, wCursorBlinkTimer inc [hl] call PCMailHandleDPadInput call PCMailHandleAInput ldh a, [hKeysPressed] and B_BUTTON jr z, .asm_1079c ld a, SFX_03 call PlaySFX pop af ld [wd291], a ret ; unreferenced? Unknown_107c2: db $01, $00, $00, $4a, $21, $b5, $42, $e0 db $03, $4a, $29, $94, $52, $fF, $7f, $00 MailScreenLabels: db 1, 0 tx MailText db 1, 14 tx WhichMailWouldYouLikeToReadText db 0, 20 tx MailNumbersText db $ff PCMailHandleDPadInput: ldh a, [hDPadHeld] and D_PAD ret z farcall GetDirectionFromDPad ld [wPCLastDirectionPressed], a ld a, [wPCPackSelection] push af call HideMailMenuCursor .asm_107f2 ld a, [wPCPackSelection] add a add a ld c, a ld a, [wPCLastDirectionPressed] add c ld c, a ld b, $00 ld hl, PCMailTransitionTable add hl, bc ld a, [hl] ld [wPCPackSelection], a ld c, a ld hl, wPCPacks add hl, bc ld a, [hl] or a jr z, .asm_107f2 pop af ld c, a ld a, [wPCPackSelection] cp c jr z, .asm_1081d ld a, SFX_01 call PlaySFX .asm_1081d call ShowMailMenuCursor xor a ld [wCursorBlinkTimer], a ret PCMailTransitionTable: ; up, right, down, left db $0c, $01, $03, $02 ; mail 1 db $0d, $02, $04, $00 ; mail 2 db $0e, $00, $05, $01 ; mail 3 db $00, $04, $06, $05 ; mail 4 db $01, $05, $07, $03 ; mail 5 db $02, $03, $08, $04 ; mail 6 db $03, $07, $09, $08 ; mail 7 db $04, $08, $0a, $06 ; mail 8 db $05, $06, $0b, $07 ; mail 9 db $06, $0a, $0c, $0b ; mail 10 db $07, $0b, $0d, $09 ; mail 11 db $08, $09, $0e, $0a ; mail 12 db $09, $0d, $00, $0e ; mail 13 db $0a, $0e, $01, $0c ; mail 14 db $0b, $0c, $02, $0d ; mail 15 PCMailHandleAInput: ldh a, [hKeysPressed] and A_BUTTON ret z ld a, SFX_02 call PlaySFX call PrintObtainedPCPacks call ShowMailMenuCursor ld a, [wPCPackSelection] ld c, a ld b, $00 ld hl, wPCPacks add hl, bc ld a, [hl] ld [wSelectedPCPack], a and $7f ld [hl], a or a ret z add a add a ld c, a ld hl, PCMailTextPages add hl, bc ld a, [hli] push hl ld h, [hl] ld l, a ld a, [wPCPackSelection] call GetPCPackNameTextID call PrintScrollableText_WithTextBoxLabel call TryOpenPCMailBoosterPack call InitMenuScreen lb de, $30, $ff call SetupText lb de, 0, 0 lb bc, 20, 12 call DrawRegularTextBox ld hl, MailScreenLabels call PrintLabels call PrintObtainedPCPacks call ShowMailMenuCursor call FlashWhiteScreen pop hl inc hl ld a, [hli] ld h, [hl] ld l, a or h jr z, .no_page_two ld a, [wPCPackSelection] call GetPCPackNameTextID call PrintScrollableText_WithTextBoxLabel .no_page_two lb de, 0, 12 lb bc, 20, 6 call DrawRegularTextBox ld hl, MailScreenLabels call PrintLabels call DoFrameIfLCDEnabled ret PCMailTextPages: ; unused dw NULL dw NULL ; mail 1 tx Text0401 tx Text0402 ; mail 2 tx Text0403 tx Text0404 ; mail 3 tx Text0405 tx Text0406 ; mail 4 tx Text0407 tx Text0408 ; mail 5 tx Text0409 tx Text040a ; mail 6 tx Text040b tx Text040c ; mail 7 tx Text040d tx Text040e ; mail 8 tx Text040f tx Text0410 ; mail 9 tx Text0411 tx Text0412 ; mail 10 tx Text0413 dw NULL ; mail 11 tx Text0414 dw NULL ; mail 12 tx Text0415 dw NULL ; mail 13 tx Text0416 dw NULL ; mail 14 tx Text0417 dw NULL ; mail 15 tx Text0418 dw NULL TryOpenPCMailBoosterPack: xor a ld [wAnotherBoosterPack], a ld a, [wSelectedPCPack] bit PACK_UNOPENED_F, a jr z, .booster_already_open and $7f add a ld c, a ld b, $00 ld hl, PCMailBoosterPacks add hl, bc ld a, [hli] push hl call GiveBoosterPack ld a, $01 ld [wAnotherBoosterPack], a pop hl ld a, [hl] or a jr z, .done call GiveBoosterPack .done call DisableLCD ret .booster_already_open call InitMenuScreen lb de, $30, $ff call SetupText ldtx hl, Text0419 call PrintScrollableText_NoTextBoxLabel jr .done PCMailBoosterPacks: db $00, $00 ; unused db BOOSTER_COLOSSEUM_NEUTRAL, $00 ; mail 1 db BOOSTER_LABORATORY_PSYCHIC, $00 ; mail 2 db BOOSTER_EVOLUTION_GRASS, $00 ; mail 3 db BOOSTER_MYSTERY_LIGHTNING_COLORLESS, $00 ; mail 4 db BOOSTER_EVOLUTION_FIGHTING, $00 ; mail 5 db BOOSTER_COLOSSEUM_FIRE, $00 ; mail 6 db BOOSTER_LABORATORY_PSYCHIC, $00 ; mail 7 db BOOSTER_LABORATORY_PSYCHIC, $00 ; mail 8 db BOOSTER_MYSTERY_WATER_COLORLESS, $00 ; mail 9 db BOOSTER_COLOSSEUM_NEUTRAL, BOOSTER_EVOLUTION_NEUTRAL ; mail 10 db BOOSTER_MYSTERY_NEUTRAL, BOOSTER_LABORATORY_NEUTRAL ; mail 11 db BOOSTER_COLOSSEUM_TRAINER, $00 ; mail 12 db BOOSTER_EVOLUTION_TRAINER, $00 ; mail 13 db BOOSTER_MYSTERY_TRAINER_COLORLESS, $00 ; mail 14 db BOOSTER_LABORATORY_TRAINER, $00 ; mail 15 UpdateMailMenuCursor: ld a, [wCursorBlinkTimer] and $10 jr z, ShowMailMenuCursor jr HideMailMenuCursor ShowMailMenuCursor: ld a, SYM_CURSOR_R jr DrawMailMenuCursor HideMailMenuCursor: ld a, SYM_SPACE jr DrawMailMenuCursor ; can be fallthrough DrawMailMenuCursor: push af call GePCPackSelectionCoordinates pop af call WriteByteToBGMap0 ret ; prints all the PC packs that player ; has already obtained PrintObtainedPCPacks: ld e, $0 ld hl, wPCPacks .loop_packs ld a, [hl] or a jr z, .next_pack ld a, e call PrintPCPackName .next_pack inc hl inc e ld a, e cp NUM_PC_PACKS jr c, .loop_packs ret ; outputs in de the text ID ; corresponding to the name ; of the mail in input a GetPCPackNameTextID: push hl add a ld e, a ld d, $00 ld hl, .PCPackNameTextIDs add hl, de ld e, [hl] inc hl ld d, [hl] pop hl ret .PCPackNameTextIDs: tx Mail1Text tx Mail2Text tx Mail3Text tx Mail4Text tx Mail5Text tx Mail6Text tx Mail7Text tx Mail8Text tx Mail9Text tx Mail10Text tx Mail11Text tx Mail12Text tx Mail13Text tx Mail14Text tx Mail15Text ; prints on screen the name of ; the PC pack from input in a PrintPCPackName: push hl push bc push de push af call GetPCPackNameTextID ld l, e ld h, d pop af call GetPCPackCoordinates ld e, c ld d, b call InitTextPrinting call PrintTextNoDelay pop de pop bc pop hl ret ; prints empty characters on screen ; corresponding to the PC pack in a ; this is to create the blinking ; effect of unopened PC packs PrintEmptyPCPackName: push hl push bc push de call GetPCPackCoordinates ld e, c ld d, b call InitTextPrinting ldtx hl, EmptyMailNameText call PrintTextNoDelay pop de pop bc pop hl ret BlinkUnopenedPCPacks: ld e, $00 ld hl, wPCPacks .loop_packs ld a, [hl] or a jr z, .next_pack bit PACK_UNOPENED_F, a jr z, .next_pack ld a, [wCursorBlinkTimer] and $0c jr z, .show cp $0c jr nz, .next_pack ; hide ld a, e call PrintEmptyPCPackName jr .next_pack .show ld a, e call PrintPCPackName .next_pack inc hl inc e ld a, e cp NUM_PC_PACKS jr c, .loop_packs ret ; outputs in bc the coordinates ; corresponding to the PC pack in a GetPCPackCoordinates: ld c, a ld a, [wPCPackSelection] push af ld a, c ld [wPCPackSelection], a call GePCPackSelectionCoordinates inc b pop af ld [wPCPackSelection], a ret ; outputs in bc the coordinates ; corresponding to the PC pack ; that is stored in wPCPackSelection GePCPackSelectionCoordinates: push hl ld a, [wPCPackSelection] add a ld c, a ld b, $00 ld hl, PCMailCoordinates add hl, bc ld a, [hli] ld b, a ld c, [hl] pop hl ret PCMailCoordinates: db 1, 2 ; mail 1 db 7, 2 ; mail 2 db 13, 2 ; mail 3 db 1, 4 ; mail 4 db 7, 4 ; mail 5 db 13, 4 ; mail 6 db 1, 6 ; mail 7 db 7, 6 ; mail 8 db 13, 6 ; mail 9 db 1, 8 ; mail 10 db 7, 8 ; mail 11 db 13, 8 ; mail 12 db 1, 10 ; mail 13 db 7, 10 ; mail 14 db 13, 10 ; mail 15 ; gives the pc pack described in a TryGivePCPack: push hl push bc push de ld b, a ld c, NUM_PC_PACKS ld hl, wPCPacks .searchLoop1 ld a, [hli] and $7f cp b jr z, .quit dec c jr nz, .searchLoop1 ld c, NUM_PC_PACKS ld hl, wPCPacks .findFreeSlotLoop ld a, [hl] and $7f jr z, .foundFreeSlot inc hl dec c jr nz, .findFreeSlotLoop debug_nop jr .quit .foundFreeSlot ld a, b or PACK_UNOPENED ; mark pack as unopened ld [hl], a .quit pop de pop bc pop hl ret