- 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
- Header with title, git-tag-derived version, and a live FPS/frame-time/
CPU/GPU-utilization/free-memory stats ribbon below the tab bar (FPS via
a new per-frame tracker in xr_session.c; CPU/GPU via the OpenXR
XR_META_performance_metrics extension, gracefully unavailable on
runtimes that don't support it)
- Bottom tab bar with a live-editable Video Options tab (renderer/
resolution), applying changes immediately via qs_config.c
- Hover and press feedback on every menu/keyboard button via a
StateListDrawable (Android's default ripple never animates on this
permanently unattached view tree), with a lighter default button color
for visibility
- i18n for all menu/keyboard chrome text, following the game's own
language setting (Strings.java)
- The main menu is now draggable via its header, matching the keyboard;
xr_input.c's drag handling is generalized to per-overlay state instead
of being keyboard-only
- The keyboard's title bar now matches the menu header's style