github ZQuestClassic/ZQuestClassic nightly-2023-08-26-2
Nightly 2023-08-26 (2)

pre-release15 months ago

The following are the changes since nightly-2023-08-26:

Bug Fixes

  • extraneous popup about string ordering error when loading older quests 5fe750736
  • set window icon on Windows 0f6990a10

Player

Visual Studio Code Extension

  • add missing std_constants typedef type highlightings f51f805c1

Build


The following are the changes since 2.55-alpha-116:

Expand changelog

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 5b3162034
     

    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.

  • 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

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

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

ZScript Standard Library (std.zh)

  • add 'GetLevelSwitchState()'/'SetLevelSwitchState()' helper functions f7228536a

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

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
  • re-open launcher after update ad58eb0ab

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

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

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

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

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

Documentation

  • correct typo in comment for jit_threads option 1e11cd6f5
  • specify that linux builds should use clang e742d5a4d
  • changelog overrides for subscreen rework 237156aa8

Build

Chores

ZScript

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

Refactors

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

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 7c8a5625c
  • 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.

  • re-enable updater test e11f6058b

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

Visual Studio Code Extension

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

Don't miss a new ZQuestClassic release

NewReleases is sending notifications on new releases.