diff --git a/gamemenu.c65 b/gamemenu.c65 index e95fdd8..e2695a7 100644 --- a/gamemenu.c65 +++ b/gamemenu.c65 @@ -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 diff --git a/gamestate.c65 b/gamestate.c65 index 54cddda..a09a2b4 100644 --- a/gamestate.c65 +++ b/gamestate.c65 @@ -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) diff --git a/keyboard.c65 b/keyboard.c65 index 273c389..0994d44 100644 --- a/keyboard.c65 +++ b/keyboard.c65 @@ -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) diff --git a/pointer.c65 b/pointer.c65 index ac09413..21cf42f 100644 --- a/pointer.c65 +++ b/pointer.c65 @@ -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