ZQuest Classic The Classic Adventure Game Engine
Get ZC! News Community Docs Contact

2.55.9

March 16, 2025

View a summary of what's new in 2.55.

Features

  • show bottom 8 pixels acd97ba42  

    The bottom 8 pixels of the screen has always been hidden. This was considered to be a universally bad thing, so they are now visible. A compat quest rule is added to control this behavior.

    When the bottom 8 pixels are enabled, active subscreens are still just 168 pixels tall. Instead, active subscreens travel an extra 8 pixels when opened.

    ZC Player has a setting to configure this too. By default, it defers to the QR as defined in the quest, but users can override this.

Player

  • option to disable transparent darkrooms stacking multiple transparent layers d188ece0e

Editor

  • 'Reference Tiles' 42197305c  

    In the tile pages, 'RClick->Set as Reference'. This tile will now display on the left-hand side while editing any other tile, as a reference.

ZScript

  • Allow '_' to be used as a spacer in numbers 71a1233f9  

    Ex. 100_000 == 100000, 2_147_483_647L = 2147483647L, 0b10_10_10_10 == 0b10101010

  • add Game->HeroScreen cfdfc4f76  

    In 2.55, this is always equal to Game->CurScreen. In 3.0, this updates as the player moves around. Added to 2.55 for script compatability.

  • add Screen->Index 136e14652  

    In 2.55, this is always equal to Game->CurScreen. In 3.0 scrolling regions, the value of this varies depending on the context (for example, an npc script will have this set to the screen the enemy spawned on).

  • add itemdata::FlashCSet, improve itemdata::CSet 7b9ed5505  

    itemdata::CSet contained both the normal and flash csets, and required bitwise operations to access. It also didn't allow for setting the flash cset. Now, itemdata::CSet is only for the normal cset, and the flash cset uses the new itemdata::FlashCSet.

  • add Viewport 4f709c1a7  

    This global represents the currently visible playing field. In 2.55, this is all read-only and only changes during scroll transitions. In 3.0, the visible viewport can be modified by scripts, and updates as the player moves around a scrolling region.

  • add Screen->DrawOrigin 4a1cf781c  

    Determines how coordinates given to Screen drawing functions are interpreted. For more, see: https://docs.zquestclassic.com/zscript/globals/screen#globals-screen-var-draworigin

  • more value range types (.., =.., ..=, =..=) 7caa8a09a
  • add ComboAdjust for getting combo position offset by some pixels 799c50086

Bug Fixes

  • System menu mouse responsiveness c87cc947f  

    Holding left-click and dragging across menus now allows going through multiple 'submenus' at once, including going back up to clicked-on parent menus. These were features of the old menu system, which were lost during the system upgrade.

  • prevent crash when loading midi with 32 tracks b1094de6d
  • actually fix loading tile data for old 1.90 quests 17d5fb84c  

    2.55.7 (commit be55516) attempted to fix this, but used the wrong path to the classic quest. This commit fixes the path, but uses a new qst file with only the tile data (since classic_1st.qst is going to be removed).

    See: https://discord.com/channels/876899628556091432/1289597114594103378

Player

  • 'Platform' ffcs teleporting the player as the screen loads 93a5429a8
  • Game time shows in-game, even when you've 'cheated' 0578ac021
  • show hero position in minimap for most special screens 08f27d9c9  

    In the original Zelda, the dot in the minimap rendered even in special screens, except for dungeon passageways. ZC was never rendering for any special screens. Now, even item cellar / guy special rooms will render the dot on the screen the player came from.

  • update dmap charted state more reliably 7ee836aed
  • fix bad memory access when checking for sword tap 2895858aa
  • prevent OOB related to bridges in HeroClass::checkchest 79b897537
  • prevent many crashes related to sprite list being full e4cd9b3af
  • off-by-one error in y-position world bounds for a few hero attacks

      Relevant changes:

    • fix(zc): more off-by-one errors 73d8493c7
  • F5 map snapshot works again 00824cc75
  • some collision issues related to 4-way movement with no-gridlock enabled. acc401cc9
  • broken 'Z_Eventlog output related to ExStates [13f619b80`](https://github.com/ZQuestClassic/ZQuestClassic/commit/13f619b80794145aa36ddfeacb9cbf9eeef5cd0f)
  • prevent crash when loading save files from 3.0 b9f3f3184

Editor

  • lockblock/chest combo wizard bad field for counter amount 52a0b3d9d
  • Mixed weapon listers now show 'E ' before enemy weapons 12a65f01f  

    Previously, they would, ex., list 'Magic' twice, once for the lweapon and once for the eweapon. This changes it to list 'Magic' and 'E Magic' separately. This does NOT change listers showing only eweapons, such as the enemy editor's attack field.

  • 'BtnCounter' subscreen widget ui was crunched 535f42a6c

ZScript Standard Library (std.zh)

  • wrap angle in AngleDir4 and AngleDir8 679ac99f4

ZScript

  • keep modifications made during last frames before scrolling b481d37f2  

    When scrolling between screens, scripts can run for a few frames just before scrolling begins, but modifications to the temporary screen were not persisting during the actual scroll.

  • prevent many out-of-bounds reads/writes d249a6bc3
  • use correct upper limit when setting itemdata Tile 5a1f6d425
  • properly revert scope when processing class f2ec202d7

Refactors

  • remove classic NES quests from release package 978bc85b3

Player

  • show play time even when recording a replay 3cb36f31d

Editor

  • better error messages related to loading enhanced music files 199c902a5
  • drop "Load Tileset" and consolidate loading tilesets via File>New 8f83d0370

Tests

  • add nargads_trail_crystal_crusades/ffc_carryover.zplay bfc0ee182
  • add freeform_shutters.zplay e6ddc2633

CI

  • [win] update vcpkg to 2024.12.16 5df1a1a37
  • upgrade actions due to node 16 deprecation beb78a0cc

2.55.8

January 05, 2025

View a summary of what's new in 2.55.

Features

  • trigger flag 'Only Grounded Weapons' 20e29e5d6  

    Makes weapons that are in the air NOT trigger the combo (until they land)

  • subscreen counters can have separate color when "full" d815cfb3a

Editor

  • 'Whistle' item editor help text 87733ac41
  • large corner option for dungeon carving autocombo mode 99e126345
  • -smart-assign CLI switch to compile + assign 88d94ba3c  

    Example usage:

    ./zeditor.exe -smart-assign your_quest.qst

  • Item animation previews now preview 'flash' 03f304cc3
  • add Cambria as tileset option 7d41dad8b
  • hotkey for 'Show FFCs' (no default keybind) 28f57197c

ZScript

  • allow trailing commas in enum/array body declarations fefc046a6

Bug Fixes

  • correct bad version number used in 2.55 Alpha 86 fa022f93b
  • number picker dialog not using proper starting value 8c1b7066b  

    fixes some dialogs in Init Data

  • prevent crash when there are too many door combo sets 1a8794c71
  • Lift gloves with specific settings not allowing throwing e2c6edf6d  

    Gloves with Button=0 and 'Disable Item Use' set were unable to throw objects once picked up.

