Skip to content

Instantly share code, notes, and snippets.

@connorjclark
Last active March 8, 2025 21:35
Show Gist options
  • Save connorjclark/4a29fbaaca79d0044694ee65dfd4f78e to your computer and use it in GitHub Desktop.
Save connorjclark/4a29fbaaca79d0044694ee65dfd4f78e to your computer and use it in GitHub Desktop.
3.0-so-far.md

Note: this is a draft!

Updated: mar 8, 2025

Features

  • 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 and combodata::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 and npcdata->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.

Player

  • 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 in zc.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 becomes TRACER 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.
  • 'Toggle Lights' cheat works on new dark rooms 1f74bdc0a

Editor

  • 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:

    • feat(zq): 'Set Default' button to set default editbox colors e9e8b112d
    • feat(zq): 'Goto' button in 'Browse Notes' to go to a notes' screen 9bd560f93
  • 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 now Shift + 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 lister c4a6d8b72  

    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)

ZScript

  • more value range types (.., =.., ..=, =..=) 1e5be558a
  • allow mathematical range expressions [A,B) etc 61c5ccc92
  • range loops (loop(int q : 0=..10))

      Relevant changes:

    • feat(zscript): range loops can contain variables in ranges/increment, and negative increments cb583e1c4
    • feat(zscript): range loops have '@NoOverflow()' annoation, docs ded10db59
  • 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 of T 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 and ResizeArray still allow char32 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 or Free()), and mostly removes any reason to ever call Own().

    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 with LEGACY_ARRAYS. It can be set to on, off, or warn, and defaults to warn. 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
    
  • 'TileBlit' and 'ComboBlit', for drawing parts of tiles/combos c874bc20e
  • webapp for exploring and sharing ZScript ae2a67e77  

    https://web.zquestclassic.com/zscript

  • add bottle cure shield jinx flag (BTF_CURESHIELDJINX) 63d0dba0c
  • add Game->Exit(), which closes the program af9076695
  • add base sprite class 930485928  

    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. The sprite class contains 40 properties that were duplicated across these classes. Some properties do not work for all classes (like ffc and player), but more support may come later.

  • show source code context with error messages fb4dbc83f
  • add RepairShield function to npc ef15f9019
  • support setting Hero->ScriptTile to draw larger than 1x1 7b8530979  

    Internally, the Hero sprite resets its Extend property every frame, which prevented using ScriptTile in combination with TileWidth and TileHeight. Now, Extend is only reset if ScriptTile is not in use.

  • @Increment annotation for enums 43003ca8c  

    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:

    1. Auto-incrementing values starting at 1 and doubling the previous for each new enum member
    2. 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 ...
    }
    

Visual Studio Code Extension

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

ZLauncher

  • add options for window size, and cap max default window size 919bda156  

    [ZLAUNCH] window_width, window_height in zcl.cfg

    Cap max default size to 2x

Web

  • 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

Bug Fixes

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

Player

  • 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

Editor

  • 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

ZScript Standard Library (std.zh)

  • clean up some missing function returns ef5211325
  • use template for Cond to support arrays af4293cd6  

    Also deprecate and suggest using ternary expressions.

ZScript

  • 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, if POP D4 is followed by PUSH D4 then the compiler replaces it with PEEK 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 and npcdata->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 and eweapon->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.0 4f80edc07
  • 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.

Visual Studio Code Extension

  • 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

Web

  • 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

Documentation

  • 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

ZScript

Build

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

Web

Refactors

  • 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

Player

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

Editor

  • 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 unused 49c6f2e4f
  • 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

ZScript Standard Library (std.zh)

  • 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

ZScript

  • 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 new internal keyword and @zasm doc comments. These files live in bindings, 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 arrays 5c64321ee  

    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" functions 18c2b4c49
  • remove many unused Game-> functions 7948da864  

    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-> or mapadata), 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 optimization 777571531
  • 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 (like Game->) without importing std; 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 (use WrapRadians instead) 786f3b248

Visual Studio Code Extension

  • use new -json zscript option for diagnostics 1143e7480
  • improve symbol id generation used for metadata 175bf4972
  • add job pool, improve script processing 6e70798b2

Tests

  • 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

Visual Studio Code Extension

  • 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

CI

  • 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

Misc.

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

Player

  • 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

ZScript Standard Library (std.zh)

  • update headers and bindings with array typing b23b23484

ZScript

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

  • optimize PEEK in x64 and wasm jit 0ff7dee9e
  • use faster LOAD/STORE instead of LOADD/STORED in compiler e8b3be6fd

Visual Studio Code Extension

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment