Features
Player
- Use SDL for gamepads for better controller support
62568e4f79Joystick input now goes through an SDL2-based joystick driver on Windows, macOS, and Linux (the web version already used SDL). Compared to the OS-native drivers this fixes several long-standing problems:
- On Linux, controllers silently stopped working whenever Steam was open: Steam Input takes an exclusive grab on the controller's evdev device. SDL reads controllers the same way Steam itself does and keeps working alongside it.
- On Windows, Xbox triggers didn't register when a pad was serviced by DirectInput, which merges both triggers onto one shared axis. SDL reads triggers independently on every backend.
- Xbox, PlayStation, Switch, 8BitDo, Stadia, and similar controllers are recognized with correct layouts, over USB or Bluetooth, and lesser-known controllers that went undetected or had buttons missing should now work.
The previous OS-native drivers remain available via the launcher (Player -> Joystick Driver) or by setting
driver = native(ordirectinput/xinputon Windows) under[joystick]in zc.cfg. - Recognize hundreds more controllers out of the box
190c074376Ships gamecontrollerdb.txt and loads it at startup. Together with the database built into SDL, recognized controllers - Xbox, PlayStation, Switch, 8BitDo, Stadia, and hundreds more - just work when plugged in: every button, stick, dpad, and trigger is identified correctly, and works the same on every platform, over USB or Bluetooth. The controls dialog shows readable names ("Left Shoulder", "Dpad Up") instead of raw button numbers.
Unrecognized controllers still work like before: bind buttons manually, once.
You may update the gamecontrollerdb.txt file next to the program to teach ZC about brand-new controllers without waiting for a release.
- Per-controller control schemes with sensible gamepad defaults
6afd40e7d8A recognized gamepad now gets its own control scheme, selected automatically and remembered per controller, so different controllers keep their own bindings. Priority is quest-specific, then per-controller, then global.
A controller seen for the first time gets a scheme named after it with gamepad defaults: dpad and left stick both move, A/B/X/Y go on the buttons with those labels (PlayStation pads use the SNES physical layout instead), L/R on the shoulders, triggers on Ex3/Ex4, Start opens the menu and Back the map.
The dpad is now bindable as four buttons, and directional buttons work even when analog movement is enabled.
- Simpler controller binding UI
c2ab39b31cIn the control scheme binding dialog, the movement sticks are now picked from a dropdown listing the connected controller's actual sticks (Dpad, Left Stick, Right Stick, ...) instead of a press-to-bind flow. Without a connected controller the stick bindings are shown read-only, as before.
The Control Schemes dialog gains a "Connected Gamepads" section showing each controller and which scheme it is assigned to, with a dropdown to reassign or set back to '(Auto)'. Assignment changes apply immediately.
Bug Fixes
Player
- Prevent crash on exit or quest reload while scripts were still compiling
cf15992fe0Regressed in 3.0.0-prerelease.132+2025-09-09 (a3e48bba8d).
Editor
@ExportEngineValuevalues being off by *1000021cd5d1d18Values are not automatically fixed in existing quests; re-editing the values will fix it for each value.
Visual Studio Code Extension
- Stale compile results could overwrite newer ones after a config switch
545eccd6cbA cancelled or restarted compile was never killed and still published its result when it finished, so a slow compile from the previously configured ZScript could clobber symbols, hovers and diagnostics from the newly configured one.
Regressed in 3.0.0-prerelease.163+2026-03-01 (4683653438).
- Language server could die on a startup error and never recover
e3bc1976bcAn unhandled promise rejection during initialization killed the server process, and the client never restarts a server that dies before the handshake finishes, so every feature stayed silently dead for the rest of the session. This is what made the extension's CI test fail wholesale now and then.