The following are the changes since nightly-2024-02-07:
Bug Fixes
Player
- various slope improvements, like fixing ffc slopes
f80e024ca
Build
- 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.
The following are the changes since 2.55-alpha-120:
Expand changelog
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
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 liballeg/allegro5#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
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
ZScript Standard Library (std.zh)
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.
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
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: asmjit/asmjit#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
CI
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
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
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