Features
Editor
- Quest browser startup dialog
32b750fde5The editor now opens with a quest browser instead of immediately creating a new quest: a listing of known quests with each quest's icon, title, author, ZC version, and last-edited date. The listing includes recent quests, everything in the quests folder, and any files or folders added with the new Open Quest / Scan Folder buttons. Quests can be filtered and sorted (recently opened, last edited, ZC version), and new quests are created via the existing tileset wizard.
The footer shows the current version and when an update is available.
File > Openalso opens the browser instead of a file picker.Automatically opening the most recent quest at startup is now off by default; the new dialog has a checkbox for it.
ZScript
- Make stack traces for script Trace/printf opt-in
4f47be3fdcPlain Trace/printf output no longer includes a stack trace in allegro.log and the console by default - only script errors always print one. Stack traces for traces can be re-enabled with the new "Log Stack Trace on Trace/printf" toggle in the Debug menu (or the
[ZScript] log_stack_trace_on_traceconfig option).
Bug Fixes
Player
- Replay uploading ran for users who never opted in
8940060885The weekly automatic replay upload had its consent check inverted: it ran for everyone who had NOT enabled the "Upload replays" option, and never for those who had. Any .zplay files in the replays folder were uploaded without consent (replay recording is also off by default, so most installs had nothing to upload), and enabling the option silently disabled uploading.
All replays uploaded to date have been deleted, since consent could not be established for them.
Bug introduced when opt-in replay uploading was added in 3.0.0-prerelease.2+2024-07-24 (36f5d08109).
Editor
- Partial quest file reads corrupting the open quest's version info
53f05170e8Grabbing tiles from another quest file (and similar partial reads, like loading a tileset in the new quest dialog) only restored part of the current quest's internal version info afterward, leaving values read from the other file in place for the rest of the session.
Most partially loaded sections happened to be in the restored part, but the rest could subtly misbehave - e.g. the compile dialog reporting the other file's ZScript version, and later partial reads taking wrong compatibility branches.
Regressed in 2.55.10 (b8bc72ae9b).
ZScript
- Stop JIT reading stale memory for ops that read and write the same register
0b6229b8b7The JIT could sometimes generate bad code for expression-indexed array reads like
pal[cond ? 0 : x].The JIT's liveness analysis applied an instruction's register writes while still scanning its args, so an instruction whose first arg writes the same D register another arg reads (ex:
READPODARRAYR D2 D2) never recorded the read. The JIT's register-cache dead-drop then believed the register dead at a branch merge, skipped flushing the dirty cached value, and the compiled read used a stale value from memory - producing wrong array indices. Whether the stale value happened to be correct depended on what ran earlier.Scripts hit this by reading an array with an index expression that itself contains control flow, fed directly into the subscript - a ternary (
arr[cond ? a : b]) or a short-circuit&&/||- since those compile to branches that leave the index in D2 and merge straight intoREADPODARRAYR D2 D2. Array writes were unaffected, as was assigning the branchy expression to a local before indexing with it.Both native JIT backends were affected; the wasm backend does not use the register cache.
Regressed in 3.0.0-prerelease.135+2025-10-08 (68087da593).
Chores
- Update replay_uploads_known_good_replays.json
b3abd2194a
Refactors
Editor
- One guard for reading data out of other quest files
37a31e1cd4Extracts the save/restore dance that partial quest loads require into ScopedPartialQuestLoad (core/qst.h), used by both the tile grabber and the quest browser. The guard swaps the tile buffer to the caller's scratch, and snapshots/restores colordata, quest_format, and DMapEditorLastMaptileUsed; loadquest already restores rules/map_count for skip-flag loads.
Side effect: grabbing tiles from another quest file no longer resets the DMap editor's last-used map tile (the grabber never restored it), and no longer leaves the foreign file's colordata semantics at risk if future sections are unskipped - the abandoned "cache QRS" comment blocks in load_imagebuf are superseded and removed.
ZScript
- JIT fast path for script instance variable registers
6a87ead34dAccessing a script's instance variables is now as fast as accessing global variables under the JIT - previously it was ~7x slower, going through a generic helper call instead of a direct memory access.
Misc.
- Fix linux test builds never being found by archives.py
677558909d - Keep archives.py download progress off stdout
45e1eb94bb - Raise a proper error when a release has no linux package
b2f890f25c - Extract .tgz downloads as tarballs in archives.py
0861b57e94 - Don't pick non-windows packages when a release has one asset
dc03b3c351 - Stop archives.py from permanently caching failed lookups
61b37e4af5 - Fix potential crash comparing against an unresolved tag
8270b8a46c - Fix bucket key parsing to tolerate nested paths
247ee525a1 - Don't use a mutable default argument in get_local_builds
a63560a9a3 - Download to the revision's own directory in Revision.binaries
88c374ecba - Don't treat a failed archive extraction as a completed download
c6e8f5c59f - List all 2.55 alphas in archives.py, not just 3-digit ones
b883625f8f - Assorted small cleanups in archives.py
c1aca39740 - Check the s3 bucket before GitHub for old release packages
2961411964 - Don't cache mutable git facts across runs in git_helpers.py
596300cbf3 - Fix confusing crash for unknown channels in bisect_builds.py
b5c74042f4 - Validate bisect endpoints up front
46ca6bd08e - Don't reject builds missing binaries the command doesn't use
99f2551553 - Add a --timeout for automated bisect steps
b9ba9be827 - Handle quit and unknown answers sanely during bisect validation
3c9a1cf126 - Remove leftover debug prints from bisect skip handling
00eff92d95 - Assorted small cleanups in bisect_builds.py
c0bc18173b - Api server rejects requests without a ZC-Version header
8584159088Clients only started sending the header alongside the replay-upload consent fix, so this locks out old builds that still carry the inverted consent check.
Also rejects split-replay segment uploads (a "sav" meta field): their save snapshot never uploads with them, so they can never be replayed.