Summary
On Linux, the mouse cursors for default/selection, action, and attack are not shown using the game cursor assets and instead fallback to the operating system pointer.
Important note: other cursor states (e.g., capture/hover-over-unit) appear to work correctly.
Impact
- Degraded gameplay UX (incorrect visual feedback for critical commands).
- Tactical cursor states (action/attack) are not clearly represented.
Relevant Code Areas
- SDL3 animated cursor pipeline:
GeneralsMD/Code/GameEngineDevice/Source/SDL3Device/GameClient/SDL3Mouse.cpp
Generals/Code/GameEngineDevice/Source/SDL3Device/GameClient/SDL3Mouse.cpp
- Cursor resource load + fallback path:
SDL3Mouse::initCursorResources
SDL3Mouse::loadCursorFromFile
SDL3Mouse::setCursor
- Initialization entry point:
GeneralsMD/Code/GameEngine/Source/GameClient/GameClient.cpp
Technical Context
- Current code falls back to SDL/OS default cursor when a specific cursor is unavailable.
- There are
MissingCursor asserts/logs in cursor resource loading.
- Recent SDL3 cursor-pipeline changes (including
SDL_CreateAnimatedCursor) may be relevant.
Initial Hypotheses
- Path or case-sensitivity mismatch on Linux for a subset of ANI files (default/action/attack).
- Selective ANI parse/load failures for those cursor types causing fallback in
setCursor.
- Visibility/current-cursor state transitions forcing fallback to NORMAL or OS cursor.
- Assets exist, but invalid hotspot/frame metadata causes
SDL_CreateAnimatedCursor failure for those specific cursors.
Reproduction Steps
- Start a Linux match.
- Check neutral/default selection cursor state.
- Enter action context (move/command) and attack context.
- Compare with capture/hover-over-unit states (currently working).
Expected Result
Game-specific default/action/attack cursors should render on Linux, without fallback to OS pointer.
Current Result
Default/action/attack cursor states fallback to OS pointer; other cursor states still work.
Investigation Checklist
Acceptance Criteria
Summary
On Linux, the mouse cursors for default/selection, action, and attack are not shown using the game cursor assets and instead fallback to the operating system pointer.
Important note: other cursor states (e.g., capture/hover-over-unit) appear to work correctly.
Impact
Relevant Code Areas
GeneralsMD/Code/GameEngineDevice/Source/SDL3Device/GameClient/SDL3Mouse.cppGenerals/Code/GameEngineDevice/Source/SDL3Device/GameClient/SDL3Mouse.cppSDL3Mouse::initCursorResourcesSDL3Mouse::loadCursorFromFileSDL3Mouse::setCursorGeneralsMD/Code/GameEngine/Source/GameClient/GameClient.cppTechnical Context
MissingCursorasserts/logs in cursor resource loading.SDL_CreateAnimatedCursor) may be relevant.Initial Hypotheses
setCursor.SDL_CreateAnimatedCursorfailure for those specific cursors.Reproduction Steps
Expected Result
Game-specific default/action/attack cursors should render on Linux, without fallback to OS pointer.
Current Result
Default/action/attack cursor states fallback to OS pointer; other cursor states still work.
Investigation Checklist
resourcePathininitCursorResourcesfor affected cursor types.Data/Cursorsat Linux runtime.loadCursorFromFileandSDL_CreateAnimatedCursorfailures by cursor type.setCursorreceives the expected enums for default/action/attack.Acceptance Criteria