Be sure to check out the reference for all of the new features below.
Version 516:
- Breaking changes
- Browser code designed around Internet Explorer may need to be updated for WebView2 (based on Edge)
- The <meta> tag for using updated IE 11 behavior is no longer necessary and may be detrimental, but <!DOCTYPE html> at the top should still be used
- A Microsoft bug allowing use of IndexedDB for local storage no longer exists in the new browser (see byondStorage below)
- The equivalence operator now takes associated values into consideration for lists
- Icons now anchor their bottom left corner to the bottom left of their bounding box after client.dir rotation, not to the southwest (in isometric this is the left corner)
- Wherever render_source is used, the replacement icon is anchored to the bottom left of the icon it replaces, always
- This means any plane master relays in client.screen should be anchored at the new SCREEN_SOUTHWEST instead of SOUTHWEST (see below)
- bound_x/y are no longer preferred for bounds; they're subtracted from pixel_w/z to mimic old behavior
- Byondapi now only creates temporary references on the main thread, which get removed via ByondValue_DecTempRef() if you want to remove them early; off-thread calls create persistent references that must be removed via ByondValue_DecRef()
- Browser code designed around Internet Explorer may need to be updated for WebView2 (based on Edge)
- Browser
- The internal browser has been upgraded to WebView2 to replace the old embedded Internet Explorer
- Calling winset() with no control and a browser-options parameter allows use of various browser options like devtools, built-in Find, zoom, etc.
- A new byondStorage option has been added for JavaScript (it must be enabled via browser-options): the hubStorage, serverStorage, and domainStorage objects work very much like localStorage
- A BYOND JavaScript object has been added to pages served via BYOND, for easier access to winget/winset
- Language features
- A vector primitive has been added, which is a 2D or 3D number; use of this has been built until movement code as well
- Vectors can be constructed using vector() as well as some math operations
- Generator objects and particles can use vectors instead of lists now
- Vectors can be used as the location argument for Move()
- A pixloc primitive has been added, which combines a turf with step offsets
- Pixlocs can be constructed using pixloc() as well as some math operations
- A new atom.pixloc var can read (and for movables, set) a pixloc
- bound_pixloc() retrieves the pixloc for a corner, edge, or center of the atom's bounding box
- Pixlocs can be used as the location argument for Move()
- Associative-only lists are available with the new alist() proc and /alist type; these are more performant for cases where indexed lists aren't needed
- Numbers can be used as keys in an alist, since accessing the Nth item isn't possible
- Duplicate keys in the list are not allowed
- Procs have new caller and callee (the proc itself) vars that return a reference to the running proc
- The returned values are a new /callee primitive type
- Callee objects can interact with arguments and some of the local vars of the procs they reference
- The most obvious use case of this is generating your own call stack in a custom error handler
- A new <=> comparator operator has been added; it returns 1 if the first operand is greater, -1 if it's less, and 0 if the operands are equal
- for(k,v in list) syntax has been added for looping through associative lists
- astype() is similar to istype() but returns either the object being tested or null; this pairs very well with the ?. operator
- sign() was tragically overlooked in 515's new math procs, so it's been added now
- lerp() interpolates between values; currently this supports numbers, vectors, pixlocs (and turfs), and /matrix values
- load_ext() can load up an external proc's info to make call_ext() faster
- #pragma syntax now exists, allowing C-like syntax for for() loops and the switch() statement
- Several new convenience procs have been added for associative lists to do rapid calculations: values_sum(), values_product(), values_dot(), values_cut_over(), and values_cut_under(); more may be added in the future
- A vector primitive has been added, which is a 2D or 3D number; use of this has been built until movement code as well
- Animation
- Named animation sequences are now supported; using a new tag argument for the first step in a sequence will give it a name
- The new command parameter will run a command on the client when an animation step completes, allowing better synchronization with animation events
- A new ANIMATION_END_LOOP flag tells the animation to finish any looping sequences before either superseding or ending them
- Filters
- Named filters are now supported; a filter can be given a name argument, and it can be looked up in an appearance's filter list by name (which must be unique to that filter list)
- Angular and radial blur filters now have an offset parameter
- Display
- icon_w and icon_z vars have been added for all appearances; these define the anchor point of the icon (i.e., they act as negative pixel_w/z offsets) but are not inherited by any overlays
- New SCREEN_dir keywords have been added for screen_loc, such as SCREEN_SOUTHWEST, simplifying positioning issues related to the breaking changes listed above
- screen_loc now supports a MIDDLE keyword similar to CENTER; it acts as LEFT+50%, BOTTOM+50%, or both
- Sound
- Sounds can now be linked to atoms so they move with you automatically without needing the server to send updates
- A new .sound command is available on the client, so skin elements and animations can trigger sounds
- Byondapi
- Byond_PixLoc() and Byond_BoundPixloc() have been added
- Byond_CRASH() has been added for throwing a runtime error; note that this will not unwind your own library's stack properly so you should do it at the end of your own lib's called function
- ByondValue_DecTempRef() has been added to immediately clean up temporary references; as noted above, ByondValue_DecRef() should no longer be used for temporary references, and must be called for persistent references created by off-thread Byondapi calls
- User interface
- All controls now have read-only mouse-pos parameters, which also have inner-mouse-pos (equivalent to mouse-pos) and outer-mouse-pos versions
- A new dpi parameter exists, globally and also for windows (per-window DPI is not currently supported), which returns the DPI scaling relative to a normal value of 1
- Input
- DMS aliases now properly handle embedded wingets
- Mouse xbuttons are now supported
- Compiler
- dm.exe and Dream Maker both show compilation progress now
- Object tree generation in Dream Maker is much faster