Files
questshock/CONFIG.md
T
ml 360a1f7e3d
build / build (push) Successful in 2m25s
Add VR locomotion: move/turn with thumbsticks while the menu is open
- 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)
2026-09-05 15:47:54 +02:00

5.6 KiB

Persistent configuration (questshock.config.json)

QuestShock can load a persistent, human-editable configuration file at startup, in addition to (and independent of) the engine's own prefs.txt.

  • Location: /sdcard/questshock/questshock.config.json - the same folder you already copy res/data/res/sound into (see README.md section 5.1).

  • Format: plain JSON, grouped by concern. Each top-level key is a group; each key inside a group is one option.

  • Loading: read automatically at app startup, before the splash screen, if the file exists. If it doesn't exist, nothing changes - the engine behaves exactly as it did before this file existed (driven by prefs.txt as usual).

  • Saving: never automatic. In-headset, open the menu (controller menu button) and press Save Configuration to write the file from your current live settings, overwriting it if present. Press Load Configuration to re-read the file and apply it without restarting the app.

  • Live vs. restart-required: every option below is tagged as either live-appliable (applying it while already playing takes effect immediately) or restart-required. Pressing Load Configuration applies every live-appliable change straight away; if the file also changes something restart-required, a dialog lists exactly which option(s) need it and offers:

    • Dismiss - keep playing with the live-appliable changes already applied; the restart-required option(s) stay as they were.
    • Restart Now - relaunches the app, which re-runs this same startup load and so applies every group in the file, including the restart-required ones.

    (Every option currently documented below is live-appliable, so this dialog won't actually appear yet - it's built in for options added in a future version that do need a restart.)

  • Unrecognized groups/keys are ignored (harmless if you're editing the file in advance for a future version). An invalid value for a specific option (see each option's possible values below) is logged and that one option is skipped - every other valid option in the file still applies. A file that isn't valid JSON at all is ignored entirely, with nothing applied.

  • questshock.config.json and prefs.txt are fully independent - loading or saving one never reads or writes the other.

Example

{
  "video_options": {
    "renderer": "opengl",
    "resolution": "1024x768"
  },
  "general": {
    "language": "english"
  },
  "player_position": {
    "x": 0.0,
    "z": 0.0,
    "yaw_degrees": 0.0
  }
}

Video Options (video_options)

renderer

Which renderer the game uses to draw the 3D view.

  • Type: enum
  • Possible values: "software", "opengl"
  • Restart required?: No (live-appliable)

resolution

The game's internal rendering resolution.

  • Type: enum
  • Possible values: "320x200", "320x400", "640x400", "640x480", "1024x768"
  • Restart required?: No (live-appliable)

General (general)

language

The game's UI/text language - both the game's own resource strings and this project's own menu/keyboard chrome text (title bar, buttons, etc.).

  • Type: enum
  • Possible values: "english", "french", "german"
  • Restart required?: No (live-appliable) - applies the same way the game's own in-game options menu applies a language change (reloads the language-specific resource files and refreshes the inventory/MFD/side-icon UI immediately).
  • Note: French and German both need their own full resource pack (frnstrng.res/mfdfrn.res, gerstrng.res/mfdger.res under res/data/) - if any of those files aren't present, the switch is refused (logged, questshock.config.json and the current language are left unchanged) rather than leaving the game with no valid resource file open. See README.md section 3 ("Game assets") for where mfdfrn.res/ mfdger.res come from - the GOG Enhanced Edition installer alone doesn't include them.

Player Position (player_position)

Where the player is virtually standing/facing, independent of - and not reset by - starting a new game or loading a save (same independence from prefs.txt/savegames as every other group here). Set by moving around in-headset (menu open, left thumbstick snap-turns, right thumbstick smooth- moves) to line yourself up with the game quad ("virtual screen"). Height is never included here - it always comes from your real tracked headset height, not this file.

Startup fallback: only applied at startup if all three fields (x, z, yaw_degrees) are present - a config file with none of them (or none at all), or a partial/hand-edited one missing any of the three, falls back to an automatic recenter instead (see Reset Position below), using your real head pose at that moment. A complete saved position is applied as-is, with no such recenter.

Reset Position (Main Menu tab) is a separate, live-only action, not a config value: it recenters using your current real head pose, so the game quad ends up directly ahead of wherever you're actually standing/ facing right now - not a plain "go back to (0, 0, 0)" (which would only undo thumbstick movement, not any physical drift/rotation since the session started). It's unrelated to questshock.config.json - it never reads or writes this file.

x, z

Horizontal position, in meters, on the play space's floor plane.

  • Type: number
  • Restart required?: No (live-appliable)

yaw_degrees

Which way the player is virtually facing, in degrees.

  • Type: number
  • Restart required?: No (live-appliable)