Note: this is a draft!
Updated: mar 8, 2025
- new icons
fbfcc87da
- custom logo for quest package export
13030cb8a
- custom title music for quest package export
705d14b31
- add burn-based light radii for items, to change the glow radius when lit on fire.
6cc9ab347
- SCC for 'Trigger Combo Copycat', allows triggering a triggers-tab copycat index
bcf7b98ce
- LW_REFARROW, LW_REFFIRE, LW_REFFIRE2 (reflected arrows, fire, fire2)
e3b23aa7d
- Slidy Ice for the Player
a923d5c42
- 'Toggle Darkness' trigger flag (toggles current room being a dark room)
ff6c8151e
- 'Req. Darkness' / 'Req. No Darkness' trigger flags; act as conditionals on a room being dark or not
dae41c8c7
- Trigger flags relating to LItems (map,compass,etc)
42b835781
- Trigger options relating to tinting the palette
4917cea2d
- Trigger options relating to changing palette and wavy/quake vfx
9220affe4
- Trigger options relating to status effects and 'Push->' timing
3ee3da857
- ZScript arrays now are separately typed from non-arrays.
cf2769fe9
Array types can be declared by adding
[]
. - add Cure Shield Jinx to bottles
184674728
- add shield effect for jinxes, update Whisp Ring
97688da50
Jinx enemies (aka Bubbles) can now impact shields, and whisp rings now correctly apply to temporary jinxes.
See
docs/enemies.txt
for how to configure Jinx enemies. - add shield jinx removal as refill effect (#938)
977e72321
- add Shield Jinx trigger (#941)
985904538
- expand palette from 6-bit to 8-bit color
4fccd7565
The RGB channels for colors have been increased to full RGB color range of 0-255, rather than 0-63. This increases the number of possible colors that palettes can use by 64x.
This also impacts how colors are declared in ZScript, such as for
Graphics->Tint
,Graphics->MonochromeHue
andcombodata::TrigTintR/G/B
. A script compat QR is added for existing quests that use 6-bit colors.A minor side effect of this change that applies for all quests is that palette effects, such as the fade in/out screen transitions and the death animation, are now smoother as there are more possible colors to animate through.
- add configurable weapon sfx to enemies (#977)
e71f8dc99
This can also be configured in ZScript with
npc->WeaponSFX
andnpcdata->WeaponSFX
. - fully configurable enemy weapons (#984)
36f92c7bf
The enemy editor now allows you to configure additional things for the weapon that the enemy fires. These used to be hardcoded based on the weapon type, but now all these are configurable per-enemy:
- damage
- speed
- block flags (ignores player defense / shields / reflectable)
- movement flags (gravity / pitfalls / drownable)
- tile size and hit / draw offsets
- burning sprites and light radius
- make the special sfx of enemy weapons configurable too (#991)
9fd9f4a3d
Some weapon types, like boomerangs and bombs, have a secondary sfx that was hardcoded. You can now configure them in the enemy editor.
- add enemy types to zinfo
d2ed2627e
- lift glove flag to drop objects when hit
73ceca28c
- 'Cycle to Screen Undercombo' combo animation flag
577e115bd
- add Misc SFX when the Hero lands on the ground
57c43d98d
- attribute 10 now used for hop height for vires/polsvoice (#1043)
6ffb11753
- per-combo player landing sfx
29e5a0e08
The MiscSFX landing SFX plays if none is set.
- pushblocks can drown (on a QR)
f3ffe8e74
- combo-specific falling/drowning sprites/sfx for pushblocks
b8a2c17e9
- Trigger flag 'Apply Discount', allows wealth medal discount to apply to trigger counter costs
7ffb36113
- 'Light Wave' effect for dark room lights
b46b96c18
Makes the lights increase and decrease radius in a sine wave pattern, with a specified rate and size. Lantern items have a checkbox to ignore this effect.
- z3 scrolling regions (#1074)
6b5e98dd7
Regions are a collection of screens that are stitched together to become one playing area that the player can move around in, with the viewport moving to track the player. All mechanics of ZC have been updated to support that there can now be multiple active screens. Additionally, there is a new DMap option to reclaim 160 more pixels in height for the visible playing field (making the passive subscreen draw over it). There is also scripting support for configuring regions and the viewport.
Here is a guide covering what quest makers need to know about regions.
- new logo and song to file select screen
ee916ab45
- add option to disable title music
9256d13d9
- optimize zasm scripts
16da940b1
First thing when loading a quest the ZASM scripts will undergo optimizations. Most optimization passes apply improvements similar to that which have been implemented in the zscript compiler, but are not present in older quest scripts. Others are novel and improve even modern zscript compiler output.
Savings for a few quests:
- Stellar Seas - 163762 ops (5%)
- Yuurad - 604668 ops (4%)
- Umbral Cloud - 105994 ops (8%)
The optimizations done currently are:
- Removing unreachable blocks of code
- Replace many PUSH/POP with equivalent single PUSHARGSR/POPARGS
- Reduce ops used for conditionals (COMPARER)
This is on by default, but can be disabled with
[ZSCRIPT] optimize_zasm = 0
inzc.cfg
. - add zasm optimize_setv_pushr
f2dd0314e
- optimize comparison commands in ZASM
419aac804
- optimize scripts just before use, instead of all upfront
bf32e9105
- in optimizer, consider the null D5 register when combining commands like POP
0c5bc072b
- optimize old scripts LOADI to LOADD
1d7fa6a48
This removes ~8% of commands from Yuurand, ~12% from Nargad, and ~14% from Stellar Seas.
- optimize useless stack push/pops in old scripts
a273d27c3
This saves 15% of instructions for Yuurand.
- add simple titlescreen, and remove music from save select screen
a593e7571
This also reintroduces the
skip_title
option in the launcher. - remove dead ZASM
0faa3c2b6
ZASM ops that write to a register but never use the result are now removed.
- continue ZASM comparison reduction even on LOAD D2
e20f62d4d
At some point this was necessary, but not anymore.
- improve inference in optimizer simulator, and handle POP better
0a7117ba2
- improve ZASM comparison when subsequent block reuses D2
cac709f3d
- optimize SETR PUSHR to just PUSHR
442921171
- optimize zasm pass converting to new function calls
d40c0d634
Replaces older GOTO/GOTOR and GOTO/RETURN with more succinct CALLFUNC/RETURNFUNC.
This saved ~2.5% of instructions in Yuurand, ~4% in Nargads Trail.
- optimize zasm by inlining functions
86edb55fb
- optimize old scripts STOREI to STORED
da7113489
- option to show game time in the corner, for all those speedrunners out there
9d50c5687
- optimize LOADD/STORED to new LOAD/STORE to remove divisions
d8a7872c8
- optimize zasm by removing intermediate registers
dddd96cf1
- For example,
SETR D3 LINKX ; TRACER D3
becomesTRACER LINKX
- Also attempts to avoid pushing value to stack just to pop later, but only if the value of the register is unmodified in the original code between pushing and popping from the stack
- Only occurs if the register is read once. If read twice, the overhead
of calling
get_register
is too great so it would be worse to call multiple times. Data registers are much faster to access.
- For example,
- 'Toggle Lights' cheat works on new dark rooms
1f74bdc0a
- new song to ambient music menu
47c8bf62a
- Merge 'Favorite Command' and 'Hotkey' systems
47617f7ad
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.
- save backup when qst was last saved in a different version of zc
d9a81183a
- 'Adv. Paste' string editor rclick option
bd40c292c
- Advanced Paste for Item Editor
138b58626
- 'Warp Back' rclick option to reverse after following a warp
8dd981f27
- Item Wizard (Shields)
f30dd7095
- assign 'notes' per-screen (just for editor use)
Relevant changes:
- export/import strings to .tsv text file
13e56e789
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
- add help text to the FFC editor (#973)
a4030cac3
- zoom out to edit many screens at the same time
6fd217ecb
It is now possible to zoom out when editing map screens, up to the size of the entire map (although 4x4 screens is roughly the last usable zoom level).
Ctrl/Cmd + -/+
is the shortcut to zoom out and in. Note that this replaces an existing shortcut for modifying the screen palette by 16 - that is nowShift + Ctrl/Cmd + -/+
.Arrow keys change the current screen as usual (and so updates all the screen-specific UI, like enemies/warps/the Screen menu). If you move beyond the current viewport, the viewport moves along with you.
Clicking on any visible screen will also set the current screen.
Should be able to perform any action as expected on screens when zoomed out: copying, pasting, ffcs, moving items, warp squares, all drawing modes, flood fill, editing layers, etc.
The undo/redo system works as well.
There are a few new options related to this feature, under the View menu.
- Check/Uncheck/Toggle All buttons for checklist dialogs (ex. adv paste)
6d35395d3
- add 'Alphabetized' checkbox to basic listers (item,enemy,sfx,midi,subscrwidget)
0a10202e2
- clean up
Quest->Audio->MIDIs
listerc4a6d8b72
Empty MIDIs now show as
zzUntitled
, to help support alphabetized sorting. - add '(000)' after '(None)' in some lists, allowing typing '0' to skip to it.
94fa4ce00
- (enemy editor) added descriptive labels and dropdowns to walker type attributes (#1041)
e5cf4d4da
- upgrade sprite data list dialog
383b5d34a
- 'Drag Squares From Center' option, for FFCs/warp squares/etc
4028184ff
- Tools->Fix Tools->Green Arrival Square Fix
e07947d77
Allows you to clear out all the green arrival squares in your quest (and optionally turn them into blue squares)
- more value range types (.., =.., ..=, =..=)
1e5be558a
- allow mathematical range expressions [A,B) etc
61c5ccc92
- range loops (
loop(int q : 0=..10)
)Relevant changes:
- allow multiple comma-delimited increment statements in for loops
ab8232c78
- allow enums of non-int pre-existing types (ex.
long
)9ca034ea1
- add networking via websockets
41c3622a4
WebSockets allow for scripts to communicate with an external WebSocket server. This introduces an official way to use the network in ZScript.
The following example script communicates to a freely hosted WebSocket server, which simply responds back with the messages it receives.
To make your own WebSocket server, Python is a good option. Some example libraries:
#include "std.zh" generic script WebSocketScript { void run() { printf("Connecting to websocket.\n"); websocket ws = Game->LoadWebSocket("ws://ws.ifelse.io"); ws->Own(); bool hasSentMessage = false; while (true) { if (ws->State == WEBSOCKET_STATE_CONNECTING) { Waitframe(); continue; } else if (ws->State == WEBSOCKET_STATE_CLOSED) { char32 error[0]; ws->GetError(error); printf("Failed to connect: %s\n", error); break; } if (ws->State != WEBSOCKET_STATE_OPEN) { printf("Failed to connect: %l\n", ws->State); break; } if (!hasSentMessage) { printf("Connected!\n"); ws->Send("hello world!"); ws->Send("domo arigato!", WEBSOCKET_MESSAGE_TYPE_BINARY); hasSentMessage = true; } while (ws->HasMessage) { int message_ptr = ws->Receive(); int type = ws->MessageType; if (type == WEBSOCKET_MESSAGE_TYPE_TEXT) printf("got text message: %s\n", message_ptr); else if (type == WEBSOCKET_MESSAGE_TYPE_BINARY) { int len = SizeOfArray(message_ptr); printf("got binary message of length: %d\n", len); for (int i = 0; i < len; ++i) printf("%d: %l\n", i, message_ptr[i]); } else printf("got message, but with unknown type: %l\n", type); } Waitframe(); } } }
- 'atol' (string to long)
475cac6ce
- add template types to some internal functions
633d75471
The following internal functions have switched from using
untyped
to template types:void ArrayPushBack(T[] arr, T val) void ArrayPushFront(T[] arr, T val) void ArrayPushAt(T[] arr, T val, int index) T ArrayPopBack(T[] arr) T ArrayPopFront(T[] arr) T ArrayPopAt(T[] arr) void ArrayCopy(T[] dest, T[] src) int SizeOfArray(T[] arr) void ResizeArray(T[] arr, int sz) void OwnArray(T[] arr) void DestroyArray(T[] arr) void printfa(str* format, T[] args) void sprintfa(str* buf, str* format, T[] args) T Min(T arg1, T arg2, ...T rest) T Max(T arg1, T arg2, ...T rest) T Choose(T arg1, ...T rest)
This means that the type
T
must match other occurrences ofT
throughout the entire signature, given the types of the parameters used by the callsite. For example, this code no longer compiles:printfa("hello %d", 1) // Second param is not an array Object objects[] = {new Object()}; ArrayPushBack(objects, 1) // Second param is not an Object int v = ArrayPopBack(objects) // Cannot convert Object to int
Note: for now,
SizeOfArray
andResizeArray
still allowchar32
for their array parameters, since that is common for string operations and we don't have a formal string type yet. - add garbage collector for automatic memory management
d4bc547f8
Objects created by scripts are now automatically deleted when they are no longer reachable from any script.
This removes needing to manually delete objects you create (either with the
delete
operator orFree()
), and mostly removes any reason to ever callOwn()
.See the new "Object Memory Management" section in ZScript_Additions.txt for further details.
- option 'OLD_ARRAY_TYPECASTING' to use old array type handling
d7555bf9e
- add LEGACY_ARRAYS option as more lenient approach to array syntax
caeb93357
This replaces the
OLD_ARRAY_TYPECASTING
option withLEGACY_ARRAYS
. It can be set toon
,off
, orwarn
, and defaults towarn
. This option supports usage of deprecated syntax for arrays. This will continue to work:int arr = {1, 2}; Trace(arr[0]);
- by default, this will warn that
int[] arr
is the preferred syntax - legacy arrays syntax is currently not allowed for objects that must be
free'd, such as custom classes or
bitmap
(but, for example,lweapon
is fine)
Additionally but independent of this option, parameter types are cast to/from arrays when resolving a function call. There was an existing feature that selects the function that required the fewest type casts, and this taps into that. For example, this code works:
void fnArray(int[] arr) {} void fnLegacyArray(int arr) {} ... int legacy_arr = {1}; fnArray(arr); // arr is cast to int[] int arr = {1}; fnLegacyArray(arr); // arr is cast to int
- by default, this will warn that
- 'TileBlit' and 'ComboBlit', for drawing parts of tiles/combos
c874bc20e
- webapp for exploring and sharing ZScript
ae2a67e77
- add bottle cure shield jinx flag (
BTF_CURESHIELDJINX
)63d0dba0c
- add
Game->Exit()
, which closes the programaf9076695
- add base
sprite
class930485928
The following classes now all share a common base class:
- eweapon
- lweapon
- ffc
- itemsprite
- npc
- player
All of these classes can now be assigned to variables of the type
sprite
. Thesprite
class contains 40 properties that were duplicated across these classes. Some properties do not work for all classes (likeffc
andplayer
), but more support may come later. - show source code context with error messages
fb4dbc83f
- add
RepairShield
function to npcef15f9019
- support setting
Hero->ScriptTile
to draw larger than 1x17b8530979
Internally, the Hero sprite resets its
Extend
property every frame, which prevented usingScriptTile
in combination withTileWidth
andTileHeight
. Now,Extend
is only reset ifScriptTile
is not in use. @Increment
annotation for enums43003ca8c
Allows manually setting a value for the enum to increment by for each value
- add
@Bitflags
enum annotation (#1064)c089b2af1
This annotation turns an enum into a bitflags enum:
- Auto-incrementing values starting at 1 and doubling the previous for each new enum member
- For type safety, bitwise operations on enum bitflags are only allowed with the same type
For example:
@Bitflags("int") // "long" is also supported enum SomeBitflags { Fast, Big, Loud, }; @Bitflags("int") enum OtherBitflags { Combo, Enemy, Weapon, }; auto x = Fast | Big; // inferred type is SomeBitflags if (x & Enemy) // Errors, scripter accidentally used the wrong enum. // ...
- add
sprite::SpawnScreen
c9fbd48d7
This is the screen that the sprite spawned on. In a non-scrolling region, this is the same as
Game->CurScreen
. - support expression in default parameters
d2dd3eebf
The default for optional parameters no longer need to be constant. For example, this is now valid:
void debug(int num, int x = Player->X, int y = Player->Y - 10) { // draw num at x, y ... }
- document symbol outline, hover tooltips and "Go to Definition"
dbd473b97
This patch greatly enhances the capabilities of the language extension. New features are:
- A symbol outline of the current script, showing all variables, functions, classes, namespaces, etc.
- Tooltips on hover, shown if a variable/class/whatever was declared with a comment. This supports markdown
- "Go to Definition" to jump to where something is defined. You can right-click to see this option, or CTRL/CMD+click on something
- support @link tags in hover tooltips
1430272d2
Comments may contain inline links to other symbols with the
@link
tag:// Better than {@link counter2} ... {@link counter2|that counter is lame} int counter1; // This also works as shorthand for links: [counter1] int counter2;
When hovering the mouse over any usage of
counter1
, the tooltip will render these as clickable links that navigate you to the specified symbol. - support Go To Definition for type of variable declaration
32d372e64
- support Go To Definition for includes/imports
dffa4cf41
- support Go-To-Definition for enums
c3ae6346b
- support Go To Definition for function return type
ea021739a
Also support tooltip showing up when hovering over declarations.
- support 'Find all references'
e15861fc0
For now, this is only able to list all references within the current file.
- add options for window size, and cap max default window size
919bda156
[ZLAUNCH] window_width, window_height
in zcl.cfgCap max default size to 2x
- first pass on wasm JIT backend for web
08254299c
Adds a new backend to convert ZASM to WebAssembly. This also includes some utility methods for analyzing the structure (finding the functions) and control flow of a ZASM script, which was necessary to split ZASM scripts into multiple WebAssembly functions and implement the control flow of a ZASM script into WebAssembly structure control ops.
Although
prime.zs
is ~10x faster, scripts from real quests aren't any faster than the normal ZASM interpreter, since a very naive and poorly performing method was used to transform the ZASM control flow graph.The utility methods for analyzing ZASM should be useful for improving the x64 backend too, for example, to similarly compile only one function at a time.
- support more ZASM ops for wasm jit
53d5bc9a7
- support new SETCMP, GOTOCMP, CALLFUNC, RETURNFUNC ops in wasm
1c190a5a7
- use correct app id in zalleg_setup_allegro
41139dde1
- fairy npc not despawning when picked up
ea1be60e0
- changer ffcs counting for trigger groups and similar effects (they shouldn't)
1a1bd37ac
- zfix modulo operator being entirely wrong
efe612523
- changer ffcs counting for trigger groups and similar effects (they shouldn't)
7ce5862b6
- zscript docs were not being generated for release package
a5a9bc81d
- 'Screen->Lit' not compiling; now properly returns (and sets) screen's lit state
8f50a32f5
- remove sfx limit (except for fuzz testing)
0c1de2949
- initial path not being set for file dialog
1d08708c9
- pushblocks ignoring the top half of combo solidity
09f991298
- Fire level triggers not counting as 'weapon' triggers
5f42bff76
They didn't count for effects such as 'Kill Triggering Weapon'- they do now.
- cheats menu being greyed out when it shouldn't be
b0db6567a
- use correct sav path for -standalone mode
742115e11
- use more performant throttleFPS instead of rest in system menu
4c9ace43b
- only assign save path just before actually writing to disk
17ba9ef42
- prevent calling dmap script twice in scrolling dmap warp
6fc179786
- not showing error dialogs in title screen, and unbreak -only switch
949bb6abe
- prevent failing to save after continue
e2922a7d3
- disable scripts that start with an unknown command
4aa4acd94
- check for null when printing ZASM command string arg
6c4d774c5
- improve function breakdown in structured zasm
68259bbf4
- handle first command being function call for structured zasm
69bbf846a
- handle recursive function calls in ZASM cfg creation
1649a62e1
- detect dtors as separate functions in structured zasm
08e17d01d
- remember last save slot position when returning to save select screen
b05607e2e
- re-optimize when jit reuses scripts from last load
f55cf241f
- invalid optimization on broken SDDDD register
d482c135b
- disable propagate_values and dead_code passes for now
cca0aaf0d
These are likely to have a few edge cases remaining.
- do not stretch GUI
ad7995cf1
- skip title screen if specific save slot is given
94f39f26e
- actually stop mp3/ogg, and explicitly stop title music
c3f7ec46f
The titlescreen music would restart in the file select screen if the Sound dialog was opened then closed. This was because the volume was set to 0 to fade out, but it was never actually stopped.
But also, 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.
- inline function optimization handles PEEK correctly
a3d768e8f
- various fixes to optimizer that broke crucible quest
47ca63d08
- ignore QUIT in inline opt
- handle POPARGS in inline opt
- add missing register dependencies for multiple commands
- inline function optimization handles PUSHARGSR correctly
ffd3fe1fe
- various slope improvements, like fixing ffc slopes
a93568375
- save select screen not showing new hp after save->reset
e91c347a8
- load default quest for sfx when loading replay
0586712df
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.
- websockets reading wrong pointer
f98c49c69
- bug in dead code optimizer when register is both read and written to
2ed2cd56d
- passageways can have their own midi music (#934)
97a0c0130
- shadows for rocks and boulders not drawing (#951)
dc7454ec5
- ensure enemy projectiles spawn at center of hitbox (#994)
3a60859a3
- ignore conveyors when rafting
5167be598
- pushblocks with non-push flags placed on them were leaving trails of that flag
fa2c33758
- layers not showing revealed secrets in map view
2502d11cd
- 'Platform' ffcs teleporting the player as the screen loads
364a014f7
- Game time shows in-game, even when you've 'cheated'
01614ff3c
- inline function optimization handles LOAD correctly
0c8cc8624
- missing rclick menu separators
1b0b0341c
- test init data not being applied correctly
c599dfc30
- handle quest path/title with spaces in package export
11b09ef8c
- handle error instead of crashing if package export fails
e26e02c9e
- 'Notes' and 'Browse Notes' not having menu buttons
5c338087d
- upgrade tile 'move' code, more things now update on moving tiles (#916)
5c29d6f4e
- crash on moving combos in quests with many maps/screens
80af019ef
- Improve efficiency of combo moving + fix crash + fix 'undo' combo move
4efe6b07d
- Improve efficiency of tile moving + fix 'undo' tile move
7b26369e0
- memory issue when moving/inserting tiles/combos
3c72e3712
- arrow buttons above combo columns sometimes not working properly
1af434da4
- 3-stair warp dialog not properly listing catchall purpose
6ab8d137e
- buffer overflow in info editor dialog
63b6cb23f
- reduce latency on combo page paste when ComboProtection is off
5fd5fa503
- prevent crash when assigning global scripts
143e6836c
- delete the initial screen from default.qst
3b7ed5186
- prevent another crash when assigning global init script
aa28815b4
- draw eyeball combos correctly in compact mode and when zoomed out
3f8e849e8
- add latest fields to .znpc for enemy save/load (#1003)
0f15969f6
- add missing sideview ladder flags to top row of item cellar and passageway
35505498d
- fix tile protection for darknut, gleeok, ganon, and patra enemies (#1016)
74e0347de
- Screen Enemies Dialog not setting "Dirty" State for saving
0903ecdc1
- combo editor triggers -> Level Palette now has hex/decimal swapping button
dc8d75038
- square misalignment in zoomed-out expanded mode
49fcf283f
- next-screen-preview visual bugs re: zoom out
c043aaae3
- enemy editor spawn/death sprites swapped
ab5f76315
- combo alias cursor visual issues
2d2c5de92
Fixed graphical glitch when using a non-top-left origin Fixed alias mode being incompatible with the FloatBrush setting
- aliases with layers set not placing correctly when zoomed out
83d31d5a5
- description of 'Consume w/o trig' triggerflag was misleading
6be636e6d
- clean up some missing function returns
ef5211325
- use template for
Cond
to support arraysaf4293cd6
Also deprecate and suggest using ternary expressions.
- errors related to breaks in infinite loops
ccf995957
- issue with global variables sometimes not initializing properly
872162115
- label error bug with 'while(true)' and 'break;'
bfef7fd44
- case-range backwards check
b3fb9bc30
- missed handling arrays for unused var trimming
8d2ddc6f9
- a couple of small errors in recent optimizations
02bc0f4ff
Should fix issues with 'while(!false)', and variables declared in loops.
- clear script data when reassigning script
03ce2a4f6
Previously, only FFCs properly reset their state when changing their script. All others would retain their state, so would instantly do all the wrong things.
- exit with correct status for jit on QUIT
3a48a0aea
- consider PEEK when finding function calls for structured zasm
c45c5f5e7
The structured zasm builder assumed all function calls are followed by
POP D4
in older scripts. However, ifPOP D4
is followed byPUSH D4
then the compiler replaces it withPEEK D4
. This oversight missed these function calls, which broke the JIT compiler and ZASM optimizations for newer 2.55 compiled scripts. - use correct config section for optimize_zasm
694d589f6
The base config was using the wrong value, so it was still always on.
- handle WAITX not actually yielding in JIT compilers
6e95932c2
WAITFRAMESR D2
does nothing when D2 is 0, but the JIT compilers assume all wait commands should yield. Now they check if waiting actually occurs. - x64 jit compiles STACKWRITEAT correctly
5f8f9d124
- invalid compiler output from removing unused variables
d8123f886
The compiler has a pass to remove unused variables from taking up a position on the stack. However, a logic error made it so the wrong scopes would have their stack variables repositioned, which resulted in multiple variables sharing the same stack position, and breaking the script.
- parser bad optimization edge-case
978ab1b63
- parser failing to properly initialize some variables
b93b1e224
- crash in UserDataContainer, broken
websocket->Free()
32996be02
- websocket double-deleting their arrays, doing extra alloc/dealloc work
83df3a67b
- bad optimization causing global vars to sometimes read incorrectly
b000fc9e2
- websocket pool being destroyed on 'cont_game()'
ae375c530
- socket arrays sometimes going invalid?
12e3b9a92
Patched the issue here, not the cause. Not sure what caused it to sometimes go invalid, but a validity check seems sane.
- derive language runtime version from compiled scripts
a772dd873
The script engine checks the version a script was compiled in to vary some behavior. Previously this version was set to the section version in the qst file format, but that is updated even if scripts were not re-compiled. Now we look directly at the script metadata to set this version. This avoids issues with saving a quest in a new version without a recompile.
- don't only show singular deprecation warnings
88898e22f
- handle non-global objects correctly when reloading game
f93172d33
- allow simple types to match a template array type, for now
08756b8cb
- 'Hero->Warp()' using current screen's warp return square value
1f010f2d6
- stack offset issue when 'return'ing inside a 'loop()'
dc6c35037
- not correctly removing stale pointers on reload
4bd0e5412
- '@AlwaysRunEndpoint("off")' erroring despite being valid
26c78ebec
- exit process when preprocessor recursion limit is reached
58aaefd3a
- object fields not being available in dtor
7feb9afdd
This regressed because of the recent GC changes.
- compiler crashing on for-each loops
b00f59aad
This regressed because of the recent error locations refactor.
- some bindings ZASM using wrong literal values
975cf9c60
- 'loop()'s not having location metadata associated with their identifier
68a5f70c8
- 'hero' and 'link' script types not compiling
4ce3a2186
- code gen for range loop using wrong op
213361564
- 'OwnArray()' not working properly at all
d706df903
- code blocks sometimes not removing object references
2413e5ed8
- crash from metadata of var inside if statement
54cb5c3ac
- continue generating editor metadata after (most) compile errors
3d5912f15
- generate metadata for code even if optimized away
8defe2955
- scope error when using
for (...){} else {}
f43e46907
- prevent bogus "invalid object pointer" caused by uninitialized memory
9db7d3403
- remove a bunch of unnecessary zprints
1e1000c99
- make
npcdata->Flags
a bool array,remove ->Flags2
ec60344a6
npcdata->Flags
andnpcdata->Flags2
are undocumented and broken tools for accessing the internal flag of npcdata. They tried to split 64 possible flags over two integer values, but since they aren't "long" ints it didn't work. It is now a bool array. - fix broken array literals when declared as array pointers
7f249ee2e
In ZScript, there are array declarations and array pointers. Array pointers are used as array parameters, and declarations are (typically) used to declare arrays (either with an initializer list, or as an empty array).
Array declarations register their array to be deallocated at the end of the scope. Array pointers can take an array, and won't deallocate it when it goes out of scope. That's why pointers are used in parameters.
This syntax is easy to mix up, so one might declare an array using the pointer syntax. The compiler would not complain, but it would actually produce invalid code.
item items1[] = {item}; // array declaration syntax, worked item[] items1 = {item}; // array pointer syntax, was broken
This is a recent-ish regression in the 3.0 branch, and did not happpen in 2.55. This has now been resolved.
- fix many internal functions
2f845b504
Various internal functions were not popping the correct number of elements from the stack, and so their usage could produce unexpected behavior:
Game->CurrentItemID
Game->GetDMapIntro
Game->GetDMapName
Game->GetDMapTitle
Game->GetMessage
Game->SaveAndContinue
Game->SaveAndQuit
Game->SetDMapIntro
Game->SetDMapName
Game->SetDMapTitle
Game->SetMessage
Game->SwapActiveSubscreens
Game->SwapOverlaySubscreens
Game->SwapPassiveSubscreens
Module->GetItemClass
Player->PitWarp
Player->Warp
Also fixed
eweapon->MakeAngular
being completely broken andeweapon->MakeDirectional
being missing. - pop parameters for internal functions in fewer commands
2ea65eef2
- typo in
Region->GetScreenForComboPos
93238598d
- for-each loop compile issue when iterating over 'const' arrays
a7945bb45
Game->GameOverScreen[]
/Gam->GameOverStrings[]
not compiling in 3.04f80edc07
- deprecation warnings for functions not giving 'INFO:' text
4a89897b6
- prevent crash when processing for-loop metadata
235ad808b
- use lexical scoping for namespace compiler options
215607727
Previously, namespaces would ignore options defined in the file scope. Also, options defined in one namespace block would be applied to every namespace block of the same name.
See https://discord.com/channels/876899628556091432/1243749050616905768.
- character literals not highlighting properly
5dc7bd7c0
- 'AlwaysRunEndpoint' annotation missing syntax highlighting
b5b8ef720
- 'loop' keyword missing highlighting, add range operators to operator list
df11ee40f
- invalid uri on windows for links in hover tooltip
179d55946
- increase max buffer size for zscript process, which was breaking editor for large scripts
2169c67a3
- improve sfx on title screen by yielding during quest load
424f6200c
- handle reaching end of script in wasm jit
eb3dc8a7a
- handle CMP_BOOL in jit wasm
35fc59b6b
- skip titlescreen for quick open links
840e2ef7b
- disable broken parallel processing for zasm opt
cc0518ae6
- avoid performance hit by disabling info bitmap
2a6812a96
- packaged quests not loading correctly
49b71a2a1
- create https://docs.zquestclassic.com
ce839d1e8
This is a new website for documentation. It's currently mostly just reference docs for ZScript, but soon it will also have tutorials and documentation for the editor.
- add SCC tutorial
a731f1d2c
- remove ghost, tango doc sites from release package
5fd2ed7ce
- remove zasm_registers.txt from release package
63984595c
- add new zscript language documentation (#1061)
e1cfeefd1
- include logo and title assets in web data file
9e4f5313f
- fix websocket cmake project from breaking CMAKE_CONFIGURATION_TYPES
a2801b774
- add default file for compiler "signature"
d53db7b6f
This is to make the build just work in a clean checkout until I get around to removing this pointless thing altogether.
- fix typo in building.md for cmake version
aa460db5a
- use better library for json
Relevant changes:
- ci: update to macos-13 in other places too
6bb570d37
- ci: update to macos-13 in other places too
- update fmtlib to 10.2.1
11b834b35
- update building.md for Linux
f00d2f0ac
- pin poolSTL dependency to specific commit
1a347f264
- update websocketpp to newer develop branch
d00a94dfb
- fix gcc compilation issues
7cfee7439
- only depend on .git/refs/tags if present
bd8e3c8f5
- [linux] do not disable allegro5 png, which broke the title screen logo
c0553e6a9
- enable allegro DEBUGMODE in debug builds
7edeafd15
This enables allegro asserts, among other things. zc_alleg.h attempted to enable for every build type, but it actually had no effect since allegro is built as as separate target.
- Menus (new sleeker look, much cleaner backend)
03339654b
- share common allegro app setup
05eb72d5b
- load text files more efficiently
0964f7481
- remove scary and now pointless warnings when toggling fullscreen
75f9d356a
- use enums instead of defines for many flag values
806180bea
- combine misc attributes for guys into array (#955)
4e949df18
- use vector for storing FFCs
c1273e149
Previously, every screen allocated memory to hold the maximum number of FFCs (2.55 alpha 112 bumped this from 32 to 128), which took ~43 KB per screen, even if no FFCs were used. Now screens only allocate as many FFCs as they need.
For a quest that uses no FFCs at all, this saves ~5 MB of memory per map. For Yuurand, total memory usage on startup went from 1.3 GB to 800 MB.
- read weapon names from zinfo, not the deprecated module system (#1022)
ba5a5045c
- consistently use "Hero" instead of "Player" to refer to the playable character
3e3989cdb
- move Hero extern to header
ef61b6136
- move particles extern to header
92136e1c9
- remove module system (zinfo has replaced it)
3f0f24976
- add null jit backend
ec0a84ab4
- move debug zasm writing to new -extract-zasm command
847ab88e9
This allows for all scripts in a qst to be written to disk, instead of only the ones that happen to execute.
- use common structured zasm utilities in jit_x64.cpp
c40c79a06
- simplify how structured zasm finds functions
46bc924ed
- split some zasm opts into separate script-level pass
3f4f964dc
- assume modern function calls in zasm optimization passes
e260ce752
- move get_register_dependencies to zasm_table.cpp
13b6a599c
- remove music buffer setting
572f44514
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.
- add get_command_implicit_dependencies in zasm_table.cpp
9e4a41e07
- add get_register_ref_dependency in zasm_table.cpp
ced4dbad8
Also run
propagate_values
after the comparison opt passes, as it was accidentally skipping some optimizations due to the comparisons passes assuming D2 is being compared. - simplify zasm simulation and always simulate stack
37d86217d
- optimize zasm scripts in parallel
9ae7f4e86
- improve handling of bugged SDDDD by fixing it, instead of deopting
df037da33
- reduce duplicated code for trigger conditionals
Relevant changes:
- refactor(zc): reduce duplicated code for trigger results
f20ddc1b4
- refactor(zc): reduce duplicated code for trigger results
- clean up jinx handling (#939)
cfe48cd7b
- deduplicate enemy code reading of SIZEflags
92bb2cc6a
- remove old movement functions
c5b8a0e17
- use transulency table cache for all fade/lighting
284fc7567
- Clean up Tile/Side/Ring warp dialogs
2637fc6ac
- re-organize the combo editor 'Triggers' tab
53310a254
- redesign enemy editor using new GUI (#971)
e33551759
- upgrade enemy editor's enemy selector to new gui (#986)
b7e767fd4
- remove the
Misc[]
dialog as it was unused49c6f2e4f
- upgrade screen enemy selector to new gui (#989)
54498fae3
- upgrade midi editor to new gui (#995)
e472b5f1a
- upgrade sfx editor to new gui (#996)
ccdde8a65
- upgrade map styles editor to new gui (#997)
031767ec0
- in enemy editor, read defense names from zinfo
8cde41f2e
- remove classic_zquest.dat, load assets from new assets/editor folder
5551216eb
- rename Fire Levels to Burning in combo triggers tab
d454c4abe
- drop "Load Tileset" and consolidate loading tilesets via File>New
36df71e82
- remove instances of deprecated functions
331bbd4e3
- make every std file compile individually
6de1bb98b
- move some constants from std to bindings, and add more doc comments
45d9718e1
- internal function aliases, internal constexpr functions
17e03bc81
- use alias name in comments, update expected zscript
b0af4b4b8
- reserve 'constexpr' token
0cb3519ea
- clean up ScriptEngineData for all script types
584bea132
- clean up generic script indexing
a27241f73
- optimize bool ops a lot
c8fae535d
- clean up getStackOffset(Datum) code
3cdf73853
- label opcode register args as R/W/RW/unused
40e805b55
- label some opcode properties with flags
c11ec7172
- use common UserDataContainer for most user data
ba6e421d9
- standardize script object management
be20f347b
This keeps script-created objects in the same map, gives all objects a unique id, and implements allocation and retrieval for any object type using the same methods. This reduces some duplicated code, and should help with implementation of a potential garbage collector feature.
Bitmap objects are a bit special, and still need to be refactored.
- document, clean up, and sanity check websocket stuff
ce2f07d9c
- document, clean up, and sanity check websocket stuff
764e539e0
- migrate user_bitmap to script object system
68329daf9
Incidently, this increases the maximum number of user bitmaps to 256.
- move zasm table and serialization to shared lib
c483f611c
- remove separate zasm defines for compiler
bcd079539
- improve location of many error messages
52949459f
- move internal symbols to new binding .zh files
011539980
Internal symbols were defined in
.cpp
files, but now they are defined in.zs
files with a newinternal
keyword and@zasm
doc comments. These files live inbindings
, and are automatically included for every compilation.This should simplify the process of adding new internal symbols. It also enables viewing documentation of any internal symbol in the VS Code extension (w/ a hover tooltip), and all the documentation we have for internal functions and variables has been inserted as comments in the binding files.
This also deprecates functions that create an object of internal types, like
Game->CreateBitmap(width, height)
- and replaces with normal constructors -new bitmap(width, height)
. - remove library symbol cpp files
76a67b371
- remove internal class type
b76078275
- array literals better deduce their element types
3717da293
- type-safe opcode classes and use zasm table for stringification
75dc4d745
- separate zasm code from script data
75f981f57
- make all command strings match enum name
08e0c08e5
This normalizes all the string names for commands to be the same as the enum name used in code, and rewrites
get_script_command
to be an explicit mapping of this string representation and the enum value. These not matching was confusing, and was a potential source of future bugs. - remove unused features from ZScriptArray
c09b58133
Various things are just a wrapper around what std::vector does, and we don't need dimensions, a template, or a custom iterator.
- remove duplicated function deallocateZScriptArray
d061e3c55
- add -json switch to parser, use stderr for logging
3be9b16e8
- add errors and warnings to json output as diagnostics
6ae06e15d
- improve validation of file paths
0480ad034
..
is now allowed in paths, as long as it doesn't reach above the quest's "Files" folder- more specific error messages when path is invalid
- check for illegal filenames
- general clean up of path validation code
- remove
Game->Misc,Misc2,Misc3,STD,Ghost,Tango
arrays5c64321ee
These have been removed from ZScript. Additionally their implementations are removed too, since no quests ever used them.
- remove unused getters/setters from npcdata
a7fbbb5cc
- simplify ltou, utol and convcase
7aabd9078
These functions returned false if the string given is empty. That's not useful, so now they longer return anything.
- remove unnecessary
Debug->
"typecast" functions18c2b4c49
- remove many unused
Game->
functions7948da864
All of the following functions were found to not be used in any published quests or scripts. Since they have all been deprecated (via
Screen->
ormapadata
), they have been removed.GetScreenEnemy
SetScreenEnemy
GetScreenDoor
SetScreenDoor
SetScreenGuy
GetScreenGuy
SetScreenString
GetScreenString
SetScreenRoomType
GetScreenRoomType
SetScreenEntryX
GetScreenEntryX
SetScreenEntryY
GetScreenEntryY
SetScreenItem
GetScreenItem
SetScreenUndercombo
GetScreenUndercombo
SetScreenUnderCSet
GetScreenUnderCSet
SetScreenCatchall
GetScreenCatchall
SetScreenLayerOpacity
GetScreenLayerOpacity
SetScreenSecretCombo
GetScreenSecretCombo
SetScreenSecretCSet
GetScreenSecretCSet
SetScreenSecretFlag
GetScreenSecretFlag
SetScreenLayerMap
GetScreenLayerMap
SetScreenLayerScreen
GetScreenLayerScreen
SetScreenPath
GetScreenPath
SetScreenWarpReturnX
GetScreenWarpReturnX
SetScreenWarpReturnY
GetScreenWarpReturnY
GetScreenEFlags
- improve placement of errors/warnings on function calls
9eedc1911
Errors/warnings from using unknown or deprecated functions now attach to the function name, rather than the entire call expression.
- remove A registers
2c8e6a1ec
The "A" registers are two old registers that were never used in any quests. The only way to access them in recent builds has been the FFC
GetFFCInitA
/SetFFCInitA
, but no published quest has ever used them.Now the ffc and item editors no longer display these two "A" register fields, and internally many other things handling these registers have been deleted.
- make
ComboAt
internal as an optimization777571531
- tidy up std, move many enum/constants to bindings (#1065)
45b9f1794
Many constants are now named enums, and moved from
std
to binding files (which are imported automatically). This allows these values to be used with internal bindings (likeGame->
) without importingstd
; and improves documentation by giving everything a reference-able name.Also did a large general clean up of documentation comments, and made sure every internal function/variable documents what enum applies to it.
Removed many unused or unimplemented features.
- remove HEADER_GUARD (allow and ignore duplicate imports)
626c87772
- prevent parsing same files multiple times
20885219b
Before, every import would parse the file it included. Now, a cache is used so every file is only parsed once. This reduces compiler times (for example: compiling the binding files went from ~300ms to ~200ms).
- remove WarpReturnC
0f4e5290c
- deprecate
WrapAngle
(useWrapRadians
instead)786f3b248
- use new -json zscript option for diagnostics
1143e7480
- improve symbol id generation used for metadata
175bf4972
- add job pool, improve script processing
6e70798b2
- save replay result file when starting replay
cb2e4b0d3
- fix get_recent_release_tag method
3b24464b1
- update 'armos.zs' expected zasm
8ccc152f6
- extract snapshot testing code to base class
d9d839b21
- add snapshot tests for x64 jit
07a6ef713
- fail replay test if jit cannot compile a script
1bf248ab2
- fail on abort in web replay tests
2b643c358
- stop on fatal errors in run_web_version.js
bafc72eba
- fix test_jit.py not looking in the right folder anymore
44227cd6e
- add "frames" and "length" meta fields to zplay
93e77ddf7
- use "latest" version for all playground.qst replays
3c80d2439
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 test_optimize_zasm.py and update_snapshots.py
6b8053c89
- move snapshot files to common folder
47eb8e745
- hash jit output for all but playground.qst
8a28eff6b
- add scripts/run_for_every_qst.py, for running a command against every qst in the database
0eb93f48d
- add replay test for class ctor/dtor
57c8cc5e1
- fix different outputs for jit snapshots
179f96858
- define calling convention for jit regression tests
03e3f0871
- add playground_exstate.zplay and playground_large_animations.zplay
d61aeb1bc
- add crucible_quest.zplay
5dd7d4c23
- add combo_rotator.zplay
543bcfb5f
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.
- fix crucible_quest.zplay from recent slope refactor
3a3dba0d0
- make the editor File->New test do what it says it does
3314b4ef0
- use original qst for combo rotator replay
b093e59c6
- update crucible_quest.zplay for 5732b53
798646bc4
- add local web app for running replay tests
bd16f16e0
- move build archive operations to archive.py
144ec7f33
This greatly cleans up bisect_builds.py, which was doing a lot. Now a new tool
scripts/archive.py
is responsible for downloading any build - or building from source, as needed. - avoid enumerating s3 bucket just to download single version
e1b37622b
- use new archive download for run_replay_tests.py
f2eaaf7ec
This removes the old download flow that required a github api key to get a baseline build for a compare report.
- move github related functions to github_helpers.py
deb47752d
- use requirements.txt for python deps
61941b504
- extract core replay runner to replays.py
a2ab3ac30
- format Python using Black
c54f26195
- sort Python imports using isort
2cabfdb7c
- update expected zasm from recent changes
ed025a972
- refactor how known replay failures are handled
85f745323
- import Path directly
2fd240321
- remove solid.zplay
2b3acd742
- add playground_bitmap_credits.zplay
d6b398ad4
- make some test scripts emit no warnings
6720fc50e
- update test scripts for new array syntax
873e7ecd6
- add item_spawns_cloud.zplay
0ab66ae79
- add crucible_quest_short_1.zplay
f7650745d
- add snapshot test for compiling the zscript database
46e71c1d8
- use truecolor bitmap for gfx frame hash
bd2cf5c9b
- add "auto" script tests; reorganize and document playground quest
99a867ad3
- add scc replay test
cfe187b58
- add scripts/replay_uploads.py for downloading and running uploaded replays
49b3d60e0
- add Database class to nicely automate downloading the database for local use
3af230f63
- add tests for 2.55 and 3.0
c9334a381
Also:
- On Mac, can now use path to
.app
bundle as installation folder - For 2.55, fix bug where parser errors underlined the entire line
- On Mac, can now use path to
- reset cache for web builds
1a8cbf99d
- for web tests, build for RelWithDebInfo
16ce632d5
- include coverage for all apps, not just zplayer
c0e0151c4
- bump build cache so 2.55 branch doesn't conflict
75da202d6
- set correct test results folder for web replays for upload
2ebfaeffc
- get database update cron working again
15b7ff4aa
- fix type in download-artifact v4 action
ec499225b
- fix another typo in download-artifact v4 action
e272d0914
- set test results folder names for jit/non-jit replay runs
bfd9daa06
- fix replay report generation for forks
bbb53680f
- upgrade to python 3.12.8
12b1fa654
- ignore fixup commits in git hook
644798146
- use better examples for commit messages
46af4f0af
- version refactor
b49ae14d6
Switch from "alpha/beta/gamma/final" to simpler "stable/nightly" versioning, and adopt a semver-like version string. See docs/versioning.md for more.
Also, greatly automate the version bumping process. Simply select stable or nightly in GitHub action, and release scripts handle selecting the next version number accordingly.
- link to website in generated changelog
c72db7477
- Remove whistle delay for new replays
9bf0e2a7b
- minor replay/debug improvements
4fe60ce1f
- add jit_runtime_debug.py for debugging jit bugs
781ffbc00
- remove noisy allocation logs
6319e54ac
- Revert "fix!: more lens/enemy stuff missed in prior commit"
fbc664523
This reverts commit b9cafe07b073b7de07bb2f27207582bc8d435d62.
- Revert "fix: changer ffcs counting for trigger groups and similar effects (they shouldn't)"
bf50df15b
This reverts commit 1a1bd37ac769db838a390e88b6fef03288576b01.
- fix(zq): upgrade combo 'move' code, more things now update on moving combos, add Combo overwrite warnings (#917)
e8d903186
- Revert "ci!: use pull_request_target for ci.yml workflow"
fab9eefc0
This reverts commit 40d18af060793860c7757fd69f8e5defd15e59c2.
- Revert "refactor(zc): remove old movement functions"
87b073771
This reverts commit c5b8a0e17d165380f44ddf7950a73b6aa216d3ad.
- support "latest" for version field in zplay
dcaf7f925
- add -analyze-zasm-duplication for finding duplicated functions
aa467263c
Not fully finished, just a start.
- temporarily disable compare zasm opt as I improve in a branch
52d0aa35a
- disable zasm optimization until reported issues with tango are fixed
c3b7e1ba2
- update headers and bindings with array typing
b23b23484
- optimize '!' operator
cb8cbe038
- more parser optimizations
900178b73
- Optimize multiple consecutive PUSH opcodes
dc6d9e49e
- Add ZASM comments to parser output
407bcf258
- add more ZASM comments
4b1dd0988
- CALLFUNC/RETURNFUNC for optimized function call/return
5aa14b335
- New 'ReturnVisitor' pass errors on functions missing 'return' statements
5cc8fb151
- code reachability optimizations
17ae5ad31
- more small ZASM optimizations
76f86d2a7
- add compile option for missing return error
18275ed76
- treat empty functions like prototype functions
433581fe7
This can be a heavy optimization for empty constructors/destructors.
- make some more internal functions
constexpr
21cdf3c04
- re-number zasm comment numberings
3ea93b743
- Optimize 'STORED' followed by 'LOADD', and add 'STOREDV'
6fce11564
- Optimize standing-statement x++,x-- to ++x,--x
5b62f2f5c
- optimize sections of zasm that are run only for their side-efffects
d253cbb84
- Optimizations related to function call parameters, unused function params
d79b131ab
- range loop cleanup
9841db7d5
- Optimize variables initialized to 0
f20abd31d
- clean up unused variables
f3a0991d6
- internal label errors now prevent compile
beb767112
- compare related optimizations
3a0d346dc
- allow 3-arg opcodes, move zasm tables to remove duplication
0c3e0823b
- optimize comparisons to run when used, add CMP_BOOL flag for boolean-equality comparisons
aa9bf8ebb
- support CMP_BOOL in x64 jit
accf84bf0
- add Region in anticipation of z3 scrolling
f87c20d08
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 regionRegion->GetScreenForComboPos(int pos)
: given a combo position, returns the screen index associated with itRegion->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 of176
to iterate all the combos in the current area, it will work in both regions and non-regions. Additionally you should useComboAt(x, y)
rather than anything else to translate between pixel coordinates and a combo position. - optimize PEEK in x64 and wasm jit
0ff7dee9e
- use faster LOAD/STORE instead of LOADD/STORED in compiler
e8b3be6fd