Features
- Allow decimal values for some SCC arguments
06dbd7afa3This allows the full range of values for
Screen->D[]andInitD[]parameters.Discord: https://discord.com/channels/876899628556091432/1525520874072047667
Bug Fixes
- Negating or abs-ing a zfix holding INT32_MIN was undefined behavior
8008705978zfix::operator-() negated the raw value directly, and doAbs() used abs(); both are signed overflow when the value is INT32_MIN. Use unsigned negation instead, which wraps INT32_MIN to itself by definition - the same result real hardware already produced, minus the UB that let gcc miscompile sign checks.
Player
- Handle some out-of-bounds rpos calculations
cf61fadb3d - Remove hero position modification in scrollscr quit
aec7ee0da4This was the cause of a divergence when playing back a zplay between replay mode and assert mode. It's purpose was just to prevent a single-frame change to a replay comment during the z3 refactor. Let's just remove it now.
- Strings parsing after being told to close
e8c221c605In some circumstances, string parsing would continue slightly after the end of the string (when using a Warp or End String SCC). This could cause stray SFX to play for text that was not displayed.
Editor
- String index info typo
70fdb5d15b
ZScript
- Corrupted message strings read via the legacy encoding
423544c183In quests using the compat rule for the old binary message encoding, Game->GetMessage and messagedata->Get returned corrupted text for any string containing a control code argument of 254 or more.
Chores
- Update replay_uploads_known_good_replays.json
ac1a221929
Refactors
Player
- Move message string related code into separate file
76eb4e8dc5
Tests
- Handle compare replay report with no graphical differences
da86e3e3b4When a selected replay has no unexpected graphical frames, the compare report crashed on load with "Cannot set properties of undefined". Because the crash happened during init, the segment dropdown's change handler was never attached, so segment selection silently did nothing for every replay. Show an explanatory message instead, which also lets init finish and restores segment selection.
- De-duplicate identical replay tracks in compare report
e73a320510A platform that produced more than one results file (from sharding or a retry pass) showed each replay as two or more identical side-by-side tracks in the compare report. De-duplicate when merging results for the same platform.
- Flag allowlisted known failures in compare report
f281168efcReplays that are allowlisted as known failures (e.g. platform-specific rendering differences) still pass CI but leave behind "unexpected" frame snapshots. In the compare report these looked like real regressions. Mark such runs with a "known failure (passed)" badge so they are not mistaken for genuine differences.
- Surface non-graphical failures in compare report
25625d80f8Replays that failed on something other than a graphics check (e.g. a non-graphical comment/step assertion, or a crash) produce no snapshots, so the compare report silently dropped them - the failure was invisible unless a baseline happened to capture frames. Keep these runs and show a note explaining that the difference is in the replay step log, not the rendered image.
- Show replay stderr in compare report
83e1d4b9b1Display each run's stderr (e.g. the assertion message that explains a failure) below the tracks in the compare report. The text is loaded from each run's stderr.txt on disk when the report is generated, not stored in test_results.json.
- Include roundtrip files in compare report
4fde7a4ae1Link each failing replay's roundtrip (re-serialized) file from the compare report so serialization differences can be inspected. Roundtrip files are trimmed to keep all metadata fields, the first 100 steps, and the steps around each failure, so the report stays small enough to upload.