;==================================== ; draw pointer ;==================================== draw_pointer: ; point sprite to right location (X,Y) lda CURSOR_X sta XPOS lda CURSOR_Y sta YPOS ; see if inside special region ; ldy #LOCATION_SPECIAL_EXIT ; lda (LOCATION_STRUCT_L),Y ; cmp #$ff ; beq finger_not_special ; if $ff not special ; lda (LOCATION_STRUCT_L),Y ; cmp #DIRECTION_ANY ; beq was_any ; lda DIRECTION ; and #$f ; and (LOCATION_STRUCT_L),Y ; beq finger_not_special ; only special if facing right way ;was_any: ; see if X1 < X < X2 ; lda CURSOR_X ; ldy #LOCATION_SPECIAL_X1 ; cmp (LOCATION_STRUCT_L),Y ; bcc finger_not_special ; blt ; ldy #LOCATION_SPECIAL_X2 ; cmp (LOCATION_STRUCT_L),Y ; bcs finger_not_special ; bge ; see if Y1 < Y < Y2 ; lda CURSOR_Y ; ldy #LOCATION_SPECIAL_Y1 ; cmp (LOCATION_STRUCT_L),Y ; bcc finger_not_special ; blt ; ldy #LOCATION_SPECIAL_Y2 ; cmp (LOCATION_STRUCT_L),Y ; bcs finger_not_special ; bge ; we made it this far, we are special ;finger_grab: ; lda #1 ; sta IN_SPECIAL ; lda CURSOR_VISIBLE ; if not visible skip ; bne really_draw_grab ; rts ;really_draw_grab: ; lda DIRECTION ; and #DIRECTION_ONLY_POINT ; bne special_but_point ; lda #finger_grab_sprite ; jmp finger_draw ;special_but_point: ; jmp finger_point finger_not_special: ; lda CURSOR_VISIBLE ; if not visible skip ; bne really_not_special ; rts really_not_special: ; check for left/right lda CURSOR_X cmp #7 bcc check_cursor_left ; blt cmp #33 bcs check_cursor_right ; bge ; otherwise, finger_point finger_point: ; holding item takes precednce lda HOLDING_ITEM cmp #HOLDING_MATCH beq match_finger cmp #HOLDING_LIT_MATCH beq match_lit_finger cmp #HOLDING_KEY beq key_finger lda HOLDING_PAGE and #$c0 beq real_finger_point cmp #HOLDING_BLUE_PAGE beq blue_finger cmp #HOLDING_WHITE_PAGE beq white_finger cmp #HOLDING_RED_PAGE ; beq red_finger red_finger: lda #finger_red_page_sprite jmp finger_draw ; all that's left is key key_finger: lda #finger_key_sprite jmp finger_draw match_finger: lda #finger_match_sprite jmp finger_draw match_lit_finger: lda #finger_match_lit_sprite jmp finger_draw blue_finger: lda #finger_blue_page_sprite jmp finger_draw white_finger: lda #finger_white_page_sprite jmp finger_draw real_finger_point: lda #finger_point_sprite jmp finger_draw check_cursor_left: jsr lookup_direction and #$f beq finger_point cmp #$1 beq finger_left bne finger_uturn_left check_cursor_right: jsr lookup_direction and #$f0 beq finger_point cmp #$10 beq finger_right bne finger_uturn_right log2_table: ; 0 1 2 3 4 5 6 7 8 .byte 0,0,1,1,2,2,2,2,3 lookup_direction: ; lda DIRECTION ; and #$f ; tay ; lda log2_table,Y ; asl ; asl ; asl ; asl ; clc ; ldy #LOCATION_BGS ; adc (LOCATION_STRUCT_L),Y ; tay ; lda direction_lookup,Y rts finger_left: lda #1 sta IN_LEFT lda #finger_left_sprite jmp finger_draw finger_right: lda #1 sta IN_RIGHT lda #finger_right_sprite jmp finger_draw finger_uturn_left: lda #2 sta IN_LEFT lda #finger_turn_left_sprite jmp finger_draw finger_uturn_right: lda #2 sta IN_RIGHT lda #finger_turn_right_sprite jmp finger_draw finger_draw: sta INH jsr put_sprite_crop no_draw_pointer: rts ; 0 = point ; 1 = left ; 2 = left u-turn ; R/L EWSN 0010 ; 1010 direction_lookup: direction_lookup_n: .byte $00,$00,$22,$22,$01,$01,$21,$21,$10,$10,$12,$12,$11,$11,$11,$11 direction_lookup_s: ; N S SN W WN WS WSN .byte $00, $22,$00,$22,$10,$12,$10,$12 ; E EN ES ESN EW EWN EWS EWSN .byte $01,$02,$01,$21,$11,$11,$11,$11 direction_lookup_e: .byte $00,$01,$10,$11,$22,$21,$12,$11,$00,$01,$10,$11,$22,$21,$12,$11 direction_lookup_w: .byte $00,$10,$01,$11,$00,$10,$01,$11,$22,$12,$21,$11,$22,$12,$21,$11