Added mouse sensitivity menu option and logic
This commit is contained in:
parent
2b7492b3d4
commit
c606d14f3e
4 changed files with 101 additions and 6 deletions
68
gamemenu.c65
68
gamemenu.c65
|
|
@ -144,6 +144,32 @@ FUNC menu_update_found_to_tab
|
||||||
FEND
|
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
|
// FUNC menu_render
|
||||||
// Render the full menu screen with current settings
|
// Render the full menu screen with current settings
|
||||||
|
|
@ -168,9 +194,15 @@ FUNC menu_render
|
||||||
// Foundation to Tableau value
|
// Foundation to Tableau value
|
||||||
menu_update_found_to_tab()
|
menu_update_found_to_tab()
|
||||||
|
|
||||||
// Instructions for resume/restart (row 12+)
|
// Mouse sensitivity option (row 12)
|
||||||
menu_print_string(12*40+$0400+4, @str_inst_f7)
|
menu_print_string(12*40+$0400+4, @str_mouse_sensitivity)
|
||||||
menu_print_string(15*40+$0400+4, @str_inst_runstop)
|
|
||||||
|
// 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)
|
// Controls info (row 20)
|
||||||
menu_print_string(20*40+$0400+2, @str_controls)
|
menu_print_string(20*40+$0400+2, @str_controls)
|
||||||
|
|
@ -226,12 +258,18 @@ FUNC menu_show(out:{BYTE action})
|
||||||
WEND
|
WEND
|
||||||
|
|
||||||
// Menu loop
|
// Menu loop
|
||||||
|
#PRAGMA _P_USE_LONG_JUMP 1
|
||||||
WHILE 1
|
WHILE 1
|
||||||
|
#PRAGMA _P_USE_LONG_JUMP 0
|
||||||
key_scan(key)
|
key_scan(key)
|
||||||
|
|
||||||
// Only process on key press (transition from NONE to key)
|
// Only process on key press (transition from NONE to key)
|
||||||
|
#PRAGMA _P_USE_LONG_JUMP 1
|
||||||
IF key != KEY_NONE
|
IF key != KEY_NONE
|
||||||
|
#PRAGMA _P_USE_LONG_JUMP 0
|
||||||
|
#PRAGMA _P_USE_LONG_JUMP 1
|
||||||
IF prev_key == KEY_NONE
|
IF prev_key == KEY_NONE
|
||||||
|
#PRAGMA _P_USE_LONG_JUMP 0
|
||||||
SWITCH key
|
SWITCH key
|
||||||
CASE KEY_F1
|
CASE KEY_F1
|
||||||
// Toggle draw mode
|
// Toggle draw mode
|
||||||
|
|
@ -251,6 +289,15 @@ FUNC menu_show(out:{BYTE action})
|
||||||
ENDIF
|
ENDIF
|
||||||
menu_update_found_to_tab()
|
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
|
CASE KEY_F7
|
||||||
// Resume game
|
// Resume game
|
||||||
action = MENU_ACTION_RESUME
|
action = MENU_ACTION_RESUME
|
||||||
|
|
@ -320,6 +367,11 @@ ASM
|
||||||
!scr "F3: Foundation>Tableau:", 0
|
!scr "F3: Foundation>Tableau:", 0
|
||||||
ENDASM
|
ENDASM
|
||||||
|
|
||||||
|
LABEL str_mouse_sensitivity
|
||||||
|
ASM
|
||||||
|
!scr "F5: Mouse sensitivity:", 0
|
||||||
|
ENDASM
|
||||||
|
|
||||||
LABEL str_on
|
LABEL str_on
|
||||||
ASM
|
ASM
|
||||||
!scr "On", 0
|
!scr "On", 0
|
||||||
|
|
@ -330,6 +382,16 @@ ASM
|
||||||
!scr "Off", 0
|
!scr "Off", 0
|
||||||
ENDASM
|
ENDASM
|
||||||
|
|
||||||
|
LABEL str_high
|
||||||
|
ASM
|
||||||
|
!scr "High", 0
|
||||||
|
ENDASM
|
||||||
|
|
||||||
|
LABEL str_low
|
||||||
|
ASM
|
||||||
|
!scr "Low", 0
|
||||||
|
ENDASM
|
||||||
|
|
||||||
LABEL str_inst_f1
|
LABEL str_inst_f1
|
||||||
ASM
|
ASM
|
||||||
!scr "F1: Toggle draw mode (1/3)", 0
|
!scr "F1: Toggle draw mode (1/3)", 0
|
||||||
|
|
|
||||||
|
|
@ -13,6 +13,7 @@ GOTO __skip_lib_gamestate
|
||||||
// Game configuration
|
// Game configuration
|
||||||
BYTE game_draw_mode = 1 // Stock draw mode: 1 or 3 cards per draw
|
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_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
|
// Game interaction state
|
||||||
BYTE game_selected_pile // Currently selected pile ID (PILE_ID_NONE if none)
|
BYTE game_selected_pile // Currently selected pile ID (PILE_ID_NONE if none)
|
||||||
|
|
|
||||||
17
keyboard.c65
17
keyboard.c65
|
|
@ -39,9 +39,10 @@ WORD CONST CIA_DDRB = $DC03 // Port B Data Direction Register
|
||||||
BYTE CONST KEY_NONE = 0
|
BYTE CONST KEY_NONE = 0
|
||||||
BYTE CONST KEY_F1 = 1
|
BYTE CONST KEY_F1 = 1
|
||||||
BYTE CONST KEY_F3 = 2
|
BYTE CONST KEY_F3 = 2
|
||||||
BYTE CONST KEY_F7 = 3
|
BYTE CONST KEY_F5 = 3
|
||||||
BYTE CONST KEY_RUNSTOP = 4
|
BYTE CONST KEY_F7 = 4
|
||||||
BYTE CONST KEY_RETURN = 5
|
BYTE CONST KEY_RUNSTOP = 5
|
||||||
|
BYTE CONST KEY_RETURN = 6
|
||||||
|
|
||||||
// C64 Keycode constants (for internal use)
|
// C64 Keycode constants (for internal use)
|
||||||
// Based on: https://www.c64-wiki.com/wiki/Keyboard
|
// 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_F7F8 = $03
|
||||||
BYTE CONST KEYCODE_F1F2 = $04
|
BYTE CONST KEYCODE_F1F2 = $04
|
||||||
BYTE CONST KEYCODE_F3F4 = $05
|
BYTE CONST KEYCODE_F3F4 = $05
|
||||||
|
BYTE CONST KEYCODE_F5F6 = $06
|
||||||
BYTE CONST KEYCODE_RUNSTOP = $3F
|
BYTE CONST KEYCODE_RUNSTOP = $3F
|
||||||
|
|
||||||
// Row and column lookup tables for keyboard scanning
|
// Row and column lookup tables for keyboard scanning
|
||||||
|
|
@ -65,6 +67,7 @@ ENDASM
|
||||||
// Key history for debouncing (one byte per tracked key)
|
// Key history for debouncing (one byte per tracked key)
|
||||||
BYTE key_history_f1
|
BYTE key_history_f1
|
||||||
BYTE key_history_f3
|
BYTE key_history_f3
|
||||||
|
BYTE key_history_f5
|
||||||
BYTE key_history_f7
|
BYTE key_history_f7
|
||||||
BYTE key_history_return
|
BYTE key_history_return
|
||||||
BYTE key_history_runstop
|
BYTE key_history_runstop
|
||||||
|
|
@ -159,6 +162,14 @@ FUNC key_scan(out:{BYTE key_pressed})
|
||||||
ENDIF
|
ENDIF
|
||||||
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
|
// Check F7
|
||||||
IF key_pressed == KEY_NONE
|
IF key_pressed == KEY_NONE
|
||||||
key_check_raw(KEYCODE_F7F8, key_history_f7, check_result)
|
key_check_raw(KEYCODE_F7F8, key_history_f7, check_result)
|
||||||
|
|
|
||||||
21
pointer.c65
21
pointer.c65
|
|
@ -266,6 +266,7 @@ FEND
|
||||||
// Update pointer based on mouse delta movements
|
// Update pointer based on mouse delta movements
|
||||||
// Expects mouse_delta_x and mouse_delta_y to be set (from mouse.c65 library)
|
// Expects mouse_delta_x and mouse_delta_y to be set (from mouse.c65 library)
|
||||||
// Mouse deltas are signed 8-bit values
|
// 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})
|
FUNC pointer_update_mouse({BYTE delta_x} {BYTE delta_y})
|
||||||
BYTE sign_x
|
BYTE sign_x
|
||||||
|
|
@ -273,6 +274,26 @@ FUNC pointer_update_mouse({BYTE delta_x} {BYTE delta_y})
|
||||||
BYTE abs_x
|
BYTE abs_x
|
||||||
BYTE abs_y
|
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
|
// Handle X movement
|
||||||
sign_x = delta_x & %10000000
|
sign_x = delta_x & %10000000
|
||||||
IF sign_x
|
IF sign_x
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue