The one with the subscreen rewrite, software updater, music mixing, and individual save files.
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:
- 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 tosaves/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 tosaves/
.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 atsaves/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 andgame.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
flagdb349d14f
- 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
option1e11cd6f5
- 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
- fix(zc): put title.mid back in zelda.dat, since it is available to quests
- 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:
- 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