Added mouse sensitivity menu option and logic

This commit is contained in:
Mattias Hansson 2026-03-08 16:07:28 +01:00
parent 2b7492b3d4
commit c606d14f3e
4 changed files with 101 additions and 6 deletions

View file

@ -144,6 +144,32 @@ FUNC menu_update_found_to_tab
FEND
// ============================================================================
// FUNC menu_update_mouse_sensitivity
// Update only the mouse sensitivity display (row 12) - no screen clear
// ============================================================================
FUNC menu_update_mouse_sensitivity
WORD screen_pos @ $e8
WORD str_ptr @ $ea
// Clear the value area (cols 28-31)
screen_pos = 12*40+$0400+27
POKE screen_pos[0] , 32 // space
POKE screen_pos[1] , 32
POKE screen_pos[2] , 32
POKE screen_pos[3] , 32
// Mouse sensitivity value
screen_pos = 12*40+$0400+27
IF game_mouse_high_sensitivity == 0
POINTER str_ptr -> str_low
ELSE
POINTER str_ptr -> str_high
ENDIF
menu_print_string(screen_pos, str_ptr)
FEND
// ============================================================================
// FUNC menu_render
// Render the full menu screen with current settings
@ -168,9 +194,15 @@ FUNC menu_render
// Foundation to Tableau value
menu_update_found_to_tab()
// Instructions for resume/restart (row 12+)
menu_print_string(12*40+$0400+4, @str_inst_f7)
menu_print_string(15*40+$0400+4, @str_inst_runstop)
// Mouse sensitivity option (row 12)
menu_print_string(12*40+$0400+4, @str_mouse_sensitivity)
// Mouse sensitivity value
menu_update_mouse_sensitivity()
// Instructions for resume/restart (row 15+)
menu_print_string(15*40+$0400+4, @str_inst_f7)
menu_print_string(18*40+$0400+4, @str_inst_runstop)
// Controls info (row 20)
menu_print_string(20*40+$0400+2, @str_controls)
@ -226,12 +258,18 @@ FUNC menu_show(out:{BYTE action})
WEND
// Menu loop
#PRAGMA _P_USE_LONG_JUMP 1
WHILE 1
#PRAGMA _P_USE_LONG_JUMP 0
key_scan(key)
// Only process on key press (transition from NONE to key)
#PRAGMA _P_USE_LONG_JUMP 1
IF key != KEY_NONE
#PRAGMA _P_USE_LONG_JUMP 0
#PRAGMA _P_USE_LONG_JUMP 1
IF prev_key == KEY_NONE
#PRAGMA _P_USE_LONG_JUMP 0
SWITCH key
CASE KEY_F1
// Toggle draw mode
@ -251,6 +289,15 @@ FUNC menu_show(out:{BYTE action})
ENDIF
menu_update_found_to_tab()
CASE KEY_F5
// Toggle mouse sensitivity
IF game_mouse_high_sensitivity == 0
game_mouse_high_sensitivity = 1
ELSE
game_mouse_high_sensitivity = 0
ENDIF
menu_update_mouse_sensitivity()
CASE KEY_F7
// Resume game
action = MENU_ACTION_RESUME
@ -320,6 +367,11 @@ ASM
!scr "F3: Foundation>Tableau:", 0
ENDASM
LABEL str_mouse_sensitivity
ASM
!scr "F5: Mouse sensitivity:", 0
ENDASM
LABEL str_on
ASM
!scr "On", 0
@ -330,6 +382,16 @@ ASM
!scr "Off", 0
ENDASM
LABEL str_high
ASM
!scr "High", 0
ENDASM
LABEL str_low
ASM
!scr "Low", 0
ENDASM
LABEL str_inst_f1
ASM
!scr "F1: Toggle draw mode (1/3)", 0

View file

@ -13,6 +13,7 @@ GOTO __skip_lib_gamestate
// Game configuration
BYTE game_draw_mode = 1 // Stock draw mode: 1 or 3 cards per draw
BYTE game_allow_found_to_tab = 0 // Allow foundation to tableau moves: 0=disallow, 1=allow
BYTE game_mouse_high_sensitivity = 1 // Mouse sensitivity: 1=high (default), 0=low (filters small movements)
// Game interaction state
BYTE game_selected_pile // Currently selected pile ID (PILE_ID_NONE if none)

View file

@ -39,9 +39,10 @@ WORD CONST CIA_DDRB = $DC03 // Port B Data Direction Register
BYTE CONST KEY_NONE = 0
BYTE CONST KEY_F1 = 1
BYTE CONST KEY_F3 = 2
BYTE CONST KEY_F7 = 3
BYTE CONST KEY_RUNSTOP = 4
BYTE CONST KEY_RETURN = 5
BYTE CONST KEY_F5 = 3
BYTE CONST KEY_F7 = 4
BYTE CONST KEY_RUNSTOP = 5
BYTE CONST KEY_RETURN = 6
// C64 Keycode constants (for internal use)
// Based on: https://www.c64-wiki.com/wiki/Keyboard
@ -49,6 +50,7 @@ BYTE CONST KEYCODE_RETURN = $01
BYTE CONST KEYCODE_F7F8 = $03
BYTE CONST KEYCODE_F1F2 = $04
BYTE CONST KEYCODE_F3F4 = $05
BYTE CONST KEYCODE_F5F6 = $06
BYTE CONST KEYCODE_RUNSTOP = $3F
// Row and column lookup tables for keyboard scanning
@ -65,6 +67,7 @@ ENDASM
// Key history for debouncing (one byte per tracked key)
BYTE key_history_f1
BYTE key_history_f3
BYTE key_history_f5
BYTE key_history_f7
BYTE key_history_return
BYTE key_history_runstop
@ -159,6 +162,14 @@ FUNC key_scan(out:{BYTE key_pressed})
ENDIF
ENDIF
// Check F5
IF key_pressed == KEY_NONE
key_check_raw(KEYCODE_F5F6, key_history_f5, check_result)
IF check_result > 0
key_pressed = KEY_F5
ENDIF
ENDIF
// Check F7
IF key_pressed == KEY_NONE
key_check_raw(KEYCODE_F7F8, key_history_f7, check_result)

View file

@ -266,6 +266,7 @@ FEND
// Update pointer based on mouse delta movements
// Expects mouse_delta_x and mouse_delta_y to be set (from mouse.c65 library)
// Mouse deltas are signed 8-bit values
// If game_mouse_high_sensitivity = 0, filters out ±1 pixel movements (deadzone)
// ============================================================================
FUNC pointer_update_mouse({BYTE delta_x} {BYTE delta_y})
BYTE sign_x
@ -273,6 +274,26 @@ FUNC pointer_update_mouse({BYTE delta_x} {BYTE delta_y})
BYTE abs_x
BYTE abs_y
BYTE CONST LOW_SENSE_FILTER = 2
// Apply deadzone filter if low sensitivity mode
IF game_mouse_high_sensitivity == 0
// Filter ±1 pixel movements (1 = +1, 255 = -1 in signed byte)
IF delta_x <= LOW_SENSE_FILTER
delta_x = 0
ENDIF
IF delta_x >= 255-LOW_SENSE_FILTER
delta_x = 0
ENDIF
IF delta_y <= LOW_SENSE_FILTER
delta_y = 0
ENDIF
IF delta_y >= 255-LOW_SENSE_FILTER
delta_y = 0
ENDIF
ENDIF
// Handle X movement
sign_x = delta_x & %10000000
IF sign_x