BYOND 5.0 Version 516 Release Notes
Build 516.1652
Fixes (More Info)
Dream Daemon
- Overloading the output operator was pushing the result onto the stack, when the result should have been discarded. (Ter13)
- Internal islist tests for filter lists didn't work correctly, so procs such as Copy() didn't work on filter lists. (Sovexe)
- Setting the pixel_w argument in image() was applying it incorrectly to pixel_z, which would then get clobbered by the actual pixel_z argument if present. (LordAndrew)
- The server was not always re-sending area information that got garbage-collected by the client, which only happened in projects with a lot of areas on the map. (Meme01)
- Changes to client appearance (such as setting client.color) could cause the client to stop rendering the map until there was a noteworthy change to a mob. The server now makes sure to send the appropriate message to the client in these cases. (F0lak)
Dream Seeker
- Writing to byondStorage now properly calls sync() on the appropriate storage item in any other browser windows for the same Dream Seeker session. Note that this will not synchronize across separate DS sessions that are both running. (Drathek)
- Running Dream Seeker with text-mode maps caused the maps not to appear, or to appear very distorted, as a result of icon positioning changes that weren't forwarded properly to text mode. (Lummox JR)
- URLs starting with ? without a protocol in the browser would send topic messages twice. (Comicao1)
- KEEP_TOGETHER groups with large boundaries were causing renderer exhaustion. This has been improved with better handling of offscreen surfaces. An additional workaround is to use BLEND_INSET_OVERLAY on any objects that are children of the group. (Ter13)
Build 516.1651
Fixes (More Info)
Dream Seeker
- Calling del() on an object that was an index in an alist() would sometimes result in junkifying the alist tree and subsequently cause a crash. (F0lak)
- When setting focus to a browser control through winset(), the browser itself (the internal part) didn't believe it was focused because the actual focus was on the outer window holding it. (Ter13)
- Too many winsets/wingets done via JavaScript could cause the browser to throttle them and stop responding. (Hry)
Features (More Info)
Dream Seeker
- Aliases defined in a .dms file previously didn't run their new command back through the client's frontend command parser, meaning they missed out on some commands such as .winset and on embedded wingets, and instead only worked with the backend parser for ordinary verbs. This has been changed, so an alias will now reroute commands properly.
- New inner-mouse-pos and outer-mouse-pos params have been added to every control. There is also a mouse-pos param that's an alias for inner-mouse-pos. These are read-only, and represent the mouse coords relative to the upper left corner. Note that this will not be included when using * to read a control's parameters; the mouse-pos params must be explicitly read.
Build 516.1650
Fixes (More Info)
Dream Daemon
- The change to pixloc to include bounds wasn't working when reading atom.pixloc for movables. Additionally, setting atom.loc to a pixloc directly didn't work correctly with bounds. (Depressedmistake)
- Moving by a vector didn't set the mover's dir properly, which could result in either no changes, the correct dir being set when crossing tile boundaries, or diagonals causing a flop back and forth between cardinal directions. (Ter13)
- Rounding errors on the server could cause desync between a mob and the eye. (Depressedmistake)
Dream Seeker
- The byondStorage options and BYOND object for JavaScript were lost when refreshing a browser page. (Hry)
- pixel_w/z weren't accounted for in client-side visual bounds, causing some icons to pop in and out of view. (Ter13)
Build 516.1649
Fixes (More Info)
Dream Daemon
- When for(k,v in list) had a non-associative list, it incorrectly acted as though the list was empty. (Albro1)
- Loading UTF-8 BOM encoded files with file2text() included the format leader. While technically "correct" behavior, it was completely unwanted, so the format leader is now removed. (Lummox JR)
- Creating vectors from strings had some problems with x and X characters, which were meant to behave just like commas. (Ter13)
- External calls made via the new load_ext() form were clearing junk data by mistake and failing to clear other data, resulting in small memory leaks, bad ref errors, and possible premature deletion of objects. (A-112)
- Breaking change: atom.pixloc now includes its bound_x/y offsets, so it's equivalent to bound_pixloc(atom,SOUTHWEST). (Ter13)
Dream Maker
- The compiler's parser failed to parse the expression .-1 correctly. Following the . path operator with a number is valid, but not with a negative number; this should be interpreted as a subtraction instead. (Ter13)
Dream Seeker
- In servers with a huge number of procs, the command parser could get caught in an infinite loop in some cases and hang the client. (Mos_ley.if)
- URLs starting with ? didn't work correctly in the browser. For safety you should always use the byond:// protocol in front of such URLs anyway, but it was intended that 516 should continue to support old code that uses this. However the change that was meant to handle those URLs never got included, causing unexpected results for projects that relied on it. (Comicao1)
- Visual positions of movable atoms in visual contents were being offset from their parent if their bounds didn't start at 0,0, which was an unintended departure from earlier versions. This will still happen however for the contents of turfs that are in visual contents, which is intended. (Zagros5000)
- Playing sounds with wait, and possibly other parameters, could cause a crash. (Comicao1)
- Files sent to the browser with UTF-8 BOM encoding loaded incorrectly when done via browse(). (James)
- screen_loc with map-edge keywords like RIGHT or BOTTOM with negative tile offsets caused the object not to display. (James)
- 3D sounds were occasionally disappearing or sounding from the wrong place. (Baiomu)
- Changes to HUDs on secondary maps didn't trigger a resize notification that would correctly display their bounds. (Axerob)
Build 516.1648
Fixes (More Info)
Dream Seeker
- Breaking change: Previously, render_source replaced an icon with the render_target by anchoring to the center of the icon. This was stupid, because it created the need for hacky workarounds and it produced a ton of annoying bugs, but it was also unintuitive. Now, when render_source replaces an icon it anchors to the lower left, just as if you were simply using a different icon. (Lummox JR)
Features (More Info)
DM Language
- New screen_loc keywords have been added for specifying the edge of the HUD (including any extra tiles added by the HUD) rather than the edge of the map. These are SCREEEN_SOUTHWEST, SCREEN_NORTHEAST, etc. They work like the regular dir keywords but include HUD extensions. Note that HUD objects using these keywords will not extend the HUD any further.
- Sounds can now be linked to atoms and move with you thanks to the sound.atom and sound.transform vars. The relative x,y of the atom to the listener (virtual eye) will be run through a 3x3 matrix in sound.transform and the resulting 3D position added to the sound's existing x,y,z vars.
- A new animation flag, ANIMATION_END_LOOP, can be used to gracefully end the loop of a previous sequence when superseding it, or when stopping animation entirely.
- New icon_w and icon_z vars have been added to atoms, which specify the home position of the icon relative to the lower left corner. They act like negative pixel_w/z, except they are NOT inherited by any overlays, etc. They apply only to a single icon.
- New convenience procs have been added for doing fast operations on associative lists that hold numbers as their associated values, such as list("apple"=3, "orange"=10). This is mainly to drive performance in certain games.
The new procs are:
- values_sum: Returns a total of all associated numbers in the list
- values_product: Returns a product of all associated numbers in the list (1 if no numbers)
- values_dot: Returns a dot product of the numbers in two associative lists, by multiplying the numbers associated with matching values
- values_cut_under: Cuts all values from a list whose associated numbers are below a certain threshold
- values_cut_over: Cuts all values from a list whose associated numbers are above a certain threshold
- lerp() has been added, which does interpolation at a lower level between two values of the same type: numbers, vectors, pixlocs, and matrix.
- sign() was tragically overlooked in the addition of new math procs to 515. This has been rectified.
- New proc vars, caller and callee (the latter referring to the proc itself), return information about running procs and can be used to access their information. These vars return a new /callee primitive object. This can be used to trace a call stack in a custom error handler, for instance.
- A new <=> operator has been added. This returns negative if the first value is less than the second, 0 if they're equal, or positive if the first value is greater.
- A new type of associative-only list, called alist(), can be used for improved performance in some cases where you want key-value pairs without other list baggage. Some differences from regular lists include:
- No random access (can't get the Nth item)
- No duplicated "keys"
- Numbers can be used as keys
- for(item,value in list) can now loop through the items in a list and grab the associated value at the same time.
- A new pragma directive, #pragma syntax C, allows you to specify C-like syntax for switch() or for for() loops. In switch(), this means you now have a case statement and fall-through behavior, with the break keyword ending a switch case. In for loops this means you can use the semicolon as a separator in place of a comma, so multiple statements can be chained together. These changes can be done individually or both together, and also respond to the pragma push/pop directives.
- load_ext() has been added to pre-load a function in an external library. The result of load_ext() can be passed to call_ext() as a single argument in place of call_ext(library_name, function_name).
- astype() is a new proc that effectively acts as a built-in (istype(a,b) ? a : null), but faster. It's mainly useful for situations where you want to conditionally call a proc, like astype(player,/mob)?.Bounce().
- animate() now supports a tag argument for named animation sequences.
- A new /vector primitive has been added. This is (for now) a 2D or 3D numerical vector, and it has support in various movement procs. As a primitive, it doesn't descend from /datum and can't be overridden.
The new vector() proc is used to create a vector.
- A new /pixloc primitive has been added, representing an x,y,z position including step_x/y offsets. It has support in various movement procs. As a primitive, it doesn't descend from /datum and can't be overridden.
Additionally, an atom.pixloc var has been added. This can be used to directly read or (for movables) write an atom's pixloc.
The new pixloc() proc creates a pixloc, and bound_pixloc() grabs the pixloc of the center/edge/corner of an atom's bounding box.
- filter() now accepts a name argument. Named filters can be looked up in the filter list for an atom by name instead of by index.
Dream Daemon
- Breaking change: The ~= and ~! operators now take associated values into account when checking associative lists.
- Byondapi: Byond_CRASH() has been added. Note that this will NOT trip any stack unwinding or error traps in your library.
Dream Seeker
- A new winset option has been added for WebView2. Using a blank control name, you can send a browser-options parameter that's a comma-separated list of the following:
- find: Make the Ctrl+F find option available
- devtools: Make devtools available, for debugging your HTML/CSS/JS
- zoom: Make zoom available
- refresh: Make the refresh option available
- byondstorage: Add a new API for saving data locally, since localStorage won't really work
The byondStorage API is actually three different items: hubStorage (shared with all instances of the same hub entry), serverStorage (specific to a hub and server URL), and domainStorage (serverStorage without including the port number). These have different uses depending on the game. They behave like localStorage in principle.
Pages served through the browser control will also have access to a new BYOND JavaScript API which has two functions: BYOND.winset(id,params) and BYOND.winget(id,params); the latter returns a Promise and can be used with the await keyword.
- A new .sound command can be run on the client, for use in skins that might want to play a sound when interacting with the skin.
- Breaking change: SIDE_MAP and ISOMETRIC_MAP have had changes to their positioning behavior. In SIDE_MAP, the lower left corner of the icon is now always anchored relative to the lower left corner of an object's bounding box. In isometric, this is the left corner. This is contrary to old behavior that anchored southwest corner to southwest corner, because "southwest" isn't always the lower left if client.dir changes.
bound_x/y still exist but they act as negative offsets in pixel_w/z space, which is basically in keeping with old behavior. It's actually preferable now that you don't use bound_x/y, but just use pixel offsets which are inherited or else use the new icon_w/z vars.
Everything
- Browser controls now use WebView2 instead of the old embedded IE. The old embedded IE code is still present but will be phased out during the beta.
This is a massive step up for the engine since it means users are no longer tied to the ancient, horrendous Trident engine and its stupid, stupid issues.
515 Release Notes | View All