Features
- Let GUI widgets be marked as having an invalid value
7e00a24f61A widget marked invalid gets a red border, and its tooltip shows even when tooltips are turned off, so it can say what's wrong. Also, a text field can now show a starting value outside of its bounds as is, rather than clamping it.
Editor
- Show script setup values that are invalid for their field
2619fc4c64DiscordIn a script's setup, an exported variable whose value isn't one of its dropdown's options, is outside its range, or has unlisted flags set was shown as the closest valid value instead, which looked like the value had been changed. Such fields now show the value as is, with a red border, and hovering them explains what's wrong.
- Copy InitD values when converting a script to exported values
97e6fe2155DiscordA script that takes its setup values as
run()parameters (InitD) can now be converted to exported variables without setting every placement up again: replace the parameters with exported variables of the same names and remove all of therun()parameters. When compiled, each placement's InitD values are copied to the variables of the same name, unless one already has a value set there. InitD itself is left as is.
Bug Fixes
- Fix gauges from old subscreens sometimes drawing as a grid
85268151ffLife and magic gauges converted from a quest's old-format subscreens got random values for settings the old format doesn't have, such as the gauge's grid size and spacing, so a gauge could draw as a grid of pieces. Other converted subscreen widgets had the same problem with a few of their settings. Saving the quest in the editor also stored the random values.
Bug introduced when new life gauge settings were added in 2.55-alpha-117 (99462bf6b0).
- Initialize two values that could be read before being set
ab6df5e5d6Neither one changes behavior.
Player
- Fix portals sometimes warping the Hero on arrival
a1422fcc6fEntering a screen with a portal on it, such as the one left by the Magic Mirror, could warp the Hero as soon as they were standing on the portal, instead of waiting for them to step off of it first. Whether it happened depended on leftover memory. Portals created by scripts could also start animating from a random frame and draw the wrong tile.
Bug introduced when user created portals were added in 2.55-alpha-114 (ca30be23d1).
- Stop writing random bytes for a used-up portal into saves
8730313ad4Doesn't change gameplay: a cleared portal is never loaded.
Bug introduced when user created portals were added in 2.55-alpha-114 (ca30be23d1).
Editor
- Keep exported script variable values when variables move
b5d675f7cbDiscordValues set in the editor for a script's exported variables were stored by the variable's position in the script, so adding, removing or reordering the script's variables scrambled the values of every placed copy of the script (FFCs, combos, items, enemies, ...). Now, when slots are assigned after compiling, the values follow their variables by name, keeping their numbers if a variable changed between int and long. If a variable with values set is gone and others were added, the editor asks which one it was renamed to, or whether to discard its values.
Bug introduced when exported variables were added in 3.0.0-prerelease.205+2026-07-30 (76b97b95ee).
- Fix see-through transparent pixel marks in the tile editor
22cb4f2c15DiscordThe X marks drawn over transparent pixels in the tile editor could turn see-through, showing whatever was behind the editor, for some choices of color 0 (for example a dark gray). They are now always drawn with one of the standard editor colors.
Regressed in 2.55-alpha-113 (93f18c3ef0).
ZScript
- Stop leaving imported script files open
7d47087768Each file a script imports (including the script itself) was opened to check that it exists, and never closed. On Windows, those files couldn't be deleted or renamed until the compiler exited.
Regressed in 3.0.0-prerelease.45+2025-02-14 (20885219b6).
- Keep
Distance()identical across cpu architectures0393f1ec5cDistance() and LongDistance() could return a value 0.0001 lower on arm64 than on x86, desyncing replays recorded on the other architecture.
- Fix crash when reading script variables from debug info
c4be21b655Script debug info could think its variable and scope lookups were already built when they weren't, and then crash. Whether it happened depended on leftover memory, so it only showed up in some builds (the parser tests crashed on gcc and Windows builds).
Bug introduced when scope info was added to debug data in 3.0.0-prerelease.161+2026-02-16 (b3f408e08b).
- Fix crash from a comment after a one-line enum
2be08e7197A comment at the end of a line holding a whole enum, like
enum { A, B }; // ..., was written into memory that had already been freed, which could crash the compiler. It now documents the enum.Regressed in 3.0.0-prerelease.185+2026-05-10 (ed22cfa753).
- Fix the debugger's source view background on open
18b38dae5bThe first frame of the script debugger's source view drew its background with a random color.
Bug introduced when the rich debugger was added in 3.0.0-prerelease.161+2026-02-16 (c7a2ccbb84).
ZLauncher
- Fix cursor and alternate text colors for built-in themes
2bc928ffa3The built-in themes left the cursor, read-only text and disabled colors unset (or set to the wrong value), instead of using their defaults.
Regressed in 3.0.0-prerelease.49+2024-04-06 (cb05cf84df).
Web
- Show modified dates in the browser files list
ef0fed8464The files list in the settings panel showed "Invalid Date" for every file.
Regressed in 3.0.0-prerelease.105+2025-05-19 (10b4684be3).
- Compile every script with the JIT when loading a quest
37ccb7bc95With the JIT on in the web version, loading a quest could leave some of its scripts uncompiled, so they ran slower, with "error compiling ..." in the log.
Regressed in 3.0.0-prerelease.197+2026-07-06 (9ae8b8ed98).
- Log a failed file fetch instead of a ReferenceError
ab77c4fc32When fetching a quest file failed, the web version logged "error fetching
ReferenceError: e is not defined" rather than the failure itself. Regressed in 3.0.0-prerelease.127+2025-08-16 (496d2ca008).
Documentation
- Add compatibility notes to the message strings page
4514f780d6Covers how strings from older quests are converted, the compat rules that change how strings behave, and known 2.55 bugs with screen state SCCs. Also fixes the 2.55 format listed for TriggerComboCopycat, which 2.55 does not support.
Build
- Compress the mac .dmg with LZMA
4304a8b8ddThe mac download is about 18% smaller (52 MB -> 43 MB for 3.0.0-prerelease.231). LZMA disk images need macOS 10.15, and the minimum supported version is already 12.0.
- Strip symbol tables from mac and linux binaries
1d5c49f1d4Shrinks the mac download by about 5 MB and the linux download by about 1.3 MB. Debug info was already kept out of the packages, but the symbol tables were not.
- Make the editor about 20% smaller
f34198f9d5Dialog code is now built for size, which shrinks zeditor by about 20% (11% compressed) with no effect on gameplay.
- Upgrade sentry-native from 0.6.6 to 0.17.4
d2e7f31720 - Enable Sentry in the Windows arm64 release
6b1ae049d0
Web
- Stop using emscripten APIs removed after 6.0.6
d2f9e8f1c5 - Make the ZScript compiler smaller and faster
4a1eaf028eThe ZScript compiler is now about a third smaller (3.3 MB instead of 5 MB), and compiles scripts about 13% faster.
Chores
- Update replay_uploads_known_good_replays.json
32c8deb0b0
Refactors
- Move widget pointers in the GUI builder instead of copying
0141830e28Each widget's shared_ptr was copied into its builder, copied again out of it, and copied once more into its parent, inlining a refcount pair and its cleanup paths per copy. Under -Oz this saves ~130 KB of zeditor.
Web
- Run JIT scripts without an asyncify round-trip
7715e9b405 - Drop the JIT's check for stale compiled scripts
2fdf800b3a - Stop logging every compiled script module
0e2a5f4d82
Tests
- Always report a crashing target, and exit 128+signal
ed028604a6 - Don't warn about missing backtraces after reporting a crash
4cef68d4ed
Player
- Skip the title screen tests on web
5d35234785
ZScript
- Cover a script running a frozen generic script
41ba670213
CI
- Retry the Windows Chocolatey install when the package feed is down
dcb86edd32The community Chocolatey feed intermittently answers 503/504, which choco then reports as "package not found" and fails the whole build job before anything is compiled. Retry the install a few times with a pause between attempts; already-installed packages are skipped on the next try, so only the fetches that failed are repeated.
- Only save ccache from main and release branches
b25877cdf2 - Run web replay tests concurrently
af0941aace
Misc.
- Update
trigger_example.qstwith spinner setupb4949f307a
Editor
- Mention in InitD tab that it is the old way
def10377a2