pokered/home/joypad2.asm

96 lines
2.6 KiB
NASM
Raw Normal View History

; this function is used when lower button sensitivity is wanted (e.g. menus)
; OUTPUT: [hJoy5] = pressed buttons in usual format
; there are two flags that control its functionality, [hJoy6] and [hJoy7]
; there are essentially three modes of operation
; 1. Get newly pressed buttons only
; ([hJoy7] == 0, [hJoy6] == any)
; Just copies [hJoyPressed] to [hJoy5].
; 2. Get currently pressed buttons at low sample rate with delay
; ([hJoy7] == 1, [hJoy6] != 0)
; If the user holds down buttons for more than half a second,
; report buttons as being pressed up to 12 times per second thereafter.
; If the user holds down buttons for less than half a second,
; report only one button press.
; 3. Same as 2, but report no buttons as pressed if A or B is held down.
; ([hJoy7] == 1, [hJoy6] == 0)
JoypadLowSensitivity::
call Joypad
ldh a, [hJoy7] ; flag
and a ; get all currently pressed buttons or only newly pressed buttons?
ldh a, [hJoyPressed] ; newly pressed buttons
jr z, .storeButtonState
ldh a, [hJoyHeld] ; all currently pressed buttons
.storeButtonState
ldh [hJoy5], a
ldh a, [hJoyPressed] ; newly pressed buttons
and a ; have any buttons been newly pressed since last check?
jr z, .noNewlyPressedButtons
.newlyPressedButtons
ld a, 30 ; half a second delay
ldh [hFrameCounter], a
ret
.noNewlyPressedButtons
ldh a, [hFrameCounter]
and a ; is the delay over?
jr z, .delayOver
.delayNotOver
xor a
ldh [hJoy5], a ; report no buttons as pressed
ret
.delayOver
; if [hJoy6] = 0 and A or B is pressed, report no buttons as pressed
ldh a, [hJoyHeld]
and A_BUTTON | B_BUTTON
jr z, .setShortDelay
ldh a, [hJoy6] ; flag
and a
jr nz, .setShortDelay
xor a
ldh [hJoy5], a
.setShortDelay
ld a, 5 ; 1/12 of a second delay
ldh [hFrameCounter], a
ret
WaitForTextScrollButtonPress::
ldh a, [hDownArrowBlinkCount1]
push af
ldh a, [hDownArrowBlinkCount2]
push af
xor a
ldh [hDownArrowBlinkCount1], a
ld a, $6
ldh [hDownArrowBlinkCount2], a
.loop
push hl
ld a, [wTownMapSpriteBlinkingEnabled]
and a
jr z, .skipAnimation
call TownMapSpriteBlinkingAnimation
.skipAnimation
hlcoord 18, 16
call HandleDownArrowBlinkTiming
pop hl
call JoypadLowSensitivity
predef CableClub_Run
ldh a, [hJoy5]
and A_BUTTON | B_BUTTON
jr z, .loop
pop af
ldh [hDownArrowBlinkCount2], a
pop af
ldh [hDownArrowBlinkCount1], a
ret
; (unless in link battle) waits for A or B being pressed and outputs the scrolling sound effect
ManualTextScroll::
ld a, [wLinkState]
cp LINK_STATE_BATTLING
jr z, .inLinkBattle
call WaitForTextScrollButtonPress
ld a, SFX_PRESS_AB
jp PlaySound
.inLinkBattle
ld c, 65
jp DelayFrames