*** Important ***: The new map syntax uses key=value pairs separated by semicolons. This format provides more flexibility and readability. Keep in mind the game has backwards compatibility support for the legacy syntax, so you don't need to immediately convert existing maps.

New Map Syntax Glossary
This glossary demonstrates the new key=value; syntax introduced in version 0.6. Unlike the legacy space-separated format, the new syntax uses parameter names followed by equals signs and values, with semicolons separating each parameter.

Key Features of the New Syntax:
- Parameters use the format: parameter=value;
- Parameters can be arranged in any order you prefer
- Support for quoted strings with spaces: text="Hello World";
- Flexible boolean parsing: automatic=yes; vanishing=1; passworded=on;
- Better error handling and validation
- Default values are automatically applied for optional parameters

Basic Format:
element_type parameter1=value1; parameter2=value2; parameter3=value3;

Example Comparison:
Legacy: platform 0 50 0 50 0 0 grass
New: platform minx=0; maxx=50; miny=0; maxy=50; minz=0; maxz=0; type=grass;

Coordinate System (same as legacy):
- minx = leftmost x coordinate
- maxx = rightmost x coordinate  
- miny = bottom y coordinate
- maxy = top y coordinate
- minz = minimum height (use 0 for 2D maps)
- maxz = maximum height (use 0 for 2D maps)

For 2D maps, use the y parameters as your y coordinates and set minz=0; maxz=0;

Definitions sorted by element type:

Platform
A standard surface like grass or cement.
platform minx=value; maxx=value; miny=value; maxy=value; minz=value; maxz=value; type=platform_type; flag="optional_display_name";
platform minx=0; maxx=50; miny=0; maxy=50; minz=0; maxz=0; type=grass;
The optional flag parameter gives the platform a custom display name. When set, the flag is shown instead of the surface type. Useful when you want a tile to sound like one thing but appear as something else. The surface type and all collision or sound behaviour remain entirely unchanged.
platform minx=5; maxx=15; miny=5; maxy=15; minz=0; maxz=0; type=ash; flag="doormat";

Wall
A wall which prevents movement, perfect for tables, ledges, buildings.
wall minx=value; maxx=value; miny=value; maxy=value; minz=value; maxz=value; type=wall_type;
wall minx=0; maxx=0; miny=0; maxy=0; minz=0; maxz=10; type=wallwood;

Double Wall
A wall that plays a different sound depending on which side the player approaches from. Useful for buildings where the outside sounds like brick but the inside sounds like plaster.
The axis parameter tells the engine which direction players approach from: x means east/west, y means north/south, z means up/down.
material1 is heard when approaching from the positive direction (moving east, north, or up). material2 is heard from the negative direction (moving west, south, or down).
For a rectangular building, all four exterior walls can use the same material1/material2 ordering.
flag1 and flag2 are optional, and name each side the same way a plain wall's flag names it, so feeling this wall reports flag1 from the material1 side and flag2 from the material2 side instead of two identical-sounding walls.
double_wall minx=value; maxx=value; miny=value; maxy=value; minz=value; maxz=value; axis=x_or_y_or_z; material1=surface_name; material2=surface_name; flag1="optional_text"; flag2="optional_text";
double_wall minx=0; maxx=0; miny=0; maxy=50; minz=0; maxz=5; axis=x; material1=brick; material2=plaster; flag1="Outside wall"; flag2="Inside wall";

Floor
Indicates floor levels in multi-story maps. Required for elevators.
floor minx=value; maxx=value; miny=value; maxy=value; minz=value; maxz=value; label="optional_text";
floor minx=0; maxx=50; miny=0; maxy=50; minz=0; maxz=25;
floor minx=0; maxx=50; miny=0; maxy=50; minz=26; maxz=50;

Blockage
A wall that speaks text when bumped into or when within its boundaries.
blockage minx=value; maxx=value; miny=value; maxy=value; minz=value; maxz=value; text="message";
blockage minx=0; maxx=50; miny=0; maxy=50; minz=0; maxz=50; text="You can't go here!";

Source
A typical sound source like birds, water, room tones.
Optional synced=true starts it wherever a shared, endlessly-repeating loop of it would be right now, computed from wall-clock time, instead of from the beginning, so a player who joins after it's already been playing for a while hears it partway through like everyone else, not restarted just for them. Off by default.
source minx=value; maxx=value; miny=value; maxy=value; minz=value; maxz=value; path=filename; volume=value; pitch=value; synced=value;
source minx=0; maxx=50; miny=0; maxy=50; minz=0; maxz=50; path=birds.ogg; volume=75; pitch=100;
source minx=0; maxx=50; miny=0; maxy=50; minz=0; maxz=50; path=radio.ogg; volume=75; pitch=100; synced=true;

Volume (on sources, timed sources, ambiences, excludable sources, excludable ambiences, lifts) runs 0-100: 100 is full, 50 is half, 0 is silent. Leave it out and it defaults to 100 (full). Negative values are read as decibels instead (-5 = -5 dB, -20 = -20 dB) for fine or quiet control, which also keeps older maps working.

A sound whose path is in the music folder (path=music/theme.ogg) is treated as music rather than as an effect.
It is mixed against the player's Music slider instead of their Sound Sources slider, so someone who turns music down turns your jukebox, radio or bandstand down with it, and someone who wants music off gets silence rather than one track still playing at them from across the map.
This applies to every kind of source and to ambiences. Nothing else about them changes: position, boundaries, exclusion and everything else behave exactly as they always did.

3D Source
A source pinned to a single point instead of a box, for something small like a radio or a music box rather than an ambient area. Panned and occluded the same as a regular source, just with no boundaries to walk across.
Optional synced=true works the same as it does on a regular source: starts wherever a shared, endlessly-repeating loop of it would be right now, computed from wall-clock time, instead of from the beginning. Off by default.
source3d x=value; y=value; z=value; path=filename; volume=value; pitch=value; synced=value;
source3d x=10; y=10; z=0; path=music/512.ogg; volume=100; pitch=100; synced=true;

Timed Source
A source that plays at specified intervals (in milliseconds).
timed_source minx=value; maxx=value; miny=value; maxy=value; minz=value; maxz=value; path=filename; interval=milliseconds; volume=value; pitch=value;
timed_source minx=0; maxx=50; miny=0; maxy=50; minz=0; maxz=50; path=wallwood9.ogg; interval=10000; volume=75; pitch=100;

Playlist Source
A source that cycles through a list of files instead of looping one, panned across its boundaries exactly like a regular source. Advances to the next file whenever the current one finishes and loops back to the first after the last, no shuffle or crossfade, just a straight cycle. path takes a comma-separated list of filenames, with no spaces around the commas.
Optional synced=true starts on whichever track, and how far into it, a shared, endlessly-repeating cycle of the whole playlist would be right now, computed from wall-clock time, instead of always starting on the first track -- so a player who joins partway through hears wherever the playlist would already be, not track one restarted just for them. Off by default.
source_playlist minx=value; maxx=value; miny=value; maxy=value; minz=value; maxz=value; path=filename1,filename2,filename3; volume=value; pitch=value; synced=value;
source_playlist minx=0; maxx=50; miny=0; maxy=50; minz=0; maxz=50; path=jazz1.ogg,jazz2.ogg,jazz3.ogg; volume=75; pitch=100;
source_playlist minx=0; maxx=50; miny=0; maxy=50; minz=0; maxz=50; path=jazz1.ogg,jazz2.ogg,jazz3.ogg; volume=75; pitch=100; synced=true;

