The maximum object layer is now 1024. While games that ignore this limit will still function, there may possibly be visual artifacts.
The client mouse procs MouseDown() and MouseUp() previously had icon_x and icon_y arguments. These have been replaced. Games compiled with older versions of BYOND will still work the same, but games compiled in BYOND 4.0 will need to be updated. See mouse procs in the DM Reference for details.
The client.command_prompt value no longer serves any purpose, if indeed it ever did. (A side effect of using it in BYOND 3.0 was that it cleared the input.) It is not supported in the client, but games using it will still compile.
The client.command_text value has been deprecated. It still works, but it is now preferable to set up an input control in your skin with a command parameter of !verb (e.g., "!say \""). Using the ! makes the command visible in the input box and it can be cleared with Esc or / just like with command_text. The difference is that command_text only handles the default control, while this new syntax handles whatever control you specify and will work in multiple windows. Replace code that sets command_text with the following:
// replacing usr.client.command_text = command with: var/list/params = list("command" = "![command]") winset(usr, "input", list2params(params))
The following obsolete language features have been completely removed. For a few years now, all of them have compiled but with warnings of their impending doom; that day of reckoning has finally come. Attempting to compile them now generates compiler errors. They are still fully supported at runtime in games compiled with older versions.
Games now can include a "skin", a special interface that can be custom-designed for that game alone, which has any window components you may want. For older games, a default skin is available which contains the standard macros and commands. Older games will automatically work with this skin as far as popping up browser windows, showing the map or info panels, etc., but anything using a non-default skin will have to use the new winset() command to make changes to skin status.
Skins can be created in Dream Maker using a new editor. They are stored as .dmf files, and can be edited in text form as well.
New procs available for working with skins are winset(), winget(), output(), winclone(), and winshow().
For more details on how to use skins, see the skin reference.
As a result of this change, old-style .dms script files and the client/script var are obsolete for most games. These files are still used by the BYOND site to provide links to games and for other purposes. But the most common uses, to set up keyboard macros and use CSS stylesheets, are now available by creating a skin file. It will not hurt anything to continue using .dms files or client/script in your game, but skins provide more flexibility.
BYOND now supports full 32-bit icons with alpha blending. These are still stored as .dmi files, but the file format itself is now just a PNG file with comments, which can be edited in any picture editor you like as long as comments are preserved.
Bigger icon sizes are also available. Actual atoms are still only 32×32, but icons can be any multiple thereof and atoms can use the pieces. icon_state="wizard 0,0" would be the lower left corner of a big icon, while "wizard" would just show a thumbnail compressed down to 32×32.
To accommodate bigger icons, some of the icon procs behave a little differently. See the reference for details.
Icons now support different delays per animation frame, allowing for more flexibility.
JPEG files are supported. GIF files are supported. Animated GIFs can be imported into the icon editor.
Dream Daemon has had a long-overdue overhaul, and now supports many features that were previously available only in Dream Seeker. A comprehensive help file explains how to use all the new options.
Among other options, you can now specify lists of friends. This is separate from pager friends. You can host games that are only open to a specific group of friends, such as for testing purposes or special meetings.
Ban controls are also more advanced. Host bans work differently from pager bans, and they can be "sticky", preventing difficult users from easily coming back.
The extension for map files has changed from .dmp to .dmm to prevent conflicts on some systems.
Multiple undo levels are available in the icon pixmap editor. The icon state editor and movie editors support multiple selection.
Files can be renamed directly in the file tree. Files deleted in DreamMaker go to the recycle bin.
Because Dream Seeker now supports skins, the commands and options that were around previously may not be readily available in every game. Most of them have now moved to a new Options & Messages box, which can be opened by the pager, or often by a menu command in the game's skin.
OpenGL is now used for drawing the map, which is faster on most systems and supports the 32-bit alpha blended icons now in use. It can be turned off for systems that aren't easily capable of handling OpenGL. Maps can now be scaled, and no longer are restricted to just 32×32 or 16×16.
Game skins can be modified so that you run a game with a skin more to your liking.
Keyboard macros support both key presses and key releases. This should make more exotic game controls feasible, but the server will still only respond as fast as every 1/10 second and only as fast as it receives network messages from the client.
Key macros now allow many combinations of keys, including Ctrl, Shift, and of course Alt, but keys can also be used on their own. In BYOND 3.0, you could only link the R key, for example, to a verb by turning on macro mode which treated it as Alt+R. Now just setting a macro for R will do the trick.
The pager now has a Control Panel showing active games on your system, and can be used to bring up the Options & Messages box in DS which shows system messages and allows things like hosting or rebooting. The pager's tray icon has a Worlds menu that does the same thing.
Conversations can be held in separate windows, making it easier to chat.
You have more direct control over the stylesheet used for text output in the pager.
The limit for datums, previously 65,535, has been expanded to over 16 million. Many other things like text strings still use the 64K limit.
A new var, world.host, holds the key of the person hosting the world, if it is known.
There is even more mouse proc support, including the ability to detect operations with the right mouse button.
A larger world.view or client.view is supported, up to about 5,000 tiles.
Lists now support binary operators | & ^ and the assignment operators |= &= ^=.
Games are able to reconnect users between servers without prompting, unless the user specifies they would like to be prompted, making massive multiplayer worlds easier to manage.
New icon procs: GetPixel, Scale, Crop, MapColors, and an improved RGBA Blend proc.
The html_encode() proc has had a minor change that should improve many games, but shouldn't break anything. The proc will now look for URLs in any text it is encoding (even if they don't use a valid protocol like byond:// or html://) and will skip over any special characters like & that it would normally encode. Because html_encode() is often used to spam-proof player chat, the old behavior (encoding & to & no matter what) would mess up automatic links.
The recent files list in all tools is now limited to 8 instead of 4. All the programs now have proper help files.
Resources generated at runtime are now stored in a separate cache so as not to bloat the world.rsc.
For added security, run() will now ignore .bat and .exe files. The off-chance that a user ignored the query and subjected himself to the mercy of a possibly malicious host was worrisome. It will query the user for everything else. It also informs the user of the program to be run should they "ok" the request.
Profiling code no longer relies on the browser and can be done in either Dream Seeker or Dream Daemon.
You can now configure your user directory (where key.txt, KeyInfo, cfg, MyHub, lib, Skins, and cache go). It defaults to the "My Documents\\BYOND" folder for new users, and will keep the current setting (most likely "AppData\BYOND") for old users. To override either of these, use the setting in the pager Preferences/Advanced.
All output controls, and the same HTML output control used by other apps such as the pager, can be logged by right-clicking and selecting the Log... option from the context menu. The logs will include text that was already output before you started logging, as long as it is still visible in the control.
These same outputs also don't instantly chop off old lines once they exceed their maximum (1000 by default), but will allow some spillover to prevent flickering.
Opening a world's .rsc file with the pager or Dream Seeker will automatically import the resources within and run the corresponding .dmb world file.
Fixed a crash with long-urls sent to the browser.
Text mode now does proper layering for mouse-over and clicking and such.
The animate_movement var couldn't turn animation itself on or off at runtime, and reading the var's current value only worked for mobs; for other atoms and images it returned true/false only. (DarkCampainger, Jon88)
When the SYNC_STEPS setting of animate_movement was used, often objects would fail to sync correctly. Now most problems with this have been resolved.
arglist() wasn't passing the correct information into the verb.args list. (PirateHead)
flick() would only limit itself to mobs a certain part of the map, so it would not work across Z levels for things like ladders, teleporters, etc. Now, flick messages are sent to all clients, in range or not. (Gakumerasara)
The line-of-sight code has been changed and may appear different in some games. The main purpose for the change was to prevent opaque objects outside the illuminated range from appearing, which was a bug. In most cases any changes should not hurt gameplay.
The infra_luminosity var made not just an obj or mob, but its entire turf and contents visible.
After a bug was fixed in the BYOND 3.5 pager that allowed HTML to be slipped in against a recipient's wishes, a new bug appeared that caused links to encode & characters as &. Links will now work properly.
startup() did not properly check to see if the host's original security settings were respected. Now it is impossible for a game running in safe mode, for example, to launch another game in trusted mode.
When new turfs were created by expanding the map, a default area would be assigned to them after New(), whether or not turf/New() was already assigning an area. (ACWraith)