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
|
||||
|
||||
|
||||
// ============================================================================
|
||||
// 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
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
|
|
|
|||
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_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)
|
||||
|
|
|
|||
21
pointer.c65
21
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
|
||||
|
|
|
|||
Loading…
Reference in a new issue