Ambience
Sounds that only play when you're within the boundaries.
ambience minx=value; maxx=value; miny=value; maxy=value; minz=value; maxz=value; path=filename; volume=value; pitch=value;
ambience minx=0; maxx=50; miny=0; maxy=50; minz=0; maxz=50; path=birds.ogg; volume=75; pitch=100;

Excludable Ambience
An ambience that can be silenced in specific areas using excludable zones.
It plays only inside its own boundaries like any ambience, but falls silent while you stand in any excludable zone carrying its id -- so you can punch quiet pockets into one large ambience (a shed in the middle of a rain field, say) instead of chopping the ambience into several boxes around the hole.
The ambience keeps running while silenced, so stepping back out drops you into it rather than restarting it.
Optional fade=value (milliseconds, default 0) crossfades instead of cutting instantly.
xambience minx=value; maxx=value; miny=value; maxy=value; minz=value; maxz=value; id=reference_name; path=filename; volume=value; pitch=value; fade=value;
xambience minx=0; maxx=30; miny=0; maxy=30; minz=0; maxz=30; id=Rain; path=rain.ogg;
xambience minx=0; maxx=30; miny=0; maxy=30; minz=0; maxz=30; id=Rain; path=rain.ogg; volume=75; pitch=100; fade=1500;

Excludable Source
Sources that can be silenced in specific areas using excludable zones.
Optional fade=value (milliseconds, default 0) crossfades in/out across the exclusion zone boundary instead of cutting instantly -- e.g. street ambience drifting away as you step into a store.
xsource minx=value; maxx=value; miny=value; maxy=value; minz=value; maxz=value; id=reference_name; path=filename; volume=value; pitch=value; fade=value;
xsource minx=0; maxx=30; miny=0; maxy=30; minz=0; maxz=30; id=Outside; path=birds1.ogg;
xsource minx=0; maxx=30; miny=0; maxy=30; minz=0; maxz=30; id=Outside; path=birds1.ogg; volume=75; pitch=100; fade=1500;

Excludable Zone
Silences an excludable source or excludable ambience (whichever shares its id) in specified boundaries.
x_zone id=reference_name; minx=value; maxx=value; miny=value; maxy=value; minz=value; maxz=value;
x_zone id=Outside; minx=10; maxx=20; miny=10; maxy=20; minz=0; maxz=10;

Speaker
Stereo speaker system with left and right channels.
speaker start_x=left_x; start_y=left_y; start_z=left_z; end_x=right_x; end_y=right_y; end_z=right_z; path=filename; volume=value;
speaker start_x=0; start_y=0; start_z=0; end_x=10; end_y=0; end_z=0; path=music1.ogg; volume=-5;

Music
Background music for the entire map.
music path=filename; pitch=value;
music path=music5.ogg; pitch=100;

Instrument Handler
A spot a player can stand on and play a simulated instrument from the keyboard. Every note is heard by everyone else on the map, positioned at the player playing it.
type = the instrument. Available types are piano and drumset. Defaults to piano when left out.
While playing, the black keys are Q, W, E, T, Y and U, and the white keys are A, S, D, F, G, H, J and K. Normal movement and other single-key controls are suspended until the player stops.
2D maps do not use z.
An instrument can occupy an area rather than a single tile. Write minx, maxx, miny, maxy, minz and maxz in place of x, y and z, and it responds anywhere inside that box. This is optional in every sense: x, y and z still mean exactly what they always did, and an instrument written that way stays one tile.
instrument x=value; y=value; z=value; type=instrument_type;
instrument minx=value; maxx=value; miny=value; maxy=value; minz=value; maxz=value; type=instrument_type;
instrument x=0; y=0; z=0; type=piano;
instrument x=10; y=4; z=0; type=drumset;
instrument minx=10; maxx=16; miny=4; maxy=4; minz=0; maxz=0; type=piano;

URL/Stream
Plays radio streams or audio from URLs.
stream address=url;
stream address=http://myurl.com/myurl.mp3;

Sign
Interactive sign that displays text when Enter is pressed.
Can cover an area rather than a single tile. See Tiles and Areas below.
A sign spanning several tiles is audible along its whole length rather than beaconing from one corner of itself.
sign x=value; y=value; z=value; text="message";
sign minx=value; maxx=value; miny=value; maxy=value; minz=value; maxz=value; text="message";
sign x=0; y=0; z=0; text="Hi, welcome to Golden Crayon.";
sign minx=0; maxx=6; miny=10; maxy=10; minz=0; maxz=0; text="Platform 1, southbound services.";

Text Square
Sign without sound effect.
Can cover an area rather than a single tile. See Tiles and Areas below.
txt x=value; y=value; z=value; text="message";
txt minx=value; maxx=value; miny=value; maxy=value; minz=value; maxz=value; text="message";
txt x=0; y=0; z=0; text="Hi, welcome to Golden Crayon.";

Tiles and Areas
Several elements can be written either as a single tile, with x, y and z, or as an area, with minx, maxx, miny, maxy, minz and maxz. Written as an area, the element answers anywhere inside that box, which is what you want for anything that is really one thing covering a space rather than a row of copies: a site map across the ceiling of an entrance, a sign spanning a doorway, a clock readable from anywhere in a concourse.
The elements that take both forms are sign, txt, dlg, clock, calendar and instrument.
This is optional in every sense. x, y and z still mean exactly what they always did, every element already written that way stays one tile, and nothing needs updating.
In the builder each of these shows three Maximum (optional) boxes under X, Y and Z. Leave them blank and you get the single tile you always got. Fill in only the ones you want and the others stay one tile deep, so a sign can be six tiles wide without also being six tall. Camera markers fill them in for you, so marking the two corners and opening the form is enough.
Written with a minimum above its maximum, the two are swapped rather than producing a box that contains nothing.
Elements whose coordinate is a position rather than a place you stand deliberately do not take areas. A 3d source, an ambience and a checkpoint are each located somewhere, and a range would not mean anything for them.
2D maps do not use z.

Interactables
Refer to interactables.txt for full documentation on interactables and their commands.

Dialog
Story elements with multiple text snippets separated by --.
A dialog can cover an area rather than a single tile. Write minx, maxx, miny, maxy, minz and maxz in place of x, y and z, and pressing Enter anywhere inside that box opens it. This is what you want for anything that is really one notice covering a whole space, like a site map on the ceiling of an entrance or a sign spanning a doorway: previously that meant one dlg per tile, all carrying the same text, and changing the wording meant changing every one of them.
This is optional in every sense: x, y and z still mean exactly what they always did, and a dialog written that way stays one tile. In the builder the same choice appears as three Maximum (optional) boxes under X, Y and Z. Fill none of them in and you get the single tile you always got; fill in the ones you want and you get a box. Camera markers fill them in for you, so marking the two corners and opening the form is enough.
Written with a minimum above its maximum, the two are swapped rather than producing a box that contains nothing.
2D maps do not use z.
id = optional. Gives the dialog a name that actions can open it by: open:id or activate:id, from a button, a trigger or anything else that runs actions.
activate_only = optional, true or false (default false). When true, pressing Enter on the dialog doesn't open it, so it only opens when an action does. In the builder this is Only Opens When Activated.
dlg x=value; y=value; z=value; text="line1--line2--line3--line4";
dlg minx=value; maxx=value; miny=value; maxy=value; minz=value; maxz=value; text="line1--line2";
dlg x=0; y=0; z=0; text="Hi--I'm a dialog--Each time you press Enter--You will hear these four lines.";
dlg minx=0; maxx=8; miny=20; maxy=20; minz=4; maxz=4; text="Building directory--Ground floor, reception--First floor, offices.";
dlg x=5; y=5; z=0; text="The vault door groans open."; id=vault_story; activate_only=true;