Player

  • Push (Generic) 'Opposites Cancel' flag not working properly with 0-push directions 41abab9b6
  • Add limit to genericdata->RunFrozen() recursion to prevent crashing fcfa741ba  

    Running too many frozen scripts at once caused a stack overflow crash, now it causes a script error message.

  • prevent potential crash from show walkability cheat 96267d91f
  • remove ladder during warp (#1017) 9d668a66b
  • when charging duration of Charge Ring is 0, use default time instead (#1023) 4923c5af3
  • remove jittery 1px gap when pushing blocks right/down 2a39e4d89
  • step triggers ignoring z-axis 4f0026223
  • triggered autowarp combos now use sidewarps eccc64d66  

    autowarps triggered by combotriggers use sidewarps. instead of tilewarps screenflags that make autowarp and sidewarp direct work with triggers now (as they should)

  • Custom Bush/Slash combo sprites not spawning centered on the combo a59f93106
  • incorrect dungeon check in map view 170d9237d  

    This resulted in drawing doors incorrectly.

  • bombed walls drawn incorrectly during scrolling e1cff3508

Editor

  • add more ? buttons to combo editor about weapon triggers 65e989e30  

    Clarified how the fire triggers work Renamed 'Any Fire' to 'Normal Fire' to better reflect how it actually works

  • some lists closing dialogs randomly when rclicked 33096f847
  • changing some options in options dlg wasn't updating rclick menu e5ed7a6b7
  • show tile 0's actual graphic for gauge widget tile selectors 0e6f66d50
  • Mouse Scroll setting not working on 4th combo column 29916995b
  • typo in subscreen gauge piece 'Units per Frame' help text 09e7c5e08
  • set explicit width for combo lifting drop-down lists 3ea9aac26
  • typo in push flag help text 8409561af
  • crash on importing combo aliases 888a5ec24
  • 'delay' animation preview was calculated wrong 775850d14
  • remove hidden combo selection mode toggled with spacebar (#1051) 46503dc88  

    Pressing space changed how combo selection worked in a way that often confused users. There was also no visible indication of this, so it was extra bad. This mode was perhaps useful for something in the combo selector dialog, but outside that it was seemingly not useful at all - and is now removed.

  • item 'flash' not previewing on main screen 97042f4f1
  • remove extraneous String, but guy is (none) warning 066fb4e6f  

    Due to various new features, this warning is no longer valid, as there are reasons to have a string with no guy, ex. Signposts

ZScript

  • prevent potential crash while compiling ternary expressions 52d4ef7f6  

    Regressed 2 years ago in dd975320.

  • fix codegen for long integer ^^^ constant 0 fd4d8ae25  

    This was accidentally producing 10000 instead of 1.

  • correct broken clipping of draw commands in some cases 37b9ded29  

    Some draw commands clip their contents based on whether the render target is the screen or a custom bitmap. However, the way this was tracked was broken, and resulted in all draw commands in the same batch following a single custom bitmap draw command incorrectly using the clipping bounds meant for just custom bitmaps.

  • properly allocate file list to prevent FileSystem->LoadDirectory() crash 346d46d03

Documentation

  • link to docs.zquestclassic.com/zscript in zscript.txt, ZScript_Additions.txt 72284f478

Refactors

Editor

  • rename boomerang range attribute to duration (#1048) 1657d1072
  • in Load Tileset wizard, enable all clear options by default 82819fab6

ZScript Standard Library (std.zh)

  • remove DMFS_SIDEVIEW since it was never implemented 29689de17

ZScript

  • log errors in ghost_zh when creating an enemy fails 445c75322
  • rename Game->LevelStates[]/Game->GlobalStates[] 440d29feb  

    previous names Game->LSwitches[]/Game->GSwitch[] are deprecated

  • add a few functions in preparation for z3 regions e5ac9267f  

    While 2.55 won't support scrolling regions, it will still have these following functions so that scripts may be written to be compatible with 2.55 and 3.0.

    Game:

    • mapdata LoadTempScreen(int layer, int screen)
    • mapdata LoadTempScreenForComboPos(int layer, int pos)
    • mapdata LoadScrollingScreen(int layer, int screen)

     

    Screen:

    • ffc LoadFFC(int screen, int index)
    • void TriggerSecrets(int screen)

Tests

  • correctly emit error when compiling unsupported ZASM 956953974  

    The -quick-compile and -smart-compile CLI switches were not correctly failing the program or printing an error message when encountering a bad ZASM command.

CI

  • use macos-13 for newer clang cd7d682dd

Misc.

Editor

  • add help text for conveyors about positive/negative values 240967771

2.55.7

October 19, 2024

View a summary of what's new in 2.55.

Features

Player

  • show save path in game details view 213a7da40

Editor

  • add "Auto-Save" and "Auto-Restart" options to test dialog 947bf60c3  

    The test dialog no longer prompts you about unsaved changes. Instead, a new option in the dialog "Auto-Save" will save for you just before launching test mode. This defaults to on, but can be disabled.

    Additionally, the existing "Auto-Restart" option was moved from the launcher to the test dialog, where it belongs.

  • show error reason when failing to load quest d722f60f3
  • dense forest autocombo mode bf032786e
  • extension autocombo mode, for resizing things along one axis 0cd0fdd0b

Bug Fixes

  • mapscr::numFFC() no longer returns 1 when there are 0 ffcs 8219f9537
  • issue where double clicking could stop working in lists 7ceba6735
  • load NES tiles for old quests without tile data 197b5d43b  

    Some 1.90 and older quests save no tile data if they just used the default NES graphics. That broke sometime around 2.50, resulting in crashes or random behavior when loading these rare old quests.

  • [mac] Change all CTRL shortcuts to CMD, and allow CTRL in hotkeys c01ae362a  

    The hotkey system already used CMD instead of CTRL, but many old allegro shortcuts were still checking CTRL on Mac (like copy/pasting text). Now they use CMD.

    Also, can now use CTRL when configuring hotkeys on Mac.

Player

  • for old quests, darknut shields no longer incorrectly break when hit with hammer 19a3a2ea5
  • supress Z_eventlog when game is not active fbadf441c
  • improve error handling for saves in titlescreen 471691cd8  
    • When loading a save file failed, the program would exit. Now an error message is displayed
    • Previous places that showed a generic save-related error message are now more specific
    • Fixed a few things that were causing errors related to saves when canceling during save slot creation
    • Canceling the dialog that pops up after creating a new save slot now deletes the save, rather than it defaulting to classic_1st.qst
  • New mirrors hanging the game when using their 'Block' feature f7d89849f
  • avoid crash on magic relections when sprite list is full fe45f6764
  • handle screen transitions on slopes in sideview mode 4e4531354  

    Slopes bugged out big time when moving between screens in sideview mode, shooting players across the screen. That is now fixed, but one should avoid starting upwards-stairs on the edge of a screen, as the player still does not traverse up it when entering from the other side.

Editor

  • reenable floating selection for dense forest 287e74d84
  • lifted duplicate combo and combo 0 restrictions from autocombo types that did not need them. 2f2dc2015
  • reset animation in item dialog on selection change a89fe8cae
  • set track to 0 when updating dmap music 279fcd2fa  

    This prevents a bug where an invalid track could be selected when changing the tracker music file in the dmap editor.

  • fix Preview mode not working when opened from top menu c5190ea0b
  • prevent crash when saving test init data 2469c962e

ZScript

  • remove a bunch of unnecessary logging 5b9d5a992
  • constants at script or namespace scope counting against the global variable limit 5f58b5423
  • properly handle optional params not being compile time values 748697ca7  

    If an optional parameter was not a defaulted to a compile time value, the compiler inserted a random value instead. Now it will emit an error.

  • fix off-by-one error in shopdata 27f4c5e8b
  • show useful error message when single-quote char string is too long ec93dabfe
  • fix combodata Flag, NextData and NextCSet 1aec2f4c6  

    These were never correctly implemented.

  • remove bogus error log when using ArrayCopy f5afaae9b

Documentation

ZScript

  • fix order of arguments in DrawString on webdocs 11c589a84

Refactors

Player

  • improve how title screen assets are loaded 7b0e780a7  
    • Use title_gfx.dat instead of default.qst. This file is smaller and so is quicker to load (200ms -> 100ms on my machine)
    • Don't reload the assets if they are already currently loaded. Previously this file was unnecessarily loaded multiple times while simply navigating the save select screens

ZScript

  • remove unused ->ScriptEntry, ->ScriptOccupancy, ->ExitScript a7f06c78a
  • always show script context when logging errors 48f515d04  

    Previously the "Print Script Metadata on Traces" QR had to be enabled to show what script caused an error. However, this context is always useful for debugging and so should always be displayed.

2.55.6

September 09, 2024

View a summary of what's new in 2.55.

Features

  • configurable charge step for enemy rope walk style (#953) f01c2d522  

    If "Walk Attr." (aka misc attribute 10) is >0, enemies with the "Rope" walk style will use that custom value for the charging step.

  • use allegro 5 for DUMB tracker audio (mod, it, s3m, xm) c8c5d3569  

    The listed tracker formats now support setting loop points in the DMap Music tab, including setting the speed / position in ZScript. Note, the only enhanced music formats that do not support these features now are: spc, gbs, vgm, gym, and nsf.

    This also happens to fix an issue where tracks that have builtin loops were incorrectly playing silence before looping.

  • support delete keyboard shortcuts for most text controls e6a3ff822  
    • Ctrl+Backspace (Mac: Opt+Backspace) - deletes from cursor to next word boundrary
    • Alt+Backspace (Mac: Cmd+Backspace) - deletes from cursor to beginning of the line

Bug Fixes

  • improve key input latency by simplifying d_vsync_proc cbf5f0eb6
  • call allegro_exit before exit to avoid rare hang seen on linux d9b0b8d67
  • generate correct version string for 1.92 quests 24de952ee
  • ctrl+a,c,v work again in text fields 4280a7ef5
  • use correct conversion from 6-bit to 8-bit colors db551f976  

    Multiple places converted 6-bit colors to 8-bit by just multiplying by 4, which is wrong (ex: 63 * 4 = 252, but 255 is expected). Now we use a lookup table. This fixes:

    • The hex color shown in palette and tile editors
    • various components drawn in the editor (like the minimap)
    • exporting jpg images
  • prevent crash when deleting all text in some input fields b492be6b3

Player

  • Damage combos with Custom Damage not working on FFCs cdf6736b5
  • correctly restore sword/potion/triforce items with fairies in pre-2.55 quests 0a5af9c70
  • restore palette after wavy effect 4c9bb4688  

    The wavy effect was leaving the palette slightly off what it should have been, which was making the colors slightly saturated until the next time the palette changed.

  • do not ignore replay forever if save has not been played yet 5315b9e8f
  • draw decorations correctly during scrolling 98ca34d88  

    Some decorations (like combo sprites) are drawn without the correct offset during screen scrolling, and worse were not disappearing after the end of the scroll (not until its animation naturally finished). Now these decoration sprites are drawn correctly during scrolling, and get removed.

  • lockblocks on layer 0 no longer ignored in cave dmaps if locked door present bacf7e3d9  

    Context: https://discord.com/channels/876899628556091432/1278165595321405554

  • pause music when opening player data with cheat shortcut bf75a402a
  • avoid crash in Go To cheat by checking destination is valid 03db97be2  

    This cheat dialog expects you to input the screen number before any DMap xoff is applied, which can result in directing the game to load an invalid screen and crash. Now the screen is validated, and the xoff is displayed next to each DMap in the dropdown.

  • fire trail weapons glow in dark rooms, just like flames 8b4b84d2c

Editor

  • prevent dmap editor crash when map is no longer valid 3fdf19026
  • prevent various quest report crashes 0be115688
  • set the default values for patra's (2 and 3) inner eyes 5cba3160c
  • reduce latency on combo page paste 35c4e18bb

ZScript

  • scripts no longer use wrong context after many sprites created 1fe2717be  

    After 65536 sprites have been created without closing the player, the ID of subsequent sprites was too high for how the internal script engine stored the state for each script. This resulted in randomly using some other script's state, causing general mayhem.

  • LoadDirectory always failing due to bad path validation 6cad0f194

Build

  • upgrade to latest GME 9cbfda0c3  

    https://github.com/libgme/game-music-emu/compare/6b676192d98302e698ac78fe3c00833eae6a74e5...05a2aa29e8eae29316804fdd28ceaa96c74a1531

Refactors

  • reduce amount of copying in readmaps f64f9497e  

    This makes loading yuurand.qst 21% faster (2445ms -> 1927ms)

2.55.5

August 04, 2024

View a summary of what's new in 2.55.

Features

Player

  • add opt-in automation for uploading replays 2cee0ae2a  

    When enabled, once a week replays are uploaded to a server when the program exits. Only replays of known quests from the database are uploaded. There is also an option to manually trigger this process rather than enabling it automatically.

    Please consider enabling this, as it greatly helps out with development by allowing us to prevent bugs. This is important for any new features we add, but extremely so for the upcoming Z3 scrolling overhaul.

    See docs/replays.md for more information about the replay system.

Bug Fixes

  • avoid crash when loading midi using native file dialog 509bbf169
  • capture allegro 5 systems logging in allegro.log a91036ff2
  • crash in native file picker from bad string 2f194bff2
  • sprite drawing not deleting all bitmaps it created 98d5483a2
  • crash when file prompt initial path has no slash b8b24753f

Player

  • kill all sound effects for passageways, item cellars, and when stepping out of a warp (#942) 4f6c66419
  • [windows] save path being cut off in log bea620a61
  • resolve replay qst against quests dir, handle missing file better 507ab28a1
  • prevent replay save from happening on title screen 728fb9c4a
  • also save replay when selecting Quit Without Saving 5ee702ed0
  • shadows for rocks and boulders not drawing 23ead9542
  • side shield flags on npcs being flipped when facing left/right 957326fb7

Editor

  • [windows] Load Tileset with native file dialog no longer busted 55d043f0f
  • wording consistency issue (trigger should refer to the Triggers tab) 08f705958
  • some number entries (using SWAP_ZSINT_NO_DEC) being broken. dd7ba17db  

    Notably fixes many spots in the "Insert SCC" dialog, and some in combo wizards.

  • death/spawn sprites not properly updating on tile move b2ad04786
  • mark ffc count dirty when using Paste Special > FFC fb8c31b60  

    This was preventing FFCs from being retained on a screen when using the special FFC paste mode.

  • restore proper animation speed for combos in screen view 32edeb2f5

ZLauncher

  • remove defunct "Allow Multiple Instances" option e84d5e849

Build

  • upgrade allegro e00aabb87  

    https://github.com/liballeg/allegro5/compare/549f189df3408bba27524763289545f20771c3b0...c6b10fff225a0c94e2785e2e2d6d99a2f068ccf4

  • enable type-limits diagnostic as error, fix many issues found b94cfebea

Refactors

Player

  • remove epilipsey dialog on fresh install, add toggle in launcher 9b68154d0
  • remove prompt about recording when starting a new save file f0d809b6f

Editor

  • add sub-menu for changing tile color depth d94402f04

ZScript

  • remove unused greyscale and monochrome filters 253b4246a  

    Removes these methods:

    • Graphics->Greyscale()
    • Graphics->Monochrome()
    • Game->GreyscaleOff()
    • Game->GreyscaleOn()

     

    None of these are used in published quests, Graphics->Tint() and Graphics->MonochromeHue() can be used instead, and removing these simplifies some rendering logic.

  • remove option to configure run function name 561bb71a6

Misc.

Player

  • add qst_title, qst_hash as replay meta fields dd5d65044

2.55.4

June 27, 2024

View a summary of what's new in 2.55.

Features

  • add 'Note' item wizard, notes can play relative strings now b55a47b39
  • add enemy flag to control if affected by "Kill All Enemies" b102f3fb0
  • add option to use the native OS dialog to select/create files 5953252f5  

    A new button allows using the OS dialog to select/create a file. This can be used directly by setting the Native File Dialog option in the launcher.

Editor

  • show CSet in combo pages b6b0f0365
  • hex entry for string control code dialog 6d5b46655

ZScript

  • allow function return and parameter types to use [] 9a797f67c  

    This doesn't enforce array types, but allows 3.0 scripts to be backwards-compatabile with 2.55

Bug Fixes

Player

  • npc scripts for many enemies ending after one frame 5c44cb6ba  

    Enemies larger than one tile use a different code path than other enemies, and that path was mistakenly only allowing scripts to run for a single frame.

Editor

  • prevent invalid string access resulting in crash a29a80185

ZLauncher

  • hide update tab on linux 843167862

Build

  • add cmake install commands for linux 139839098
  • update GME, which should resolve the final gcc build issue 154ac73e7
  • set default install folder on linux to ~/zquestclassic b982a1f5a
  • generate changelog when doing linux install 592236643

Refactors

  • remove expensive busy loop in render throttler 218b38ec0  

    Replaces a busy loop with a much cheaper mutex condition variable to control FPS.

    The maxfps option now works for values less than 60 fps.

Player

  • add cache to generation of translucency tables 10d8b84c0  

    This took up a lot of CPU time during the titlescreen and during animations such as screen wipes / triforce pickup / etc.

ZScript Standard Library (std.zh)

  • delete unused and unwanted stuff 5291c4cd2  

    These files have been deleted from the std library:

    • std_zh/assert.zh
    • std_zh/astar.zh
    • std_zh/infostring.zh
    • std_zh/math.zh
    • std_zh/std_legacy.zh
    • std_zh/std_meta.zh
    • std_zh/std_update.zh
    • std_zh/std_user_defs.zh
    • std_zh/std_vars.zh
    • std_zh/weapon.zh

     

    These files either do not belong in a standard library (too specific), are not finished, or otherwise provide little to no value so are just a maintenance burden.

ZScript

  • reduce the scripts included by default 0891e663c  

    This removes some scripts that aren't useful, or aren't a good fit for default inclusion.

    • delete gameover_menus.zh
    • delete LISP.zh
    • delete Music.zh
    • delete sprites.zh
    • delete styles.zh
    • delete theRandomHeader_v2.zh
    • delete ZVersion.zh
    • delete tango/1.0 and tango/1.2 (keeping just 1.3)
    • move sram.zh to deprecated/sram.zh
    • move theRandomHeader_v3.zh to deprecated/theRandomHeader.zh
    • move time.zh to deprecated/time.zh
    • move example scripts to headers/examples
    • remove std including EmilyMisc.zh - include yourself as needed

Tests

  • add newbie_boss.zplay and recompile test 094702d13

Misc.

ZLauncher

  • remove tounge-in-cheek tooltip from Fullscreen checkbox d672593ca

2.55.3

May 16, 2024

View a summary of what's new in 2.55.

Bug Fixes

  • correct the version string for 2.55.x releases 387e6c05c
  • incorrect default right string margin ae1c890e7

Player

  • visual text bug in sound panel 32a169b2f
  • active shields interacting with light beams while inactive 7e52830f0
  • reset playing_field_offset at beginning of scroll 5e1f431eb  

    This prevents the draw offset from a quake from persisting during a scroll.

    See https://discord.com/channels/876899628556091432/1238226802867048529

Editor

  • "Used Tiles" completely failing to calculate 4066823d5

ZScript

  • TraceS parameter not compiling correctly 2761eb50b
  • handle engine subscreen in ScriptTypeToString 150aafa9f
  • dealloc owned objects for all combos in loadscr e9438011a  

    For some reason, only the combo at position 0 had its owned objects deallocated when loading a new screen. Now they all do.

Documentation

Editor

  • touch up attack/whimsical ring help text ('damage' -> 'power') 9879b835f

Refactors

Player

  • rename the "ZScript Debugger" to "ZC Console" 719738e74

ZScript

  • remove ZASM debugger b3b79f66e  

    This was already made inaccessible from the GUI in 1da2d02, but now it is removed entirely. Work on a real debugger will begin soon.

  • tweak Region-> and screen script internals in preparation for z3 e02113363  

    Region->OriginScreen is now of type screendata, and Region->OriginScreenIndex is added to return just the screen index.

    Similar change made to Region->GetScreenForComoboPos(int pos).

  • use faster register allocation in jit c6da3fe63  

    asmjit's register allocation was using a bin-packing algorithm. This turns out to be very slow for the assembly that our jit compiler emits, since the vast majority of variables exist for only a single basic block. Instead of bin-packing, the much faster and simpler linear scan register allocation algorithm is now used.

    For a very large 200k-instruction script, compilation went from 19.5s to 2.8s (a 85% decrease).

    With this improvement, the 20k-instruction limit for jit has been removed. One example of the impact of this is that yuurand.zplay, which the jit compiler was previously mostly disabled for since most of its scripts are huge, now has all its scripts compiled. This increased the average FPS for yuurand.zplay from ~320 to ~2000, while still reducing the total time spent compiling.

    Theoretically this change in register allocation may produce slower runtime code, but there was no drop in FPS realized in the maths.zs stress test.

Tests

  • add eiyuu.zplay b119635bb

2.55.2

April 22, 2024

View a summary of what's new in 2.55.

Features

Editor

  • 'Notes' per-screen for editor use 4ed3e71bc
  • ffc editor now previews large ffcs 20ba0bc09

Bug Fixes

  • Improve dropdown numerical search e9e127f73
  • update 'default.qst' aa948b117  

    Several default subscreen fixes (some by P-Tux7, some by myself)

  • reduce sfx buffer to decrease lag caused by e7c214e ef8ce36a9
  • removed flag that was breaking mod playback b7ac0c6a8

Player

  • hardcode 120 for zscript alpha register 80b70b43f  

    This fixes some quests that only look at the alpha version and, seeing it was now 0 presented an error message to the user.

  • 'delete' within a destructor being buggy 3c86a76b8
  • 'Spotlight' combos on changer/ethereal ffcs still shooting light c04ea1ba6
  • fix buggy color flickering on big player sprites bb644e0c8
  • some variables being improperly reset on 'Continue' 489e32212

Editor

  • 'View Map' favorite command skipping menu 0a21ba8ff
  • avoid overwriting screen bookmarks on quest load d1386ba10
  • 'Gen Flags' being missing from combo advanced paste a50934b68
  • Crash in ZInfo menu if descriptions are long cef01b5c1
  • crash on reducing map count ba8f2dfd5
  • warp dialog selector mishandling negative dmap offsets 19917e9f7
  • upgrade tile+combo 'move' code, more things now update on moving tiles/combos 6aae56ece  

    Also fixes some issues with 'undo'ing moves, and adds Combo Protection for in-use combos.

ZScript Standard Library (std.zh)

  • update to remove use of 'deprecated' functions/vars 61cccce71
  • 'TRIGFLAG_' constants were off-by-one at a certain point in the list f2fc4df01

ZScript

  • some array-related functions breaking for arrays >65535 in size 9c5d9aed4
  • class variables not shadowing global vars properly 8d7658367
  • some wrong error messages related to mapdata FFC access 9909f5c1b
  • disallow casting custom objects to unrelated types 8a48221a9  

    A bug in type conversion allowed this code to compile:

    Object obj = new Object();
    int number = obj;
    int numbers[] = {obj};

    The above code now produces a compiler error.

  • handful of zasm commands using wrong name 960da1145
  • handful of zasm commands using wrong name 40537d3ab
  • Trace(string) using wrong register d845df6a8
  • wrong names for zasm npc InitD and item WeaponHitWidth 324d86cac
  • various symbols with broken compiler output 982ec4d75  
    • npc->Attack()
    • npc->CanSlide()
    • npc->ConstantWalk(int[])
    • npc->ConstantWalk8(int[])
    • npc->FloatingWalk(int[])
    • npc->HaltingWalk(int[])
    • npc->HaltingWalk8(int[])
    • npc->isDead()
    • npc->NewDir8(int[])
    • npc->Remove()
    • npc->Slide()
    • npc->StopBGSFX()
    • npc->VariableWalk(int[])
    • npc->VariableWalk8(int[])
    • Trace(char32[])
  • remove some unimplemented symbols and correct some types fd4e4b434

Documentation

ZScript

  • add documentation regarding 'Hero->Warp()' and its return square b90683ccb

Refactors

ZScript

  • better 'read-only' compile warnings a58cf4f05
  • deprecate many getters/setters, replace with variables 7a20dab49  

    ~40 built-in methods exist in this style:

    int Max(); // Returns the max.
    void Max(int value); // Sets the max.
    int GetCurDMapScreen();

    These have been deprecated and replaced with a variable, like so:

    int Max; // The max number.
    int CurDMapScreen;
    

Tests

  • add tests for read-only vars and deprecation d8d56745e

Misc.

  • update themes 702396d7f

2.55.1

March 14, 2024

Features

  • include The Deep quest in release package db28a4c7f

Bug Fixes

  • generic script InitD[] not working at all cf430d9ea
  • increase sfx buffer to prevent "Out of buffers" log spam 96833f2d8

Player

  • improve replay stop process for update mode 3a97716b4
  • check if save slot is valid before loading d6cefc9da
  • fix crash in Options>Snapshot Format b41a7134d

Editor

  • minor typo in Export DMaps title 99f775c1f
  • correctly handle variable length title in all dmap reading/writing c9f4ab06b  

    6bd8a9a added support for variable length dmap titles, but only for the main dmap reading/writing code. This functionality is duplicated across dmap import/export and other places, but wasn't updated.

ZScript

  • verify first index for screen_d 9edf63b54  

    This fixes a crash in Titan's Gate.

ZLauncher

  • "Static for invalid data" option not working in zlauncher 0e11d6c12

Tests

  • include palette in gfx frame hash dd1c45ffd
  • fix hash for compare replay image dedupe e5b86f3c3  

    The previous hash did not take into account the image format's color palette, so hash collisions prevented some failing frames from showing.

  • fix --split-threshold cli arg for split_replay.py 71f99233d
  • add the_deep.zplay d2d5c9138
  • add enigma_of_basilischi_island_basilse.zplay a48f508e3

CI

  • upload releases to s3 bucket 86707c7d6

Misc.

  • add min replay size threshold when splitting replays 3b76d7982

2.55.0

February 20, 2024

View a summary of what's new in 2.55.

Features

  • Allow disabling resizability of windows (setting in launcher only) 90085dd84
  • add 'Script1'-'Script10' shield blockflags, to block specific scripted weapons. de1cb2b66
  • add burn-based light radii for items, to change the glow radius when lit on fire. 5f829d628
  • LW_REFARROW, LW_REFFIRE, LW_REFFIRE2 (reflected arrows, fire, fire2) 27c41e1f2

Player

  • Custom mirrors can 'block' instead of reflect per-direction 9ce509792
  • option to show game time in the corner, for all those speedrunners out there 05449497b

Editor

  • Add warnings to combo editor (can detect problems and warn you about them) 05188bddf
  • Merge 'Favorite Command' and 'Hotkey' systems cbb1ee991  

    Any 'Hotkey' can now be set to a favorite command, and all old favorite commands now have 'Hotkey's. Favorite command buttons will clear upon this update, as the configs have changed.

  • Hotkey cheatsheet, open with Shift+? 2f0f07d43
  • Item Wizard (Shields) bcf109db2
  • support multiple palettes in map preview/image export f207fda3f
  • various updates to default.qst (File->New) 0a53ec393  
    • Add sideview swimming tiles
    • Add charge-swimming sprites
    • Add Bunny Link - this required expanding the pages per LTM from 1 to 2
    • Add BS/Z3 swimming tiles
    • Add the missing enemy tiles from Outlands
    • Magic Pols Voice now uses CSet 10, to make room for ...
    • Add Whistle Pols Voice: blocks arrows like a Magic Pols Voice, but is a One-Hit Kill via the whistle. Uses CSet 7
    • Improve the lifting and holding sprites
    • Improve Z3 Octorok tiles (Slow Fire and Bomb Octorok)
    • Update credits on page 109
    • Convert Bug Net to use 4-bit colour
    • Fix enemy bombs using CSet 6
    • Delete unused scripts in the tiles
    • Delete unimplemented Sprite 088 (Firework)
  • set test_mode_record option in test dialog directly 356066ed5
  • export/import strings to .tsv text file 1e1af9db1  

    Allows for exporting strings to a spreadsheet, text editor, or other program for modification, then importing them back to ZC.

    The first row of the .tsv (tab separated values) file are the column names, followed by an example row to designate where the first three lines begin and end for each string (but you can add more lines than that).

    For best results in a spreadsheet, "Freeze" the first two rows and use a monospace font for the "message" column.

    Example: https://docs.google.com/spreadsheets/d/197-NSvNQJ174Ri9GVlxYDX4oFp8w1SZbmOXuDohKZZk/edit?usp=sharing

  • fix some tiles in default.qst (File->New) e342a0335  
    • Fix wrong assignment of lava drown tiles
    • Delete redundant diving tiles in Z3 player tile pages

ZLauncher

  • set save folder 0269d0102
  • add options for window size, and cap max default window size 47b273d89  

    [ZLAUNCH] window_width, window_height in zcl.cfg

    Cap max default size to 2x

Bug Fixes

  • prevent clock shifts from hanging the program b379a0ed9  

    Allegro 5 doesn't use a monotonic clock that ignores suspended time, so day light saving shifts or even hibernating your computer can result in Allegro trying to do so much work to "catch up" that it hangs the program. See https://github.com/liballeg/allegro5/pull/1511 for more.

  • shift key input no longer accidentally ignored c92f096a0
  • passive (non-button) items not respecting "Usable as a Bunny" flag 84d7f07e8
  • ZScript metadata fields cutting off at semicolons in strings ab92b22e7
  • 'box_out' popups sometimes appearing squished in the upper-left ced3bfb71
  • default bs patra has broken animation e846caa2f
  • newer hero movement ladder polish 172c7a5ef
  • fairy npc not despawning when picked up 45dfdd547
  • being able to carry objects while swimming, when lift glove isn't swim-capable d06f44a33
  • 'Push (Generic)' combos not properly locking into place on block triggers 80845040c
  • deleting subscreens resulting in invalid/crashy data a29918a05
  • arrow key navigation in menus not resepecting hidden items 883c2305c
  • prevent 1.90 qst load compat from setting first dmap cont/compass to bad value f1e3c5bcd
  • ZScript access to subscreen elements was missing a 'transparent' color option 96c306004
  • zasm metadata not clearing properly when assigning slots 33bb31162
  • implement set volume for GME music (spc,gbs,vgm,gym,nsf) 76091a598
  • Enemy Flames not reflecting off of shields, even with reflect flag set 2264bb083
  • issues with numbers between 0 and -1 1b44e3b2c
  • swords not updating properly, sometimes 915670436
  • old quest subscreen minimap titles overlapping dc548320e
  • placing flags on layers not marking the layer screen as "valid" 8c74b7296
  • ensure file is closed when qst fails to load c702f24fc
  • retain monitor resolution for fullscreen mode 981c6c1f9  

    Previously, the maximum monitor resolution would be used when using fullscreen mode. That was bad because it messes up the window layout of anything else on that monitor. Now we create fullscreen displays without changing the resolution.

    Also, no longer destroy and recreate the display to change fullscreen/windowed mode. Switching between is much smoother now, and the code got a bit simpler and safer.

  • changer ffcs counting for trigger groups and similar effects (they shouldn't) e9d91d8fa

Player

  • Music not properly changing when using some warp types (ex. SCC warp) 0aef5384b
  • extra pushing allowed per screen 8a798d0dd
  • cheats menu being greyed out when it shouldn't be b24044c87
  • new respawn points not accounting for dmap offset d90410dcd
  • initialize fadevolume to avoid undefined behavior 437c27b25  

    This fixes a bug where music would randomly be silent or extremely loud.

    Also, cap the volume used to play music to 255, to avoid ever playing it so loud again.

  • set volume correctly when music changes with only fading in or out 9274a675b  

    For example, if the new music has a fade in frame duration of 0, and the old music has a fade out frame duration of >0, then the new music would incorrectly have its volume stuck at 0%.

  • menu bar unaligned with dropdown due to menu using int scaling f8222be89
  • Swim speeds not being saved to save file 2bbf51a02
  • spotlights with color setting '0,0,0' or tile setting '0,0' now function 8da01272a
  • Allow throwing lifted object without validating cost 498f70f46
  • thrown weapons now should hit enemies that they land on b11265992
  • all 'break on landing' weapons should hit enemies/the player that they land on fed7aab0b
  • correctly make qstpath relative to quests dir in "custom_game" dialog 019c880c6
  • use correct sav path for -standalone mode 9346ac6a8
  • prevent bad module path being set after exiting 3a4e16d4b
  • improve main menu responsiveness 5dd96666e
  • system menu not closing on reset/quit/etc 049532ccd
  • fix 'warp' SCC sometimes not closing the string 7601d2fb7
  • use more performant throttleFPS instead of rest in system menu 0de39b360
  • remove accidental double compilation for global scripts f30fd983f
  • draw to correct bitmap when showing button clear prompt 6e204d4fc
  • minor replay determinism bug for subscr_item_clk (selector animation) 825844706
  • only assign save path just before actually writing to disk 603e96444
  • call saves_do_first_time_stuff when changing slot qstpath db4cf98c2
  • handle edge case when changing unplayed save file qst 79564453f
  • prevent calling dmap script twice in scrolling dmap warp e8edc34e9
  • set previously unset save_t write_to_disk in all places adca2b376
  • not showing error dialogs in title screen, and unbreak -only switch c32a29d1d
  • clear spin state during screen scroll 7ca93107b  

    This avoid a ghost sword visible during scrolling, and also prevents a nasty bug where the player's action state would be frozen until hit.

  • prevent crash in save creation by resetting global vars 2b3c4119d  

    When a game is loaded, many global variables are initialized to a known state. These variables were not reset when the game ends and returns to the title screen. However, save creation happens to call code that checks the active subscreen pointer, which was invalidated. Accessing this could randomly crash or corrupt the program.

    Now, these global variables are reset also just before loading the title screen.

  • prevent failing to save after continue 870510c96
  • lift glove 'disable item use' not stopping sword SFX from playing 3e6fe6e05
  • remember last save slot position when returning to save select screen a3bc81309
  • [win32] invisible hero because of MSVC bug 511934cea
  • remember cheat on continue game 99675afa2
  • 'Custom Weapon' itemclasses rounding down step speed 8f4b63428
  • restore option to scale display to full window size b618eb983  

    This broke when the display was fixed to only show at the correct aspect ratio. Default is still as before, but now the "Force Integer Values for Scale" option works again.

  • still allow for game area to be stretched, ignoring aspect ratio 381583118
  • ignore gamepad input when window is not active 646ef8f08
  • weird newer movement edge-case 0dd159abb
  • opening spacebar map triggering some secret effects on the current screen c1d9c1dca
  • lens unintentionally making enemies sometimes invisible 1a9273955
  • lens unintentionally making enemies sometimes invisible 111569113
  • Divine Escape particles sometimes flying in wrong directions d2472cceb
  • crash when running replay without any real saves f90cb0253
  • remove unnecessary absolute path check for standalone mode saves ed4afb985
  • show final game frame when opening/closing subscreen 07dddb5e9  

    For older quests utilizing none of the QRs related to "cool scrolling", the subscreen open/close crawl would show a version of the game frame that was missing a few things, like enemy or player sprites.

    This should allow us to simplify the rendering (no need to render most things twice to a secondary bitmap), and just looks better.

  • do not stretch GUI fad67d962
  • tall grass on layers not applying its sfx/sprite 76f952fc9
  • fix snapshot with NOSUBSCR not supplying a palette and not accounting for NOSUBSCROFFSET 45bf325cb
  • set default volume to 100% instead of 25% 8a4f7cf2e
  • prevent grid aligning while jumping, which broke jumping for some old quests 2d8a18875
  • for replay mode, whistle sfx pauses game for number of frames proportional to sfx length instead of 0 frames 1f38de5b0
  • hero action "swimhit" incorrectly unset due to broken isSwimming() check 8b10722d8
  • combo cycling reset too early for animations with frame skips 601cba74f  

    Turns out this never worked properly!

  • defer deletion of sprites to end of animate logic 548c3e15d  

    This fixes a crash caused when a sprite deletes itself in middle of its animate logic.

  • prevent OOB access for darkroom ditherrectfill 07dfbbe3f  

    When scrolling, this function could be told to grab a line of the bitmap memory outside its bounds, which resulted in a crash.

  • reset global variables on continue game for replays f3b34561f
  • actually stop mp3/ogg 994d743dc  

    Due to a bug ogg and mp3 formats were really just "paused" when told to stop, so setting the volume afterwards would result in resuming music that was meant to be over.

  • ambient/background sfx volume not being set 52594bfc7  

    The recent removal of "digi_volume" made all background sfx play at full volume. Fixed that.

    Additionally, fixed a bug in the sound dialog that skipped the first sfx when adjusting currently playing sounds to the new volume. That first sfx is often a background sfx.

  • various slope improvements, like fixing ffc slopes f80e024ca
  • fix mirror shield not resetting the last used mirror combo position 2c375403a
  • save select screen not showing new hp after save->reset 8d15352e5
  • load default quest for sfx when loading replay 4bc56aef2  

    Quests before custom sfx rely on the default quest providing sfx, but that wasn't being loaded when playing back a replay. So it would either use whatever the last quest loaded, or have nothing, which was the case for the replay test script.

  • use correct graphic when holding up purchase from bottle shop 03d123012
  • apply BS swim sprites compat rule to Zelda 3000 qst 5f7ab3c23  

    This QR is applied to all 1.90 quests, but Zelda 3000 was saved in 1.92 and this visual bug was overlooked.

  • consume button presses in subscreen menu 23f44b9f6  

    The subscreen refactor ~6 months ago resulted in button presses not being eaten. One side effect of this was the item selection sfx playing for every frame the button was down, instead of the intended one time.

  • ZC menu options render/get disabled correctly 571460f7a

Editor

  • prevent flickering for minimap tooltip 69948f334
  • Tile editor checkboxes not clicking 983a17add
  • disable unpack cache to fix tile rotate/flip fed7b7732
  • tile page rclick "insert", "delete" was swapped 0b9bad2a6
  • disabling tooltips works again 409abe1ff
  • item editor candle text goof 17852c009
  • 'Go' in warp dialogs not rebuilding transparency table d41040b13
  • fixed warp ring dialog 1f05880ab
  • wrong button focused in zscript compile dialog 41a07b400
  • tile editor bugginess 87cd522a9
  • Polish numpick dialog, fix new gui focusing f9852b3f6
  • Crash on changing map count 92c190255
  • timeout of 0 for parser timeout now acts as "no timeout" 975602f22
  • 'File->Exit' not exiting 5db531ab7
  • 'Scroll to Combo' on screen rclick being offset 5497092dc
  • greyed out pasting in string list f2440669d
  • create test init data relative to qst init, not base init fadfe7d74  

    This was originally done this way to avoid changing test init data when the quest's actual init data changed, but that maybe is not as useful as the other approach.

    Also very simply fixes the problem of screen data (and other init values) not being properly set.

  • autocombo/combo pool/combo alias pages RClick menus being offset d3e276c4d
  • 'Open Tile Page' on combos not using the ORIGINAL tile of the combo 7009db89b
  • disable tooltips when hotkey cheatsheet is open bcae99ea1
  • clean up several issues with the warp dialogs 378766362
  • options->fonts being broken/inconsistent, not saving changes cc2cb75cd
  • undefined memory write when applying modern quest ruleset 2ed538d97
  • lockblock/chest combo wizards not saving 'Use ExState' flag 2a3eb96fd
  • some more issues with warp dialogs e9ab158ae
  • warp dialogs not properly previewing negative xoffset dmap map-marked squares b593e46bf
  • solidity preview inaccuracies 723c58ebc
  • 'Tools->Combo Flags' bugging out when clicked 53f324ae6
  • crash related to 'Scroll to page' for aliases/pools/autocombos 7f8d8236c
  • midi edit dialog not showing in new rendering system 7ff03e46b
  • handle quest path/title with spaces in package export 432dfe42c
  • transparent tiles not drawing correctly in map preview 80f94a9ea
  • error message on failure to load enhanced music in the dmap editor 06cee90fa
  • skipy broken in combo preview animation 590e9f59c
  • combo animations not resetting after using combo selector in dialogs 99ab2ae95
  • weapon type names drop down being empty 53cdacc3d  

    This broke from recent addition of reflected arrows/fire (e3b23aa)

  • hide unimplemented enemies 875589f19
  • handle error instead of crashing if package export fails 53f7a7253
  • stop clearing screen when editing palette 47aaddd62  

    Since the render refactor, we haven't needed to clear the screen when changing palettes, since this dialog is rendered to a different bitmap than whats in the background.

  • 'Load Tileset' not applying compat fixes 0fdad2857

ZScript Standard Library (std.zh)

  • DMFS_ constants being off-by-one 7fc001530

ZScript

  • 'subscreenwidget->PerContainer' not working 9d7c222dc
  • al_rest crashing when using debug feature 6058be2ba
  • parser configs not working 74a81247e
  • issues running destructors 7d0dc5299
  • handle rare COMPAREV2 for x64 jit 0fc3edd39
  • sprintf giving a wrong error message on %c 180b66fc9
  • 'Screen->SetExDoor()'/'mapdata->SetExDoor()' not opening matching doors 88f2ab405
  • grab correct value from stack for POPARGS JIT x64 504f87a71  

    This didn't seem to break anything, but it showed up as a difference when comparing registers from JIT w/ non-JIT.

  • Hero->WarpEx not using dmap xoff when setting continue screen e21ba53d0
  • global var initializers not erroring when non-constant e1b10e2a0
  • escape character " not working properly in string literals a08d4a149
  • invalid character errors wrongly occurring for values 128-255 2cfe2e472
  • subscreen widgets not allowing SUB_COLOR_TRANSPARENT to be used 77346b0c8
  • class function params with same-name as class member not shadowing properly 5659c8ebd
  • class/object destructors stack being offset wrongly 79079c766
  • fix Audio->SetMusicLoop() truncating decimal values c6e7c0205
  • compiler crash related to invalid array indeces f3e3f7ecb
  • sanity check for bitmap->isValid() and bitmap->isAllocated() c07f28f80
  • stale data in destructors 6251b0f23  

    scripted objects weren't clearing data used by the destructor when being cleared, leading to future objects referencing the stale data if they didn't have a destructor of their own to overwrite it.

  • generic script item collect event fix f53af5295  

    Item Collect event will no longer be fired for items such as timeout items when they are not actually able to be collected. Due to timing changes, the "Combine when collected twice" now also occurs BEFORE the event.

  • clear jit-compiled scripts as intended when loading new quest ddf96eddd
  • fix crash when creating too many paldatas 83a3bc867
  • fix paldata->CopyCSet() referencing the wrong pointer 2a305c182
  • handle out of bounds for Game->LItems[] 6d260c7f3  

    This fixes a crash in Panolpy when reading a specific sign.

  • return enemy x,y when getting fairy item x,y 6e60fe889  

    Setting item->X,Y on fairy items additionally sets the position of the corresponding fairy enemy sprite. However, the getter returns the item coordinate. This resulted in unexpected behavior from something harmless like item->X = item->X causing the engine fairy movement to halt.

  • fix sideview sprites becoming unable to jump when on the ground 673eb859d
  • compat rule for old sprite jump behavior 2b7275305

Web

  • use zc-data.nyc3.digitaloceanspaces.com for now af524e98f
  • "Copy URL" in player now uses correct test params 8b5eaf56d
  • sync fs when writing save order txt file e006c07a7
  • quick save creation link working again 9e4c8a90f  

    The quest gamedata field was inadvertently set to 0 because the save file was prematurely selected before being saved for the first time, which prevented anything in saves_do_first_time_stuff from sticking.

Documentation

  • add a couple missing subscreen widget script docs f55a272d0
  • document DrawTile '-777' rotation behavior 8bfb995e0
  • fix typo 9dc086113
  • update zstrings.txt to mention the "Insert SCC" button bd084e245
  • fix some issues with the webdocs 569adf358
  • fix 'subscreendata->PosDirs[]' being misdocumented as '->Poses[]' 4bee8e505

Build

  • fix missing libpng for web build a6c345e5a
  • fix missing libogg for web build a5254efa0
  • upgrade to latest asmjit 65ae72c6d  

    Resolves MSVC release mode bug: https://github.com/asmjit/asmjit/issues/427

  • add default file for compiler "signature" 26e8cd4db  

    This is to make the build just work in a clean checkout until I get around to removing this pointless thing altogether.

Refactors

  • remove unused 'VSync' option (it didn't do anything) 74bbc05b7
  • key files d0864dc8d  

    Now work from the folder the quest is in OR the exe is in, and saves to the folder the quest is in. Also cleaned up the code for handling reading key files.

  • remove unsupported color_depth option f827b35bb
  • load text files more efficiently 663e4dacf
  • don't tint behind dropdown lists (allow skipping dlgs tint) cb8f87135
  • Menus (new sleeker look, much cleaner backend) df3b5ab5b
  • remove scary and now pointless warnings when toggling fullscreen cf9942aca

Player

  • remove unused volume code in read_saves 244b8cad0
  • move x64 backend jit code to separate file f3d40e0b7
  • move global inits from init_game to new init_game_vars c4f5c11ae
  • make lamp_paid not static for replay determinism 534d82e91
  • remove ZASM debugger from menu 377981e09  

    You may still activate this with [CONSOLE] print_ZASM = 1 in zc.cfg, but the option is no longer in the player menu. This will be removed entirely soon - it's so slow it can lock up a computer, and not useful enough to keep around.

    We may introduce a proper debugger in the future for ZScript to serve the purpose the ZASM debugger tried to.

  • remove extra draws to scrollbuf in draw_screen d57d0318b
  • remove digi_music volume control e426c5d1c  

    digi_music is a global volume control for all allegro 4 music streams, which is only used for GME (so all those chiptune formats). But we already apply emusic_volume (enhanced music) to all non-MIDI music, so digi_music was at best redundant, and at worse a confusing knob that only modified some music formats.

    It's been removed from the Sound dialog, and now defaults to 255 (100%). It can still be modified via scripts, though this should be changed to just set/read emusic_volume sometime in the near future.

    BTW - ~6 months ago OGG was changed to use Allegro 5 instead of 4, which means at that point digi_music no longer had any effect on OGG volume.

  • remove music buffer setting 9a6ae020b  

    This only applied to it/xm/s3m/mod music. There's no need to expose this to users. Instead, always use 128KB as a buffer size.

Editor

  • Clean up Tile/Side/Ring warp dialogs 34b7addff

ZScript

  • optimize script lookup by name 9ee5c4ba8
  • copy script entry to tempfile quicker 267bd5af2
  • manually parse config file, drop al_init 28fe49bc6
  • clean up ScriptEngineData for all script types ce8062e19

Tests

  • save replay result file when starting replay 62165c822
  • suppress timeout check on frame 0 487351025
  • update 'triggers.zplay' 218609b0b
  • add '--output' option for zscript tests ae45b645f
  • fix zscript subfolder tests not running (and update) 0e35a067e
  • update errors_2_expected.txt ce9e615a7
  • filter out expired test builds in bisect_builds.py 2bdc2354a
  • prevent infinite loop when zplayer exits before first frame a56646b40
  • add nargads_trail_crystal_crusades.zplay 08c75565d
  • fail replay test if jit cannot compile a script 9ca544889
  • fix local webserver when offline 804520e40
  • include js script in web replay test stdout/stderr 3c162e5b2
  • add umbral_cloud.zplay 0a0826577
  • add pageerror listener in run_replay.js ee98991df
  • fail on abort in web replay tests 3b0da67b4
  • stop on fatal errors in run_web_version.js d69ad2aaa
  • set write_to_disk in saves_test 297b5433e
  • add "frames" and "length" meta fields to zplay 35da8a5eb
  • use "latest" version for all playground.qst replays 42b94c785  

    These replays should be trivial to update as needed, and using no replay compat code makes them far more useful for verifying specific features.

  • add link_to_the_heavens.zplay b1309cc47
  • add dinus.zplay 9807de3e7
  • add grassland_attack.zplay 8970b2cbd
  • make the editor File->New test do what it says it does f0b6972ea
  • add goriya_moblin_war.zplay bbce9f9fb
  • update test_compile_and_quick_assign to compile replays/scripting quests 1084e5c54  

    This is the first of more planned script replay tests, which along with the playground.qst replays will be re-compiled with the latest zscript in CI and their replays re-verified. Should result in better test coverage for newer compiler features.

  • add 100_rooms_of_wisdom.zplay a59b6141e
  • add dragon_ball_z.zplay 27e215665
  • add new_beginnings.zplay 27424bb8b
  • add kriztles_3.zplay eb92a96b4
  • add final_fantasy.zplay 2b5572cce
  • add zelda_3000.zplay 145976d57
  • use original qst for combo rotator replay 3552ee8f5

CI

  • update vcpkg 00f89c2c7  

    Apparently vcpkg has issues with retaining build assets long term. Being forced to update to latest as something we need expired.

    https://github.com/microsoft/vcpkg/pull/30546#issuecomment-1819985146

  • set correct test results folder for web replays for upload 9413f492c
  • use improved lfs cache 69740f37c
  • use RelWithDebInfo for win32 tests 2eb360aa3

Misc.

  • Allow scrolling info popups 6fb7e9304
  • Remove '(Experimental)' label from FFC solidity 5a4663794
  • add 'peekkey()' / 'upeekkey()' local allegro edits 7022b0ee4
  • clean up menus, particularly the zc main menu 5ae6e3d64
  • Remove whistle delay for new replays ac0017e2a
  • update default fonts to be same between base_config and 'Default:' button e8b85365d
  • help text to indicate use of A1/A2 values on ffc/item editors 599d6f70c
  • remove noisy allocation logs 32bf8f42f
  • add qst.author sentry tag, so we can know who to reach out to for crashes in unpublished quests 22a5c9c73
  • remove tilesets/classic.qst 21bf6b417  

    The default quest (File->New) makes this not necessary.

Player

  • show current frame count when recording and system menu is active 0f4e8a00c
  • improve error message when qst title does not match save file 069e15113
  • support "latest" for version field in zplay 5870d858b

Editor

  • Add hotkey for rebinding hotkeys af954f385
  • fix some text, add divine escape help text for warp types 1b058a4b7
  • clean up 'Door Combo Set' dialog/hotkeys and document them a4503c640
  • upgrade combo 'advanced paste' dialog, add 'Adv. Paste' to rclick menu 7ac1da426
  • disable auto save for new, unsaved quest cba0be860

ZScript

  • internal label errors now prevent compile 1b0d63bfa
  • add 'itemdata->LAttributes[]' to access attributes as a full 32-bit long value 83f9d2d03
  • add Region in anticipation of z3 scrolling 403c19750  

    To enable scripts to work in 2.55 and in a future release with z3 scrolling, we are adding a non-functional Region:

    • Region->Width: width in pixels (today, always 256)
    • Region->Height: height in pixels (176)
    • Region->ScreenWidth: width in screens (1)
    • Region->ScreenHeight: height in screens (1)
    • Region->NumCombos: number of combo positions (176)
    • Region->ID: region id (0 - meaning just a normal 1x1 area)
    • Region->OriginScreen: top-left screen in the region
    • Region->GetScreenForComboPos(int pos): given a combo position, returns the screen index associated with it
    • Region->TriggerSecrets(int screen_index): trigger secrets for given screen. The screen must be in the region

     

    For example, if a script uses Region->NumCombos instead of 176 to iterate all the combos in the current area, it will work in both regions and non-regions. Additionally you should use ComboAt(x, y) rather than anything else to translate between pixel coordinates and a combo position.

  • mark combo->CSet deprecated, in favor for the better named ->CSet2 81cd99579

2.55 Alpha 120

November 11, 2023

Features

  • Add 'Screen->Data[]', 'Screen->DataSize' script data array for every screen. b080de56c  

    This data array can be edited in the 'Screen Data' dialog, and all changes made by scripts are saved to the save file.

  • Init Data dither pattern picker/previewer ef1e3e5f6
  • fade out the background behind dialog windows ba6344865
  • 3 new dithering styles 8b7aa8ed7
  • customizable 'ShoveOffset', add zfix round-direction handling 809119087
  • FFC 'Platform' flag for moving platforms (to pull the player along with) 3fb03f0b0
  • Crumbling Combos (crumbling floors) 5ac8fd1ee
  • Customizable sword tapping sounds (in Misc SFX and combo editor) b4eb8aa23
  • customizable flicker speed and color for enemies and player in init data 8a18af11e
  • allow conveyors on all layers + ffcs (QR) 4d9976b23
  • Add itemsprite->NoSound 65c4a5d61  

    Disables the pickup sound for an item if true.

  • add itemsprite->NoHoldSound 1bc071fcf
  • add configuration for snapshot image scale d4a3aa3b8
  • set default snapshot scale to 2x a57ecc4dd
  • Allow weapons to change sprite when lit on fire b727121cb
  • Add 'ExDoors', similar to 'ExStates', but directional. Carries over to adjacent screen.

      Relevant changes:

    • feat(zscript): ZScript access for ExDoor related features a00570f67
    • fix: typo in previous commit b499e2c3e

Player

  • added a setting to put a limit on 'uncapped' FPS so the game still runs at playable speeds 5f9a3d367

Editor

  • Pressing 'esc' while zoomed in on the minimap now unzooms (instead of trying to quit zq) 918cdafca
  • 'Insert SCC' button in the string editor now respects the caret position c706b3af3
  • made enemy editor InitD compatible with script metadata 8c0e4b37b
  • add zooming when grabbing from image 26019c058
  • added angular tile block rotation option to the tile editor 24e46ffb2
  • added buttons to the dmap editor to preview enhanced music looping 1822e0e47
  • view script slots dialog 4cd827e73
  • Combo Pool Pages dialog 25ae10290  

    Dialog is modular, should make adding future pages dialogs much easier

  • Auto Combo Pages dialog 259419630
  • allow customizing invalid checkerboard color 26ea8b84c
  • Combo Alias Pages dialog 6e0636de7

ZScript Standard Library (std.zh)

  • memcpy version that only takes 2 args (auto-determines size) 3bb11dda8

ZScript

  • script access for extended dmap titles and new dmap intro string IDs 21c168a1b
  • GetTilePixel(), SetTilePixel(), and Is8BitTile[] b9b290a14
  • 'Screen->GuyCount'/'mapdata->GuyCount' for read/write enemy respawns 340d55b9c
  • script access for player and enemy flicker and flash effects 4a1bf1223

ZUpdater

  • add release channel to builds to specify where zupdater looks for updates bb9023ea8  

    This adds a "channel" configuration to releases that limits what releases the updater will consider when looking for new versions. This allows us to configure a "2.55" release channel, and prevents the from updating into 3.0 releases while still allowing it to grab new releases from 2.55.

    This is necessary long term as it allows 2.55 users getting easy bug fix updates without moving them to 3.0, which should only be done explicitly.

Web

  • include cambria tileset 34580b86f

Bug Fixes

  • wavy/cancel compat not being set 2f0fe8052
  • a couple small things related to script access of subscreens d120f2c3a
  • 'Newer Player Movement' corner-shove works better with off-grid solids 1695530d3
  • Init Data dialog sometimes being too tall ed36204f0
  • use cross platform clock for text edit proc e6bdfb99d
  • issue more vsync in old gui proc as needed to catch up 5add82df0
  • [mac] only check for .app to allow for app bundle to be renamed b393e5875
  • set size when making dlg layer to avoid crash 6d47e8136
  • minor dialog hiccups in some circumstances 02764be1b
  • crash on viewing 'Fairy' flag help texts 62bfe66d4
  • dialog windows in background popping out on tab-out e7dbfacdd
  • tooltips staying open over dialog windows fadfa27d2
  • use steady_clock instead of system_lock to measure replay duration d3e8e7fcc
  • [mac] handle CMD key press and allow CMD for all places CTRL is e45016fb2
  • a couple crashes/dialog oddities c577892d9
  • add proper versioning for init data deltas fdd6da3c1
  • Crumble type now uses 'Continuous' as a checkbox, fix wizard for Crumbling type 020466990
  • various issues with the default display size for windowed mode 20f6fa908  

    Instead of using the monitor scale / DPI to multiply the size we set the window to, it now looks at the monitor resolution and uses the largest integer multiple of the base resolution (256x240 for zplayer, 456x342 for zeditor and zlauncher). This always takes into account the scaling of the OS (the monitor width/height changes when you modify that). If a window size is saved from a previous run, it will use that instead -- unless it won't fit, then it goes back to getting the largest resolution for the given monitor. More details:

    • Completely change how the initial display is sized for windowed mode. Instead of using the monitor DPI to scale up a base resolution, default to as large a resolution as possible while maintaining an integer scale. This particular commit retains the previous behavior for Windows, but the next one will move Windows to the new behavior (separate commits just in case a revert is necessary)
    • Set the desired window size for zeditor before creating the display, not after.
    • Use the base resolution in zplayer for the allegro 5 screen bitmap, instead of 2x the base resolution. Should improve rendering time a bit
    • More reliable behavior on mac. Previously would possibly cut off top part of screen and mess up mouse events if the initial display height was bigger than the available height
    • Set default for fullscreen option on Mac back to off. On newer M2 Macs fullscreen display creation is bugged. Fine for Windowed -> then Maximize, and fine for older Macs, but for now just set the default to windowed mode to be safe
  • simplify display size for windows too a049b6ce6
  • set window title as early as possible to reduce flash of text d7312b9dc
  • mark render item transform dirty when changing parent f59d8b314  

    This bug resulted in the tooltip / highlighter being offset when the window size changes.

  • bomb equippability not respecting cost counter customization c7ffbf652
  • many issues with the 'Doors' dialog 6e97f2aaf  

    Also adds new '(None)' door type. The player will not 'auto-walk' when entering from a '(None)' door, and no combos are placed when setting one in zq.

  • use simpler temp file creation for all platforms 5018d9e54  

    This should resolve problems with making save files observed on some Linux setups.

  • ack halt/resume draw events from allegro 438a18c1a  

    Without this, the [osx] allow_live_resize = false configuration option results in the window freezing on resize.

Player

  • fixed passageway and item cellar fade-in when "New Dark Rooms" rule is on 4748d9a89
  • playtime not drawing unless scrolling ddd3f26a1  

    I'm so mad at how dumb this was. Specifically, it doesn't draw if you have "subscreen over sprites" disabled unless you're scrolling.

  • 1-pixel gap in 'show walkability' cheat draw ee0eda1e2
  • 'Newer Player Movement' corner-shove being far too lenient d0e2908b1
  • fix manhandla step speed calculations 60e9d9f41
  • show previous changes in player data menu when used multiple times without unpausing 325834d44
  • restore quest progression and skip names 804484ddd
  • fix corner shove solidity 7c5c7c992
  • set size when making info layer to avoid crash 5163053b5
  • titlescreen hp offset when hp_per_heart != 16 31f3840e4
  • Lift 'Special Item' setting wrong state 7215fd92d
  • properly reset directory cache 8cacad3d5
  • subscreens with item-overridden level items not properly displaying 913003180
  • snapshot entire player screen for gui snapshot, which was missing a5 layers 8f416879e
  • set game played to false to fix quest progression sword/health bug be675976b
  • fix conveyor stun and forced direction persisting past stepping off the conveyor 87bba7462
  • set dummy flag when drawing temporary item a4ed17065  

    This fixes a known bug in older quests that plays sfx repeatedly when picking up a fairy.

Editor

  • fixed crash when opening preview mode 23ad85cfb
  • made autocombos respect moving, adding, and removing combos f8d89f5ad
  • prevent crash when changing font 640378df8
  • prevent data loss when grabbing tile from old quests f8fdd7bb7
  • qrs having wrong category name in search menu 5391348e4
  • import maps was unhelpfully clearing everything 50c6377e1  

    The map import tool was checking if the first screen's valid field was a special value denoting it was "cleared" by the user. It's unclear why valid holds this information, but presently it's not useful and breaks map imports randomly.

  • use cross platform clock for timing to fix combo editor animation 163f9a91f
  • use cross platform clock for zscript compile timing cde9a4688
  • format zc_args.txt correctly be4390661
  • preserve screen bitmap 3d674f868
  • prevent crash when rendering minimap during loading 4c7dfe677
  • fix crash with passive and overlay subscreen settings 1c9b81f57
  • 'Paste FFC' being slightly misaligned from the grid 8664554e2
  • clear tooltip before entering square-placement mode 972e6919a
  • test mode init data marking quest as "needs saving" extraneously 243088418
  • mark tooltip dirty if text changes 164f77d33
  • Fix palette desyncs (permanently?) b5a7ee226  

    Should no longer need to ever manually 'rebuild transparency table'. As such, the default keybind for 'Reset Transparency' is now '(None)' instead of 'B'

  • do not freeze screen bitmap while in pal dialog 95fac7ac8
  • Tall Grass combo wizard dropset not setting flags properly 4732eb4b0
  • prevent bad overlay when no tile is copied 5f76b78fe
  • more tile page problems from 4-bit: scaling, overlay 1f65a0cca
  • snapshot entire editor screen to include a5 layers 8cd737c5a
  • dmap editor remembering wrong tab 1a264a262
  • use consistent values for mouse coords when making tooltips c716f13c3

ZScript Standard Library (std.zh)

  • update ffrules.zh to include all new quest rules cc67be852

ZScript

  • 'subdata->TransClock' was not returning -1 properly when not transitioning 95edf1e5e
  • fix slowdown caused by draw commands during frozen message strings 48511cdd5
  • persist compiled jit functions when reloading the same quest 2bd7e877d
  • Game->CurrentItemID() being completely broken 9fc212abb
  • mark destructors of base classes as virtual 29c39e15a
  • do allegro 5 init before a4 init in parser 58e391f63
  • fix SPRINTFA calling the wrong function c49ed2840

Web

  • remove unnecessary bitmap backup 9c309afab  

    This pretty much doubles FPS across the board. huzzah

  • support both landscape orientations 8206a3008

Documentation

  • specify what OS versions we support 080b61e10

Build

  • simplify packaging script ee5e02a1c
  • use zlib as a shared library d388d1a6c
  • upgrade sentry to 0.6.6 749746d6d
  • move some src/*.cpp files to appropriate static lib e3038f133
  • remove unused font.cpp 3bda28548
  • upgrade to latest asmjit 2ede55147
  • upgrade allegro d5de2ebbd  

    https://github.com/liballeg/allegro5/compare/652684327236dfd23dcf6bf433fa9975212106b5...11a6425cae646c592f3086cda5f8c339296135fb

  • auto generate changelog for alpha release 36085a914

Web

  • fix renamed script d79ef7d06
  • remove post-processing by python script f8b2af856
  • include function names in release build, separate dwarf for debug build fb44b2a78
  • integrate web build into cmake 7dbb75dee
  • fix missing zscript compiler caused by 7dbb75d bbdb9be63

Chores

  • fix many many typos of it's -> its a7e3cf4ec
  • remove outdated or unnecessary docs and ZScript headers 81b871ade

Refactors

  • memcpy the buffer in PACKFILE fread 8f547f8f5  

    This saves ~500ms on my Mac when loading Yuurand.qst

  • speed up copy_tile / tilesize 01e13ec0a
  • use safe cstr reading functions b1a7b8d43
  • add bounded_vec container type 9edaa62a2
  • render a4->a5 bitmaps in first pass 8ef8665a7
  • reorder field initializer list to fix compiler warnings 8d64f8374
  • simplify render tree drawing b52d7eaea  

    This adds prepare and render functions to the RenderTreeItem class. Also makes them virtual so that new classes can be made to represent a render item. The minimap drawing code was moved to this.

    Consolidates the logic for when a render item is dirty, and moves allegro 4 bitmap handling into a new derived class.

  • use a single bitmap for dialog tint 8a8ef4667
  • add bitmap_flags to rti 6af0dcc23
  • Init Data / Gamedata acb7c8481  

    Change how Init Data is stored and saved to the quest file (and rearrange the dialog slightly) - Allow setting mcguffin level state for all levels in init data/cheats instead of just levels 1-8 - Init data health can be in HP instead of just in Hearts - Can set init values for script counters 26-100 (was missing before) - Change how data is stored and saved to the save file

  • cache zasm script size be7c81d3c
  • move zcsound source files to src/sound 09dfea4eb
  • remove zcmusicd.cpp 15628e6f3
  • move ffc set data / changer out of ffc.cpp and to src/zc 3a6d2d394  

    This is the first step to moving ffc.cpp to zcbase.

  • cleanup combo position handling, optimize spotlight code 44cb8bb72
  • cache config read for use_linear_bitmaps 4c922be5e
  • remember previous screen clip for scrolling pane 7a8021809
  • avoid copying combo everywhere 0ecfa71f6
  • limit default window size to 3x the base resolution, and add a buffer so to always be less than the monitor size 2f6cf5a72
  • unpack 4-bit tiles when quest is loaded ff01c741b  

    This reduces CPU usage by ~3%.

    Previously, 4-bit tiles were only unpacked just before being drawn. Unpacking means converting into a format ready for drawing, which is somewhat slow to do in functions as hot as tile drawing. Now, when a qst is loaded all 4-bit tiles are unpacked in memory. When saving a qst the reverse happens. This change has no impact on the qst file format.

  • avoid copy when drawing tile without any transformation 973303a3c  

    This reduces CPU usage by ~7%.

  • make get_qr faster by unpacking the bits ahead of time 990eb380b  

    This reduces CPU usage by ~5.5%.

  • Split graphical weapon init code, in prep for ignite sprites 9ca67c7b0
  • make tooltips simpler to install, and map prev/next tooltip ca09be0e2
  • remove unused single_instance 618d9986f
  • minor combo alias optimizations/cleanup 8d1d73e44

Player

  • do far less work in platform_fallthrough 8861f51f1
  • do less work in run_gswitch_timers 78af21af8
  • avoid costly script object dealloc when destroying dummy item c22e9d68f
  • use more accurate but slower tile drawing when drawing on edge of bitmap c1601e941
  • respect bitmap clip in tile drawing functions, remove usage of temp_buf in screen draw a42586c11
  • totally remove temp_buf in screen draw, and masked_blit 93f25b690  

    This refactor reduces CPU usage by roughly 6%.

    This results in some unavoidable minor graphical changes for quests with the QR "Subscreen Appears Above Sprites" disabled. Specifically, sprites (such as jumping enemies, weapons, etc) continue to draw over the subscreen background as before, but now also draw over the individual subscreen UI elements. In most cases this looks better, and better follows what the QR text says will happen.

    https://hoten.cc/tmp/compare-report-screen-draw-refactor/

  • cache result of item_tile_mod, which saves 17% of CPU time b3c942902
  • remove accidental copy in run_gswitch_timers 9646be4b1
  • show dialog when saving fails 2a571d392

Editor

  • only draw tooltip bitmap when in use ef146dede
  • remove rests and use smarter fps throttle 3ca0a1208  

    Use the same smart FPS throttle that the player uses in the editor too.

    This doubled the FPS in the Web version.

  • draw minimap to smaller bitmap df2602f85  

    Also add a callback to RenderTreeItem, which allows the main drawing code to directly render the minimap as needed.

  • only rerender minimap when dirty 66d882141
  • draw tooltips to smaller bitmap 50f1344a3
  • move minimap drawing to render_minimap.cpp 042728610
  • remove dialogs for deprecated modules and quest templates 0ebbc8450
  • move tooltip rendering to render_tooltip.cpp 911019c55
  • bah humbug! 21ecb9203
  • remove pointless time code d0549a3ed
  • simplify tile copy during grabbing eb1a43609

ZScript

  • replace script debug_id with composite id (type, index) 8e6c48a21  

    The previous hack of using a global variable incremented in the constructor had strange behavior, and would result in different ids given when reloading a quest.

  • use .contains instead of .find in jit.cpp 02dbb040c

ZLauncher

  • group current version info in updater tab 986b27145
  • open new website for release note buttons 1c8149e0f
  • remove changing zmod in launcher 85ea325db

ZUpdater

  • just query website for release channel info a724610af

Web

  • prevent script trace unless debugger is enabled cf3ce065b
  • stop excluding some slow-to-build dialogs in debug builds 452efb90a

Tests

  • re-enable classic_1st.qst resave test 9065169e6
  • expand resave test to include ss_jenny.qst a92664884
  • run replay tests concurrently 762ac2db5
  • add playground_ffc_changers.zplay c5f02cfb1
  • pass correct value for frame arg, which was breaking --update 2cf6ae4c6
  • recover from failure when downloading a release 6545e847d
  • add --concurrency flag to run_replay_tests.py, and set to 1 in headful mode df4644a4e
  • set retries flag when getting baseline replays locally 27f017136
  • remove diff from replay test run result 8ef2c1575
  • support baseline prompt when providing existing test results on disk 492bc6b8b
  • keep webserver alive for web replay tests. check for fatal errors 1af5883f2
  • make test replays lazy files instead of a single giant download f9fa641ef
  • clear test result folders in python tests d0147e77e
  • for replay tests baseline prompt, only consider releases predating current commit d026d8834

Editor

  • add test_package_export 53d06c6f2

CI

  • trigger web.zquestclassic.com deploy on release c17ef05ea
  • use clang 17.0.2 for linux 1d3ebb548
  • add failing test results to tar for faster upload 78cf78184
  • reduce amount of data uploaded when replays fail f589ada7e
  • fix archive step when there is nothing to archive 3869a0869
  • run fewer replay tests for web, for now ec906a94b
  • specify bash shell to fix windows failing test results upload ced10c828
  • only consider ancestors when searching for baseline commit 69c4cf890  

    Previously it would only look at the main branch, but that does not support long-living branches nor multiple release branches.

  • fetch all git history for compare job c5f2a5b1a
  • explictly ask for python tests in ci.yml, which stopped running b/c of f589ada 36666a369
  • use all cores for replay tests on windows 3e2554782
  • fix archive test results on windows 33be44347

Misc.

  • include oneliners in changelog script 3bba771c0
  • reserve dmap data in qst format for z3 regions 69784d2fa
  • add README.txt to release package 1b30ef164
  • log time it took to load qst 3ebdba27f
  • collect quest ratings e3ef8f63a
  • change log of website to new domain 9d8e9239a
  • remove ag.cfg f0f80f38d
  • add/clarify some info text 716ec391f
  • clean up box_out popup 06bea6850
  • update 'default.qst' 4b54dd752
  • update references to old program names 9a3e56796
  • allow '<:' in commit (similar to '!:'), to squash with prior commit in changelog 6ea35b2c7

Player

  • set cont. heart beep default to off 9919433e6
  • change ending credits from Zelda Classic to ZQuest Classic 31c7829ca
  • use more user friendly strings for creating save file / continue screen f2084a1a0

Editor

  • add -uncompress-qst CLI command 696657428
  • make checkerboard bg in the tile editor align with the tile grid 2b681111a
  • remove minimum for tooltip timer c6c3f3203
  • remove annoying beta warning 622e6daa5

ZScript

  • Add compile error when trying to store temporary literals e6296db90
  • never compile scripts larger than 20,000 ZASM instructions 5986e6021
  • print jit_log stuff to allegro log instead of stdout 3e720b62d
  • highly priortize only frame-1 global scripts for JIT compiler e8f60b40e

ZLauncher

  • add support zc button 11ec92044

Web

  • make quest url a bit friendlier 8aa27f494
  • use gzip instead of allegro PACKFILE compression dee67d885  

    gzip compresses better than allegro PACKFILEs:

    And it's a bit faster to load a qst in the Web version when it doesn't have to decompress it. For Yuurand.qst, loading time (including downloading) from 17.4s to 14.5s

  • better indicate download progress for compressed assets 3fb07895d
  • support default open URL for tilesets b1e6584dd

2.55 Alpha 119

October 08, 2023

Features

  • subscreen scripts, ZScript subscreen access  

    Add 'Subscreen Scripts', which run while the engine active subscreen is open. Add ZScript types 'subscreendata', 'subscreenpage', 'subscreenwidget'

      Relevant changes:

    • feat: subscreen scripts, ZScript subscreen access cb2d6b521
    • feat: 'subscreendata' datatype implementation 64026507c
    • feat: 'subscreenpage' datatype implementation 0d049c655
    • feat: 'subscreenwidget' datatype implementation for shared vars 5e8e6dcc8
    • feat: start 'subscreenwidget' datatype implementation for type vars 57649a824
    • feat: more 'subscreenwidget' datatype implementation for type vars 9a8334236
    • feat: more 'subscreenwidget' datatype implementation for type vars 5c0c1a9ef
    • feat: finish 'subscreenwidget' datatype implementation for type vars 252033a21
    • fix(zc): fix a couple subscreen drawing issues e82b08532
    • refactor: start implementing subscreen scripts e19d0fda1
  • lightbeams now respect solid ffcs/pushblocks (compat QR'd) 8555d9430
  • 'Mirror (Custom)' combo type for customizable reflection 5c06dfcf4
  • Spotlight combos work on ffcs, fixed lightbeam-ffc hitboxes fd039e808
  • Subscreen widgets now have unique labels, and display coordinates 4553336cd  

    ZScript can get a subscreen by it's label. Display coordinates are the coordinates that make up the bounding box rectangle for a widget.

  • change grid-snapping on FFCs, blue squares, item square, etc c4f28895e  

    Now, these all snap to the half-grid by default, but do not snap to the grid while 'Shift' is held.

  • new DMap editor behavior where titles are no longer limited to 20 chars and intro strings use a string table dropdown 6bd8a9acb

Player

  • add command "-create-save " cc459c65b
  • remove encoding layer for save files a0c81ae88  

    Just like the previous work to remove the encoding layer for qst files.

    Previous save files can still be read, but when next saved will no longer be encoded.

    Should be a tad faster to read and write, especially reading in bulk as the title screen no longer needs to read the entire file to decode, when it only needs the first part of the file.

    Also changes save file writing to disk to instead write to a temporary and move to the destination when done. This may prevent a source of save file corruption.

Editor

  • 'Highlight Current Layer' option, when enabled dithers out non-active layers. 69267fb51
  • "Open Tile Page" now saves which page was last opened f6f3090e1
  • options to control the size and color of the dither when using "Highlight Current Layer" 08be9cd24
  • added cset to the autocombo preview, made autocombo engravings in the combo list draw over the selector 466c7b5ba
  • added a popup when using an invalid autocombo explaining why it's invalid da634dba1
  • added a "Connect to Edge" flag to certain autocombos, changing how they interact with the edge of the screen 7e0ddb89a
  • quick map view hotkey, 2x and 4x map scale 98ad766b7
  • double click in text procs selects all text d7f12e957
  • option for tooltip highlight color (instead of pink hardcoded) 0036f21c1
  • reworked double click in text procs to select by word a3bfa4a75
  • checkerboard background option for invalid data 39549c142
  • changed the default size of some subscreen widgets to make them easier to grab in the editor fd74a7a18
  • dragged items in the subscreen editor can be snapped to the grid with ctrl 03274b2d8
  • 'File->Load Tileset' to start a new quest from a tileset 211e53bff
  • subscreen wizards for generating item grids and counter blocks 365e95fd2
  • "connect to solids" flag for basic and relational autocombos a28a3efa7

ZScript Standard Library (std.zh)

  • add 'SF_LAST', convert SF_ constants to enum 053b63911

ZScript

  • 'auto' variable declarations 1b06c63ea
  • 'sprintf' will resize the buffer if it is too small. bc9fc80f8

Visual Studio Code Extension

  • update keyword highlighting 2dad50771

Web

  • migrate to new database manifest and use CDN 5c823a081  
    • Quests and associated music are now hosted at data.zquestclassic.com, via DigitalOcean's CDN. This should make downloading faster.
    • Add preloads for the manifest and the wasm

     

    New format for quest manifest:

    • Supports multiple releases of a quest (creating a new release each time the contents have changed). Currently always shows the latest, but when a save slot is first created it locks to that version. Later, will add a way to upgrade/alert user that there is a new version for an existing save
    • Add an approval bit, so we can be granular about what quests are published and playable in the web version

     

    Drive-by bug fixes:

    • bug preventing saving files (see 2803f8 and 98f366)
    • bug preventing editor from persisting qst file due to missing filesystem sync
    • bug preventing copy/download browser local files from showing when user opts out of mounting a directory
    • (for all platforms) bug that changes .sav files to use a relative path (to the configured quest directory) for the associated qst file, instead of an absolute path. Save files were portable before because of some non-trivial magic when resolving a qst path, but this makes it more explicitly portable
  • reduce amount of preloaded data 24e1eee5c  

    zc.data is 5 MB now, instead of 15+

Bug Fixes

  • active global script double-running due to warp script check 28d9aaf3d
  • wrong 'maxdigits' on old subscreen counters 8c4b2b9b7
  • fixed memory leak when changing enhanced music tracks c9bcdb22a
  • favorite combos corruption when loading 1.92 or older quests cca598afc
  • some small errors related to subscreens/subscreen scripting d2721853c
  • [linux] use /var/tmp instead of /tmp for save-then-move 2803f8fcb  

    /tmp is for files that are not expected to persist. When running under flatpak, a tmpfs is mounted to /tmp, so we cannot move files from that to a real physical drive. This resulted in saving failing.

    /var/tmp is the better choice, since files there are expected to persist and so will always be a physical drive.

  • [linux] for flatpak, create tmp file in app directory 98f366eda
  • moveflags not set correctly for pre-2.50 enemies 58d73e0cf
  • replays depending on wrong moveflags 8c359cdb3  

    not sure of a better commit title

  • handle empty init data delta, which is when no change is made ecb6e1bd7
  • fix dmap title corruption 189d34c1d
  • use correct subscreen font for PROP type 2bd4f84be

Player

  • pushblock solidity inconsistency 58ea254ad
  • oddities with pushblocks and pits/water 54f0de9a7
  • sidewarps at edge of map not working with walk-through-walls cheat active b4cc7cbb6
  • Screen 0x80+ 'safe return point' bugginess b53ee67ef
  • 'Magic Containers' cheat not updating max magic soon enough to refill 7f9ee156d
  • bugginess with push flags on 'Push (Generic)' combos f10def353
  • Oddity with swords/spin attacks not properly hitting triggers ae7bf3e44
  • remove accidental code that resulted in less precise sin even outside replays 0545938cf
  • incorrect value for cos(90) in replay mode 2d46cdd1e
  • fixed unresponsive input in SCC menus e394d09cd
  • fixed line heights after drawing tiles to strings with SCCs f05923d8c
  • check if A wpn slot when doing bomb deselect 9bc8776cb  

    This is a potential fix for a bug that prevents the sword/A slot from working after using the last bomb. The bug is very difficult to reproduce, so not certain to be the fix.

  • Optimize light beams to be a loooooot faster 258029d87
  • prevent crash when gamepad disconnects while configuring 761ab2c57
  • handle trailing slash in quest_dir cfg option 06cd618af

Editor

  • 'esc' choosing 'yes' in 'Really want to quit?' popup f683887dd
  • sanitize quest title for package name e64f888d2
  • allow spaces in package name 87519c7ea
  • fixed crash in combo wizard for signposts dd826371d
  • fixed bugged inner bottom corner in DoR autocombo 22817644a
  • right clicking autocombo combo panes no longer resets cset to 0 6300f4d89
  • clearing an autocombo in the editor also clears args and flags b71f9a3dc
  • combo aliases with layers now flag layer screens valid e09d0e3f9
  • fixed out of bounds array access with the drawing mode menu f8f4ea09b
  • hopefully fixed inconsistent DoR autocombo behavior ae6d73cd2
  • improved DoR autocombos connecting with the edge of the screen dea3b0e1a
  • filter invalid characters from test init data cfg header 25f477fd8
  • made selecting a favorite combo update the drawing mode dropdown d5c1183c4
  • reduced information on the autocombo preview in compact mode 8eef7f843
  • normalize path component for test init data cfg header eaa537d99
  • fix several issues with the 'default.qst' subscreens 8e9d475bc
  • fix autocombo height change not being treated as a list command de70ed253
  • made autocombos preview correctly with the combo brush 88ef45f62
  • fixed combo pools being able to fill the same combo multiple times c0c0f6d2b
  • layer visibility checkbox for layer 0 b51c89ce7
  • fixed layer 6 highlighting and overhead combo drawing b55a98696
  • fixed "view map" solidity drawing 9de52adc0
  • correctly load parts of old qst when grabbing tiles f4ed68578
  • sfx data corruption due to improper struct initialization be96107dc
  • fixed copy/paste hotkey in the string editor and crash when editing absurdly long strings e0aa4ba60
  • liquid combo wizard mod sfx off by 10000 1c0399ff2
  • moved some resizing functionality from the move arrows to resize arrows in the subscreen editor a72d22a04
  • fixed subscreen wizard window titles not updating 03e600092
  • fixed crashes when previewing layer solidity and incorrect layered solidity drawing e78b6ecbe
  • copy over assets folder in packager feab68e41

ZScript

  • typechecking error related to arrays of class objects e981a6591
  • fixed paldata mix() not flagging changed colors as used 7cb103ba6
  • fixed incorrect argument ordering in DrawTiles() and erroneous error logging in serveral drawing functions ff7752406
  • fixed incorrect max count for user objects d571f7688
  • paldata objects not clearing properly on init 13a78f04e
  • generic script local arrays and '->Own()'ed objects bugging out on 'Continue' 850fca401

ZUpdater

  • use headless mode when run from launcher 1f91452cd

Web

  • avoid double save when using the quick-load feature 2e2fb45da

Documentation

  • move packaging_quests.md to packaged docs b5467ee10

ZScript

  • made note of rotation arguments for PutPixels() f31a9e75f
  • webdocs for paldata and correction for PutPixels() 0a94ab06c

Build

  • move allegro legacy to third_party 7066aaec7
  • move loadpng to third_party faf8af981
  • delete include/loadpng/loadpng.h 6a03d57cb
  • move algif to third_party d3c85c763
  • move al5img to src 7b8ebe4d3
  • move aldumb.patch to third_party f9d885dbd
  • include licenses in package c7a2a13a3
  • add include to fix missing atoi on VS2022 8ea837e46
  • [mac] 'ZQuestClassic.app' -> 'ZQuest Classic.app' 0c137af69

Web

  • upgrade to emscripten 3.1.45 b428714d2
  • rename workbox-config.js to workbox-config.cjs 3602a7233
  • update dependencies 97203e923

Chores

  • update .mailmap 8c87d92ec

Refactors

  • extract legacy encoded reader for qst to try_open_maybe_legacy_encoded_file 9b5c4579f
  • removed leftover references to favorite combo aliases 8a122dd40
  • use transform matrices for render tree badeba084  

    The previous adhoc system supported translation and scaling in a very broken way, making it impossible to construct a non-trivial render item hierarchy.

    Now it uses proper transforms matrices. Implemented with dirty flags - each render item has a world matrix (and inverse, for mouse lookups) that only update when the underlying transformations change (or one of its parents)

  • add TabBuilder gui class a9e768c99
  • gamedata and user_object stuff, script '->Own()' handling 76a8c3d2f

Player

  • only check already loaded saves for 4th qst red easter egg 8362c1e93  

    Otherwise, it takes noticeable time to load every save file when the file select screen loads.

  • move some things from .zmod to be hardcoded 103242d4d
  • remove module info/loading from menu 6d27582d0
  • remove classic_zelda.dat e1d9bd937

ZUpdater

  • extract getting next release and installing to functions 6346d4838
  • [win] use curl and json libs instead of python 765ab0322
  • use zupdater binary instead of python in launcher 20528f43a
  • [win] use native library for unzip bcf1582dc  

    zupdater is now Python-free for Windows.

Tests

  • update playground_cutscene_trigger.zplay 9ef7f02fb
  • upgrade puppeteer to 21.1.1 b8476fd2e
  • re-enable part of updater test 1e11349cb

Web

  • run test_zeditor.py and test_zplayer.py bb237a671

CI

  • fetch full history when building to generate nightly changelog 0389cd277
  • fetch full history when building web test 22aee7c8f
  • use correct variable for release tag in sentry debug upload cfdeef5b9
  • use Release instead of RelWithDebInfo for windows test, for caching 000548dcf
  • use sentry-cli 2.20.6 instead of latest, to fix debug info upload error 3b862dda7
  • disable sound for linux replays 0c6b1c77e  

    install_sound randomly starting failing in CI.

  • create web.zip and upload to GitHub release ffb2f56cf
  • set concurrency for release workflow 335bc90c1
  • trigger website delpoy on release d8cbf92e1
  • add --ignore-missing to sentry set-commits command fdf2059e9
  • pull git lfs objects for packaged resources 4a5c80d12
  • create cron job to update database daily 348cb03fb

Misc.

  • add script for expanding ZASM opcodes/registers en masse 6f8ca315a
  • update zasm expansion script to handle name lists from file 820a5978f
  • package changelogs for recent alphas, and include nightly changes c67dc4d1a
  • update GitHub org f5f1591cf
  • fix transparency on some cave tiles in the default quest 2cbfecefa
  • improve parser timeout handling 5ebd2423f
  • update default.qst (add auto combos) ec1a38337
  • log error when file move fails d52938c9d
  • add AUTHORS file 008738d7a
  • rename editor exectuable from zquest to zeditor b34503993
  • support lists via * for changelog markdown parser e7e7a7aa9

Player

  • create quests subdirectory for qst files e5c9c2b5a
  • auto open file select dialog for new game 57afca898

Editor

  • increase size of 'Wizard' combo editor button 51bc46e1b

Visual Studio Code Extension

  • publish 1.0.7 e7f9e0ec5

ZLauncher

  • use new program names 9f51c900a

Web

  • rename from Zelda Classic to ZQuest Classic a37ec4ce8

Sectioned Changes

Relational Combos Update

Relational Combos Update

The old "Relational" and "Dungeon Carving" modes have been replaced by a new drawing mode that can handle various relational drawing behaviors. Alongside this, favorite combos list has been expanded and improved to make designing screens faster than ever before.

Autocombos

The Autocombo, similar to the "Alias" and "Combo Pool" drawing modes before it, adds a list of user defined patterns which are used for relational drawing. Each autocombo has a set of combos used for the pattern, a combo for erasing from the pattern with right click, and a display combo which affects how it will appear in the editor for user convenience. They can also auto generate a pattern from a default arrangement of combos like how the older drawing modes worked, but do not need use combos placed in that order.

Unlike most other features, autocombos can read and modify combos on adjacent screens with the "Cross Screens" flag.

Autocombo behavior can be selected from the following 9 types:

  • The "Basic Relational" type is a standard relational mode with 4-directional tile awareness.
  • The "Relational" type works like the old relational drawing mode with 8-directional tile awareness. It also has a flag to use the old combo layout when generating.
  • The "Flat Mountain" type is the simplest of the set, with only 6 tiles representing the corners, sides, and top.
  • The "Pancake Mountain" type is for drawing flat topped mountains, formed by drawing the edges and then extruding the side faces downwards.
  • The "Fence" type is similar to "Pancake Mountain" but without the combos for extruding sides.
  • The "Dungeon Carving" type works like the old dungeon carving drawing mode, drawing 2 tile high dungeon walls. It also has a flag to use the old combo layout when generating.
  • The "Complex Mountain" type has you fill in the top layer of a mountain and then fills out the bottoms, backs, and sides with a 3/4 perspective. Unlike the other sets, this one is imperfect and may require some manual correction, but it makes using the hardest mountain sets in common usage far easier.
  • The "Positional Tiling" type lets you form a rectangular pattern that it then tiles based on X/Y position within the map. With shift + click you can set where the top-left corner of the pattern is located.
  • The "Replace" type lets you set an arbitrary set of before and after combos to replace when drawing. Instead of erasing, right click will reverse the process.

Favorite Combos Expansion

The favorite combos list has also been greatly expanded. It now allows for 9 pages of combos. Right clicking the page selector buttons will create a drop-down allowing you to jump to any page.

It can also now hold entries from any of the four drawing modes. When selecting an entry from a different drawing mode, the current mode will automatically update to match. This should make switching from relationally drawing a screen's layout to placing down large objects as aliases to adding finer details a breeze. Each of the three special drawing modes will have icons drawn over their favorite combo entries, which can be disabled with the "Show Favorite Combo Modes" option in Ect->Options....

Lastly, adding favorite combos now respects the AutoBrush setting, making adding large blocks of single combos to the page far quicker.

2.55 Alpha 118

September 08, 2023

Bug Fixes

  • typo with subscreen view setting 2c638f17e
  • windows 7 crashes on compile zscript 0101beff4
  • 'View Unowned Items' subscreen bugs 5e5ffa36e
  • subscreen buttonitem on active subscreen not scrolling properly 5327d4c8e
  • close about window on ESC/clicking X dac2fe022
  • [mac] title bar showing on initial fullscreen launch 507efb964  

    The osx_tell_dock_outside_bundle = false feature I added to allegro recently is somewhat useful in development, but apparently problematic for normal use.

Player

  • handle error when sav file fails to load b6ca752fb
  • unload other save games when selecting one 5b2dba0e1
  • save file corruption from overlooked fields 2bb017871
  • Crash on zscript object destructor 8f243d2d3
  • Crash on dmap lacking subscreen a79f8dfc6
  • read hp from save file for life meter on titlescreen 14189f18e
  • remove accidental dev mode, which always allows cheats 7bc53d4b3
  • retain previous position when returning to title screen 62d266e76
  • unreliable behavior of ESC in title screen b5e21a833
  • sfx accidentally disabled in save select screen 5fef0688a
  • empty item slots filling wrongly 59fc452e3
  • weird subscreen item animation resetting 683974182

Editor

  • mention change-combo shortcut in info text 023352a5b
  • room data gui text overlap 42ed02f5a

ZScript Standard Library (std.zh)

  • CR_RUPEES definition was missing e3edf4430

ZScript

  • set save name being truncated because not using new string 5496e5ac4
  • use safer vsnprintf to avoid crash via buffer overflow in logging b92439ed8
  • check_bunny accidentally always on for Game->CurrentItemID() 3583e94ee

Web

  • set default saves folder to /local/saves 01e692282
  • quick quest load was broken after save refactor 2b5a12861

Build

  • fix windows compile due to msvc hang bug 461de4df9

Chores

  • remove outdated source file preamble comments 3341301ad

Tests

  • add -test-zc switch to test save file roundtrip 2eccdedc2
  • mostly finish save roundtrip test f416ffa14
  • check for full game equality in save roundtrip 5c07f9c3d
  • fix zc saves test ef46dcc9c

CI

  • fix updater test cache 7e3dd39f5
  • add test_zplayer.py ef94dec88

Misc.

  • support sentry unique user counting e9eb11357

2.55 Alpha 117

August 30, 2023

Features

  • Add 75 new 'Custom Counters' (26-100) c30c57aa6
  • Music and sound stuff galore!  
    • Enhanced music using MP3 and OGG can now be given loop points and crossfade timings in the DMap editor. The music will then loop at those points and fade in and out with those timings.
    • Scripts have new ways to interact with enhanced music: GetMusicPos(), SetMusicPos(), SetMusicSpeed(), GetMusicLength(), and SetMusicLoop()
    • Scripts can also play music with crossfades using CrossfadeEnhancedMusic().
    • Scripts can play sounds with different, volume, pan, frequency, and looping with PlaySoundEx().
    // Turns a SFX into an instrument by playing it back at different frequencies
    ffc script Piano
    {
       void run()
       {
           // Frequency values and keys for different notes
           int hz[] =   {16350L, 17320L, 18350L, 19450L, 20600L, 21830L, 23120L, 24500L, 25960L, 27500L, 29140L, 30870L, 32700L};
           int keys[] = {KEY_Z,  KEY_S,  KEY_X,  KEY_D,  KEY_C,  KEY_V,  KEY_G,  KEY_B,  KEY_H,  KEY_N,  KEY_J,  KEY_M,  KEY_COMMA};
           int sz = SizeOfArray(hz);
           int sfx = Rand(60); // Pick a random SFX
           while(true)
           {
               for(int i=0; i<sz; ++i)
               {
                   if(Input->KeyPress[keys[i]])
                   {
                       int j = (hz[i]/hz[0]) * 22050L; // Multiply by the sample rate of most default SFX
                       Audio->PlaySoundEx(sfx, 100, 0, j);
                   }
               }
    
               Waitframe();
           }
       }
    }
    • Scripts can also adjust sounds mid playback with AdjustSound() and track their completion with GetSoundCompletion().
    ffc script AdjustSound
    {
       void run()
       {
           // Play the sound panned to the left at half volume
           Audio->PlaySoundEx(SFX_SECRET, 50, -128, -1, false);
           // Run until the sound has stopped playing
           while(Audio->GetSoundCompletion(SFX_SECRET)!=-1)
           {
               int pct = Audio->GetSoundCompletion(SFX_SECRET) / 100;
               // Pan the sound to the right while increasing in volume
               Audio->AdjustSound(SFX_SECRET, Lerp(50, 100, pct), Lerp(-128, 127, pct), -1, false);
               Waitframe();
           }
       }
    }
    • Scripts can set MusicRefresh to prevent music from resetting when changing screens
    Audio->PlayEnhancedMusic("ExampleSong.ogg", 0);
    Audio->MusicRefresh = MR_DMAP; // Music will refresh on changing DMap
    Audio->MusicRefreshFlags[MRF_REVERT] = true; // Music refresh with revert to default behavior afterwards
    • AdjustMusicVolume() and AdjustSFXVolume() have been reworked to be a multiplier capped at the user's volume settings, rather than overwriting those settings.

      Relevant changes:

    • feat: Music and sound stuff galore! 463a6d1dc
    • feat: music looping and length functions for ogg and mpick p3 0d00efce4
    • feat: add enhanced music loops for dmap music 8c6f66142
    • feat: add enhanced music loops for dmap music 1bf93ebc3
    • feat: PlaySound with different volume, pan, and loop f7afa08a7
    • feat: added frequency param to PlaySound() 51931b91f
    • feat: added crossfading enhanced music d03c55c0d
    • feat: dmap editor crossfades 5e34b007c
    • feat: zscript access for dmap crossfades 435449e33
    • feat: MusicRefresh setting for ZScript 5df225ec7
    • feat(zscript): dmapdata music loop point access fc8fa9918
    • feat(zscript): GetSoundCompletion() a2df0883a
    • feat(zscript): Split MusicRefresh into MusicRefresh and MusicRefreshFlags[] 679b79c50
    • fix: changed how crossfades interact with F1/F4 9274b2990
    • fix: fademiddleframes in CrossfadeEnhancedMusic() 2fb00213c
    • fix(zq): missing mirrorDMap and loop points from dmap import and export b694fba13
    • fix(zscript): CrossfadeEnhancedMusic() now keeps playing old music on failure and returns a proper result 57c6aa58b
    • fix(zscript): rename expanded Audio->PlaySound() function to PlaySoundEx() e96efb263
    • fix(zscript): GetSoundCompletion() crash when the sound is not allocated edf58c67d
    • docs(zscript): docs for Crossfades and MusicRefresh 589df961c
    • docs(zscript): webdocs for new Audio features 93ec63eea
    • chore: attempt to fix ubuntu compile 0f17db7cc
    • chore: Merge branch 'main' into music-backup 8c3412b96
    • chore: merge main into music branch 11d792fb4
  • qr for mirror/prism combos working on all layers 5eb173a5d
  • 'Dive->','Dive-> (Sensitive)' trigger flags ceef20ab1
  • Lens can show/hide multiple different layers per screen, can include layer 0 1e603b650
  • Can now disable pushblock draw layer [QR Pushable Block Sprite Layer] dd365e844
  • add software updater  

    ZUpdater looks for the newest versions, and allows you to download and replace your current installation with it.

    You can run zupdater.exe directly, or you can use the new "Update" tab in ZLauncher. ZLauncher also has an option to auto-focus the tab on startup if a new version is detected.

    Note: this feature currently requires Python 3 to be installed.

    Also: drive-by fixes for launching a process on unix, though the updater feature doesn't use this.

      Relevant changes:

    • feat: add software updater 5b3162034
    • feat(launcher): re-open launcher after update ad58eb0ab
    • test: re-enable updater test e11f6058b
  • Add 'Game->OverrideItems[]' to allow forcing an item id to be "highest level owned" of its' class. bc232375d
  • One-line minimap titles, 'Preview DMap' for subscreen editor f02222644
  • allow copying subscreen pages (including across subscreens, and quests) 501cb73da
  • setting for subscreen widgets to hide during message strings bc1773d55
  • parser timeout is now configurable/disablable (instead of 30sec) f3cc92471
  • expand combo initd to [8] ef17c9542
  • walk-through nes doors now set door states when used ab3ffc86f
  • allow closing program with (most) dialogs open. (clean up gui functions too) be04a5ee5
  • add 'Button Counter' subscreen widget type 09a871e0c
  • 'No Unequip' flag for subscreen itemslot widgets 95781cec3
  • new subscreen selector options (per-widget and subscreen-wide) cfb498ffe

Player

  • split saves into individual files b6b151149  

    Each save slot created is now stored in a separate file, kept in the saves/ folder. This path is configurable with [zeldadx] save_folder.

    An existing zc.sav file is split into individual files, and the original is moved to saves/backup.

    The order of the save slots is maintained by saves/order.txt. You may freely rearrange the lines of this text file, though you must do so when the program is not open for it to have any effect.

    Any save file that gets deleted will simply be moved to saves/deleted. If you ever want it truly gone, you can delete the folder yourself. If you want to restore it, just move it back to saves/.

    Individual save files are only loaded into memory as needed, and only partially if only needed to display info on the title screen (like the name, icon, hearts, etc).

    The -standalone switch still works the same, but the save file is at saves/standalone.sav.

  • change save slot limit from 15 to ∞ 1e0794e25
  • copy save file to backup folder on every save bfa22af7b
  • support more than one qst file for -standalone mode 7ebfcf8d3  

    Previously, standalone mode only worked for a single quest file at a time. For example, run -standalone game.qst once and game.qst becomes the only quest that will work with the save file generated. Now, each quest will use a save file derived from the name of the quest file.

    You can also provide a specific path if you like. It will be resolved relative to the save/ folder (you can also use an absolute path). Example usage: -standalone game.qst me.sav

  • record music and sfx position for scripts in replays 7c1bd3b22
  • configure primary and secondary gamepad stick in settings b5b94f9ce
  • select one of multiple gamepads in settings 2a1198ff1
  • add option to auto-restart in test mode when qst is saved in zquest 32d7f0497

Editor

  • Remember 'View Layer 2/3 as BG' setting e04aeaf47
  • add Shift+Minus/Plus for changing combo in combo editor f77eb091b
  • configure multiple init datas for test mode 44d7ecf90  

    Test Mode now allows you to customize test-only init data. You can make multiple init datas. They are saved to your zquest.cfg. A basic name is auto-assigned, but you can set your own name by modifying your config.

    When you create a new test init data, your current quest's init data is used as the starting point. Later modifying the quest init data has no impact on your test init datas.

    You can also directly modify the init data values in the config, though the format is not documented anywhere.

  • save test init data per-quest c7a9d6a2c
  • made side warps for new screens default to Scrolling warps 1c6a806b8
  • side warp triggers cycle backwards with right click c20f03d46
  • "Set All" buttons for screen state carryovers 1d0abd731
  • Smart Assign Slots in zscript compile 3192de1e7
  • ctrl+clicking a tile selector goes to previously selected tile f88ac07da

ZScript Standard Library (std.zh)

  • add 'GetLevelSwitchState()'/'SetLevelSwitchState()' helper functions f7228536a
  • item_tile/item_cset animation helpers in EmilyMisc.zh e04a6f984

ZScript

  • special layer for non-overhead ffc draws d8d123b1a
  • Add special layer timings related to lens of truth 4799cb023
  • Add 'Game->TrigGroups[]' read-only array a6f5459d8
  • Variadic Parameters (user functions) f8a424029
  • printfa/sprintfa to take an array of args like printf/sprintf eb8dfd978
  • Allow declaring size 0 arrays ecf7793fe
  • Game->CurrentItemID() to use the engine method of checking owned items. 42129a5f5
  • Array Push/Pop functions 85e1777a3
  • ArrayPushAt/ArrayPopAt for arbitrary index push/pop f34605181

Visual Studio Code Extension

  • add "Always Include" setting, default ["std.zh"] 84cd984dd  

    This takes an array of files to always '#include', so that you don't need to manually add the #include to every one of your files.

  • better working 'alwaysInclude', clean error messages for other-file errors 053e6bbc6
  • better CONST_ASSERT handling, setting to ignore CONST_ASSERT errors db0bc504b
  • use default options NO_ERROR_HALT, HEADER_GUARD for language server compiles a5a6483a5
  • add includepaths option 406f41d2b

ZLauncher

  • add button to view current release notes 76ad2c2a0

Web

  • support music crossfading, set position, set speed 61104f63f  

    This drops the web-specific implementation of zcmusic via SDL_mixer. It was only done that way because we weren't building any sound libraries from source, so using emscripten's port system + SDL_mixer was a workaround. But SDL_mixer only supports a single music channel, so it cannot do crossfading, so it's time to drop it.

Bug Fixes

  • cutscene combos being incompatible with replays b6e7680f8
  • set exe path string to empty if fail to get exe path 728d3ce03
  • changer ffc interactions, ffc timer interactions 9ad10b881
  • use ut8 encoding for config and filenames 134c2fd7a  

    Config values can now carry non-ascii values. This required also configuring allegro to treat file paths as UTF8.

    Fonts have varying support for characters outside ASCII characters. Probably we currently have no fonts that adequately cover non-latin characters. While you may see gibberish in the file picker, files should still load just fine.

  • pushable blocks not respecting lens layer hiding/revealing c4f332289
  • support leading dot in file selector filter 9ffaa4cec  

    This recently broke loading zplay files because the constant for the extension changed from zplay to .zplay, and the old file selector expect no leading dot, unlike every other file path API known to man.

  • dmap music with crossfades was not setting loop points ad0adaf62
  • Allow exiting zc when test mode gets stuck in error f18c48097
  • some bad dialog 'default's resulting in windows closing 2a4fd7097
  • event crash due to bad weapon access 82b9954f3
  • checkbox odd alignment issues 0a39e13ea
  • test quest dlg wrong button focus eae4f8082
  • add some missing properties to init data delta 8b849890a  

    Not all properties were being covered here, which affected init data cheat and test init data feature.

  • typo in transition editor title f24f49eb6
  • wrong spacing on one-line minimap title widget 8eebcfaa2
  • avoid heap overflow crash for draw_textbox scanned string 06ab4d156
  • draw bow and arrow as button item correctly 1d137103d
  • extraneous popup about string ordering error when loading older quests 5fe750736
  • set window icon on Windows 0f6990a10
  • room dialog not refreshing on setting old-guy info 72ec7e913
  • fixed crash when loading enhanced music in nosound mode 9f2a9f216
  • write zeros instead of random memory for fixed sized string fields 77153f3a0
  • virtual dtors for subscreen widget base classes to avoid memory leak bf60c8545
  • use safer vsnprintf for zsys messages 68d5b6432
  • subscreen non-equippable item flag being broken df64d36eb
  • fixed missing zcmixer->newtrack pointer null 44d7307eb
  • minor subscreen related fixes/tweaks d1b4e3db8
  • subscreen issues related to item overrides / bow&arrow 7ab011b0c
  • item quickswap issues b99b3d303
  • subscreen related crashes ef1484be8
  • item override arrows not displaying properly d0f3445b1
  • item bug introduced by recent commit e042ecfba
  • 'Background Color' element drawing in wrong area 61aeb4026

Player

  • fix bad rebase that messed up new save file header ceac21221
  • check save exists before attempting to use a56f5a84e
  • remove warning about standalone mode adf05b8cf
  • resize save vector before copying 4f0cc4ea1
  • fix bad rebase that messed up new save file header (for real) 9be5aa75c
  • update current volume when changing enhanced music volume ee66e9201
  • fairy flags acting different placed vs inherent 3f750666f
  • allow canceling delete/copy save with ESC 5d8e9b5c3
  • do not update saves order.txt in standalone mode 1ac8d0b5a
  • set ascii mode for ending graphics 8e31cfecd
  • Conveyor oddities related to Force Dir flag db349d14f
  • Triggers tab state issues d1cbad2f8  
    • "->LevelState" not setting the state properly
    • "->LevelState" and "->GlobalState" not working on ffcs
  • reset the map view cursor state in init_game 9d07bd272  

    For replay determinism.

  • 'Load Quest' menu option was busted from recent refactors 705aa3a4d
  • enhanced music not cutting to midi (none) when there's no crossfade ec0cc63eb
  • zero gamepad axis state on init 1f6ad1717
  • crop snapshot for screens with NOSUBSCR 6bef101a2
  • handle failure to create save file error bab197b23
  • defer making .sav file until after quest is selected b5e434db1
  • X/Alt+F4 not working while in game view 13afd3bf6

Editor

  • bad index for -quick-assign 10b87bb3b
  • support headless switch with quick assign a6e4fb664
  • dmap midi dropdown 01a98d5be
  • better error handling for test init data 55bca7f0e
  • use gui list data getter for init data dmap 4ed590861
  • use correct int size when reading qst template size a9904e441
  • door dialog now updates visually on dropdown modify 42cca51e1
  • write to temp file when saving qst and rename when done 43c2754de  

    This avoids issues with zplayer being unable to load the file on Reset when in Test Mode, while zquest is writing to it.

  • misaligned subcreen editor 'View' menu checkmarks 70483b21e

ZScript

  • support absolute path includes on non-windows too 2b5690bcc
  • null check results before attempting to write zasm 69d5f16e4
  • missed deallocation when directly returning string literals 39278f501
  • shop data not handling info correctly 71429e679
  • some parser pointer issues df423680b
  • broken typedefs from recent commits 82b6e9db5
  • handle variadic class functions 66cebd181

Visual Studio Code Extension

  • some more CONST_ASSERT issues d5d3c1dd0
  • header_guard works properly for edited file, no longer causes dupe errors 888a050e3
  • handle non-windows paths d3bfe96d0
  • add missing std_constants typedef type highlightings f51f805c1
  • operator highlighting typo c00fca3f0

Web

  • prevent crash when freeing music 2ff430699
  • add rests in some ui busy loops c4c44dda3
  • use half-frequency for sound, just like previous sdl impl c963a890f
  • update deploy script for new asset names b7234e534

Documentation

  • correct typo in comment for jit_threads option 1e11cd6f5
  • specify that linux builds should use clang e742d5a4d
  • changelog overrides for subscreen rework 237156aa8
  • add Arithmetic Operators to webdocs e9976d8bf
  • line-wrap singleline codes, strip single leading newline from code blocks 89a17bcc9
  • minor typo fix in webdocs 9867c8406

Build

  • add targets for common replay test invocations 2a97f57d6
  • add stubs for sdl music to un-break web build 68f407138
  • fix mac app bundle signing add74135e
  • fix compile by using portable optional varargs 2b75b232d
  • enable c++ 20 preprocessor for msvc 8ef1fbd15
  • support single config builds b8d0299e1
  • include missing import for stdint e65d7b8b2
  • disable format-overflow gcc error af7ef5a90
  • disable compiler extensions 1d7624410
  • use new msvc preprocessor only for our targets e3fd987ca  

    This would otherwise result in crashpad_handler failing to link capture_context_win.asm.obj, which is very strange.

  • upgrade to latest allegro d80750a93  

    https://github.com/liballeg/allegro5/compare/c2bf1e11bed0b63539267115baf190741e0a437a...02382edf26ff0b0ca021dfd10c370c59d9006888

    https://github.com/connorjclark/allegro5/compare/my-fork-3..my-fork-4

  • upgrade allegro fork for gamepad improvements 396b99e65  

    https://github.com/connorjclark/allegro5/compare/my-fork-4..my-fork-5

  • configure allegro audio to not build libdumb or libflac 96ce589ad

Chores

  • bump version to alpha 117 ed0d04620
  • clean up stdout garbage whitespace output 5ce129bcd
  • modify changelog for recent music additions 0c2a8aeb9
  • add more to recent music changelog de1ed3ec2
  • add sanity check to previous commit de0aac542
  • add some changelog overrides 8cae16f27

ZScript

  • Make all 'yyerror' error messages start with 'ERROR:' 917169753

Refactors

  • Screen Script dialog now new GUI, respects script metadata e48455725
  • New "Screen Data" dialog d1449c0a0
  • update dmap editor to new GUI 833660a15
  • Fix hardcoded icons, no longer using custom codepoint strings. 2193c4671
  • Merge New Subscreens (#879) 7441956cd
  • remove build version 5b7030789
  • remove old project name "AEternal" 3172d746a
  • replace "string.h" with "cstring" 931e59774
  • use calloc in reset_tile instead of manually zeroing b6752f122

Player

  • split save code from title.cpp, remove .icn ab10ed1e5  

    .icn files contained just the color data for each ring variant needed by the title screen. The idea was to avoid loading each quest just to show a single tile graphic. But, this same data is already in the gamedata save structure, so we don't need to maintained a separate file doing the same. The greatly simplifies much of the code dealing with displaying these icons.

  • remove skipicon and print_metadata_for_each_save_slot config options 7a45e5691
  • move more save file handling behind saves.h interface 5415c4554
  • move save file name into saves.cpp, remove -savefile 28c78ffc3
  • store saves in a vector becc8102f
  • remove support of .dat# when loading save files 985583d1e
  • update icon only once when making new save 3d1b13133
  • remove unnecessary sleep/flash of black on updating save icon 855e0684d
  • skip slow combo movement modification when nothing would change 4693d82e8
  • do not poll music in timer c323dbe61  

    We poll music often enough via advanceframe

  • remove title screen

      Relevant changes:

    • fix(zc): put title.mid back in zelda.dat, since it is available to quests 17e56f141
    • refactor(zc): remove title screen e4640ab77
    • refactor(zc): remove title option from menu d6878d6d2
    • refactor(zq): remove defunct -notitle switch from quest packager bcfd8bbf5
    • refactor(launcher): remove title option 2571479f4
    • misc(zc): remove unused title/logo assets from classic_zelda.dat dcd117a1a
  • remove aglogo 47ad36443
  • disable credit menu d49a0cc00

ZScript

  • better jit compilation for 32b div 10000 0a780d638

Tests

  • add more visual indicators to playground_scrolling_script.zplay f6d318fe5
  • forgot to update zasm snapshot from f6d318 cfd6241df
  • fix usage of -quick-assign in test_zquest.py ff333ee4a
  • add stdout to parser expectations to capture warnings/errors f78c85e65
  • check if gfx segments exist in workflow get_args 2da41aa14
  • support starting replay from a sav file 0b8a1a41a
  • add script for splitting replays b771f0c16  

    also support folders in the replay test directory

  • split large replay files e79878288
  • support headless flag for web replay tests 4cee3d64f
  • disable sound for mac in CI 9a68ee085  

    For some reason this started hanging the --no-headless tests, and crashing other tests on exit.

  • skip sound driver in headless mode for zquest 188452305
  • check allegro log exists before printing on timeout 16ec4b55c
  • track save files with git lfs a53b46886
  • add (crude) RNG debugging option 97acebb06
  • run_replay_tests now forwards more args when collecting local baseline results a3513f63d
  • move zquest save classic_1st.qst test to python

      Relevant changes:

    • test: move zquest save classic_1st.qst test to python 7c8a5625c
    • test: move zquest save classic_1st.qst test to python 593beae65
  • make copy of playground.qst for quick assign test d200356d7
  • move recording test to python 770a6fe39
  • move File->New test to python 4440846b2
  • disable save test 931b20261
  • do not retry replay if zplayer exits before starting 7ae23cdbd  

    This was hiding crashes that only sometimes happen on startup, and never showing a backtrace.

CI

  • do not show info dialogs in ci 8e46bff09
  • quit earlier in zquest e57e45e8e
  • skip crashy test on linux 8d2731cbf
  • also show changelog relative to last alpha for nightlies 1025e5c88
  • handle "boolean" correctly 226889535
  • upgrade to python 3.11.4 ed8113dfa
  • run python unittest module instead of calling each test file individually bee03b3bf

Misc.

  • add 'std_zh' scope to changelog generation d82a0d845
  • make std_zh a scope, instead of a type efee4a34e
  • support squashing and rewriting commit body for changelogs 7c6430abe
  • add -version, -channel, and -repo switches ee809f874
  • use new name in readme 6acc68050
  • rename mac app bundle to ZQuestClassic 6a790894b
  • rename player executable from zelda to zplayer b6224d565
  • add '-no_console' switch to prevent debug console opening 020fb0382
  • Merge branch 'main' into newsubscr2 7aac40d6b
  • support dropping commits in changelog 1078cec21
  • allow for squash commit subjects to be changed too 23529bfc7
  • support changelog 'section' overrides for large custom markdown sections 975c9a1b3
  • wrap changelog-since-alpha in a details element 65d682663
  • wrap custom changelog sections in details elements 948ea7238
  • revert grabber.exe to 4.2.0 version, since current one stopped working aad1ce6e9
  • add sentry breadcrumb for zsys error messages f6015eae0
  • disable sentry session for all but zplayer and zquest 39edc388b
  • add 'templates' folder of subscreen templates eadd4a4b8
  • update default quest, default new subscreens + new gauge layout 7dfe531d2
  • allow dropping commit from changelog with '!' before ':' 55435340e

Visual Studio Code Extension

  • publish 1.0.6 9c70b4882

Sectioned Changes

Full Subscreen Rewrite

Full Subscreen Rewrite

The entire code behind how the subscreen functions has been entirely reworked to be less janky and more manageable. This makes editing the subscreen further a LOT easier of a task for us, and makes everything just a lot nicer in general.

General mechanics tweaks

Several mechanics have been generally tweaked, including basic things like how the selector behaves and how items are equipped. These changes are mostly spread across a variety of quest rules, but for easy swapping, there are now "New Subscreen" and "Old Subscreen" Rule Templates available [see Quest->Options->Pick Rule Templates]. These change almost every new rule related to the subscreen - the only important one that they leave alone is Old Gauge Tile Layout, which changes the tile layout used by Gauge Piece widgets.

These new QRs, as well as many existing QRs that relate to the subscreen, have been moved to the new "Subscreen" tab. These are searchable as usual via the QR Search feature.

TL;DR New QRs, check the new Rule Templates or the Subscreen tab.

Button Equipment Stuff

  • QR 'No Button Verification'- if enabled, the engine will no longer auto-equip things to buttons for you.
  • Also allows UNEQUIPPING items (try to equip it to the slot it's already equipped to)
  • Problem: With this enabled, even if you start with items, now the engine won't equip any of them for you!
  • Solution: Now you can set "Default Equipment" for each button slot! Just check the box in the ItemSlot widget, for the Active Subscreen that is set on the Starting DMap, and these items will begin pre-equipped to the buttons you set them to.

Brand New Features

Overlay Subscreens

These subscreens draw over the screen at all times, both during play and the active subscreen. As usual, widgets can have the 'Display' settings on widgets to change their visibility while the active subscreen is up, down, and scrolling. This can be used for various things, such as:

  • Displaying your current keys over the corner of the game screen, either using a 'Counter' for a number of keys or a 'Gauge Piece: Counter' to actually physically display each key.
  • Displaying button items or other similar widgets transparently over the game screen, similar to LTTP

Active Subscreen: Pages

You can now add multiple PAGES to Active Subscreens! You can either set buttons (like L and R) to cycle pages, or trigger page transitions by pressing a button on an appropriately configured widget. Changing between pages will use one of currently 3 animation styles:

  • Instant (It just jumps right to the other page)
  • Slide (Both pages slide in the same direction, the current page going offscreen as the new page comes onscreen)
    • Direction and Speed (in px/frame, with 4 decimal places) are configurable for this transition type.
  • Pixellate (Seemingly-but-not-actually random pixels from across the screen change bit by bit from the old page to the new page)
    • Duration is configurable for this type, in frames, as well as the "Invert", "XOffset", and "YOffset" parameters. These parameters only change the pattern of pixellation by altering the formula used to create the pixellation pattern.

By default, the Selector is not drawn during transitions- but this can be toggled as a checkbox on each transition.

Select Any Widget

Instead of only being able to move the cursor to "Current Item" objects (now renamed to "Item Slot"), the cursor can now be set to move to ANY widget you want it to! This has some nice interactions with other new features....

New Selector Features

The selected widget can now be set to:

  • Have overridden selection text, which will be displayed in the "Selected Text" widget (formerly "Selected Item Name")
  • Start a page transition animation on button press
  • Run a generic frozen script on button press

Yes, you heard right, there is now SOME level of scripting on the engine subscreen, even if not much.

Gauge Piece Rework

Life and Magic gauge pieces received a MASSIVE overhaul, and the "Gauge Piece: Counter" has been added to allow gauges for ANY counter! All of these behave identically to each other, except for these differences:

  • Magic gauge still has the "Show Drain" property, which is used to make a gauge piece display conditionally based on your magic drain rate (ex. show the half magic symbol when you have half magic)
  • Counter gauge lets you configure which counter to use, and how many per container to use for that gauge. Aside from these differences, they ALL can:
  • Specify a Gauge Wid/Hei, making a single widget draw more than one gauge piece, instead drawing an entire GRID of gauge pieces for you!
    • Specify an XOffset/YOffset to be applied to each row/column to create an offset-grid
    • Specify an HSpace/VSpace to space out the grid
    • Flags to specify which direction the grid "moves" in (Right to Left? Top to Bottom? Move in columns first, then rows? Snake back and forth?)
  • Hide the gauge (Or only show the gauge) when you have the Infinite Item for this gauge (works the same way as counter infinite items)
  • Specify a "Units per Frame" to reduce tile page usage. For instance, if "Units per Frame" is "2", then it uses half as many tiles for the gauge, as it uses the same tile for "1" as it would for "0", and the same for "2" as it would for "3", etc.
  • Specify frames/speed/delay for an animated gauge
  • Specify an animation CONDITION, wherein the gauge will only animate if it is above or below a certain value (either as a hard value, or as a percentage of being full). Additionally, you can specify it so that it skips the first frame of the animation when the condition is true.
    • A good example of how you can use this, is to have your life gauge only animate when your health is critically low, and use the skip first frame feature. This way, normally, your life gauge uses a single still tile- but when you reach critical life, it starts using the second tile in the animation instead (as well as any more if you supply more of an animation). This would allow for, say, cracked heart containers, blood dripping from heart containers, etc, as low-health visual effects.
  • Specify "Full Tile" mode, which causes the gauge to use full tiles instead of mini-tiles, becoming twice as wide and twice as tall in the process.

Counter Addition

Counters can now have a "Max Digits" specified, and if the counter has too large a value to fit in that many digits, it will instead display that many digits as all 9s.

GUI Work

The Subscreen Lister

The dialog where you select which subscreen to edit is now upgraded to the new dialog system. This dialog now shows you 3 separate lists for the 3 different types of subscreen!

The Subscreen Editor

  • Now somewhat auto-resizes itself situationally. This means it will be smaller for passive subscreens, larger for overlay subscreens, and will adjust to font changes.
  • Now has text displaying information about the currently copied widget
  • When editing an Active Subscreen, a whole new set of buttons for adding/removing/changing Pages is present.
  • R-Click menu has been entirely revamped, with many new options added.
  • R-Click menu now also exists if r-clicking in a spot that has no widget, which previously would give no r-click menu at all.
  • Slight tweaks to the existing menus
  • New Menu: Options.
    • Options->Mouse Settings allows you to change how the mouse behaves in the subscreen editor. You can choose between "Classic" (for the old behavior), or "Modern" (the new default, reworked behavior). Notably, in the Modern behavior, you are able to click-and-drag widgets around the subscreen editor.
    • Subscreen Settings dialog, allows you to specify settings specific to the subscreen. Currently only has settings for Active Subscreens, where some settings related to swapping pages are housed.
  • Several new "View" menu options, such as previewing what it would look like if every counter were full, or if every max counter was 65535, or if you had the "Infinite Item" for every counter, etc. Also includes an option to toggle "Show Unowned Items". If off, the editor display will show only the items as you have in Init Data.

The Widget Properties Dialog

Slight spacing tweaks, every widget now has an additional tab for selection-related settings. More widgets will use tabs for formatting now, giving the dialog a bit more breathing room overall.

  Relevant changes:

  • refactor: Rewrite the entire engine subscreen backend (WIP) 872925132
  • feat: some subscreen GUI work, new buttons for page editing 7e155ec83
  • feat: major subscreen editor gui additions f8a673431
  • feat: More subscreen work, generic scripts on buttonpress and custom selectiontext ac5f25f18
  • feat: ton more subscreen work e935320e4
  • feat: new life gauge settings 99462bf6b
  • feat: new subscreen features relating to counters, gauge pieces, and the 'View' menu 7d54ca59b
  • feat: subscreen settings dialog, buttons to change pages 9b60dc98b
  • feat: allow selectable subscreen widgets to go to another page on btnpress 82aee4b29
  • feat: subscreen page transition animations d8b22db8a
  • feat: Add 'Overlay Subscreens' 82a7b0000
  • feat: Overlay Subscreen settable in dmap editor e7b77dab0
  • feat: Copy/Paste/Save/Load rclick menu for subscreens c3a23dbdb
  • fix: subscreen rng offset dfbcaa3ff
  • fix: null dereference f9d950fe6
  • fix: cursor selector offset 536748569
  • fix: subscreen save/load errors e806cae7f
  • fix: some oddities with item slots 47e634138
  • fix: more oddities with item slots 064395320
  • fix: magic meter x offset 06e578791
  • fix: itemcache/override related fixes 9ca4eb0ec
  • fix: button item misalignment bc9f8abf7
  • fix: some more subscreen related replay errors b25433e8f
  • fix: subscreen related button item stuff ad997e2b9
  • fix: more subscreen related replay errors f13ef43ca
  • fix: compat qr item 0 being visible on buttons 47c7a6d3a
  • fix: typo in previous commit 7a8ae5e27
  • fix: more subscreen fixes e646db354
  • fix: itemcache bullshit errors 23d96075f
  • fix: selector stuff 0ea092e6d
  • fix: some item animation offsets aee731bd8
  • fix: selector offset errors 20f343644
  • fix: minor counter fixes 2db1741ed
  • chore: clean up some subscreen item animation code/replay errors 97be172fa
  • refactor: convert subscreen widgets to new constant system 2a7bc9778
  • refactor: more subscreen replay/type fixes fd5a735b0
  • refactor: work on subscreen cursor selection 1283ce09d
  • refactor: split subscrwidget flags into two vars, trim gridflags a3db000a2
  • refactor: improve subscr_props dialog arrangements 2162adf82
  • test: update 'nes-remastered.zplay', item flash animation offset 93c563aa2
  • test: Update/Rerecord 3 playground replays to fix quick-assign tests 2c8906b5d

2.55 Alpha 116

August 02, 2023

Features

  • Torch combos support shapes, dirs, new Square shape. 57f6cea0c  

    Also refactor how shape drawing works to remove the need for duplicate ZQ versions.

  • Add general SFX/Sprites to combos (no zscript access yet) 4d55a2a74
  • add solid damage combo QRs ab146e65f  

    also fixed "No Solid Damage Combos" QR and fixed more issues with Newer Hero Movement

  • Customize 'Guy' per-room (compat ruled) 00302d51e
  • multiple new options related to subscreen item selection 6ff6a775f  
    • Cursor can be allowed to select empty slots (Freeform Subscreen Cursor)
    • Can be set to require pressing B to equip (Always Press To Equip)
    • Items have 'Non-equippable' flag, allowing them to be cursor-selected without allowing them on buttons.
  • add quest package export for standalone app 669ed4833  

    In the ZQuest File -> Export menu, there is a new option to package your .qst file as a standalone application. This gives you the option to distribute your quest in a way that allows people to play without grabbing any other files, or needing to select a file when starting a save slot.

    For a qst game.qst with a title "My Game", it looks like this:

    - My Game
    	- My Game.exe
    	- data/
    		- zelda.exe
    		- zc_args.txt
    		- game.qst
    		- ... all support files ...
    

    This is located in the packages folder of the root installation folder.

    Double clicking My Game.exe launches ./data/zelda.exe with the CLI switches listed in zc_args.txt. By default, the export tool provides these switches: -only game.qst -notitle. You can set whatever else you like. For example, if you want to skip the save file screen entirely, you can use -standalone instead of -only.

    Every time a package export is done in ZQuest, the folder is created from scratch.

    To include additional files, make a folder ./packages/My Game_extra and place whatever your quest needs (music, images, zc_args.txt, zc.cfg, etc). The export tool will copy this folder into the package folder at the end, which allows you to overwrite whatever you want.

    Custom icons are also supported. See docs/packaging_quests.md for details.

  • add -window-title switch e9a7e4f6c

Editor

  • 'Quick Compile ZScript' favorite command 8652f1c91
  • Option to auto-recompile when saving quest 28db73dc7
  • save autolayer info to reapply to blue void screens as a default d955ace97

ZScript

  • Add script access to draw lights (circle, cone, or square) arbitrarily. bd032d78d
  • '@InitScript(int weight)' annotation allows multiple global init scripts (all merged into ~Init). dcaa46921
  • jit compile MULTV 02cb588d3
  • JIT compile scripts with background threads e0a845b53  

    Control how many threads are used with [ZSCRIPT] jit_threads.

    # Number of background threads for compiling scripts.
    # -1 to set to number of available CPU threads
    # -x to set to (number of available CPU threads) / x
    # 0 to only compile on the main thread
    jit_threads = -2

Visual Studio Code Extension

  • create VS Code extension dabe7c091  

    This adds support to VS Code for displaying error/warning messages, syntax highlighting, and code formatting. You can install it by searching for "zscript" in the extensions Marketplace. See the extension homepage for more:

    https://marketplace.visualstudio.com/items?itemName=cjamcl.zquest-lsp

  • update vscode extension keywords 6ecf0775a

Bug Fixes

  • memory leak when allegro does not find file 4ab4a512f
  • for linux, use posix_spawnp when launching processes d93e3c2eb
  • set dirty flag for vedit text field components e21e66f69
  • bad ternary from solid damage commit c46056a29
  • ZQ doesn't lock up if parser crashes [windows only] 51eaa167d
  • properly set sentry breadcrumb category 654dd9c24
  • add win7 compat for GetOverlappedResults 8a0699eb5

Player

  • reset button down state correctly bb1e906cd
  • 'npc->Remove()' no longer leaves behind enemy bg sfx 691b022d8
  • clear darkroom bitmaps to dark color during player death animation 22e241747
  • Lantern inconsistency during scrolling caused by previous commit 00a536cc2
  • memory leak in read_one_subscreen 17f5ecc64
  • more reproducible fairy hearts, for replay in Debug mode 901a3e05d
  • various newer hero movement 9762141db
  • new respawn points with ladder 5641cf8c1
  • check for invalid screen index in subscreen map draw f327193e1
  • reduce some data races 8c2dda32e
  • smart conveyors snapping you to the grid 337727343
  • Crash related to reflected magic having invalid parent c3f9d7d48
  • specific NES door softlock 26541dbc3  

    softlock when moving through a bombable or walk-through door in mid-air with "No Scrolling Screen While In Air" enabled. (Now, with this rule on, you won't be able to go through the door until you land)

  • input prompt not showing when configuring gamepad a226a2ee9
  • prevent invalid memory access in triggerfire b3c209499
  • prevent invalid memory access in joytn 1aa558687

Editor

  • set list position for strings of older quests 9cd257e09  

    This resulted in the Strings GUI not correctly showing all the strings.

  • use correct index when saving string editor "Next" 52d8e4081
  • some pasting/blue void screen related issues cf1dfbbc3
  • blue void issues related to F4 (screen palette) dialog 33ee353c3
  • grabbing tiles from qst files 3312ba667  

    Commit 142485 regressed this, by accidentally throwing out the next section id when skipping unwanted sections.

ZScript

  • global object arrays being wrongly cleared on F6->Continue f9383ff99
  • fix for-each loops on non-const arrays. 9c6e31bca
  • free jit script handles on engine shutdown 52db50c21
  • Negative Array rule issues 0da042ba3  

    Fixed negative array rule not being respected on first load of game (either via test quest or when loading from file select); also fixed negative array rule not being turned on via compat.

  • compile crash 3cadfecb3
  • several class related bugs 9024587f5
  • QUOTEDSTRINGs not merging for all use cases (ex. annotations) c9caaafa5
  • screen script run function arguments 52b34fb60
  • shutdown jit thread pool before resetting scripts bb213c146  

    This prevents a segfault when a thread is compiling some old script after a new quest has loaded.

  • Broken labels and stack size in global init scripts 1a0707e41
  • more string literal related issues 0b0fcee0f  

    also added macros to help fix more of these that might pop up

  • prevent MODR divide-by-zero in jit 6afb11354
  • make div-by-zero an error instead of a warning, when divisor is literal 0 9e7563267
  • script engine hanging on empty script 9bf81e42c

Visual Studio Code Extension

  • support missing edge case for parsing error 8b70ca3d0

Documentation

ZScript

  • docs for light-related new drawing functions, LIGHT_SQUARE constant 173389422

Build

  • remove alogg, use a5 audio streams for ogg 7beab3968  

    Also refactors zcmusic to use ALSTREAMFILE for any a5 audio stream. Currently, mp3 and ogg use this.

    Co-authored-by: Moosh64 44924261+Moosh64@users.noreply.github.com

  • fix compiling zcbase for msvc debug 84ef4d15e
  • upgrade to latest allegro 845acc646  

    https://github.com/liballeg/allegro5/compare/68946485f315c5a6df753250ec5979ab291c60a9...c2bf1e11bed0b63539267115baf190741e0a437a

    https://github.com/connorjclark/allegro5/compare/my-fork-2..my-fork-3

  • for linux, use libcurl with openssl instead of gnutls 1227b954a
  • disable WANT_OPUS when building allegro bff683d3c
  • upgrade to latest fmtlib, for compile time checks 36a0f1932

Chores

  • bump version to alpha 116 c360cac20
  • add docs/constants for new square light shape ba9d67ed2
  • bump dmap section version to reserve for z3 05bb58363
  • fix compile previous commit f5202713a
  • add include 7dbcfc0fd
  • try fix linux compile 123e7a21c
  • update instances of "Zelda Classic" to "ZQuest Classic" ca2dd6d8f
  • update comment instances of "Zelda Classic" to "ZQuest Classic" f3ae9af4b
  • add commit to .git-blame-ignore-revs 43ccd326e
  • update changelog for A116 1869a68c7

Refactors

  • un-inline zc_math functions eba451962  

    This allows for us to always optimize these functions, even for Debug builds. Good for replay determinism.

  • actually skip reading qst sections when requested 142485948  

    Only the tile importer for qst files uses the feature of skipping sections when loading a qst file. This would still read and process every section, it just wouldn't persist anything. So it wasn't really any quicker.

    This paves the way for removing keepdata from all of our loading code.

  • add 'qrs.h','qrs.cpp' and move 'box_' related functions b0a55a23e
  • optimize some more headers/zdefs stuff 9b309630c
  • move Hotkey struct to 'hotkey.h'/'hotkey.cpp' 629fd8d9f
  • move dmap struct/flags to 'dmap.h', various constants to 'sizes.h' ab539b694
  • move packfile-related functions to 'packfile.h' 3387b9ea8
  • move combo pool/alias data to 'cpool.h'/'cpool.cpp' 65cd926a2
  • move font enum to 'fonts.h' 436d3f270
  • move MsgStr stuff to 'msgstr.h'/'msgstr.cpp' 4007bb471
  • move newcombo stuff to 'combo.h'/'combo.cpp' 2c3fe05c7
  • move combo 'advanced paste' to 'combo.cpp', use enum flags, rename 'sizes.h' to 'general.h' a4afbd4a3
  • move triggerflags to combo.h e37432d49
  • move misc data stuff to 'misctypes.h'/'misctypes.cpp' abac74960
  • only use 'QMisc' as a single global 'miscQdata' for all programs 03522af1b
  • remove keepdata boolean from packfile reading ef3faef68

Player

  • remove windows midi_patch; improve switch out/in dc48c2763  

    This code was pausing/restarting MIDIs and resetting the volume in a convulted manner, likely to workaround some old bug with MIDIs seen on windows only. We've since upgraded to allegro 5, which gives a different backend for playing MIDIs, so this bug is likely ancient history now.

    There was some issue with blurring window focus losing percussion, sometimes. Not sure if this change will have an impact, but let's see.

    Replaced the midi_patch UI toggle with pause_in_background.

    https://discord.com/channels/876899628556091432/1114306020848717904

  • do not recreate script_data when resetting 4bbe968da
  • delete unused enemy clone ctors dd6239cdb

ZScript

  • optimize function code, add PEEK to allow combining POP/PUSH back-to-backs 8402c406b
  • optimize 'SETV reg,X - TRACER reg' to 'TRACEV X' 41ca67ec7

Tests

  • better error message when zelda binary not present 0c8e2605f
  • return failing exit code if replay mode desyncs b9b09cd80
  • remove timeout for Coverage and Asan builds 908a011bc
  • use python server instead of node for local compare report 18f8a08fa
  • disable sound for replay tests a9d38c70d
  • check exit code for replay tests 1f31223cd
  • only check exit code for replay tests under Asan acd61977e
  • add download_artifacts.py dca122f8e
  • add asserts for group_arg logic bdfbe948d
  • condense --snapshot args generated for failing run b8048b986
  • refactor compare report to use ReplayTestResults aa282f96e
  • fix regression from refactor in aa282f 3da06ae9a
  • fix silly lazy unit test 0591e6a99
  • update test_replays with new unexpected gfx frames, changed in 7ed7b 5e13ce424
  • fix argument passing to run_replay_tests.py e6ea4e1a9
  • update expected zasm, changed by 8402c4 39f685f44
  • add -headless switch for disabling display and sound 4d17ccf7f
  • update expected zasm, changed by 52b34 62de6e7d3
  • print backtrace on crash 92d6b3237  

    Every Python test and invocation of our programs in CI is now called via run_target.py, which will attempt to print a backtrace if the program crashes.

  • fix sharding for replays with sub-second durations e12e09605
  • add playground_slopes.zplay 503a5c97f
  • use debugger for replay tests by default only in ci 4c0859a33
  • add playground_screen_script.zplay 2dda68a5f
  • add replays for step triggers, trigger groups, and cutscene triggers 94c96655f
  • add --show flag for replays script, alias for --no-headless and --throttle_fps 0cca40ff8
  • update playground maths script to not divide by literal 0 69a9a16af
  • update run_target default build folder selection to work on windows 82631d33c
  • add playground_sideview_slopes.zplay f0a3b9644

CI

  • allow Asan config type for test workflow 13ebdc854
  • pass build type to replay tests script c59f68b10
  • when updating artifacts, only upload the updated/ folder bc1be95c6
  • do better job of reducing size of compare report 7ed7b02d8
  • enable jit_threads 86d162ea5
  • limit yuurand.zplay for coverage because of rng desync 8f12f54c4
  • fix previous commit 8f12f54 54c1b9c2b
  • select previous alpha when generating automated changelog e390bfdac
  • remove github's version of generated changelogs 10f1b630d

Misc.

  • fix bisect process spawn for non-windows 58f518995
  • add .mailmap file bf78bab6b
  • add changelog overrides 3991c9e31
  • set failing_frame in replays for rng desync, even in replay mode 6bbe3a0e9
  • add new commit scope for the extension: vscode 57d2c1930
  • improve changelog markdown 2392d3e70
  • remove commit body after "end changelog" a30bbd8aa
  • add sentry tags for qst/screen 14e9d8791
  • add script to get all quests on purezc 7755714fb
  • add render_debug option for debugging render tree 0456127c6
  • improve newlines in changelog markdown generator 0988d3efe
  • show deprecation warning in 32bit windows build 5000dcd90
  • add -crash switch for crash reporting test 743a300dd

ZScript

  • add missing asm debug for first uncompiled command c19830c04

Visual Studio Code Extension

  • publish 1.0.5 6092d4483

2.55 Alpha 115

July 10, 2023

Features

  • Pushed-> triggerflag, triggers when the combo clicks into place after a pushblock push. 218b1d071
  • customizable ripple/tallgrass sprites per-combo 715893f35
  • increase combo label limit from 11 to 255 edea0722a

Editor

  • 'Test Quest' hotkey (default 'Ctrl+T') 79a292c4f
  • Finish signpost combo wizard ccccaf6a7
  • AutoBrush now will revert to 1x1 after placing if ALT is held while selecting an area. 43825d2b6
  • Compiler settings now searchable in QR search dialog cedf82689
  • Screen Palette menu now previews in the window behind it c98758a57
  • -quick-assign CLI switch to compile + assign 31efdf60c  

    Example usage:

    ./zquest.exe your_quest.qst -quick-assign

  • tile editor 'Esc' deselects selections (if something selected) c9df55421
  • Add 'General Tab' to advanced-paste combo dialog (and clean up the dialog) 516526658

ZScript

  • Weapon death effects + liftability settings 5b87f8712
  • Hero->MoveAtAngle(), Hero->Move() 424840536
  • generic event HERO_HIT can now understand FFC/combo position 03706f16a
  • Hero->ShieldJinx, new generic events (drown, fall, HeroHit applies to shallow liquid) 59337477d
  • -include switch to set include paths 20480cb28
  • Graphics->ConvertRGBTo() and Graphics->ConvertRGBFrom() a37a156f2

Bug Fixes

  • add some sanity checks to font initialization b659ab974
  • do not show hidden files in file selector cf932f82b
  • memory corruption in quest load from bad palcycles 72f741728
  • memory corruption in quest load from bad shop count 7b43ff57e
  • memory corruption in quest load from bad door combo count 01f4a2cc8
  • memory corruption in quest load from bad item count dafd04b15
  • memory corruption in quest load from bad weapon count 1fa149c51
  • memory corruption in quest load from bad warp count bf64cf4b5
  • memory corruption in quest load from bad string length 8b9883ac4
  • memory corruption in quest load from bad misc info count de4595fbc
  • prevent over-allocation in quest load from bad map count a262c53f7
  • memory corruption in quest load from bad string copies bf5fa4c5d
  • prevent over-allocation in quest load from bad script commands 51dd859de
  • memory corruption in quest load from bad zinfo weapon count 70910a8e3
  • memory corruption in quest load from bad zinfo counter count 40ace2986
  • memory corruption in quest load from bad zinfo mapflags count aee1105d1
  • memory corruption in quest load from bad zinfo combotypes count 46521737e
  • memory corruption in quest load from bad zinfo itemtypes count b1c8944db
  • memory corruption in quest load from old pwd hash check 941720a37
  • memory corruption in quest load from repeat section ids 75057cf10
  • prevent over-allocation in quest load from bad script bindings 3240f577b
  • memory corruption in quest load from bad subscreen strcpy f30cc94ff
  • memory corruption in quest load from bad sfx length fe8a0e887
  • memory corruption in quest load from bad warp count (old) da70b79fe
  • memory corruption in quest load from bad genscript count 8bf716bdc
  • memory corruption in quest load from bad dropset count 8d5d7f8f9
  • use-after-free bug in widget label 84539eff0
  • greatly reduce cpu usage when drawing dialogs 5d166d15f
  • set dirty flag for more dialogs needing redraw, missed some d5c5f0d41
  • properly handle mp3 unloading to avoid crash 8a33b68b9
  • set dirty flag for list search components 50fae6629

Player

  • cleanup bush/flower/etc decoration sprite code 3c8baa1e4
  • items/weapons/players not rounding y coordinate when landing 2ea7a5fe9
  • 'Save Indicator' option now works to toggle the 'Saving...' text 1a700f533
  • mouse cursor not appearing in some popups 19087bf7d
  • prevent Hero->CanMove unwanted side effects b60185559
  • fix dropped input when script modifies input state a773ac9ba
  • Fix 4-way "Newer Player Movement" 81710c1ee
  • signpost prompts take priority over triggers tab prompts 347bc58fb
  • Newer Player Movement issues with fitting in half-tall gaps 1210ef14a
  • waitdraw not working for ffcs over 32 ae823474a
  • do not stop at first ffc for lens trigger 90eff0ba4
  • npc scripts not running on screen load c8e2c861e  

    Fixed npc scripts not running on the first frame that a screen loads, resulting in a single frame of spawn poof before you can hide or change the tile of the enemy.

  • enemies not running scripts on first frame with scriptloadenemies 935757d42  

    forgot to handle this when fixing last commit

  • Fix writing to shopdata->Price[] 7094e8d8c
  • fixed new (non-classic) respawn points being unsafe in sideview c41729262
  • off-by-one error with ffc link delay 996dc964d
  • Should fix all instances of things occurring on the wrong screen when scrolling bae07692c
  • system reset when recording in test mode f35c89de7
  • scrolling on to raft paths no longer forces you to raft (compat ruled) 1412cab3e
  • mid-scroll is no longer a "safe respawn point" 9d691ad0c
  • LW_THROWN weapons not running weapon scripts 45ada8199
  • Throwing in sideview 384513a3b
  • windows crash as writing .zplay.result.txt file when exe not approved 0fe78dde3
  • Test Mode issues when quitting during opening wipe 95e3288ec
  • ignore unintentional input on first frame of subscreen 0573804d3
  • Torch combos now function on pushblocks 0a56608dd
  • force system pal after matrix screensaver b40f8d5ce
  • non-torch pushblocks no longer cast light c8d359531
  • use-after-free bug when picking up triforce 424279031

Editor

  • combo pool paintbrush was broken 50ac2928f
  • 'k' in assign slots dialog confirming 0a63b6075
  • minimap graphical oddities b91e5977b
  • map out of bounds crash report 56921d432
  • string list dropdowns were offset aaeaeccf0
  • string list ordered wrongly in dropdowns bee021913
  • undo history for "Paste FFC as ..." 023f81c00
  • undo history for "Paste FFC Data" d77c8b93f
  • gui label text wrapping on strings without spaces a49fe973c
  • background blank-out after adjusting tiles in string editor 4f855abaf
  • bad pointer alias crashing QR search dialog f63fbaa0a
  • stop using corrupted file handle when saving .zcheat file 2deb39605
  • properly load qst when grabbing tiles acacb5a21  

    The loadquest function was erroring on the ffscript section, but only when "keep data" was disable for that section. The section loading code was improperly read the file, which resulted in the password hash not being set in the header, which resulted in an errant password check prompt.

  • do not show guys in screen enemy selector 28c47172e  

    The first twenty enemy ids are reserved for guys, and can produce unexpected behavior when used as screen enemies. If a screen is using one of these enemy ids, the name was showing as "(None)" in the screen enemy list. It will now show "Guy - Do Not Use!".

    The enemy selector list also will no longer show any of these enemy ids.

  • more fixes to load quest usage of keep data 6cfcd45f8

ZScript

  • dmap scripts not updating 217b877c3
  • use sane qrs by default for parser CLI 5ed5d3b9d
  • backwards byte order of the rgb type used by paldata 79fa156a5
  • use correct engine data for player scripts 9ff13b90d
  • setting input buttons to false correctly prevents button press 656bb7628

ZConsole

  • [win] use async i/o, speeds up zscript debugger 2bbc6e58b

Documentation

  • update weapon lifting docs a9410e821
  • add fuzzing.md ba7921e82
  • type help for Slope combo type 80b4c5acd

Editor

  • Clean up tooltips for combos on the screen. 175152592

Build

  • set zquest as default startup target in VS 19d7ea741
  • add Asan build type 33ecea2aa
  • support Asan build type for zelda target dd924d048

Chores

  • update versionsig 81d7f6d21
  • fix compile 94ca60c61
  • fix non-windows compile (remove unreachable code lines) 380118b8d
  • remove debug print 605e0e1a6
  • fix type conversion error 9b8b21708
  • Replay version check for respawn point fix e92a15324
  • fix compile because I'm stupid 3f430cc81
  • comment (and slightly optimize) 'user_object.cpp' 9e5e60b0a
  • update changelog for A115 812da2517

Player

  • fix misaligned checkbox 37e42bd83
  • system palette code aa15531e5

Editor

  • init data gui cleanup c6794c995
  • update default quest file (fix dmap 0 flags) 837c65979
  • fix missed in previous commit 10097db47

Refactors

  • remove classic_qst.dat, use default.qst e6e5c9906  

    ~200KB smaller, and easier to change (no grabber.exe).

  • rename solid_object hxsz, hysz to hit_width, hit_height 0fccb318c

Player

  • remove indirection in calling scripts based on version a7bdf12cd  

    This just makes the code harder to understand. And dereferencing a pointer for a function call is certainly slower than relying on cpu branch prediction to do its thing.

  • add interface for combo cpos_infos cc2c6aa8a
  • tweak and document MAPCOMBO3 ead694178
  • replay_version_check f461b1071

Editor

  • Level Palette shortcuts cleanup, add warning with dsa 2df440583
  • new clean compiler settings dialog + help text d9528ee4f

ZScript

  • common interface for script engine data afd10f7e4
  • use ScriptEngineData for item scripts 3d13a4422
  • use enum for script type 970aafd77
  • add interface to encode combopos ref 91b4eac1d
  • only allocate script data for combos that need it 7f4ac3b75

Tests

  • update replays a383d5c57
  • add lifting.zplay, rocs_feather.zplay 4c10d5b17
  • increase replay timeout for web ced397fb1
  • add zscript compiler expected zasm tests 2afd78063
  • check if failing frame values exist in dict ba99a2dfd
  • use exists_ok when making updated dir 95f161860
  • print failing frame during replay test 67d34be84
  • use exist_ok when making updated dir (typo...) d5580d54d
  • refactor compare_replays.py to prepare for re-use 9a81e9cf4
  • refactor run_test_workflow.py to prepare for re-use b2e5fe5cc
  • automatically start webserver for compare report 47bc28454
  • add prompts for creating a report on failure b79079271  

    When run_replay_tests.py fails, a prompt is now shown to generate a compare report either from already-created baseline snapshots, from GitHub Actions, or from running a release revision locally.

    Much of the functionality needed for this was already present, this just ties everything together and makes it much simpler to generate a report.

  • auto update new script test 2af517bb1
  • restore scripts compiled by playground.qst 1f78aefca  

    These were removed from the package in aa3d87, but we actually need some of them for playground.qst

  • add playground_scrolling_script.zplay c34b92a76
  • add dark.zplay aaf68685f
  • support substring for run_replay_tests.py --filter 298d40c55
  • add test_zquest.py. tests compile, slot assign of playground.qst bd682985e
  • move ghost replay into playground.qst 3294b1866
  • rename lifting and rocs_feather replays 8c5058b1c
  • remove replay comment when jit fails to compile 6289180bf
  • fix web replay tests hanging 93fc09090
  • add ganon.zplay fbab82705

CI

  • clone before downloading release artifacts dd3bfcbb2  

    Apparently the checkout action deletes the current directory first. Lame.

  • skip solid.zplay until it is re-recorded 38e4ec35e
  • fix release tag for branches 5f647e9dd
  • fix release tag for branches (really) 465dd9c71
  • remove release cron cfcd1291e
  • specify version of PyGithub aaf2edaaf

Misc.

  • add git hooks to validate commit messages a8f26b259
  • add scripts/generate_changelog.py 3892158f1
  • grab test builds from CI for bisect tool f2e437a9f
  • print changelog on every step in bisect tool 8bb31d154
  • allow advancing in bisect tool without closing program a6b9a8584
  • cache if release has a valid package for windows in bisect tool f93e19187
  • fix git hook script when core.commentchar config not set d35712951
  • reverse commits in changelog for more natural ordering 423f04791
  • use separate folder for downloaded release builds f57703681
  • fix wrong scope suggestion 9fb96dc55
  • include commit body in changelog a29611391
  • ./zelda -load-and-quit <qstpath> 9bf02571c
  • automate fuzzing process fd3e64168
  • remove unneeded init code for fuzzing quest loading d85c83770
  • update used QRs in quest database d4bb90020
  • include deprecated_rules in qr analysis 999523839

Editor

  • Change "Place + Edit FFC #" text to "Edit New FFC #" for clarity d21b3dfad
  • do less setup for -copy-qst command 4c4e37a6a

2.55 Alpha 114

June 11, 2023

Changes to packaged files

  • 3f2ce2 Remove resources/docs/Zelda_Classic_and_ZQuest_2.53_API_Specification.pdf
  • 6b2343 Remove resources/docs/zscript_manual.rtf
  • c29e6f Remove resources/ZCL-changelog.txt
  • aa3d87 Remove resources/scripts
  • b4c455 Add '255example.qst'

Features

General

  • 21447f addd8a 8ad107 58d3d0 Add ability for lifted combos to be bombs
  • b08454 add 'Lift Flags' - allow disabling shield/items while lifting
  • 075935 Add QRs for lifting+scrolling/warping behavior options
  • ca30be Preliminary: allow user created portals
  • 884169 Add Trigger Groups (i.e. light all torches -> trigger secrets)
  • 1c6aad Add weapon igniting
  • f6245e eb40f0 Item display names
  • f460b4 "Newer Player Movement" (#856)
  • 13a30d Add "Locked String" to lockblocks/chests, display a string when failed to open
  • 7d0f10 Add SCC for run generic frozen script
  • c249c9 update std_functions: add LoadMapDataDM(int dmap, int scr)
  • 7b16cf Add more special draw layers
  • 82ba2f Some work related to combos+weapons (Step->Effects,Shooters)
  • ce3c0a Add generic script frozen mode triggered by combo triggers
  • 012ec9 Stop using encryption password for qst allegro packfile
  • 5304bd Remove encoding layer from qst files. This makes opening quests roughly 50% faster
  • a79f3a Support reading and saving as qsu (uncompressed file)
  • f2e5f0 Update 'example fonts'
  • 64d42a Some reworking of bombs

Player

  • 921302 Init Data / Cheats uses item Display Name

Editor

  • 0668a5 Allow quick slot assign
  • d5e0eb support undo/redo for ffcs
  • 24c2ad support undo/redo for single flag placement
  • 473b50 83f286 625564 Add QR hint system to info boxes
  • dcdee8 Remove import/export options for ZQT and QSU files
  • 3c95bf Add configurable cursor color for tile/combo pages
  • 5c9416 Add symbols to font preview lipsum text
  • afdc32 New item selection list dialog
  • 8f6aff Add lift glove help text
  • ff66e1 Add tile editor visual options
  • 9caad3 Add bomb flowers to default quest
  • 4dbba1 Add radial bomb flowers to default quest

ZScript

  • 2a792b Add Hitby stuff to std_constants
  • f098ea Add 'Hero->HammerState'
  • debfac Add script access types portal/savedportal
  • 246f8b Add 'npc->CanPlace()' for checking teleportation movement.
  • 2baa25 Add custom mouse script support
  • 05723f Add 'Hero->MoveXY()'/'Hero->CanMoveXY()'
  • 530f7c Lifting script access work
  • b22264 jit: compile FLOOR and CEILING

ZLauncher

  • 5b8a6b allow configuring gfx driver for player on windows

Bug Fixes

General

  • 50167b Fix jwin_file_browse_ex not applying selected extension
  • 54bcde Fix some gui color issues with certain "disabled" elements
  • 6dfbcf Fix segfault in file select extension filter
  • 005870 Fix uncleared combo bitmap
  • 1ba148 Revert non-windows ignoring 'ignore monitor scale' checkbox
  • e51281 Fix zfix dobound swapping values when it shouldn't.
  • 59c413 27b421 Fix tile preview in item lister
  • 5f053f Fix vanishing text
  • 0b42b7 Frame infobutton stuff
  • 278243 Attempt Fix gui lag issues
  • db9c3d Fix allegro.log oddities / trace handling
  • d49bb1 color a5 bitmaps on init to avoid random tint

Player

  • 4670ce copying save file should also copy replay
  • e77af5 some movement fixes and improvements
  • a13395 Fix scroll frame timing issue
  • be20d2 Never use linear scaling for game bitmap
  • 2ed468 Fix edge case bug with scroll warps and dmap script waitdraw
  • c5b367 Fix lockblocks/chests double-playing locked strings
  • 2d5e12 Fix Opening file in append mode now creates missing directories
  • dd0d45 Fix Hero->ReleaseLiftWeapon not working
  • 19979b Fix SV Ladder 'force face up' during scrolling
  • 72834b Fix facing direction affecting movement wrongly
  • 830a8a Add conveyor force-walking
  • 5dd40b Fix candle/arrow 'max per screen'
  • b966e1 'Shutters->' fixes/tweaks
  • 40e795 Fix icy pushblock interactions with block holes.
  • f79fd3 Fix ANCIENT ZQ subscreen selector bug.
  • 8f17aa Fix bad coordinates with bush ffcs
  • 81398d Fix oddities with loading save files of missing quests
  • 646eed Fix crash when missing save files
  • f741b4 Fix some CanMove stuff
  • 765eac Fix mirror portal in top left
  • 1a50e8 Fix gleeok heads not drawing correctly on first frame
  • cba517 Fix all remaining HitBy bugs (hopefully; TODO: add QR for ignoring nayru's love for HitBy)
  • cb587f Fix crash with invalid ids with npcdata
  • e75cc3 Cheat invincibility now protects from drown/pit damage
  • 2a4df0 Enemy / solid object interaction fixes
  • 5ccdfd Fix solid ffcs pushing on wraparound
  • 8c4f32 Fix 'Enemies->Item' with enemy waves interaction
  • 9975b0 Fix warpEx scrollwarp visual bug with map
  • eaf5fe Add hardcode layer 'SPLAYER_PLAYER_DRAW' to draw to player sprite layer.
  • c7aa72 Scripted enemy movement fixes
  • 03a8c9 Fix solid ffc hang
  • b305f2 Fix bad HitBy melee interactions
  • f42982 Fix enhanced music cutting out when tabbing back into the window
  • ce390d Fix layered pound blocks being hit by midair hammer
  • 07f8fe stop loading quest template to reset items
  • 3f8f62 never init from a quest template
  • 2a5734 Fix triforce + item bundles
  • 6b6744 Fix melee weapons not respecting all of HitBy's properties (UID, etc)
  • 5e26e8 Fix wrong item id check
  • 565c50 Fix dialog mouse offset at large resolutions?
  • d8f658 Fix mouse not showing during some popups
  • 0de954 Fix zc mouse showing during gameplay, setup for fancy mouse stuff.
  • f1f9c8 Fix onCredits messing up gui bitmap transparency
  • ca7839 avoid wasted computation in overpit
  • 92287c 717878 f8fa5f 01fcce improve eyeball combo during scrolling

Editor

  • 84bf0e Fix preview mode 'preview combo cycling'
  • 811622 Fix 'Show FFCs' not respecting preview mode
  • 35dd54 Fix decimals not being saved in zquest hopefully?
  • ac4d20 Fix wrong QR description
  • 820b3f Optimize slot assign; no more temp files
  • 7523dc Reduce 'do_slots' duplicate code
  • 2de58e Clean up ZQ errors, add fonts.dat size error message
  • ecb6b3 Fix combowizard for shooter not saving direction
  • ddc8e4 Fix Screen palette can be changed on null screens
  • 71071d Fix frame titles being visible in the wrong tabs
  • a738e8 Fix locked chest/lockblock combo wizard
  • 60761a Fix favorite combo offset on quest save
  • ef294b Item editor pickup tab revamp
  • 13bb56 Fix shallow water combo wizard
  • 77f342 Rework tile grab GUI: Fix 0xFF transparency issue, text cuttoff issue
  • b31eac Fix brush width/height when changing combo in some ways
  • c6f52b Fix minimap right offset
  • 386d15 Fix zq minimap offset
  • e92322 Fix grave/bsgrave combo wizard
  • 60efdd If DragAspect is on, force aspected xscale/yscale
  • a92a19 Fix placing ffcs not snapping to the half-grid
  • 24b134 Fix favorite combo misalign / mappage bookmark overwrite when grabbing tiles
  • 42b98a Fix max brush size being ignored by autobrush
  • 89d870 Fix combo editor CSet- and T shortcuts
  • 1d5a82 Fix combo brush when selection crossed combo page boundary
  • 3f862a Fix tile grid state when undoing dungeon/relational drawing
  • da42a8 Fix eweapon dropdown error
  • 9e528c oxford commas
  • c5f7f1 Allow prompts to show from triggers tab even when 'Button: 0'

ZScript

  • fac141 Fix scripts with >8 params hanging on compile
  • a743bc Fix 'Hero->ReleaseLiftWeapon()' not compiling
  • 4671e5 Fix MAPDATACOMBOTD setter referencing combo of the wrong screen
  • bb5cef Fix string/array literal allocation error
  • 64acf7 Fix 'Game->DisabledItems[]' not updating item cache
  • fd8738 Fix bad 'dmapdata->' Get/Set functions
  • 1078cf Fix enum assignment const checks
  • 87fb4c Fix?: Script npc->MoveXY ignored solid FFCs
  • 7732f3 Fix this-> not writable in user constructor
  • df8266 Fix string/array literal allocation error for real
  • 2d30a7 update std.zh: Fix FireE/LWeapon functions
  • 0c246f jit: fail compilation if function return cannot be resolved
  • fbce61 jit: support class construction function calls

2.55 Alpha 113

April 10, 2023

Full Changelog: https://github.com/ArmageddonGames/ZQuestClassic/compare/2.55-alpha-112...2.55-alpha-113

2.55 Alpha 112

February 22, 2023

View the release notes here: https://gist.github.com/connorjclark/b3147f4019bad30fe9df4aa1d55ed884

Full Changelog: https://github.com/ArmageddonGames/ZQuestClassic/compare/2.55-alpha-111...2.55-alpha-112

2.55 Alpha 111

October 23, 2022

Full Changelog: https://github.com/ArmageddonGames/ZQuestClassic/compare/2.55-alpha-110...2.55-alpha-111

  • Fixed a serious bug released in Alpha 110 where item positions would get reset for cave warps. If you saved in that version, you'll need to re-set those item positions. Always remember to backup quests when upgrading versions!
  • For the longest time, input would be unpredictably ignored or delayed a few frames for button press checks. No more! If you have super sensitive timing, you may notice the game has become more responsive to your button mashing.
  • More, see the changelog!
Detailed Changelog
// Alpha 111

Fix shadows not drawing on enemies that do not 'Obey Gravity'.
	( EmilyV, 23rd Oct, 2022 )

Add 'GetEquipmentX()'/'GetEquipmentY()' to std_functions.zh
Update 'UsingItem()' in 'std_functions.zh' to check x/y buttons
	( EmilyV, 22nd Oct, 2022 )

Change the 'Global State' flag on switches/switch blocks
	to 'Flags[10]' instead of 'Flags[9]', because
	it was overlapping with another flag...
	(this might break quests that were using this, sorry!)
	( EmilyV, 19th Oct, 2022 )

Fix scroll warp color change timing bug
	( EmilyV, 19th Oct, 2022 )

Fix duplicate cursor displaying
	( connorjclark, 19th Oct, 2022 )

Fix some buttons not working properly
Fix lifting an item with a lift glove allowing you to swim
Fix: Now when drowning / falling in a pit with a combo lifted,
	you will drop the combo.
	( EmilyV, 18th Oct, 2022 )

Fix item position not saving properly on screen 0x80+
	( EmilyV, 17th Oct, 2022 )

Allegro mouse fixes
	( connorjclark, 16th Oct, 2022 )

Fix negative item pickup amounts
Fix the mouse clipping through some dialog text
	( EmilyV, 15th Oct, 2022 )

replay fixes
	( connorjclark, 14th-22nd Oct, 2022 )

Fix '^' characters in control settings dialog
	( EmilyV, 14th Oct, 2022 )

Add 'Unsafe Ground' flag, for new pit/drowning respawn
	to mark positions as 'not safe to respawn on'.
	( EmilyV, 13th Oct, 2022 )

2.55 Alpha 110

October 13, 2022

Full Changelog: https://github.com/ArmageddonGames/ZQuestClassic/compare/2.55-alpha-109...2.55-alpha-110

Detailed Changelog
// Alpha 110

Actually fix string margin issues, for real this time, I swear.
	( EmilyV, 12th Oct, 2022 )

Enhanced music fixes for dmap music
	( Deedee, 10th Oct, 2022 )

Fix zc save file name config not working
	( connorjclark, 10th Oct, 2022 )

Fix computer-specific cursed bug relating to screen flag script access
Fix version-info related issues
ZScript Debug Console now clears on loading quest, and prints
	version info for the current build and the quest on clear.
Fix string compat issues
Fix combo editor missing labels
Fix cheats 'Player Data' window off-center
	( EmilyV, 10th Oct, 2022 )

Fix sprite data editor not saving changes to sprite name
	( EmilyV, 8th Oct, 2022 )

Reduce excess code generation (reduce .exe file size)
	( connorjclark, 7th+8th Oct, 2022 )

Attempt fix 'Windows scaling issues' bug
	( Deedee, 6th Oct, 2022 )

Fix ZScript 'Pow()' crashing
Fix weird issue with bush combos on FFCs and script-spawned weapons
	( EmilyV, 6th Oct, 2022 )

Add script access to more lifting/trigger related
	combodata variables.
	( EmilyV, 4th Oct, 2022 )

New replay/recording system. See `docs/replays.md` for instructions.
	( connorjclark, 3rd Oct, 2022 )

Fix string right margin
	( connorjclark, 2nd Oct, 2022 )

All textfields now support system clipboard copy+paste
	with Ctrl+C, Ctrl+V
All textfields now can be cleared with Ctrl+Del, Ctrl+Backspace
Insert SCC dialog copy/paste to clipboard buttons
	( EmilyV, 2nd Oct, 2022 )

Blank tiles take up less space in quest file
Upgrade sprite data editor
	( EmilyV, 1st Oct, 2022 )

Fix lift glove crash
Fix compiler settings not saving properly
Fix player sprite dialog issues
	( EmilyV, 30th Sept, 2022 )

// 30th Sept nightly

Fix scripts not finding the correct folder to create files in
Fix ZScript Compile related crashes
Fix GUI/Scrollbar related crashes
	( EmilyV, 30th Sept, 2022 )

// 29th Sept nightly

Fix default quest
Add 'Insert' and 'Remove' ('I' + 'Shift+I') to tile editor
Fix sfx on 'Direct Warp' combos sticking
	( EmilyV, 29th Sept, 2022 )

// 28th Sept nightly

Add 'Lifting' and 'Lift+Walk' player sprites
Update default quest
Fix scrolling warp palette oddities
	( EmilyV, 28th Sept, 2022 )

// 27th Sept nightly

Fix menu-related SCCs
Fix save point menu cursor moving when holding buttons
Save Point combos now support 'ComboType Effects' triggers,
	and have flags/attributes to allow healing the player's
	life and magic when activating the save point.
Fix script writing 'weapon->DeadState' not properly resetting
	'dying frame' to keep weapon alive.
	( EmilyV, 27th Sept, 2022 )

Quest MIDI Info now always allows listening
	( EmilyV, 25th Sept, 2022 )

Fix L/R quickswap eating inputs even when disabled by QR
Fix jumping twice in one frame with feather button option
Add 'Alt+Click' on 'Favorite Combos' to 'Scroll to Combo'
	( EmilyV, 24th Sept, 2022 )

Fix floodfill crash on layers
	( connorjclark, 24th Sept, 2022 )

Fix combo pools/lifting being offset when inserting/moving combos
Fix favorite combos menu
	( EmilyV, 21st Sept, 2022 )

Fix softlock when click+dragging on dropdowns
	( EmilyV, 20th Sept, 2022 )

Add hex value box to palette editor
Fix crash when using both '->Secrets' and 'Triggers Secrets' on
	the same combo
Add button-based option to feathers
	( EmilyV, 19th Sept, 2022 )

Fix 'Flags' button on screen enemy dialog going to wrong
	tab of screen data
Fix lockblock-related bug
Fix string margins
	( EmilyV, 18th Sept, 2022 )

Add 'Thrown' weapon combo trigger
Add 'lift height'/'lift time' combo options
	( EmilyV, 17th Sept, 2022 )

Add advanced 'jinx' related options to items
	( EmilyV, 16th Sept, 2022 )

Add 'Lift Glove', combo lifting
Fix crash related to having a 0 bomb ratio
	( EmilyV, 13th Sept, 2022 )

Compress screen data, greatly reducing quest file sizes
Fix 'flip' for large-sprite enemies
Add 'Combo Pools', similar to combo aliases, used to place
	a random combo from a weighted pool of combos. Intended to be useful
	for decorative purposes, ex. random varying grass/flowers
	( EmilyV, 10th-11th Sept, 2022 )

Add multiple-undo/redo to screen editing
	( connorjclark, 10th Sept, 2022 )

Fix 'ResizeArray()'
Compress combodata, reducing quest file sizes.
	( EmilyV, 9th Sept, 2022 )

Optimize ZScript array initializers
	( EmilyV, 8th Sept, 2022 )

Add new enemy movement flags
	( EmilyV, 7th Sept, 2022 )

Allegro 5 / image loading fixes (bmp)
	( connorjclark, 5th-7th Sept, 2022 )

Fix ZLauncher missing window frame
	( connorjclark, 3rd Sept, 2022 )

Add 'Shooter' combo type- a custom turret combo
Add 'Cooldown' timer for combo triggers
	( EmilyV, 2nd Sept, 2022 )

Fix dragging items
More combo triggers tab options
	( EmilyV, 31st Aug, 2022 )

Fix 'bitmap->GetPixel()' not being *10000
Add 'bitmap->CountColor()'
	( EmilyV, 29th Aug, 2022 )

Add global and timed states for Switch combos
Update 'Video Mode' dialog to allow custom resizing of the window
	( EmilyV, 21st Aug, 2022 )

Fix auto-warps repeating infinitely
Fix cheat code editing dialog
	( EmilyV, 20th Aug, 2022 )

Fix program not exiting correctly
	( connorjclark, 19th Aug, 2022 )

Try to fix mouse cursor lingering at edge of screen
	( EmilyV, 19th Aug, 2022 )

Fix 'Progressive Item' showing incorrect tile on hold up
	( EmilyV, 18th Aug, 2022 )

Bug fixes!

Too many. See detailed changelog.

Better undo/redo

Better undo/redo history for screens editing. Before U would only remember one change. Now, it remembers all the changes like a proper undo/redo system.

New shortcuts: CTRL+Z to undo, and CTRL+SHIFT+Z/CTRL+Y to redo. (CMD for Mac people)

Recording/replay system

To prepare for the upcoming z3 scrolling update, we need many recordings of games to add to a test database. If you want to help with that, please send us your .zplay files! Read on to see how:

NOTE: use the latest nightly to record a game, as there is a critical bug for recording in Alpha 110.

the following is from docs/replay.md

Replays are .zplay text files that ZC can create and play back to replay a game session. All button inputs and RNG seeds are recorded so that ZC can recreate the same playthrough frame-by-frame. Here is a demo.

This system was created primarily as a way to create automated tests. For more on that, see tests/run_replay_tests.py.

A new save file can be recorded by selecting the ZC > Replay > Enable recording new saves menu option. This will make any new save file also be recorded. You'll see an alert box telling you where the file will be saved. You can save and continue whenever without harming the recording process.

At any time, you can playback a replay in the ZC > Replay menu to watch it again, and can even take manual control whenever you want. This will not modify any exiting saved games. Note that you currently aren't be able to persist a save file when replaying a .zplay from this menu.

Later work on this system may introduce more user-facing features, such as savestates, rewinding, or creating a new game file from a replay.

In the meantime, a great way to contribute to ZC development is to enable the recording feature for your new games, and provide us your .zplay files. You don't have to finish the game, any amount of playthroughs could be helpful. The more we have, the better coverage our testing system will have, and the fewer regressions/compatibility bugs there will be!

2.55 Alpha 109

August 17, 2022

Full Changelog: https://github.com/ArmageddonGames/ZQuestClassic/compare/2.55-alpha-108...2.55-alpha-109

Detailed Changelog
Add 'OwnArray()'/'DestroyArray()' functions
	( EmilyV, 17th Aug, 2022 )

Fix more conveyor bugs
	( Deedee, 17th Aug, 2022 )

Fix light beam visual glitch
Add 'itemsprite->DroppedBy'
Fix droplist right click crash
	( EmilyV, 16th Aug, 2022 )

Generic script 'WaitEvent' system
Fix ring/damage combo interaction
	( EmilyV, 15th Aug, 2022 )

Fix slow midis
	( connorjclark, 15th Aug, 2022 )

--Aug 15th Nightly

EWeapon combo triggers
	( EmilyV, 15th Aug, 2022 )

Fix bugged cost counters
Fix item 'pickup amount' bounding
Add new combo trigger options (Lens, Light Beam, Push)
'Toggle Transparent' combo flag
Fix FFC 'Run at screen init' not working immediately after loading from save select screen
	( EmilyV, 14th Aug, 2022 )

Fix undamaged ghoma not blocking properly
	( Deedee, 14th Aug, 2022 )

--Aug 13th Nightly

Fix conveyor bugs
	( Deedee, 13th Aug, 2022 )

Add draw 'Layer' to message strings / string editor
More combo triggers stuff; invert required item,
	consume required item, and option to require/consume a counter as well.
	( EmilyV, 13th Aug, 2022 )

Fix lockblocks on layers 1/2
	( EmilyV, 9th Aug, 2022 )

Add 'Save ZInfo'/'Load ZInfo' buttons
	( EmilyV, 2nd Aug, 2022 )

Upgrade subscreen properties dialog
Add config 'auto_filenew_bugfixes' (default on)
	If enabled, compat rules are automatically bugfixed when creating a 'New' quest.
Update default quest.
	( EmilyV, 1st Aug, 2022 )

Add 'Hero->Standing' and 'Screen->TriggerCombo()'
Fix mirror light beam shield interaction
Add 'Copy Text'/'Paste Text' buttons to string editor
	( EmilyV, 30th July, 2022 )

ZScript exponentiation operator '^^^'
Add system clipboard copy/paste for zscript buffer
	( EmilyV, 29th July, 2022 )

'About' dialog expanded (now includes a button to copy info for bug reports)
Quest rules can now be exported as a string to the clipboard
Add numeric 'ID' searching on numbered listers
Fix GUI issues
	( EmilyV, 27th July, 2022 )

Update icons
Fix lockblock/locked chest flags
	( EmilyV, 26th July, 2022 )

2.55 Alpha 108

July 25, 2022

Full Changelog: https://github.com/ArmageddonGames/ZQuestClassic/compare/2.55-alpha-107...2.55-alpha-108

Highlights

  • Official Mac and 64-bit builds
  • Allegro 5 update - potentially better driver and midi/music support
  • Windows can now be resized
  • Combo Trigger major upgrades
  • Show a "apply all compat quest rules" in ZQuest if applicable. 99% of the time, you should turn all of these off!
  • Various performance improvements
  • Fix Manhandla crash when killing multiple heads at once
  • Added 32 extra states per-screen, useable by chests and lock blocks

New ZScript features

Optional parameters

////////////////////////////////
//  Function Optional Params  //
////////////////////////////////

You may now have optional parameters in functions.
	[example--
	void foo(int x = 25)
	{
		Trace(x*2);
	}
	foo(); //Traces '50'
	foo(10); //Traces '20'
	--end example]

Optional parameters cannot have any non-optional parameters listed after them.
The default value for an optional parameter must be compile-time constant.

Detailed log:
Fix decorations -2 yoffset (compat qr)
Add 'ExtraStates' to screens, usable by chests/lockblocks to have >1 per screen
Add custom item contents for chests
Add 'Bugfix' popup when loading a quest with compat rules checked
	( EmilyV, 24th July, 2022 )

Fix rounding issues
Fix scripted internal ghost-based movement functions
Fix manhandla crash
	( EmilyV, 22th July, 2022 )

More combo trigger stuff
	( EmilyV, 21st July, 2022 )

Stop 'Palette' dialog from popping up when 'Alt+F4' is used
Undercombo dialog now edits undercombo for the current layer
Fix pushblock layer behavior
Add 'itemsprite->ForceGrab' to allow scripts (and chest combos)
	to force an item to be picked up by the player.
Combo trigger SFX
	( EmilyV, 20th July, 2022 )

Fix 'Return To File Select On Death/F6' qr
More combo trigger stuff
	( EmilyV, 19th July, 2022 )

More Combo Trigger stuff
	( EmilyV, 18th July, 2022 )

Fix small mode dialog cutoff
	( EmilyV, 17th July, 2022 )

Add 'stack' type to ZScript
Fix std_zh angle issues
Begin work on new combo TriggerFlags stuff
QR for fast counter drain
Fix item scripts behaving wrongly when the 'run for multiple frames' rule is off
	( EmilyV, 16th July, 2022 )

Add 'No Damage Protection' boots flag
Fix subscreens using the wrong item IDs when multiple items of the same 'Level' are owned
	( EmilyV, 13th July, 2022 )

Add automatic crash reporting
	( connorjclark, 11th July, 2022 )

Fix warps not properly deallocating owned script objects for dmap scripts
	( EmilyV, 11th July, 2022 )

Fix subscreen editor default value of magic gauge pieces 'Show:'
	( EmilyV, 10th July, 2022 )

Keyboard sticking fixes
Exporting image palette fixes
Fix scrollpane crashes
FPS optimizations
	( connorjclark, 9th July, 2022 )

Fix FFC editor changing combo placement cset
	( EmilyV, 8th July, 2022 )

Image loading fixes
Window Resizing improvements
	( connorjclark, 8th July, 2022 )

Add '-unlinked' mode for zscript parser
	( EmilyV, 4th July, 2022 )

Rename 'OceanSFX' to 'Ambient SFX' (ZScript)
	( EmilyV, 3rd July, 2022 )

Mac (OSX) fixes
	( connorjclark, 2nd July, 2022 )

Update 'std_zh'; add 'ghostBasedMovement.zh'
	( EmilyV, 30th June, 2022 )

More Allegro5 fixes
	( connorjclark, 26th June, 2022 )

Add '*weapon->Flags[]', including [WFLAG_PICKUP_ITEMS], a flag which allows weapons
	to automatically collect items they touch, similar to how engine melee weapons do so.
Hopefully fix 'lweapon->Weapon' not working properly at all.
	( EmilyV, 26th June, 2022 )

Fix alt key shortcuts not working properly
	( connorjclark, 25th June, 2022 )

--June 25th nightly

Fix zscript compiler console closing even when warnings were thrown.
	( EmilyV, 25th June, 2022 )

Optimize ZScript internally (various small optimizations)
Fix editing the ZScript buffer causing a hardlock
Fix spawned sprite object (ex. bushes/generic combos) repeating the first
	frame at the end for one frame
	( EmilyV, 24th June, 2022 )

--June 23rd nightly

Upgrade to Allegro 5 (major backend change)
	( connorjclark, 23rd June, 2022 )

Add 'messagedata->Length', to read the length of a message string
Update std_functions 'GetMessage()':
	If the passed array is too small, it will be resized to be large enough
	Now works with strings <140 chars
	( EmilyV, 23rd June, 2022 )

Removed debug messages
	( EmilyV, 20th June, 2022 )

Fixed Hover Boots
	( Deedee, 19th June, 2022 )

Add 'optional parameters' to ZScript
	see ZScript_Additions.txt for details
	( EmilyV, 12th June, 2022 )

Fix subscreen bugs
Fix sideview swimming bugs
	( Deedee, 11th June, 2022)