- Free view: hold a mapped input (default: left grip) and that thumbstick
drives the engine's mouse look, with the stick's normal bindings suspended
while held. Also available for the right stick, unbound by default.
- Cyberspace actions: eleven thrust/climb/dive/bank/roll actions with their
own bindings, active only in cyberspace. The normal movement actions are
inactive there, and capture exclusivity only compares actions that can be
active together, so one input can be bound in both sets.
- Cyberspace pitch and bank scale with thumbstick deflection instead of
running at full strength.
- Remove the toggle_freelook action; bind the automap view to the right
stick click by default.
- Engine patches: 24 exposes whether the player is in cyberspace, 25 lets
the controller code scale cyberspace pitch and bank.
Add a player_controls config group that maps game actions to controller
inputs, and a Controller Options menu tab to rebind them in-headset.
- 45 actions: movement, click/double-click, jump, fire, and the engine's own
keyboard hotkeys (posture, save/load, weapon/MFD select, etc.), sent to the
engine as synthetic key events. Cheat and dead hotkeys are not exposed.
- Press-to-capture rebinding with per-input exclusivity, Reset to Defaults
(built-in defaults, then questshock.config.default.json), and new defaults:
left stick moves/strafes, right stick turns.
- Controller profiles for Touch, Vive and generic OpenXR
(res/controller_profiles/), matched to the active interaction profile at
runtime, with a fatal dialog if a profile's bindings are rejected at
startup.
- The menu's thumbstick locomotion is disabled while the Controller Options
tab is open or a capture is active. A scrollable list with a tap-to-jump
scroll bar handles the long action list.
- Opening the menu pauses a running game and resumes it on close.
- Reset Position now keeps the player's facing instead of turning the screen
to the current gaze.
- Play the intro video in the game's language (engine patch 23), falling back
to English.
- Watchdog and shared-key handling for stuck movement keys, plus key-edge
logging.
- Video Options tab offers width and distance presets independently for
the Initial Screen (splash/intro/menu) and Game Screen (gameplay)
profiles, with their preset step/offset configurable via
questshock.config.json.
- Ships res/questshock.config.default.json as the initial config on
first run (or whenever questshock.config.json doesn't exist yet),
refreshed from the APK on every launch without touching a user's own
saved config.
- Left thumbstick snap-turns, right thumbstick smooth-moves, letting the
player line themselves up with the fixed game quad ("virtual screen")
without needing physical room-scale space to do it in. Implemented via
a second OpenXR reference space (a "play space") derived from the real
LOCAL space by the inverse of the player's transform, so every existing
quad/hit-testing/rendering call site just needed g_local_space swapped
for it - no manual coordinate-transform math required elsewhere
- Generalized the ray/quad hit-testing in xr_input.c to a proper
oriented-plane intersection (needed once quads can rotate); verified it
degenerates to the old axis-aligned formula when unrotated, so the
keyboard and non-recentered menu are unaffected
- The menu launcher now re-centers in front of the player, correctly
oriented to face them, each time it's freshly reopened
- "Reset Position" (Main Menu tab) recenters using the player's current
real head pose - not a plain reset-to-origin, which only undid
thumbstick movement and ignored physical drift since the session
started. The same recenter runs once automatically at startup too, as a
fallback for when there's no complete saved position to use instead
- Position/orientation persists in questshock.config.json's new
player_position group (independent of savegames), including new
numeric-value support in the config file's hand-rolled JSON parser
(previously string-enums only)
- New "Language" row on the Main Menu tab (English/French/German),
backed by a new "general" group in questshock.config.json
- Fixes a device-reproduced crash: switching language used to call
language_dealfunc(), whose render_run()/opanel_redraw() repaint
assumes the game's own in-game options panel is on screen - crashes
(SIGSEGV) when triggered from our independent VR overlay instead.
Now calls language_change() directly, which is all that's actually
needed to reload resources and refresh the inventory/MFD/side-icon UI
- Fixes a second crash: this data set ships frnstrng.res/gerstrng.res
but not mfdfrn.res/mfdger.res, and language_change() closes the
current resource files before discovering the new ones don't exist -
leaving no valid resource file open and crashing on the next lookup.
Now checks both files exist before ever switching, refusing the
change (with an in-headset popup) instead of corrupting resource state
- extract_assets.sh can now also pull mfdfrn.res/mfdger.res out of a
System Shock: Classic installer (which includes them, unlike Enhanced
Edition) if one is present in res/assets/ - entirely optional
- Documented all of the above in README.md/CONFIG.md