Zone
Defines location names for areas. Add track=true (or @track@ at the end of the text) to make it trackable in the Locations menu.
Add beacon=true to make it a silent beacon: the zone is still named and tracked, but walking into it is never announced. beacon only takes effect when the zone is also trackable (track=true). @beacon@ in the text is an equivalent inline marker.
zone minx=value; maxx=value; miny=value; maxy=value; minz=value; maxz=value; text="location_name"; track=boolean; beacon=boolean;
zone minx=0; maxx=50; miny=0; maxy=50; minz=0; maxz=50; text="A test map";
zone minx=10; maxx=10; miny=10; maxy=10; minz=0; maxz=50; text="A tall tree @track@";
zone minx=5; maxx=8; miny=5; maxy=8; minz=0; maxz=5; text="Hidden cache"; track=true; beacon=true;

Chat Zone
Enables voice chat in specified area.
chat_zone minx=value; maxx=value; miny=value; maxy=value; minz=value; maxz=value;
chat_zone minx=0; maxx=10; miny=0; maxy=10; minz=0; maxz=10;

Death Message
Custom death messages for specific areas.
Constants: %name (player name), %zone (current location), %map (map name), %x %y %z (coordinates)
dmg minx=value; maxx=value; miny=value; maxy=value; minz=value; maxz=value; text="custom_message";
dmg minx=0; maxx=50; miny=0; maxy=50; minz=0; maxz=50; text="Wow, good job %name. You died at %zone!";

Spawn Location
Defines where players spawn on the map.
spawnloc minx=value; maxx=value; miny=value; maxy=value; minz=value; maxz=value;
spawnloc minx=15; maxx=30; miny=15; maxy=30; minz=0; maxz=0;
spawnloc minx=15; maxx=15; miny=20; maxy=20; minz=0; maxz=0;

Hook Controller
Limits grappling hook range in specific areas.
hkc minx=value; maxx=value; miny=value; maxy=value; minz=value; maxz=value; min=hook_down; max=hook_up;
hkc minx=0; maxx=50; miny=0; maxy=50; minz=0; maxz=50; min=10; max=0;

Clock
Displays system time when activated. Use twelve_hour=true for 12-hour format, twelve_hour=false for 24-hour.
The text may contain substitution tokens that are replaced with live values when the clock is read:
  %time   - the full reading in the clock's chosen format (e.g. "14:07:32" or "2:07:32 PM")
  %hour   - the hour, in the clock's 12/24-hour mode
  %minute - the minute, zero-padded
  %second - the second, zero-padded
  %ampm   - "AM" or "PM"
If the text contains no token, the time is appended to it. If the text is empty, only the time is spoken.
Can cover an area rather than a single tile, so one clock can be readable from anywhere in a concourse. See Tiles and Areas above.
clock x=value; y=value; z=value; twelve_hour=boolean; text="prefix_text_or_template";
clock minx=value; maxx=value; miny=value; maxy=value; minz=value; maxz=value; twelve_hour=boolean; text="prefix_text_or_template";
clock x=0; y=0; z=0; twelve_hour=false; text="On the clock, %time is displayed.";
clock minx=0; maxx=20; miny=0; maxy=8; minz=0; maxz=0; twelve_hour=false; text="The concourse clock reads %time.";

Calendar
Displays system date when activated. The text may contain substitution tokens that are replaced with live values:
  %date      - default reading, "Month Day, Year" (e.g. "January 15, 2025")
  %date1     - "Month Day, Year" (kept for older maps)
  %date2     - "Weekday, Month Day, Year" (kept for older maps)
  %weekday   - weekday name (e.g. "Wednesday")
  %monthname - month name (e.g. "January")
  %month     - month number
  %day       - day of the month
  %year      - year
Component tokens can be combined into any layout, e.g. text="%day %monthname %year" reads "15 January 2025".
If the text contains no token, the date is appended to it. If the text is empty, only the date is spoken.
Can cover an area rather than a single tile. See Tiles and Areas above.
calendar x=value; y=value; z=value; text="prefix_text_or_template";
calendar minx=value; maxx=value; miny=value; maxy=value; minz=value; maxz=value; text="prefix_text_or_template";
calendar x=0; y=0; z=0; text="Today is %weekday, %monthname %day.";

Door
Teleports users between coordinates. Use automatic=true for automatic doors, automatic=false for manual.
move and loop are optional. loop is the sound the door sits making when nothing is happening, and move is the sound it makes while travelling. A door that is only meant to open and close needs neither, so leave them out and it stays quiet between the two. open and close are still required. The same applies to gates and elevators. Passages never required any of them.
open_volume, open_pitch, close_volume and close_pitch are optional and control the volume and pitch of the open and close sounds specifically, for everyone who hears them, not just whoever triggered the door. Volume follows the usual scale -- 0 to 100 is a linear percentage, -1 to -100 is raw decibels -- and both default to 100 (full volume, no pitch shift) when left out.
door start_x=value; start_y=value; start_z=value; end_x=value; end_y=value; end_z=value; speed=milliseconds; move=sound_file; loop=sound_file; open=sound_file; close=sound_file; open_volume=value; open_pitch=value; close_volume=value; close_pitch=value; automatic=boolean; password="optional_password";
door start_x=0; start_y=0; start_z=0; end_x=50; end_y=50; end_z=0; speed=500; move=.ogg; loop=.ogg; open=door1open.ogg; close=door1close.ogg; automatic=false;
door start_x=0; start_y=0; start_z=0; end_x=50; end_y=50; end_z=0; speed=500; open=door1open.ogg; close=door1close.ogg; open_pitch=90; close_pitch=90; automatic=false;

Gate (North-South)
Large door that manipulates y and z coordinates while keeping x intact.
move and loop are optional here too, exactly as on a door above. So are open_volume, open_pitch, close_volume and close_pitch, which work exactly the same way.
gate minx=value; maxx=value; miny=value; maxy=value; minz=value; maxz=value; end_x_y=end_y; end_z=value; speed=milliseconds; move=sound_file; loop=sound_file; open=sound_file; close=sound_file; open_volume=value; open_pitch=value; close_volume=value; close_pitch=value; automatic=boolean; password="optional_password";
gate minx=0; maxx=10; miny=10; maxy=10; minz=0; maxz=6; end_x_y=15; end_z=0; speed=500; move=.ogg; loop=.ogg; open=door1open.ogg; close=door1close.ogg; automatic=false;

Gate2 (East-West)
Large door that manipulates x and z coordinates while keeping y intact.
move and loop are optional here too, exactly as on a door above. So are open_volume, open_pitch, close_volume and close_pitch, which work exactly the same way.
gate2 minx=value; maxx=value; miny=value; maxy=value; minz=value; maxz=value; end_x_y=end_x; end_z=value; speed=milliseconds; move=sound_file; loop=sound_file; open=sound_file; close=sound_file; open_volume=value; open_pitch=value; close_volume=value; close_pitch=value; automatic=boolean; password="optional_password";
gate2 minx=30; maxx=30; miny=0; maxy=60; minz=0; maxz=6; end_x_y=35; end_z=0; speed=500; move=.ogg; loop=.ogg; open=door1open.ogg; close=door1close.ogg; automatic=false;

Building Doors and Gates Both Ways
A door or gate only works in the direction you built it. A door is entered at its start and puts you down at its end, and walking back the other way does nothing until you build a second one with those two swapped. The same goes for gates.
The builder can do that second one for you. Doors and both kinds of gate now have a Build On Opposite Side box in their form. Tick it and you get two elements instead of one, the second entered from wherever the first sets you down, with the same speed, sounds, automatic setting, password and lock state.
For a door the twin is simply start and end exchanged, so a door from 0 4 0 to 0 2 0 comes with one from 0 2 0 to 0 4 0.
For a gate the twin's box is the single tile the first gate sets you down on, spanning the same range on the axis the gate does not move you along, and it sends you back to the edge of the original box you came in through.
Two things to know before you tick it. If you gave the element an ID, the twin gets that ID with _reverse on the end, because two elements cannot share one, which also means a trigger aimed at the original does not act on the twin. And a pair of gates or doors that are both automatic will bounce you between them forever, since automatic ones fire on position rather than on Enter, so leave automatic off for two-way ones or build the return trip somewhere the first does not land you.
The box is also on the edit form, for when you build something one way and think better of it later. It never remembers that a twin already exists, so ticking it a second time builds another copy.

Passage
A corridor that acts as a wall tile when closed and a surface tile when open. Players trigger it by pressing Enter from one tile outside either end face. The direction parameter controls which axis the openings face: east or west for x-axis ends, north or south for y-axis ends, up or down for z-axis ends. The wall prefix is added automatically if missing, so wall=stone and wall=wallstone are equivalent. wall_flag and surface_flag are optional, and name the wall and floor tile the same way a plain wall or platform's flag does -- only one of the two is ever placed at a time, so there is no side ambiguity to resolve the way a double wall has. Use server_bound=true with an id to keep all players in sync.
open_volume, open_pitch, close_volume and close_pitch are optional and work exactly as they do on a door, controlling the volume and pitch of the open and close sounds for everyone nearby, not just whoever triggered the passage.
passage minx=value; maxx=value; miny=value; maxy=value; minz=value; maxz=value; wall=tile_type; surface=tile_type; wall_flag="optional_text"; surface_flag="optional_text"; direction=direction; open_time=milliseconds; close_time=milliseconds; loop=sound_file; move=sound_file; open=sound_file; close=sound_file; open_volume=value; open_pitch=value; close_volume=value; close_pitch=value; id=name; password="optional_password"; server_bound=boolean; opened=boolean; locked=boolean;
passage minx=5; maxx=10; miny=0; maxy=5; minz=0; maxz=0; wall=stone; surface=stone; direction=east; open_time=500; close_time=500; open=door1open.ogg; close=door1close.ogg;

Lift
Creates a moving platform that automatically moves between minimum and maximum Z coordinates.
The platform moves up and down automatically, with a wait period at each end.
Supports loop, start, and end sounds for enhanced audio experience.
Start position can be "top", "bottom", or "random" (default).
flag is optional, and names the platform for the spyer the same way a plain platform's flag does, staying with it as it moves.
lift minx=value; maxx=value; miny=value; maxy=value; minz=value; maxz=value; speed=milliseconds; surface=platform_type; flag="optional_text"; sound=sound_file; volume=value; pitch=value; start_sound=sound_file; end_sound=sound_file; start_position=position;
lift minx=15; maxx=17; miny=15; maxy=17; minz=1; maxz=10; speed=500; surface=platform; sound=lift.ogg; volume=100; pitch=100; start_sound=liftstart.ogg; end_sound=liftend.ogg; start_position=top;

Elevator
Floor navigation system. Requires floors to be defined on the map.
Use announcement_type: 0=screen reader, 1=custom sound, 2=SAPI
move and loop are optional here too, exactly as on a door. Leave them out and the elevator makes no sound sitting still or travelling, only opening and closing.
elevator minx=value; maxx=value; miny=value; maxy=value; minz=value; maxz=value; speed=value; loop=sound_file; move=sound_file; open=sound_file; close=sound_file; announcement_type=number; announcement_sound=sound_file; use_music=boolean; text="intro_message";
elevator minx=30; maxx=40; miny=30; maxy=40; minz=0; maxz=20; speed=200; loop=elevatorloop4.ogg; move=elevatorloop1.ogg; open=elevator1open.ogg; close=elevator1close.ogg; announcement_type=1; announcement_sound=elevatorbeep5.ogg; use_music=true; text="Welcome to my elevator. This is floor %f. Where would you like to go?";

Belt (Conveyor Belt)
Continuously moves players in a specified direction while allowing free movement.
Supports 8 cardinal directions in 3D maps and 4 directions in 2D maps.
Direction compatibility: 3D directions work in 2D (mapped to closest equivalent), and vice versa.
The optional loop sound plays continuously across the belt's area. Use loop=sound_file (the same key doors, gates, and lifts use); loop_sound=sound_file is also accepted. Belt sounds live in foley/srcs, so a bare name like fan.ogg resolves to foley/srcs/fan.ogg.
belt minx=value; maxx=value; miny=value; maxy=value; minz=value; maxz=value; direction=direction_name; speed=milliseconds; loop=sound_file;
3D directions: north, northeast, east, southeast, south, southwest, west, northwest
2D directions: up, down, left, right (or use 3D equivalents)
belt minx=10; maxx=20; miny=5; maxy=15; minz=0; maxz=0; direction=northeast; speed=200; loop=conveyor.ogg;
belt minx=0; maxx=10; miny=0; maxy=5; minz=0; maxz=0; direction=right; speed=150;

Slant
Creates a slope that adjusts player elevation as they walk through it.
The slant is a region where each step in the specified direction raises or lowers the player by step_height.
Direction format: direction_up or direction_down (e.g., east_up, right_down, north_up).
3D directions: north, south, east, west, northeast, northwest, southeast, southwest (with _up or _down).
2D directions: left, right (with _up or _down).
Step height controls how many units the player rises or falls per step (default: 1).
slant minx=value; maxx=value; miny=value; maxy=value; minz=value; maxz=value; direction=direction_name; type=surface_type; step_height=value;
slant minx=10; maxx=20; miny=0; maxy=10; minz=0; maxz=10; direction=east_up; type=grass; step_height=1;
slant minx=0; maxx=15; miny=0; maxy=0; minz=0; maxz=0; direction=right_up; type=dirt6; step_height=2;

