summaryrefslogtreecommitdiff
path: root/src/engine/menus/mail.asm
diff options
context:
space:
mode:
authorDaniel Harding <33dannye@gmail.com>2021-11-15 13:31:15 -0600
committerGitHub <noreply@github.com>2021-11-15 13:31:15 -0600
commitf516a91f5fa02a741631c77b9097598f466d1328 (patch)
treebac2ee5e3fad02983b061580f5c085baecb5439a /src/engine/menus/mail.asm
parent15e986d374fdd11ed0f412fbdc9b858d4c4b9f50 (diff)
parent1fd16cd27fcd4f432bfc09fc5b7a262798b72430 (diff)
Merge pull request #114 from ElectroDeoxys/masterHEADmaster
Some more bank splitting
Diffstat (limited to 'src/engine/menus/mail.asm')
-rw-r--r--src/engine/menus/mail.asm536
1 files changed, 536 insertions, 0 deletions
diff --git a/src/engine/menus/mail.asm b/src/engine/menus/mail.asm
new file mode 100644
index 0000000..00a63cf
--- /dev/null
+++ b/src/engine/menus/mail.asm
@@ -0,0 +1,536 @@
+; 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