mirror of
https://github.com/a2-4am/million-perfect-letters.git
synced 2025-08-14 09:25:19 +00:00
support letter input with autoscroll
This commit is contained in:
43
src/puzzle.a
43
src/puzzle.a
@@ -124,13 +124,50 @@ CheckForTargetWord
|
||||
sec
|
||||
rts
|
||||
|
||||
lettertofind = $FD
|
||||
FindLetterInColumn
|
||||
; in: A = letter (0x41..0x5A)
|
||||
; Y = logical column to search
|
||||
; out: C clear if letter was found in given column
|
||||
; out: C clear if letter was found in given column, and
|
||||
; A = #$FF if letter was found below center column
|
||||
; A = #$01 if letter was found above center column
|
||||
; A = #$00 if letter was found in center column
|
||||
; C set if letter was not found
|
||||
; TODO maybe calculate how far to scroll and return that?
|
||||
sec
|
||||
; clobbers A/X
|
||||
; preserves Y
|
||||
; clobbers $FD,$FE,$FF
|
||||
ldx #$01
|
||||
- cmp puzzle_data0, y
|
||||
beq @down
|
||||
cmp puzzle_data1, y
|
||||
beq @down
|
||||
cmp puzzle_data2, y
|
||||
beq @down
|
||||
cmp puzzle_data3, y
|
||||
beq @down
|
||||
cmp puzzle_data4, y
|
||||
beq @even
|
||||
cmp puzzle_data5, y
|
||||
beq @up
|
||||
cmp puzzle_data6, y
|
||||
beq @up
|
||||
cmp puzzle_data7, y
|
||||
beq @up
|
||||
cmp puzzle_data8, y
|
||||
beq @up
|
||||
ora #$80 ; check for used letters now
|
||||
dex
|
||||
beq - ; will only branch back once
|
||||
sec ; no matches on used or unused letters, so we're done
|
||||
rts
|
||||
@down clc
|
||||
lda #$01
|
||||
rts
|
||||
@up clc
|
||||
lda #$FF
|
||||
rts
|
||||
@even clc
|
||||
lda #$00
|
||||
rts
|
||||
|
||||
ScrollPuzzleDown
|
||||
|
@@ -5,8 +5,6 @@
|
||||
;
|
||||
|
||||
GlobalLeftMargin
|
||||
; TODO other values for smaller puzzles
|
||||
; $0A for 7-letter puzzles
|
||||
!byte $0A
|
||||
|
||||
Home
|
||||
|
@@ -76,7 +76,7 @@ SelectWorld
|
||||
+ST16 $FE
|
||||
lda #0
|
||||
sta counter
|
||||
sta selectedworld ; TODO set selected world from prefs
|
||||
sta selectedworld
|
||||
lda #6
|
||||
sta VTAB
|
||||
- lda #10
|
||||
|
187
src/ui.play.a
187
src/ui.play.a
@@ -11,14 +11,18 @@
|
||||
; - AnimatePuzzleCompleted
|
||||
;
|
||||
|
||||
; codes returned from PlayEventLoop to explain why the event loop ended
|
||||
kCompletedPuzzle = 1
|
||||
kRequestedRestart = 2
|
||||
; Codes returned by play event handlers
|
||||
kKeepPlaying = 0 ; This code is checked with BEQ/BNE, so it must be 0
|
||||
kCompletedPuzzle = 1 ; All non-zero codes will exit play event loop
|
||||
kRequestedRestart = 2 ; with the code in A so caller knows what happened
|
||||
kPressedEsc = 3
|
||||
|
||||
gSelectedLogicalColumn
|
||||
!byte 0
|
||||
|
||||
gLastKeyPressed
|
||||
!byte 0
|
||||
|
||||
kWorldLeftMargins
|
||||
!byte 15,13,12,10
|
||||
!byte 15,13,12,10
|
||||
@@ -32,6 +36,36 @@ kWorldRightMargins
|
||||
kStartingColor
|
||||
!byte $D5,$AA
|
||||
|
||||
kPlayKeys
|
||||
!byte $0B ; up arrow
|
||||
!byte $0A ; down arrow
|
||||
!byte $08 ; left arrow
|
||||
!byte $15 ; right arrow
|
||||
!byte $1B ; Esc
|
||||
!byte $12 ; Ctrl-R
|
||||
!byte $0D ; Return
|
||||
!byte $00 ; A-Z
|
||||
|
||||
kPlayKeyHandlersLo
|
||||
!byte <PlayEventUpArrow
|
||||
!byte <PlayEventDownArrow
|
||||
!byte <PlayEventLeftArrow
|
||||
!byte <PlayEventRightArrow
|
||||
!byte <PlayEventEsc
|
||||
!byte <PlayEventCtrlR
|
||||
!byte <PlayEventReturn
|
||||
!byte <PlayEventLetter
|
||||
|
||||
kPlayKeyHandlersHi
|
||||
!byte >PlayEventUpArrow
|
||||
!byte >PlayEventDownArrow
|
||||
!byte >PlayEventLeftArrow
|
||||
!byte >PlayEventRightArrow
|
||||
!byte >PlayEventEsc
|
||||
!byte >PlayEventCtrlR
|
||||
!byte >PlayEventReturn
|
||||
!byte >PlayEventLetter
|
||||
|
||||
;------------------------------------------------------------------------------
|
||||
; PlayEventLoop
|
||||
; main event loop for playing a puzzle
|
||||
@@ -47,29 +81,78 @@ PlayEventLoop
|
||||
bpl -
|
||||
bit CLEARKBD
|
||||
and #$7F
|
||||
cmp #$0B ; up arrow
|
||||
beq @eventUpArrow
|
||||
cmp #$0A ; down arrow
|
||||
beq @eventDownArrow
|
||||
cmp #$08 ; left arrow
|
||||
beq @eventLeftArrow
|
||||
cmp #$15 ; right arrow
|
||||
beq @eventRightArrow
|
||||
cmp #$1B ; Esc
|
||||
beq @eventEsc
|
||||
cmp #$12 ; Ctrl-R
|
||||
beq @eventCtrlR
|
||||
sta gLastKeyPressed
|
||||
|
||||
ldx #0
|
||||
- ldy kPlayKeys, x
|
||||
beq @checkForLetter
|
||||
cpy gLastKeyPressed
|
||||
beq @dispatch
|
||||
inx
|
||||
bne -
|
||||
@checkForLetter
|
||||
cmp #$61
|
||||
bcc +
|
||||
cmp #$7B
|
||||
bcs PlayEventLoop
|
||||
and #$DF
|
||||
sta gLastKeyPressed
|
||||
+ cmp #$41
|
||||
bcc +
|
||||
bcc PlayEventLoop
|
||||
cmp #$5B
|
||||
bcs +
|
||||
jmp @eventLetter
|
||||
+ jmp PlayEventLoop
|
||||
bcs PlayEventLoop
|
||||
@dispatch
|
||||
lda kPlayKeyHandlersLo, x
|
||||
sta @j+1
|
||||
lda kPlayKeyHandlersHi, x
|
||||
sta @j+2
|
||||
@j jsr $FDFD ; SMC
|
||||
beq PlayEventLoop
|
||||
rts
|
||||
|
||||
@eventLeftArrow
|
||||
PlayEventEsc
|
||||
lda #kPressedEsc ; caller will exit play event loop
|
||||
rts
|
||||
|
||||
PlayEventCtrlR
|
||||
lda #kRequestedRestart ; caller will exit play event loop
|
||||
rts
|
||||
|
||||
PlayEventReturn
|
||||
ldy gSelectedLogicalColumn
|
||||
beq +
|
||||
jsr EraseColumnSelectionIndicator
|
||||
jmp MoveToFirstColumn
|
||||
+ lda #kKeepPlaying
|
||||
rts
|
||||
|
||||
PlayEventUpArrow
|
||||
ldy gSelectedLogicalColumn
|
||||
jsr ScrollPuzzleUp
|
||||
bcs @fail
|
||||
jsr ScrollUp
|
||||
jsr CheckForTargetWord
|
||||
bcs @done
|
||||
jsr MarkTargetWord
|
||||
jmp CheckForPuzzleComplete
|
||||
@fail jsr SoftBell
|
||||
@done lda #kKeepPlaying
|
||||
rts
|
||||
|
||||
PlayEventDownArrow
|
||||
ldy gSelectedLogicalColumn
|
||||
jsr ScrollPuzzleDown
|
||||
bcs @fail
|
||||
jsr ScrollDown
|
||||
jsr CheckForTargetWord
|
||||
bcs @done
|
||||
jsr MarkTargetWord
|
||||
jmp CheckForPuzzleComplete
|
||||
@fail jsr SoftBell
|
||||
@done lda #kKeepPlaying
|
||||
rts
|
||||
|
||||
PlayEventLeftArrow
|
||||
ldy gSelectedLogicalColumn
|
||||
jsr EraseColumnSelectionIndicator
|
||||
bne +
|
||||
@@ -77,54 +160,46 @@ PlayEventLoop
|
||||
+ dey
|
||||
sty gSelectedLogicalColumn
|
||||
jsr DrawColumnSelectionIndicator
|
||||
jmp PlayEventLoop
|
||||
lda #kKeepPlaying
|
||||
rts
|
||||
|
||||
@eventRightArrow
|
||||
PlayEventRightArrow
|
||||
ldy gSelectedLogicalColumn
|
||||
jsr EraseColumnSelectionIndicator
|
||||
iny
|
||||
cpy puzzle_logical_width
|
||||
bcc +
|
||||
MoveToFirstColumn
|
||||
ldy #0
|
||||
+ sty gSelectedLogicalColumn
|
||||
jsr DrawColumnSelectionIndicator
|
||||
jmp PlayEventLoop
|
||||
lda #kKeepPlaying
|
||||
rts
|
||||
|
||||
@eventLetter
|
||||
PlayEventLetter
|
||||
lda gLastKeyPressed
|
||||
ldy gSelectedLogicalColumn
|
||||
jsr FindLetterInColumn
|
||||
; TODO
|
||||
jmp PlayEventLoop
|
||||
|
||||
@eventEsc
|
||||
lda #kPressedEsc
|
||||
bcc +
|
||||
jsr SoftBell ; didn't find letter, we're done
|
||||
lda #kKeepPlaying
|
||||
rts
|
||||
|
||||
@eventCtrlR
|
||||
lda #kRequestedRestart
|
||||
rts
|
||||
|
||||
@eventUpArrow
|
||||
ldy gSelectedLogicalColumn
|
||||
jsr ScrollPuzzleUp
|
||||
bcs @fail
|
||||
jsr ScrollUp
|
||||
jsr CheckForTargetWord
|
||||
bcc @foundTargetWord
|
||||
bcs @done
|
||||
@fail jsr SoftBell
|
||||
@done jmp PlayEventLoop
|
||||
|
||||
@eventDownArrow
|
||||
ldy gSelectedLogicalColumn
|
||||
+ beq PlayEventRightArrow ; found letter but it's already on center row, we're done, exit through right arrow handler
|
||||
bmi @up ; scroll up or down ONCE, then reassess
|
||||
jsr ScrollPuzzleDown
|
||||
bcs @fail
|
||||
jsr ScrollDown
|
||||
jsr CheckForTargetWord
|
||||
bcc @foundTargetWord
|
||||
bcs @done
|
||||
jmp +
|
||||
@up jsr ScrollPuzzleUp
|
||||
jsr ScrollUp
|
||||
+ jsr CheckForTargetWord
|
||||
bcs PlayEventLetter ; no word, check if more scrolling is required
|
||||
jsr MarkTargetWord ; show that we've finished a word
|
||||
jsr CheckForPuzzleComplete
|
||||
beq PlayEventLetter ; if puzzle isn't complete, check if more scrolling is required
|
||||
rts ; puzzle is complete, return to caller with A = kCompletedPuzzle
|
||||
|
||||
@foundTargetWord
|
||||
MarkTargetWord
|
||||
; TODO animation here?
|
||||
ldx #4
|
||||
ldy #0
|
||||
- lda puzzle_data4, y
|
||||
@@ -132,9 +207,15 @@ PlayEventLoop
|
||||
iny
|
||||
cpy puzzle_logical_width
|
||||
bne -
|
||||
; TODO sound here?
|
||||
rts
|
||||
|
||||
CheckForPuzzleComplete
|
||||
jsr IsPuzzleComplete
|
||||
bcs @done
|
||||
bcs +
|
||||
lda #kCompletedPuzzle
|
||||
+HIDE_NEXT_2_BYTES
|
||||
+ lda #kKeepPlaying
|
||||
rts
|
||||
|
||||
;------------------------------------------------------------------------------
|
||||
|
Reference in New Issue
Block a user