Vanishing Platform
A platform that disappears on a timer cycle. Visible for vanish_time milliseconds, then invisible for the same duration. Assign an id and set trigger_controlled=true to disable the automatic timer and control it manually via activate, deactivate, and toggle actions from triggers. Use server_bound=true with an id to keep all players in sync.
vanishing_platform minx=value; maxx=value; miny=value; maxy=value; minz=value; maxz=value; surface=surface_type; replacement=replacement_type; sound=sound_file; vanish_time=milliseconds; id=name; trigger_controlled=boolean; server_bound=boolean;
vanishing_platform minx=10; maxx=20; miny=10; maxy=20; minz=3; maxz=3; surface=stone; replacement=air; sound=vanishing_platform.ogg; vanish_time=3000;
vanishing_platform minx=10; maxx=20; miny=10; maxy=20; minz=3; maxz=3; surface=wood; id=myplatform; trigger_controlled=true; server_bound=true;

Activatable Platform
A platform that is permanently solid or invisible until a trigger changes it. Unlike vanishing platforms there is no timer; the platform only changes state when you tell it to.
Use activate or show to make it solid, deactivate or hide to remove it, and toggle to flip its current state. Connect any trigger (button, lever, pressure plate, etc.) to the platform's id.
Set visible=no to start the platform hidden. Set server_bound=true with an id to keep all players in sync.
activatable_platform minx=value; maxx=value; miny=value; maxy=value; minz=value; maxz=value; surface=surface_type; visible=boolean; activate_sound=sound_file; deactivate_sound=sound_file; id=name; server_bound=boolean; disabled=boolean;
activatable_platform minx=5; maxx=15; miny=5; maxy=15; minz=3; maxz=3; surface=wood; visible=no; id=bridge; server_bound=yes;
lever x=0; y=5; z=0; on_activate="activate:bridge"; on_deactivate="deactivate:bridge"; server_bound=yes;

Travelpoint
Transports users to different maps.
travelpoint minx=value; maxx=value; miny=value; maxy=value; minz=value; maxz=value; dest_x=value; dest_y=value; dest_z=value; dest_map=map_name; dest_text="travel_message";
travelpoint minx=0; maxx=50; miny=0; maxy=50; minz=0; maxz=10; dest_x=0; dest_y=0; dest_z=0; dest_map=main; dest_text="Have a good day.";

Map Item
A collectible item placed at a point on the map. Picked up by pressing Enter when standing on it. Items go into the player's map inventory (Ctrl+Tab to cycle). By default, each item can only be picked up once per visit.
Set auto_pickup=true to collect automatically on contact. Set single_use=false to allow repeated pickup. Use on_pickup to run trigger actions when collected. Use pickup_message to speak your own text instead of the usual received message. The id field lets triggers target the item.
map_item x=value; y=value; z=value; item_name="name"; item_amount=value; sound=sound_file; loop_sound=sound_file; on_pickup="actions"; pickup_message="text"; auto_pickup=boolean; single_use=boolean; id=name;
map_item x=5; y=10; z=0; item_name="Gold Coin"; item_amount=1; sound=coin.ogg; auto_pickup=yes;
map_item x=5; y=10; z=0; item_name="Key"; on_pickup="activate:door1"; single_use=yes;

Paused Sources
Any source, source3d, timed_source or source_playlist that has an id can also take paused=true. The source comes up silent when the map loads and stays that way until a trigger resumes it, which is the only way to build one that waits to be switched on. Without it a source is already playing, so play and resume have nothing to start.
paused=true needs an id, since a source with no id can never be reached to start it. On a timed source it means the source does not fire at all until it is resumed.
source minx=10; maxx=20; miny=5; maxy=15; minz=0; maxz=0; path=music/radio.ogg; volume=100; pitch=100; id=radio; paused=true;
button x=3; y=3; z=0; on_activate="toggle:radio";

Text Input
Asks the player for a line of text and hands what they type to the rest of the map. Read it back anywhere a reference works, as [id.value]. Submitting runs on_activate the way pressing a button does.
Position is optional, which no other trigger allows. Give x, y and z (or a box, using minx/maxx/miny/maxy/minz/maxz) and the input answers Enter on those tiles. Give none at all and it has no place in the world. It then only opens when something runs activate on it. That is how you put the prompt behind a button, a pressure plate or a timer.
Set answer and the input grades itself. [id.correct] says whether the last try matched. on_correct or on_incorrect runs alongside on_activate, and case_sensitive decides how strictly they are compared. max_attempts stops it opening once that many answers have been given, and exhausted_text is what to say to somebody who tries anyway.
The rest of the settings are optional. prompt is the label on the box, title names the window, and default_value pre-fills it. secure=true hides what is typed, and multiline=true accepts more than one line. max_length and min_length bound how long an answer may be. allowed_chars limits typing to those characters, and disallowed_chars forbids them. clear_on_submit forgets the answer once it has been handed over, which happens a frame later so that actions and gates can still read it.
text_input x=value; y=value; z=value; title="window title"; prompt="question"; default_value="text"; max_length=value; min_length=value; multiline=boolean; secure=boolean; allow_empty=boolean; allowed_chars="characters"; disallowed_chars="characters"; invalid_text="message"; answer="text"; case_sensitive=boolean; max_attempts=value; exhausted_text="message"; sound=sound_file; submit_sound=sound_file; cancel_sound=sound_file; correct_sound=sound_file; incorrect_sound=sound_file; speak_result=boolean; clear_on_submit=boolean; on_activate="actions"; on_correct="actions"; on_incorrect="actions"; on_cancel="actions"; single_use=boolean; server_bound=boolean; id=name;
text_input x=10; y=5; z=0; prompt="What is the password?"; answer="swordfish"; secure=true; on_correct="unlock:vault"; on_incorrect="speak:\"That is not it.\""; id=keypad;
text_input id=name_prompt; prompt="What should we call you?"; on_activate="speak:\"Welcome, [name_prompt.value].\"";
button x=3; y=3; z=0; on_activate="activate:name_prompt";

