To help reduce the number of bugs in official releases, here is an unofficial prerelease build to give people a chance to find and report any obvious new bugs. The official release will come in a few days.
The Windows and Mac prerelease of 2.55.15 can be downloaded here. Keep this separate from your main ZC install. Once the version has been officially released, replace this prerelease build with one from official channels (the updater, GitHub, or zquestclassic.com). This link will expire at that point.
Use this thread to discuss or ask questions about the new changes.
Changelog:
# FeaturesRespawn Point Half-GridlockNew QR allows the new respawn points to lock the respawn check to thenearest half-grid (8px) position. This places you slightly further fromsome unsafe obstacles, and helps in certain edge-cases.New QR Rerolled Drops Always Roll 'Nothing'This works alongside the other smart drops qrs to help rebalance dropsets.If set, any drops that would be 'rerolled' always roll 'Nothing' instead,keeping the odds of each drop the same under all circumstances.This allows simply removing drops from the pool when they are unneeded,instead of requiring them to be rerolled into other drops.Both invincibility-granting magic items can now prevent knockbackIf knockback is prevented, the player can ex. walk over spikes without beingstopped / hit back.zc: Water/pitfall attributes for IFrames and Stun Frames- Allows customizing InvFrames after falling / drowning- Allows stunning the player (to prevent them from ex. walking directlyback into the water/pitfall) after falling / drowningzc: Cane of Byrna "Invincible Hero" flagImplement the Cane of Byrna's "Invincible Hero" flag, which was presentin the item editor but had never actually done anything. When set, anactive Byrna beam now protects the Hero from damage, the same wayNayru's Love (Divine Protection) does.zq: Improve some tile editor shortcuts- Ctrl+Arrows no longer prevent changing pages- Holding Shift makes the Alt+Arrows shortcut move in increments of 8pxinstead of 1pxzq: Improve tile editor quarter-tile draw modes"Diag Flip" was implemented wrong, acting exactly the same as 180 rotation-it has been replaced with "+Diag Flip" and "-Diag Flip" which properly flipacross the positive and negative diagonal lines respectively."Translate" has also been added, drawing at the same position in each ofthe 4 quarters of the tile, useful for minitile-drawing ex. for life meters.zq: Show combo label on favorite combo tooltipzq: Item Wizard for Stomp Bootszq: Subscreen 'hint' drawsSome things that would normally be invisible will have a 'hint' draw toindicate where and what it is in the editor (ex. Button Items, Text withempty string, etc).# Bug FixesAltGr key combinationsDitherblit ignoring clipping rectanglesAdd runtime SSE2/SSSE3 detection and fallbacks2.55.12 added fast-path code for some tile draws, which required CPUsmade in at least 2007 or later. Older CPUs would crash when executingthese unknown instructions. Now, the tile drawing code checks if the CPUsupports these instructions, and if not uses the slower drawing code.Preserve scroll position in new listersSwitchhook Block combo attributes overlappingThe 'Item/Dropset' attribute was in the same spot as the 'Break SFX'attribute! The 'Item/Dropset' attribute has been moved to fix this.If you were using 'Item/Dropset' before, you'll want to update yourSwitchhook Block combos.Continue hearts being improperly boundedThis led to high continue heart values wrapping around to lower values.Regressed in 2.55-alpha-120 (acb7c84).Prevent out-of-bounds write when loading a quest with an invalid combo countA crafted quest file could declare a combo count larger than the maximumnumber of combos, causing writes past the end of the combo buffer.Prevent out-of-bounds write when loading a quest with too many countersA crafted quest file could declare a counter count larger than the maximum,causing writes past the end of the counter arrays in the init data.Prevent out-of-bounds read from invalid DMap subscreen script indexA crafted quest file could set a DMap's active/passive subscreen script indexbeyond the script table, causing an out-of-bounds read and dereference of aninvalid script pointer when the quest is loaded or run.Avoid out-of-bounds read on unterminated enemy name in quest fileA crafted quest file could supply a 64-byte enemy name with no terminator,causing a string length scan to read past the end of the buffer.Avoid out-of-bounds read from invalid FFC combo index during quest loadA crafted quest file could give a freeform combo a combo index past the endof the combo buffer, causing an out-of-bounds read while fixing up old quests.Avoid out-of-bounds read from legacy secret-combo template indexLoading a crafted old-format quest could use a secret-combo value as an indexpast the end of the template screen's combo arrays, reading out of bounds.Prevent out-of-bounds write from invalid combo pool/autocombo countsA crafted quest file could declare more combo pools or autocombos than theengine supports, causing writes past the end of those fixed arrays.Prevent out-of-bounds write from invalid favorite combo dataA crafted quest file could declare too many favorite combos or an invalidper-row value, causing writes past the favorite-combo arrays (or a divide byzero from a zero per-row value).QR for chests/signs/lockblocks working above layer 2[mac] size default window using the screen's usable areaThe default window size on macOS subtracted a hardcoded guess for themenu bar and ignored the dock, so the window could end up larger thanthe available space. It now uses the screen's actual usable area, whichexcludes both the menu bar and the dock, and reserves the window titlebar at the correct size on high-DPI displays.zc: Sideview drowning softlocking the player forever sometimeszc: `Hero->Immortal` not clearing on quest loadzc: Per-quest controls resetting wrongly on Continuezc: Pitfalls not resetting attack timerthis allowed the player to be in the attacking animation insteadof the falling animation in some situations.zc: Ffc solid pushing of the player stopping too soonincorrect hitbox check was being usedzc: Lens hints showing during player death animationzc: Softlock with `No Scrolling Screen While Carrying` QR in NES dungeonsThis QR wasn't preventing the "suck" of bombed doors and walk-throughwalls from trying to scroll. This resulted in softlocking the playerbecause they were being permanently sucked into the scroll, while thescroll was being prevented by the carried object.zc: Standing state not checking properly for ffc platformsthis made it hard to jump when riding a downwards-moving ffc platformzc: Wrong offset being used for solid object pushingThese offsets would commonly be the same value, so, unlikely thisactually caused any issues yet.zc: Fix ePatra firing too early when ENEMY_FLAG7 is setWhen the "don't fire while looping" flag was set, ePatra could stillfire in certain attack modes (dmisc20==4 and default) regardless ofwhether it was mid-loop. Now all modes correctly wait until the loopfinishes before allowing fire.zc: New/Newer Hero Movement inconsistenciesSome spots were only checking for New movement which should've checkedfor either, causing inconsistencies between enabling both and justenabling newer movement.zc: Allow "255"/"0xFF" as transparent for more subscreen colorsSetting the `BS Dark` color to 0xFF in misc colors makes its minimaplook more similar to Dungeon/Interior minimaps.Some colors already handled this, but it was missing from places thatcould really use it.zc: Sideview drowning sprites being brokenzc: Sideview ground checks ignoring enemies' 'ignore solidity' flagThe code for "is the enemy standing on a solid" was using entirelydifferent code that didn't check this flag. Now it checks it when"Use 'Scripted Movement' for engine movement" is enabled.zc: Chests not checking all layers for Armos/`Chest->Item`this caused chests placed on layers > 2 to open without giving you anythingzc: Enemy bombs disappearing due to negative fuse timerzc: Bombs not resetting Timeout when explodingTimeout is meant to function as an alternate fuse for these, but ifit explodes before the timeout runs out, the timeout was leaking overto the explosion and killing it mid-boom.zc: Light beams not working properly during stepforwardzc: Item sounds sometimes being wrongly killedThe hookshot resetting code was killing the sound of the currently in-useitem, without regard for if that item was a hookshot or not.zc: Pushblocks not properly counting towards trigger groupszc: BS Overworld not respecting having the Map item or notzc: Enemy bad hitboxes for standing on the ground in sideviewEnemies with weird hitboxes may still have other problems, such aswalking sideways through walls, because enemy movement code is superjank- though the `Use 'Scripted Movement' for engine movement` enemymovement flag seems to help with those issues.zc: New respawn points not counting damage combos or slidey icezc: Solid moving objects interacting poorly with water/pitsthey now can push the player into pits, and no longer push the playerwhile the player is already falling/drowningzc: Prevent infinite loop in trig_trigger_groupszc: Combo general loop sfx cutting out when loopingzc: Knockback through sideview platformszc: Buggy solid platform sideview ffc collisionWhen moving at angles the collision for riding the platform was gettingconfused with the collision for solid objects pushing the player,knocking the player off the platform weirdly.zc: Shooter/crumble combos ticking when screen is 'frozen'zc: Prevent rng desync when manually ending replayWhen playing a replay file, selecting Quit in the menu caused an rngdesync dialog to appear. Now, the program actually closes.zc: Deterministic high-precision math for gameplay and replaysWhile recording a replay, trig (Sin/Cos/Tan) switched to a low-precisionlookup table, so simply having a replay enabled could change gameplay.Separately, ArcSin/ArcCos/ArcTan and Ln/Log10/Pow always used thesystem math library, whose results vary across platforms and compilers -a source of cross-platform replay desyncs. All of this math is now bothhigh-precision and bit-identical on every platform and compiler:recording a replay never changes behavior, and replays cannot desyncacross machines due to math differences.As an example of how the old trig error presented: in Stellar Seas, aboss laser derives its collision geometry from trig, and the recording-mode error (up to ~0.001) was amplified by the script into "phantomhitboxes" - hits landing tens of pixels away from the visible attack,only while a replay was recording.Other user-facing effects:- Pow(2, n) and Pow(10, n) are exact, and Log10 of a power of tenreturns an exact integer, so digit-counting scripts behave reliably.- Replays recorded before this version still play back with the oldmath, bit for bit.zc: Walking/standing combo effects not blocked by bridgesthis includes the general tab sfx/spriteszc: Stomp Boots block flags being backwardsRegressed in 2.55.0 (de1cb2b).zc: Frozen scripts wrongly having draws stopped by running stringszc: SCC setting screen state of non-current screen using wrong mapzc: Bottom 8px bad collision using 4-way newer hero movementzc: Stop triforce pickup softlocking with low MP/HP counter settingsPicking up a triforce would freeze the game when MP per Block was setto 1-3 (or HP per Heart to 1). The refill animation never finished, sothe pickup cutscene looped forever and quitting crashed.zc: 1-wide gaps being hard to fall through in sideviewzc: Handle replay load failures gracefully with a GUI errorLoading an invalid replay could crash the program. Now, an error dialogis displayed when a replay fails to load.zc: Prevent previous qst misc data leaking to nextzc: Hammer triggering combos outside its hitboxThe hammer could trigger combos and secret flags above and behind theplayer, outside the area its hitbox was drawn. It was most obvious withthe "don't trigger while the hammer is in the air" item flag enabled: onthe first frame the hammer became active on the ground, it triggeredcombos where it had been a frame earlier, while still raised.zc: Armos combos with custom enemies not clearing the combozc: Large armos bad tile offsetzc: Auto Sidewarp combos not using the assigned Warp SFXzq: Remove unused wand attributes/flags from item editorzq: Tile editor rotations sometimes undoneCaused by a bug in tile caching code.zq: Preview mode combo cycling using bad colors for Ignore CSetzq: Water/shallow water combo wizard not setting levels properlyIf you didn't edit the `Req Item Level`/`Flippers Level` fields, they wouldstay at value 0, despite showing as value 1 in the GUI. For req item level,this could completely disable the passive hp mod.zq: Don't show confirmation on exit in new quest wizardzq: 'block' missing from 'Mirror (Custom)' attribute helpzq: Typo in ffc editor 'Swap' flags' infozq: Avoid potential crash when drawing doorszq: Clean up the string editor / add infobuttonszq: Respect "New Darkness Trans Layer Stacking" QR in editorzq: Clean up 'Button Counter' subscreen widget '?' buttonsstd_zh: CenterY for an item returned an X-based coordinateCenterY(item, false) used the item's X coordinate instead of its Y in thesprite-center branch, returning a wrong value. It now uses Y, matching thehitbox branch and every other CenterY overload.zscript: Show correct code location for script drawing errorszscript: Prevent DMap and hero scripts running twice on initThe first frame of these scripts were incorrectly running twice. Theexact behavior depended on whether these QRs are enabled:- "Scripts Draw During Warps"- "Passive Subscreen Script runs during wipes/refills"This bug only occurred if one of these QRs was enabled.zscript: Prevent crash from out-of-bounds sprite script IDszscript: Use proper gfx for script created sword beamsThis regressed in 9ca67c7b0 (2.55-alpha-120).zscript: `Game->CurrentItemID()` using a bad default value for bitflagszscript: Strcmp-family functions now always return -1, 0, or 1strcmp(), stricmp(), strncmp(), and strnicmp() returned the raw Clibrary comparison result, which is only guaranteed to be negative,zero, or positive - the exact value varies by platform and compiler.Scripts comparing the result against exactly -1 or 1 could behavedifferently across builds. These functions now always return -1, 0,or 1.zscript: Free script-owned objects when a script's state is clearedResetting or clearing a script's engine data did not reliably releasethe script objects that the script had taken ownership of. Severalscript types that run in less common ways (like active subscreenscripts) could therefore leak these until the engine eventually ran outof slots.Releasing owned objects is now an inseparable part of resetting orclearing a script's engine data, so it can no longer be skipped.zscript: Prevent crash when taking the modulo of the minimum integer by -1Computing the remainder of the smallest representable integer modulo -1crashed the game, in both the interpreter and the JIT. The result is now0, the same as any value modulo -1.zscript: Remove unimplemented `Audio->PauseCurMIDI()` and `ResumeCurMIDI()`zscript: Free objects owned by DMap and subscreen scriptsObjects and arrays that a DMap, OnMap, or active/passive subscreenscript took ownership of were not released when the script's state wascleared, leaking them until the engine ran out of object slots.zconsole: [win] prevent debug console from freezingThe named-pipe connection was treated as a hard failure when it didn'tcomplete instantly, popping a modal dialog that could hide behind thegame window (appearing as a frozen black screen) and orphaning thehelper console in an endless retry loop. Connect now waits with abounded timeout so a slow-to-start console attaches normally, and anysetup failure quietly disables the console instead of blocking the app.# Refactorszc: Copy cpos_update optimization from combos to ffcszc: Greatly speed up refresh_rgb_tables using last key cacheThis greatly speeds up the program within fade effects. Forterror_of_necromancy_demo6_32_of_54.zplay it reduced the total CPU timebeing spent in `refresh_rgb_tables` from 60% to 0.3%.zc: Optimize code for common dithering argsThis speeds up dithering by a lot - between 3x and 25x depending on theplatform.zc: [win] remove obsolete vsync workaround (use_dwm_flush)Remove a Windows-only screen-tearing workaround from the Vista/Win7era, along with its hidden use_dwm_flush config option, which is nowignored if set. It was off by default and is redundant now: thedisplay backend owns frame presentation, and desktop composition isalways on in modern Windows.zc: Greatly speed up dithercircfillzq: Improve FFC hover tooltips# CIUpgrade actions due to node 20 deprecation# Misc.Update rulesetszq: Remove darkness dithered corner by defaultEtc->Options->Toggles->Show Darkness Corner Dither toggles this Darknessnow shows a line in Screen Info, to less obtrusively indicate darkscreens.zq: Improve infotext for string editor 'Layer'

