summaryrefslogtreecommitdiff
path: root/src/engine/menus/deck_check.asm
diff options
context:
space:
mode:
Diffstat (limited to 'src/engine/menus/deck_check.asm')
-rw-r--r--src/engine/menus/deck_check.asm142
1 files changed, 142 insertions, 0 deletions
diff --git a/src/engine/menus/deck_check.asm b/src/engine/menus/deck_check.asm
new file mode 100644
index 0000000..040e472
--- /dev/null
+++ b/src/engine/menus/deck_check.asm
@@ -0,0 +1,142 @@
+; handle player input in check menu
+; works out which cursor coordinate to go to
+; and sets carry flag if A or B are pressed
+; returns a = $1 if A pressed
+; returns a = $ff if B pressed
+HandleCheckMenuInput:
+ xor a
+ ld [wPlaysSfx], a
+ ld a, [wCheckMenuCursorXPosition]
+ ld d, a
+ ld a, [wCheckMenuCursorYPosition]
+ ld e, a
+
+; d = cursor x position
+; e = cursor y position
+
+ ldh a, [hDPadHeld]
+ or a
+ jr z, .no_pad
+ bit D_LEFT_F, a
+ jr nz, .horizontal
+ bit D_RIGHT_F, a
+ jr z, .check_vertical
+
+; handle horizontal input
+.horizontal
+ ld a, d
+ xor $1 ; flips x coordinate
+ ld d, a
+ jr .okay
+.check_vertical
+ bit D_UP_F, a
+ jr nz, .vertical
+ bit D_DOWN_F, a
+ jr z, .no_pad
+
+; handle vertical input
+.vertical
+ ld a, e
+ xor $01 ; flips y coordinate
+ ld e, a
+
+.okay
+ ld a, TRUE
+ ld [wPlaysSfx], a
+ push de
+ call EraseCheckMenuCursor
+ pop de
+
+; update x and y cursor positions
+ ld a, d
+ ld [wCheckMenuCursorXPosition], a
+ ld a, e
+ ld [wCheckMenuCursorYPosition], a
+
+; reset cursor blink
+ xor a
+ ld [wCheckMenuCursorBlinkCounter], a
+.no_pad
+ ldh a, [hKeysPressed]
+ and A_BUTTON | B_BUTTON
+ jr z, .no_input
+ and A_BUTTON
+ jr nz, .a_press
+ ld a, $ff ; cancel
+ call PlaySFXConfirmOrCancel
+ scf
+ ret
+
+.a_press
+ call DisplayCheckMenuCursor
+ ld a, $01
+ call PlaySFXConfirmOrCancel
+ scf
+ ret
+
+.no_input
+ ld a, [wPlaysSfx]
+ or a
+ jr z, .check_blink
+ call PlaySFX
+
+.check_blink
+ ld hl, wCheckMenuCursorBlinkCounter
+ ld a, [hl]
+ inc [hl]
+ and %00001111
+ ret nz ; only update cursor if blink's lower nibble is 0
+
+ ld a, SYM_CURSOR_R ; cursor byte
+ bit 4, [hl] ; only draw cursor if blink counter's fourth bit is not set
+ jr z, DrawCheckMenuCursor
+
+; draws in the cursor position
+EraseCheckMenuCursor:
+ ld a, SYM_SPACE ; empty cursor
+; fallthrough
+
+; draws in the cursor position
+; input:
+; a = tile byte to draw
+DrawCheckMenuCursor:
+ ld e, a
+ ld a, 10
+ ld l, a
+ ld a, [wCheckMenuCursorXPosition]
+ ld h, a
+ call HtimesL
+
+ ld a, l
+ add 1
+ ld b, a
+ ld a, [wCheckMenuCursorYPosition]
+ sla a
+ add 14
+ ld c, a
+
+ ld a, e
+ call WriteByteToBGMap0
+ or a
+ ret
+
+DisplayCheckMenuCursor:
+ ld a, SYM_CURSOR_R
+ jr DrawCheckMenuCursor
+
+; plays sound depending on value in a
+; input:
+; a = $ff: play cancel sound
+; a != $ff: play confirm sound
+PlaySFXConfirmOrCancel:
+ push af
+ inc a
+ jr z, .asm_9103
+ ld a, SFX_02 ; confirmation sfx
+ jr .asm_9105
+.asm_9103
+ ld a, SFX_03 ; cancellation sfx
+.asm_9105
+ call PlaySFX
+ pop af
+ ret