Menu Input
Asks the player to pick from a list and hands the choice to the rest of the map. The chosen label is [id.value], its position is [id.index], and submitting runs on_activate.
options is the list, comma separated. Write an entry as Label=target and choosing it also activates that element. That is the short way to give each choice its own behaviour. A plain Label leaves everything to on_activate and [id.value]. A label that needs a comma of its own can escape it as \,.
Position works exactly as it does on a text input. Coordinates make it answer Enter on those tiles, and no coordinates at all make it something an action opens.
The rest of the settings are optional. title names the window, and intro_text is spoken as the menu opens. default_index is the option to start on, counting from 0, and remember=true reopens on the last choice instead. wrap decides whether moving past either end comes round again (leave it out and each player's own menu setting decides). allow_cancel=false means the menu cannot be escaped out of.
menu_input x=value; y=value; z=value; options="Label,Label=target"; title="window title"; intro_text="spoken on opening"; default_index=value; wrap=boolean; allow_cancel=boolean; remember=boolean; speak_result=boolean; exhausted_text="message"; sound=sound_file; click_sound=sound_file; select_sound=sound_file; close_sound=sound_file; submit_sound=sound_file; cancel_sound=sound_file; on_activate="actions"; on_cancel="actions"; single_use=boolean; server_bound=boolean; id=name;
menu_input x=10; y=5; z=0; options="Ground floor=lift_down,First floor=lift_up,Nothing thanks"; intro_text="Where to?"; id=panel;
menu_input id=colour_choice; options="Red,Green,Blue"; on_activate="speak:\"You chose [colour_choice.value].\"";

Form Input
Asks the player several things at once, as one audio form, and hands every answer to the rest of the map together. Each control has a name, and [id.name] reads what that control was left holding.
Position works exactly as it does on a text input. Coordinates make it answer Enter on those tiles, and no coordinates at all make it something an action opens.
controls is the list of controls, comma separated, each written type:name:label:default:extra. The types are text, number, checkbox, list, slider and button. extra is whatever that type needs and is bracketed when it holds separators of its own, so a list keeps its options there, a slider its minimum, maximum and step, and a button its actions.
Build these in the builder rather than by hand. Its Controls field has Add, Edit, Remove, Move Up, Move Down and a Preview that puts the real form on screen.
A button carries no answer. Pressing one runs its actions there and then without closing the form, and those actions see whatever is currently filled in.
form_input x=value; y=value; z=value; controls="type:name:label:default:extra,..."; title="window title"; ok_label="text"; cancel_label="text"; speak_result=boolean; exhausted_text="message"; sound=sound_file; submit_sound=sound_file; cancel_sound=sound_file; on_activate="actions"; on_cancel="actions"; single_use=boolean; server_bound=boolean; id=name;
form_input x=10; y=5; z=0; id=signup; title="Sign up"; controls="text:playername:Your name::,list:colour:Favourite colour:Red:[Red,Green,Blue],slider:volume:Volume:50:[0,100,5]"; on_activate="speak:Thanks [signup.playername]";

Hazard
Instantly kills players when stepped on.
hazard minx=value; maxx=value; miny=value; maxy=value; minz=value; maxz=value;
hazard minx=0; maxx=50; miny=0; maxy=50; minz=0; maxz=50;

Checkpoint
Sets respawn point if player dies.
checkpoint x=value; y=value; z=value;
checkpoint x=50; y=50; z=0;

Instrument
A spot a player can stand on and press Enter to play a simulated instrument. Notes are heard by everyone else on the map, positioned at the player.
instrument x=value; y=value; z=value; type=piano|drumset;
instrument minx=value; maxx=value; miny=value; maxy=value; minz=value; maxz=value; type=piano|drumset;
instrument x=50; y=50; z=0; type=piano;
instrument minx=50; maxx=58; miny=50; maxy=50; minz=0; maxz=0; type=piano;

Health Drainer
Gradually drains player health over time.
health_drainer minx=value; maxx=value; miny=value; maxy=value; minz=value; maxz=value; speed=milliseconds; damage=value; [id=value;]
health_drainer minx=0; maxx=10; miny=0; maxy=10; minz=0; maxz=10; speed=1000; damage=100;
Optional: id assigns a unique identifier so the drainer can be enabled or disabled via the activate and deactivate actions. Any trigger can target a health drainer by its id.

Main Menu Area
Allows access to the main menu for setting default maps.
menu minx=value; maxx=value; miny=value; maxy=value; minz=value; maxz=value;
menu minx=0; maxx=10; miny=0; maxy=10; minz=0; maxz=10;

Reverb Space
Gives an area a room echo. While the listener is inside, the world's positioned sounds pick up the reverb. All params are optional (sensible defaults apply).
decay_time = how long the echo tail lasts, in seconds -- a cave that rings for five seconds is 5. wet = how much reverb is mixed in, 0-1. damp = how quickly the highs die away, 0-1 (higher = darker tail). width = stereo spread of the tail, 0-1.
decay_time replaces the older room_size, which was the raw knob the reverb uses and behaved very unevenly across its range. Maps written with room_size still load and are converted for you.
space minx=value; maxx=value; miny=value; maxy=value; minz=value; maxz=value; decay_time=value; wet=value; damp=value; width=value;
space minx=10; maxx=30; miny=10; maxy=30; minz=0; maxz=10; decay_time=4; wet=0.5; damp=0.5;

Plate Space
The same box as a reverb space, using a plate reverb instead. A plate does not develop the faintly metallic ring a reverb space gives short sharp sounds, so footsteps and impacts sit in the room rather than setting it off. Takes the same four controls, plus four a reverb space has no equivalent for. All params are optional.
decay_time, wet, damp, width = exactly as in a reverb space above. A plate also honors decay times a reverb space cannot reach, anything under about 0.6 seconds or over 6, up to a limit of 30 seconds. A larger decay_time is treated as 30.
predelay = the gap before the tail starts, in seconds, 0 to 0.25. This is what makes a big room read as big without smearing the sound that caused it: a hall wants 0.03 or more, a closet wants none. Reaching it across a canyon is what makes the far wall sound far.
size = scale on the reverb's delays, 0.1 to 2 (default 1). Unlike a reverb space, where decay_time is the only sense of scale, this changes the size of the room itself rather than only how long it rings. Small values sound boxy, large values sound open. Set it rather than sweeping it while sound is playing, since retuning every delay at once is audible.
low_cut = highpass on the reverb's wet output, in Hz, 0 to 20000 (default 0). 0 means off. This trims rumble from the tail without touching decay_time or damp -- a little goes a long way, values above a couple hundred start sounding thin. If you don't know what value to use, pick a plate preset in the builder instead of dialing this in by hand; most presets already set it for you.
high_cut = lowpass on the reverb's wet output, in Hz, 0 to 20000 (default 0). 0 means off. This is a hard ceiling on brightness from the very first reflection, unlike damp which only governs how fast highs fade out over the tail -- use it for a space that sounds muffled from the start (padding, water, a tight box), not for one that should merely darken as it rings. As with low_cut, a preset is the easier way to get a sensible value.
p_space minx=value; maxx=value; miny=value; maxy=value; minz=value; maxz=value; decay_time=value; wet=value; damp=value; width=value; predelay=value; size=value; low_cut=value; high_cut=value;
p_space minx=10; maxx=30; miny=10; maxy=30; minz=0; maxz=10; decay_time=4; wet=0.5; damp=0.5; predelay=0.03; size=1.4;
p_space minx=0; maxx=8; miny=0; maxy=8; minz=0; maxz=6; decay_time=0.4; wet=0.3; damp=0.7; size=0.3; high_cut=2500;

Convolution Space
The same box again, playing a recording of a real place instead of a reverb the engine builds from numbers. A reverb space and a plate space both describe a room with settings; this one hands you the room itself, captured in an actual cathedral, stairwell, storm drain or washing machine. There is no decay_time, damp or width, because the recording already carries all three -- the file IS the room, and picking a different file is how you change the space.
So what is the point, when a reverb space already gives you a room? The difference is between describing a place and having one. A reverb space is a set of dials, and dials can only ever produce the kind of room those dials know how to make: a decay time, a brightness, a width. That covers an enormous amount of ground, and for most rooms in most maps it is the right tool and the cheaper one. What it cannot do is sound like one specific place. Every room it makes is a plausible generic room, and two spaces set to similar numbers sound like siblings, because the same machinery made both.
A convolution space is a measurement of somewhere real, so it carries everything about that place at once, including the parts nobody would think to dial in -- the particular way a stairwell's corners answer a footstep, the honk a length of pipe adds, the specific cramped smack of a washing machine drum. You are not approximating the space, you are playing it. That is what makes it worth the extra cost for the places that should feel like somewhere rather than like a room, and it is also what makes it useless for a space you want to tune by ear, since the only knob that changes the room is which file you picked.
A good rule: reach for a reverb space or a plate space by default, and reach for a convolution space when the place is the point.
This behaves differently from the other two in one way worth understanding. A reverb space or plate space colors what YOU hear while you stand inside it, and someone outside hears nothing of it. A convolution space does that too, but it also works the other way round: a sound made INSIDE the box keeps the room even for listeners standing outside. So a player who steps into a cupboard is heard walking around in a cupboard by everyone nearby, while those listeners keep whatever room they are standing in themselves.
ir_file = the impulse response to play, as a path under the sounds folder, for example responses/small_prehistoric_cave.wav. This is the one required parameter. In the builder, browse for it rather than typing it -- the browser plays a real footstep through each file so you can hear what the space does, which a raw impulse response does not tell you on its own. The Presets button is the easier way in still, since every preset is a curated file with a name that says what it is.
wet = how much reverb is mixed in, 0-1, exactly as in a reverb space.
dry = how much of a sound's own direct signal is still heard alongside the reverb, 0-1 (default 0). This exists only here, and the default is deliberately different from the other two. A recording of a real place already contains the direct sound arriving before the room answers it, so playing the game's own copy of that sound on top of it at full volume doubles up on something the recording already has. Leave it at 0 for a space that should sound like the room, and raise it for one that should sound like a footstep with a room added behind it.
low_cut = highpass on the reverb's wet output, in Hz, 0 to 20000 (default 0). 0 means off. Works exactly as it does on a plate space, and is the way to get a duller or thinner version of a space without needing a second recording of it.
high_cut = lowpass on the reverb's wet output, in Hz, 0 to 20000 (default 0). 0 means off. Again as on a plate space.
A convolution space costs more to run than the other two, since it is playing a recording rather than computing a tail. Players who need the headroom back can turn all reverb off under Sound and Audio in the settings, which covers every kind and every space in the map at once.
c_space minx=value; maxx=value; miny=value; maxy=value; minz=value; maxz=value; ir_file=value; wet=value; dry=value; low_cut=value; high_cut=value;
c_space minx=10; maxx=30; miny=10; maxy=30; minz=0; maxz=10; ir_file=responses/small_prehistoric_cave.wav; wet=0.6;
c_space minx=0; maxx=2; miny=0; maxy=2; minz=0; maxz=2; ir_file=responses/old_washing_machine.wav; wet=1; high_cut=4000;

Occluded Space
Muffles sound when the listener is within the specified boundaries.
Useful for simulating muffled sound through walls or underwater effects.
inverted = optional (default false). false = a barrier: sound is muffled only when the listener and source are on OPPOSITE sides of the box. true = a muffling medium (water, fog): sound is also muffled when BOTH the listener and source are inside it, so people sharing the medium hear each other muffled too.
thickness = optional (default 1). How far OUTSIDE the box, in tiles, a sound can sit and still be heard unoccluded by a listener inside -- effectively the wall's depth. Raise it so a thick wall's no-occlusion shadow reaches sounds (e.g. wall-bumps) a few tiles beyond the boundary. Only relaxes occlusion; does not apply to inverted zones.
cutoff_freq = the frequency above which sound is cut away, in Hz. Lower is more muffled; around 20000 is no muffling at all, a few hundred is heavily muffled. Usable range is 20 to 20000, and anything outside it is brought back inside with a warning in your map errors. resonance = emphasis right at the cutoff, roughly 1-8; leave it alone unless you want a distinctly hollow or resonant character. Values above 8 are lowered to 8, since that is as steep as the audio engine can build.
o_space minx=value; maxx=value; miny=value; maxy=value; minz=value; maxz=value; cutoff_freq=value; resonance=value; inverted=value; thickness=value;
o_space minx=10; maxx=20; miny=10; maxy=20; minz=0; maxz=10; cutoff_freq=800; inverted=true; thickness=2;

Reflection Space
Gives an area its own "feel the wall" reflection settings, and an easy way to get reflections WITHOUT acoustic materials. While you stand inside the box, sounds reflect off nearby walls using these values, and ANY wall reflects using the box's default reflectivity (a wall that has its own acoustic material still uses that instead). Good for builders who just want reflections in a room without tuning per material.
refl_range = step range; how far a wall can be and still reflect (game units).
refl_count = maximum number of simultaneous reflections.
volume = base reflection loudness in dB (negative is quieter).
wet = default wall reflectivity 0-1 for walls that have no acoustic material (0 = those walls do not reflect).
refl_cutoff = brightness of the reflected copy, as a cutoff frequency in Hz. Lower is duller.
r_space minx=value; maxx=value; miny=value; maxy=value; minz=value; maxz=value; refl_range=value; refl_count=value; volume=value; wet=value; refl_cutoff=value;
r_space minx=10; maxx=20; miny=10; maxy=20; minz=0; maxz=10; refl_range=8; refl_count=2; volume=-8; wet=0.6; refl_cutoff=6000;

Acoustic Material
Declares how a wall MATERIAL muffles sound, once, for the whole map. The engine then occludes any sound automatically wherever that material's walls actually sit between you and the source -- no occlusion boxes needed. An occluded space box still overrides this where one is placed.
This element has no boundaries; it is a rule, not a region.
name = the material as the map stores it WITHOUT the "wall" prefix (a "wallwood" tile is material "wood").
cutoff = the frequency above which sound through this material is cut away, in Hz. Lower is more muffled. Usable range is 20 to 20000, and anything outside it is brought back inside with a warning in your map errors.
order = how steeply it is cut, 1 to 8. Higher is a sharper, more decisive muffle. 8 is as steep as the audio engine can build, so anything above it is lowered to 8.
The same material also colors the "feel the wall" reflection (image-source method): when a sound reflects off this material's wall, the copy is made quieter and duller accordingly. Reflection is opt-in: leave wet at 0 and this material does not reflect.
wet = reflectivity 0-1 (how loud this material's reflection is; 0 = no reflection). Hard surfaces (metal, stone) high; soft (carpet) low.
refl_cutoff = brightness of the reflected copy, as a cutoff frequency in Hz. Lower is duller.
Note: reflection is enabled per map via the "Allow sounds to reflect off walls" setting. When on, non-looping world sounds (footsteps, other players, voice) reflect off nearby walls while you are in a reflection space -- it is not chosen per individual source.
acoustic_material name=value; cutoff=value; order=value; wet=value; refl_cutoff=value;
acoustic_material name=wood; cutoff=1200; order=2; wet=0.6; refl_cutoff=6000;
acoustic_material name=carpet; cutoff=500; order=3; wet=0.25; refl_cutoff=2500;

Zone Reverb
Maps a named zone to a reverb preset, applied whenever you stand in that zone -- the box-free version of a reverb space. A reverb space box overrides this where one is placed.
This element has no boundaries; it is a rule, not a region.
name = the zone name as the map reports it (the same names zones use elsewhere), matched exactly by default. Wrap it in asterisks instead to match any zone whose name simply contains that word or phrase -- name=*corridor* applies to a zone named just "corridor", one named "east corridor", and one named "a long and winding corridor" alike, without listing each one separately. This match is not case sensitive. In the builder, checking "Match Any Zone Containing This" does this wrapping for you, so typing the asterisks yourself is never required.
decay_time, wet, damp, width = the same reverb controls as a reverb space.
zone_reverb name=value; decay_time=value; wet=value; damp=value; width=value;
zone_reverb name=hall; decay_time=5; wet=0.6; damp=0.4;
zone_reverb name=*corridor*; decay_time=1.2; wet=0.4; damp=0.6;

Zone Plate Reverb
The same rule as a zone reverb, using a plate reverb instead -- the box-free version of a plate space. A space box of either kind overrides this where one is placed, and registering one over a zone reverb of the same name replaces it rather than leaving both fighting over the zone.
This element has no boundaries; it is a rule, not a region.
name = the zone name, matched exactly, or wrapped in asterisks to match any zone containing that word. Works exactly as it does for a zone reverb above.
decay_time, wet, damp, width, predelay, size, low_cut, high_cut = the same controls as a plate space.
zone_plate_reverb name=value; decay_time=value; wet=value; damp=value; width=value; predelay=value; size=value; low_cut=value; high_cut=value;
zone_plate_reverb name=hall; decay_time=5; wet=0.6; damp=0.4; predelay=0.04; size=1.5;
zone_plate_reverb name=*corridor*; decay_time=1.2; wet=0.4; damp=0.6; size=0.8;

Map Configuration Commands (single line entries):

Map Name
name=map_name;
name=test;

Minimum Boundaries
Optional. Left out, a map starts at 0 on every axis, which is how every map behaved before these existed. May be negative, down to -1000000, so a map can extend below or behind its origin.
minx=value;
miny=value;
minz=value;
minx=-50;
miny=0;
minz=-20;

Maximum Boundaries
Up to 1000000, and never below the matching minimum.
maxx=value;
maxy=value;
maxz=value;
maxx=50;
maxy=50;
maxz=50;

Both sets are editable in game from the map settings menu (Ctrl + B), under "Set minimum coordinates" and "Set maximum coordinates". 2D maps only use X and Y. Changing either refreshes the map.

Categories
A map can be filed under any number of categories, chosen from a fixed list. In game they are checkboxes under Categories in the map settings menu; a map can no longer be given a category that isn't on the list, and one that isn't is removed the next time that map's categories are saved. The list lives in categories.txt on the server and currently reads: 2D, 3D, AFK, Brain Teasers, Challenges, Cities, Entertainment, Events, Hangouts / Main, Jokes and Laughs, Music Rooms, Nature, Relaxation, Residential, Tutorials, Miscellaneous.
Hangouts / Main is the one with behavior attached: only a map carrying it can be set as your main map, and a map carrying it cannot be submitted for challenge map evaluation.
category name
category Nature

Default Health
health=value;
health=30000;

Map Settings (add these as single lines)
public;           - Makes the map public
visible;          - Makes the map visible
nocamera;         - Disables camera
nospyer;          - Disables spyer
camwalls;         - Lets the camera pan through walls (it is stopped by them unless you add this)
nocoords;         - Disables coordinate viewing
nofloors;         - Disables floor announcements
nohook;           - Disables grappling hook
nobiking;         - Disables bikes
classicbike;      - Bikes here ride the classic way (see below)
noboating;        - Disables boats
nodamage;         - Disables fall damage
keepitems;        - Keeps what you are carrying when this same map reloads (see below)
2d;               - Converts map to 2D
predict;          - Enables predictive syntax (see below)

Keeping Items
Your map inventory is normally emptied whenever a map loads, including when the map that loads is the one you were already on. Dying on a map sends you back to its spawn point, which reloads it, so everything collected on the way to that death is gone as well as the progress.
keepitems changes that for one map: leave it and come back to it and you are handed what you were carrying, so a death on a long challenge map costs you the run rather than the collecting.
It is deliberately narrow. It only applies when the map loading is the same map by name, so walking from a keepitems map to any other map arrives empty-handed as always, even if that map also has keepitems. It also only applies within one visit to the server: disconnecting, being kicked, or going back to the menu drops what was held, so coming back later starts a fresh run.
Only the map inventory is affected. Your main inventory was never cleared by a map load and is not touched by this.
One thing to plan for. This does not stop item pickups from being collectable again after the reload, so an item you keep can also be picked up a second time on the way back through. If that matters for your map, gate the pickups behind a counter or a trigger you restore, rather than relying on the items themselves being gone.

Classic Biking
classicbike makes bikes on this map ride the way they did in the original client, and changes nothing else.
Normally a bike pedals one tile at a time under a continuous surface loop, so it rolls smoothly and you steer it as it goes.
The classic bike instead commits you to a five-tile dash every half second: it lands, plays one sound for the surface it landed on, and pings the radar once if there is a wall or a drop within twenty-five tiles ahead.
Hitting a wall during a dash crashes and puts you back where the dash started, and riding off into open air with nothing below crashes the same way. Running out of map simply stops you, without a crash.
Mounting, dismounting, turning and everything else about being on a bike are unchanged, so a rider needs to learn nothing new to use one.
classicbike;

Autowalk Settings
autowalk0;        - Tap arrow keys only
autowalk1;        - Hold arrow keys only

Timed Map
time=minutes;
time=5;

Contributors
contributor=name;
contributor=John;

Boolean Values:
The new syntax supports flexible boolean parsing. All of these are equivalent to true:
- true, yes, 1, on, enabled
All of these are equivalent to false:
- false, no, 0, off, disabled

String Values with Spaces:
Use quotes for strings containing spaces:
text="Hello World";
label="Living Room";
password="secret phrase";

Parameter Order:
Unlike legacy syntax, parameters can be in any order:
platform type=grass; minx=0; maxx=50; miny=0; maxy=50; minz=0; maxz=0;
platform minx=0; maxx=50; type=grass; miny=0; maxy=50; minz=0; maxz=0;
Both examples above are equivalent and valid.

Optional Parameters:
Many parameters have default values and are optional. For example:
- volume defaults to 100 (full) on sources/ambiences; 0 is silent
- pitch defaults to 100.0
- automatic defaults to false
- speed defaults to 1.0

If you don't specify these optional parameters, the default values will be used automatically.

Predictive Syntax:
Predictive syntax is a feature that attempts to guess what parameter you were trying to use when it encounters an unrecognized keyword. It is recommended for beginners who are still learning the map syntax, as it can help correct common mistakes without breaking your map.

To enable it, add "predict;" as a single line in your map data, or toggle it from the map settings menu.

How it works:
- When the parser encounters an unknown parameter, it tries to match it to the correct keyword.
- Common mistakes like camelCase (maxX instead of maxx), snake_case (max_x instead of maxx), or similar typos are automatically corrected.
- It also attempts to correct element type names, such as "tile" to "platform" or "conv" to "belt".
- The corrections happen during parsing only and do not modify your rawdata.

Flaws and limitations:
- Predictive syntax can produce unexpected results if a typo happens to closely resemble a different valid parameter. For example, a misspelled parameter might be corrected to something you did not intend.
- It may silently apply a wrong correction without warning, which can lead to confusing behavior that is difficult to debug.
- It is not a substitute for learning the proper keywords. Relying on it heavily can mask mistakes that would be better caught and fixed.
- It is strongly advised that you read this glossary and use the proper keywords rather than depending on predictive syntax for production maps.