BYOND 5.0 Version 515 Release Notes
Fixes (More Info)
- The grid space allotted for text in the properties pane was incorrect for some values. (Ter13)
- The "delete topmost turf" option in the map editor caused a hang. (Higoten)
- When a turf replaced another turf in the map editor, the undo action was sometimes incorrect, restoring the default world.turf instead. (Higoten)
- Find and replace didn't work corectly in some cases when using the single Replace instead of Replace All option. (Higoten)
- Rectangular selections that were deleted set the area and turf info in the old region incorrectly, which resulted in weird behavior when adding turfs over that region. (Higoten)
- Pasting a rectangular selection in the map editor couldn't be undone. (Higoten)
- Compiling while a turf or area was open for editing in the map editor's properties pane could cause a crash when selecting a tile after compilation. (Higoten)
- Doing a Find All in the map editor on any scope broader than the current file would hang Dream Maker. (Higoten)
- The compiler sometimes compiled with a minimum world version that was incorrect if it also did not require that client version. (Anturke)
- Attempting to reconcile path changes to a map after a compilation with errors brought up the "Pending Map Errors" dialog could cause a crash. (Higoten)
- Changing a movable's pixel or step offsets in the properties pane of the map editor offset it by the new value instead of using that value directly. (Depressedmistake)
- The eraser tool didn't work on movables in the map editor. (Higoten)
- Find and replace didn't work correctly for movables in the map editor. (Higoten)
- Adding movables to the map could give them incorrect pixel/step offsets, and outright crash if clicking on a part of the map where only the background shows through. (Higoten)
- Objects with big icons would sometimes disappear if the turf they were on was only just barely out of view to the north or east. (Zagros5000)
- The black tiles for SEE_PIXELS and SEE_BLACKNESS were on the wrong plane and at the wrong position. (Exxion)
Fixes (More Info)
- The built-in pathfinding had some strange behavior directly next to the target, which wasn't apparent until get_steps_to() was added. (Kozuma3)
- New optimizations for for(atom in range()) and similar procs were compiling incorrectly. (Anturke)
- Deleting a rectangular selection and then compiling caused a crash. (Higoten)
- Using find and replace in the map editor could sometimes cause a hang. (Higoten)
- Text-mode map display was messed up. (Kozuma3)
- Trying to use RenderIcon() or its related features with mapless interfaces caused a crash. (Kozuma3)
Fixes (More Info)
- Turf changes on the eastern or northern edges of a player's turf view range did not send any appearance changes to the client. (Taitz)
- Calling gradient(list, index) with a non-constant list as the first argument resulted in a "bad gradient" runtime error. (Lummox JR)
- Gradients in hue-based color spaces were calculated incorrectly. (Redmooogle)
- The server did not properly recognize when an object ID had been reused in RenderIcon(), causing old information to be used in some cases. (Kozuma3)
- Find and replace could hang or crash the map editor. (RootAbyss)
Features (More Info)
- A new nameof() proc, operating only at compile-time, can be used to convert a proc reference into the name of the proc, solving a dilemma faced by multiple Space Station 13 codebases.
Fixes (More Info)
- Another hang issue similar to the one fixed in the last build occurred when a movable overlapped the east edge of the map, instead of the north edge. (RootAbyss)
- An expression *varname could compile incorrectly in certain cases, causing an implied src prefix before the var to be lost and resulting in runtime errors. (Niezan)
- Deleting a rectangular selection did not create a correct undo action. Additionally, dragging a turf that was not previously selected did not create an undo action. (RootAbyss)
- Compiling while an object was selected in the map editor's palette could cause a crash. (RootAbyss)
- Actions that caused the DirectX device to be lost, such as hitting Ctrl+Alt+Del, would prevent the world preview in the map editor from redrawing correctly. (RootAbyss)
- Atoms drawn to a render target drew in an incorrect position within the slate if they had a screen_loc with one of the screen-edge keywords (e.g. LEFT, BOTTOM). (Ter13)
- RenderIcon() kept the results of previous renders visible instead of clearing them, causing transparent pixels in the second image to show the previous image. (Anturke)
Fixes (More Info)
- Movable atoms with icons bigger than the world tile size could hang the server when their top edge overhung the northern edge of the map. (Lummox JR)
- Trying to read from a prototype's vars list caused a crash instead of a runtime error or null. (Luber)
- Bounding box calculations for the turf map were incorrect near the north and east edges of the map. (RootAbyss)
- Undo levels in the map editor were being cleared by compiling. (Lummox JR)
- Resizing the map could crash the editor. (RootAbyss)
- Sometimes icons in the icon editor did not show their changes visually until leaving the pixel editor screen or doing some operations such as deleting a pixel with the select tool. (RootAbyss)
- Deleting atoms from the map and then re-compiling did not remove them. (RootAbyss)
- Stopping a sound on a channel that wasn't playing anything crashed the client. (S34N_W)
Fixes (More Info)
- The Undo command in the map editor didn't repaint correctly after fully replacing turfs. (Lummox JR)
- Trying to generate instances from an icon states or directions in the map editor from an object without an icon could cause a crash. (Rickoshay)
- Implicit return types in procs such as operator+= could be incorrect in some situations, intermittently spitting out errors about undefined vars. (Niezan)
- Map files were being read with underlay turfs displaying in the reverse order, and saving also reversed the order of underlay turfs. (Hydrugen)
- After a failed compilation, checking or unchecking files in the file tree didn't update the .dme file on subsequent compilations. (Niezan)
- Mouse wheel events weren't handled properly in the map editor. (Francinum)
- Flicked icons could appear in the wrong place if they weren't the same size as the default. (RootAbyss)
- Replacing reference strings with images in browser and output controls was done too aggressively, mangling some attributes like links. (Exxion)
- Browser handling of CSS files was incorrect, causing CSS not to load in some situations. (Anturke)
- mouse_opacity was incorrectly set for objects in visual contents outside of a KEEP_TOGETHER group. (Kozuma3)
- A change to the pre-render step messed up some map gliding calculations. (Hydrugen)
Fixes (More Info)
- Attempting to access an invalid var for lists at runtime will now throw an error, whereas in the past it failed silently. This applies only to worlds compiled in version 515 or later. (DamianQ)
- Attempting to access an invalid var under world at runtime will now throw an error, whereas in the past it failed silently. This applies only to worlds compiled in version 515 or later. (DamianQ)
- The compiler will now correctly throw an error when trying to access proc-local vars such as src or usr inside of a static var declaration. This is because the related bug id:2798255 caused world.init to throw runtime errors. (This is a breaking change for some games, especially several variants of Space Station 13. For cases where this is being done to confirm a var is valid, use type::varname (the literal word "type") instead.) (DamianQ)
Features (More Info)
- json_encode() and json_decode() now have a second argument for flags that influence their behavior. This can be used to produce pretty-printed JSON as well as decide how string decoding needs to be.
- Savefiles now have byond_version and byond_build vars that can be used for maintaining compatibility. This can be defined at compile-time as a default for all savefiles. New functionality has also been added to savefiles for saving appearances and matrices in a better way. If you want to avoid savefiles updating to the new version during beta testing, you can set savefile/byond_version=514 for the time being.
- Prior to maps being sent to clients on every tick, the server will now call an optional user-defined world.Tick() proc. This can be used for various housekeeping needs.
- call_ext() is now used for all external library calls, in place of call(), to clarify the difference between calling DM code and calling external code. This is a breaking change for some games, although it won't have any impact on games compiled prior to BYOND 515. Trying to call() an external library will either produce a compiler warning if the library name is a constant string, or a runtime error otherwise.
- A new %% operator, and %%= as its companion, allows modulo to be done with fractional operands. The old % operator always truncates the operands to integers, and that behavior remains the same for backwards compatibility.
- A new scope :: operator has been added. This has many uses:
- ::varname and ::procname(...) can be used as a shorthand for global.varname and global.procname(...), respectively.
- /thing::staticvar can be used to disambiguate var names when a static and local var have the same name.
- Most commonly, A::B is a shorthand for initial(A.B), but can be used where A is a constant type path, e.g. /foo::bar.
- In an object's var declarations, and static var declarations, type::varname and parent_type::varname are valid, so an expression like HP = parent_type::HP + 20 is allowed.
- /mytype::procname() can provide a reference to a specific proc for use with call().
- The operations x**2, x**-1, and x*x have been optimized with new instructions that should be moderately faster. In this case, x is any expression that doesn't have a side effect (no proc calls, no ++ operator, etc.). Therefore an expression like (x1-x2)*(x1-x2) gets compiled as a faster form of (x1-x2)**2 which also has the advantage of not having to calculate x1-x2 twice.
- A new syntax for block() is available that avoids the need for calling locate(). This syntax is block(x1,y1,z1, x2=x1,y2=y1,z2=z1). This will also alleviate the need to try to trim the x,y values to valid values.
- trimtext() returns a copy of a string with any leading or trailing space characters removed.
- An expected return type can be specified when you define a proc, by following the proc declaration with "as /mytype", "as num", "as list", etc. The main purpose of this is to allow the . operator to check for the validity of vars and procs after a proc call in an expression such as myproc().foo = bar.
- "Pointers" are now supported in the DM language. Preceding any writable var, list item, etc. with the & operator will create a pointer, and that pointer can be read and written to by preceding it with the * operator. Proc-local vars are allowed to be used as pointer targets, so a sleeping proc's values can be altered in this way.
- In order to make animations simpler to manage, a new ANIMATION_CONTINUE flag has been added to animate(). With this flag, the object argument does not have to be omitted to continue an animation chain. This should make it easier to build animations with soft code.
- The sound datum now has a pitch var that can be used to shift the pitch of a sound up or down (currently limited to 3 octaves of change). This also allows a sound to be time-stretched by setting frequency to the inverse of pitch.
- refcount() has been added to the language, which will return the number of references for a given object. If that object does not use reference counting, the result is zero.
- ftime() can be used to check the creation or modification time of a file on the server.
- get_steps_to() uses the built-in pathfinding to return a list of directions to follow for the entire path. In this way, a movable atom can cache its pathfinding and call get_step_to() less often.
- Several new math procs have been added:
- floor(x): the value of x, rounded down to the nearest integer; this is an alias for round(x) with no second argument
- ceil(x): the value of x, rounded up to the nearest integer
- trunc(x): the value of x rounded toward zero to an integer; that is, the integer part of the number
- fract(x): the fractional part of x
- isnan(x): true of x is a numeric type but is an invalid number (NaN)
- isinf(x): true if x is a positive or negative infinity
- The read-only world.process var returns the process ID in the operating system of the current server.
- noise_hash() has been introduced, allowing a built-in way to get procedural noise.
- Two new features have been added to animate() to simplify the construction of more complex animations and to preview them. First, a delay argument has been added, so the first step in a sequence can be pushed forward or back in time, relative to when animate() is called; this for instance allows a later animation sequence to happen without having to sleep(). Additionally, a new ANIMATION_SLICE flag has been added for previewing a portion of an animation; see the reference for more details.
- list.RemoveAll() has been added. This is basically a faster version of while(list.Remove(item)); that won't choke on huge lists when the number of removals is relatively high.
- A new sound.params var can be used to set up skin-related interactions with the sound. Currently the only parameter supported is on-end, which can call a command when a sound is finished.
- A special proc called operator"" can be defined for objects, altering how they get converted to text when embedded in a string via brackets. It is important to note this will NOT affect how the object is seen by clients.
- client.RenderIcon() can now be used to create an icon file from an appearance, leveraging the client's rendering capabilities. Additionally, appearance reference strings (from the ref() proc or \ref operator) should be usable in outputs and browser controls.
- The sound datum's offset var can now be used to specify a start time (in seconds), or to change the sound's position when using the SOUND_UPDATE flag.
- for(thing in list) loops are now optimized to better handle cases where the list is range, orange, viewers, oviewers, hearers, or ohearers. Previously view() and block() were the only lists that were optimized in this way.
- The map editor has undergone a huge overhaul, making editing easier going forward. (Those who didn't work with the alpha builds are encouraged to make backup copies of their maps.)
- Rendering is now done using the same engine Dream Seeker uses, which allows effects to appear that couldn't before and also should make everything draw faster.
- The object palette is much more useful than before.
- Objects on the map can be live-edited with a new properties pane on the right-hand side of the editor window.
- Atom vars are sorted by their depth in the type tree, making it easier to find the properties you want to change. These levels are also collapsible.
- The editor tools and shortcuts have been revamped for improved ease of use.
- num-lock, caps-lock, and scroll-lock are now valid in commands using the double-bracket embedded winget syntax.
514 Release Notes | View All