OSDN Git Service

Fixed an issue where the ShaftShowFloors command would cause the destination floor...
[skyscrapersim/skyscraper.git] / designguide.html
index a69f4e9..cdfbc05 100644 (file)
 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
 <html>
 <head>
-<title>Skyscraper Building Design Guide</title>
-<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
+  <title>Skyscraper Building Design Guide</title>
+  <meta http-equiv="content-type" content="text/html; charset=iso-8859-1">
 </head>
 
 <body>
-<div align="center"> 
-  <p><strong><font size="+2">Skyscraper 1.8<br>
-    Building Design Guide<br>
-    </font></strong>Copyright (C)2005-2011 Ryan Thoryk</p>
-  <hr>
-  <p align="left">This document describes how to create your own buildings for 
-    the Skyscraper simulator, and also describes all of the available commands. 
-    Please note that the commands and syntax will change frequently during the 
-    simulator's development, and formatting will be cleaned up to make the code 
-    more readable. A graphical building designer is planned, which will generate 
-    these script files based on simplified CAD-like floorplan layouts, and will 
-    also allow the user to view the building in 3D as it's being created.</p>
-  <p align="left">&nbsp;</p>
-  <p align="center"><font size="+1"><strong><u>Contents</u></strong></font></p>
-  <p align="center"><a href="#Start">Starting a new building</a></p>
-  <p align="center"><a href="#General">General Stuff</a></p>
-  <p align="center"> <a href="#Globals">Globals Section</a></p>
-  <p align="center"> <a href="#Textures">Textures Section</a></p>
-  <p align="center"><a href="#Floor">Floor Sections</a></p>
-  <p align="center"><a href="#Elevator">Elevator Sections</a></p>
-  <p align="center"><a href="#GlobalCommands">Global Commands</a></p>
-  <p align="center"><a href="#Functions">Predefined Functions</a></p>
-  <p align="center"><a href="#Example">Example Building</a></p>
-  <p align="left">&nbsp;</p>
-  <p align="left"><strong><font size="+1"><a name="Start"></a>1. Starting a new 
-    building</font></strong></p>
-  <p align="left">Buildings are stored in text files in Skyscraper's <em>buildings</em> 
-    folder, usually at c:\program files\skyscraper\buildings on Windows, or in 
-    the &quot;buildings&quot; directory on Unix. The filenames end in BLD, and 
-    so you need to make sure your text file ends with &quot;.bld&quot; and not 
-    &quot;.txt&quot;. To create a new building, first open up a text editor, and 
-    read the instructions below. When you're finished, save it into the <em>buildings</em> 
-    folder shown above, as something like &quot;mybuilding.bld&quot;. The building 
-    will appear in Skyscraper's buildings list the next time you run it. A simplistic 
-    building is included for you to get a good idea of the overall format of a 
-    typical building data file. You might also want to open one of the other buildings 
-    that come with Skyscraper (&quot;Triton Center.bld&quot;, &quot;Glass Tower.bld&quot;, 
-    etc) for examples on the more advanced functions. Please note that the script 
-    syntax will change in the future.</p>
-  <p align="left">&nbsp;</p>
-  <p align="left"><strong><font size="+1"><a name="General"></a>2. General Stuff</font></strong></p>
-  <p align="left"><strong>1. Comments</strong></p>
-  <p align="left">To add a comment to your file, simply put the # symbol right 
-    before your comment. For example:<br>
-    <font size="2" face="Courier New, Courier, mono"># This is a comment</font></p>
-  <p align="left">It's a good idea to use comment markers to add a title header 
-    at the top of your building file. The Triton Center file has this header:<br>
-    <font size="2" face="Courier New, Courier, mono">#The Triton Center<br>
-    #Copyright &copy;2003-2010 Ryan Thoryk</font></p>
-  <p align="left"><br>
-    <strong>2. Variables</strong></p>
-  <p align="left">Variables are marked with percent signs (%), and most system 
-    variables will be described later. There are 256 user variables (0-255) which 
-    can be set using the Set command:<font size="2" face="Courier New, Courier, mono"><br>
-    Set 2 = 100<br>
-    </font>and then can be used later:<font size="2" face="Courier New, Courier, mono"><br>
-    Height = %2%<br>
-    </font></p>
-  <p align="left"><strong>3. IF statements</strong></p>
-  <p align="left">Basic IF statements can be made, with the following syntax:<br>
-    <font size="2" face="Courier New, Courier, mono">if[<em>expression</em>] command</font></p>
-  <p align="left">Available signs are = (equals), &gt; (greater than), &lt; (less 
-    than), ! (is not), &amp; (and) and | (or). Expressions can also be enclosed 
-    in parenthesis. Note that the IF statement only works with the current line, 
-    and does not currently support multiple lines within an IF block, an &quot;else&quot; 
-    statement, or nesting.</p>
-  <p align="left">For example, to set the height to 9.5 if the floor number is 
-    less than 82:<br>
-    <font size="2" face="Courier New, Courier, mono">if[%floor% &lt; 82] Height 
-    = 9.5</font></p>
-  <p align="left">This example shows a complex expression:<br>
-    <font size="2" face="Courier New, Courier, mono">if[%floor% &lt; 82 &amp; 
-    (%height% = 3 | %height% = 5)] Height = 9.5</font></p>
-  <p align="left">In the above example, the statement will be true if the <em>floor</em> 
-    value is less than 82 and if the <em>height</em> value is either 3 or 5.<br>
-  </p>
-  <p align="left"><strong>4. Inline calculations</strong></p>
-  <p align="left">Values can be calculated inline by using the following math 
-    operators: <br>
-    + (plus), - (minus), / (divide), and * (multiply).</p>
-  <p align="left">They can be used anywhere in the data file. Here's an example 
-    of one being used with the Set command:<br>
-    <font size="2" face="Courier New, Courier, mono">Set 1 = %floorheight% + 10</font></p>
-  <p align="left">Parenthesis are also supported, for grouped operations. Here's 
-    an example of a complex math expression:<br>
-    <font size="2" face="Courier New, Courier, mono">Set 5 = %height% + (%interfloorheight% 
-    * (4 / %altitude%))</font></p>
-  <p align="left"><font size="2" face="Courier New, Courier, mono"><br>
-    </font><strong>5. Object parameters from outside floor sections</strong></p>
-  <p align="left">Information about a certain floor can be obtained elsewhere 
-    in the script, by referencing the floor in this manner:</p>
-  <p align="left"><font size="2" face="Courier New, Courier, mono">Floor(<em>number</em>).<em>parameter</em></font></p>
-  <p align="left">Available parameters are Base, Altitude, Height, FullHeight and InterfloorHeight. 
-    Note that this function must only be called after the specified floor has 
-    been created.<br>If the InterfloorOnTop parameter in the globals section is set to 'false' (the default), then Base refers to the floor's altitude plus interfloor height; otherwise it refers to the altitude.</p>
-  <p align="left">Example:<font size="2" face="Courier New, Courier, mono"><br>
-    Set 1 = Floor(5).Altitude</font></p>
-  <p align="left"><strong><font size="2" face="Courier New, Courier, mono"><br>
-    </font>6. Includes</strong></p>
-  <p align="left">Other script files can be included (inserted) anywhere in the 
-    current script by using the &lt;Include&gt; command.</p>
-  <p align="left">Syntax:<br>
-    <font size="2" face="Courier New, Courier, mono">&lt;Include <em>filename</em>&gt;</font></p>
-  <p align="left">To include a file called test.txt that's in the data folder, 
-    you would enter:<br>
-    <font size="2" face="Courier New, Courier, mono"><br>
-    &lt;Include data/test.txt&gt;<br>
-    </font></p>
-  <p align="left"><strong>7. Functions</strong></p>
-  <p align="left">Functions can be created to share code between sections of scripts, 
-    and also between entire scripts when used in conjunction with includes. An 
-    unlimited number of parameters can be specified for each function.</p>
-  <p align="left">Syntax:<br>
-    <font size="2" face="Courier New, Courier, mono">&lt;Function <em>name</em>&gt;<br>
-    <em>(code)</em><br>
-    &lt;EndFunction&gt; </font></p>
-  <p align="left">The above is a function definition, and must be used outside 
-    of any sections (such as &lt;Floor&gt;) and also before the function call. 
-    To call the function later in your code, you use the function name followed 
-    by a list of parameters contained within parenthesis, or just parenthesis 
-    if you're not passing any parameters:</p>
-  <p align="left">Syntax:<br>
-    <em>name</em>(<em>parameter1</em>, <em>parameter2</em>, ...)<br>
-    or<br>
-    name()<br>
-    <br>
-    The parameters appear as variables inside the function in the form of <font size="2" face="Courier New, Courier, mono">%param#%</font> 
-    - so the first parameter passed is <font size="2" face="Courier New, Courier, mono">%param1%</font>, 
-    the second is <font size="2" face="Courier New, Courier, mono">%param2%</font>, 
-    etc. For an example, I'll create a function called Test with a single SetAutoSize 
-    command within it, and call that function:</p>
+
+<div align="center">
+<p><strong><font size="+2">Skyscraper 1.9<br>
+Building Design Guide<br>
+</font></strong>Copyright (C)2005-2014 Ryan Thoryk</p>
+<hr>
+
+<p align="left">This document describes how to create your own buildings for
+the Skyscraper simulator, and also describes all of the available commands.
+Please note that the commands and syntax will change frequently during the
+simulator's development, and formatting will be cleaned up to make the code
+more readable. A graphical building designer is planned, which will generate
+these script files based on simplified CAD-like floorplan layouts, and will
+also allow the user to view the building in 3D as it's being created.</p>
+
+<p align="left"> </p>
+
+<p align="center"><font size="+1"><strong><u>Contents</u></strong></font></p>
+
+<p align="center"><a href="#Start">Starting a new building</a></p>
+
+<p align="center"><a href="#General">General Stuff</a></p>
+
+<p align="center"><a href="#Globals">Globals Section</a></p>
+
+<p align="center"><a href="#Textures">Textures Section</a></p>
+
+<p align="center"><a href="#Floor">Floor Sections</a></p>
+
+<p align="center"><a href="#Elevator">Elevator Sections</a></p>
+
+<p align="center"><a href="#GlobalCommands">Global Commands</a></p>
+
+<p align="center"><a href="#Functions">Predefined Functions</a></p>
+
+<p align="center"><a href="#Example">Example Building</a></p>
+
+<p align="left"> </p>
+
+<p align="left"><strong><font size="+1"><a name="Start"></a>1. Starting a new
+building</font></strong></p>
+
+<p align="left">Buildings are stored in text files in Skyscraper's
+<em>buildings</em> folder, usually at "c:\program files\skyscraper\buildings"
+on Windows, or in the "buildings" directory on Unix. The filenames end in BLD,
+and so you need to make sure your text file ends with ".bld" and not ".txt". To
+create a new building, first open up a text editor, and read the instructions
+below. When you're finished, save it into the <em>buildings</em> folder shown
+above, as something like "mybuilding.bld". The building will appear when you
+choose "Other buildings..." in Skyscraper's main menu the next time you run it.
+A simplistic building is included for you to get a good idea of the overall
+format of a typical building data file. You might also want to open one of the
+other buildings that come with Skyscraper ("Triton Center.bld", "Glass
+Tower.bld", etc) for examples on the more advanced functions. Please note that
+the script syntax will change in the future.</p>
+
+<p align="left"> </p>
+
+<p align="left"><strong><font size="+1"><a name="General"></a>2. General
+Stuff</font></strong></p>
+
+<p align="left"><strong>1. Comments</strong></p>
+
+<p align="left">To add a comment to your file, simply put the # symbol right
+before your comment. For example:<br>
+<font face="Courier New, Courier, mono" size="2"># This is a comment</font></p>
+
+<p align="left">It's a good idea to use comment markers to add a title header
+at the top of your building file. The Triton Center file has this header:<br>
+<font face="Courier New, Courier, mono" size="2">#The Triton Center<br>
+#Copyright ©2002-2013 Ryan Thoryk</font></p>
+
+<p align="left"><br>
+<strong>2. Variables</strong></p>
+
+<p align="left">Variables are marked with percent signs (%), and most system
+variables will be described later. Variables can be set using the Set
+command:<font face="Courier New, Courier, mono" size="2"><br>
+Set myvariable = 100<br>
+</font>and then can be used later:<font face="Courier New, Courier, mono"
+size="2"><br>
+Height = %myvariable%<br>
+<br>
+</font></p>
+
+<p align="left"><strong>3. IF/While statements</strong></p>
+
+<p align="left">Basic IF and While statements can be made, with the following
+syntax:<br>
+<font face="Courier New, Courier, mono" size="2">if[<em>expression</em>]
+command<br>
+while[<em>expression</em>] command</font></p>
+
+<p align="left">Available signs are = (equals), &gt; (greater than), &lt; (less
+than), ! (is not), &amp; (and) and | (or). Expressions can also be enclosed in
+parenthesis. Note that IF/While statements only work with the current line, and
+do not currently support multiple lines within an IF/While block, an "else"
+statement, or nesting. A While statement will loop the current line until the
+expression is false, so be careful with this because it can create an infinite
+loop if the expression is always true. See the <em>Functions</em> section below
+for an example of a While statement.</p>
+
+<p align="left">For example, to set the height to 9.5 if the floor number is
+less than 82:<br>
+<font face="Courier New, Courier, mono" size="2">if[%floor% &lt; 82] Height =
+9.5</font></p>
+
+<p align="left">This example shows a complex expression:<br>
+<font face="Courier New, Courier, mono" size="2">if[%floor% &lt; 82 &amp;
+(%height% = 3 | %height% = 5)] Height = 9.5</font></p>
+
+<p align="left">In the above example, the statement will be true if the
+<em>floor</em> value is less than 82 and if the <em>height</em> value is either
+3 or 5.<br>
+<br>
+</p>
+
+<p align="left"><strong>4. Inline calculations</strong></p>
+
+<p align="left">Values can be calculated inline by using the following math
+operators: <br>
++ (plus), - (minus), / (divide), * (multiply), and ^ (power of)</p>
+
+<p align="left">They can be used anywhere in the data file. Here's an example
+of one being used with the Set command:<br>
+<font face="Courier New, Courier, mono" size="2">Set 1 = %floorheight% +
+10</font></p>
+
+<p align="left">Parenthesis are also supported, for grouped operations. Here's
+an example of a complex math expression:<br>
+<font face="Courier New, Courier, mono" size="2">Set 5 = %height% +
+(%interfloorheight% * (4 / %altitude%))</font></p>
+
+<p align="left"><font face="Courier New, Courier, mono" size="2"><br>
+</font><strong>5. Object parameters from outside floor sections</strong></p>
+
+<p align="left">Information about a certain floor can be obtained elsewhere in
+the script, by referencing the floor in this manner:</p>
+
+<p align="left"><font face="Courier New, Courier, mono"
+size="2">Floor(<em>number</em>).<em>parameter</em></font></p>
+
+<p align="left">Available parameters are <em>Base</em>, <em>Altitude</em>,
+<em>Height</em>, <em>FullHeight</em> and <em>InterfloorHeight</em>. Note that
+this function must only be called after the specified floor has been
+created.<br>
+If the <em>InterfloorOnTop</em> parameter in the globals section is set to
+'false' (the default), then <em>Base</em> refers to the floor's altitude plus
+interfloor height; otherwise it refers to the altitude.</p>
+
+<p align="left">Example:<font face="Courier New, Courier, mono" size="2"><br>
+Set 1 = Floor(5).Altitude</font></p>
+
+<p align="left"><strong><font face="Courier New, Courier, mono" size="2"><br>
+</font>6. Includes</strong></p>
+
+<p align="left">Other script files can be included (inserted) anywhere in the
+current script by using the &lt;Include&gt; command. Scripts can be included
+multiple times, and included scripts can include other scripts.</p>
+
+<p align="left">Syntax:<br>
+<font face="Courier New, Courier, mono" size="2">&lt;Include
+<em>filename</em>&gt;</font></p>
+
+<p align="left">To include a file called test.txt that's in the data folder,
+you would enter:<br>
+<font face="Courier New, Courier, mono" size="2"><br>
+&lt;Include data/test.txt&gt;<br>
+</font></p>
+
+<p align="left"><br>
+<strong>7. Functions</strong></p>
+
+<p align="left">Functions can be created to share code between sections of
+scripts, and also between entire scripts when used in conjunction with
+includes. An unlimited number of parameters can be specified for each function.
+If a function is specified with the same name as a previously defined function,
+the function will be skipped and a warning will be printed. This can only be
+used outside of any section, such as &lt;Floor&gt;.</p>
+
+<p align="left">Syntax:<br>
+<font face="Courier New, Courier, mono" size="2">&lt;Function
+<em>name</em>&gt;<br>
+<em>(code)</em><br>
+&lt;EndFunction&gt; </font></p>
+
+<p align="left">The above is a function definition, and must be used before the
+function call. Functions can be called from anywhere in the script, and can
+also call other functions, resulting in nested functions. To call the function
+later in your code, use the function name followed by a list of parameters
+contained within parenthesis, or just parenthesis if you're not passing any
+parameters:</p>
+
+<p align="left">Syntax:<br>
+<em>name</em>(<em>parameter1</em>, <em>parameter2</em>, ...)<br>
+or<br>
+name()<br>
+<br>
+The parameters appear as variables inside the function in the form of <font
+face="Courier New, Courier, mono" size="2">%param#%</font> - so the first
+parameter passed is <font face="Courier New, Courier, mono"
+size="2">%param1%</font>, the second is <font face="Courier New, Courier, mono"
+size="2">%param2%</font>, etc. For an example, I'll create a function called
+Test with a single SetAutoSize command within it, and call that function:</p>
 </div>
-<div align="left"> 
-  <p><font size="2" face="Courier New, Courier, mono">&lt;Function test&gt;<br>
-    SetAutoSize = %param1%, %param2%<br>
-    &lt;EndFunction&gt;<br>
-    <br>
-    test(false, false)</font></p>
-  <p>In the above example, the command that ends up being performed is &quot;SetAutoSize 
-    = false, false&quot;.</p>
-  <p>&nbsp;</p>
+
+<div align="left">
+<p><font face="Courier New, Courier, mono" size="2">&lt;Function test&gt;<br>
+SetAutoSize = %param1%, %param2%<br>
+&lt;EndFunction&gt;<br>
+<br>
+test(false, false)</font></p>
+
+<p>In the above example, the command that ends up being performed is
+"SetAutoSize = false, false". Here is an example of using a While statement to
+loop a function:</p>
+
+<p><font face="Courier New, Courier, mono" size="2">set a = 0<br>
+&lt;Function testing&gt;<br>
+set a = %a% + 1<br>
+print %a%<br>
+&lt;EndFunction&gt;<br>
+<br>
+while [%a% &lt; 5] testing()<br>
+print finished</font></p>
+
+<p>The console output of that ends up being:</p>
+
+<p><font face="Courier New, Courier, mono" size="2">1<br>
+2<br>
+3<br>
+4<br>
+5<br>
+finished</font></p>
+
+<p align="left"><br>
+<strong>8. Advanced Math Functions</strong></p>
+
+<p align="left">Several built-in advanced math functions are provided, mostly
+for trigonometric calculations.</p>
+
+<p align="left">Syntax and descriptions:<br>
+<br>
+cos(<em>x</em>) - calculate cosine, x is angle in radians<br>
+sine(<em>x</em>) - calculate sine, x is angle in radians<br>
+tan(<em>x</em>) - calculate tangent, x is angle in radians<br>
+acos(<em>x</em>) - calculate arc cosine, x is a value from -1 to 1<br>
+asin(<em>x</em>) - calculate arc sine, x is a value from -1 to 1<br>
+atan(<em>x</em>) - calculate arc tangent<br>
+atan2(<em>y</em>, <em>x</em>) - calculate arc tangent with two values, one for
+the y-coordinate and one for the x<br>
+sqrt(<em>x</em>) - calculate square root<br>
+abs(<em>x</em>) - calculate absolute value<br>
+exp(<em>x</em>) - calculate exponential function<br>
+log(<em>x</em>) - calculate natural logarithm<br>
+log2(<em>x</em>) - calculate binary logarithm<br>
+log10(<em>x</em>) - calculate common logarithm<br>
+mod(<em>number</em>, <em>denominator</em>) - calculate modulo (remainder) of a
+division<br>
+hypot(<em>x</em>, <em>y</em>) - calculate hypotenuse<br>
+ceil(<em>number</em>) - calculate ceiling (round up)<br>
+flr(<em>number</em>) - calculate floor (round down)<br>
+rnd(<em>limit</em>) - generate random number from 0 to limit<br>
+round(<em>number</em>) - round number to nearest integer<br>
+</p>
+
+<p></p>
+
+<p></p>
+
+<p></p>
+
+<p></p>
+
+<p> </p>
 </div>
+
 <div align="center">
-  <p align="left"> <strong><font size="+1"><a name="Globals"></a>3. The <em>Globals</em> 
-    Section</font></strong></p>
-  <p align="left">The <em>Globals</em> section contains the general information 
-    about your building. The section starts with this header:<br>
-    <font size="2" face="Courier New, Courier, mono">&lt;Globals&gt;</font></p>
-  <p align="left">and ends with this footer:<br>
-    <font size="2" face="Courier New, Courier, mono">&lt;EndGlobals&gt;</font></p>
-  <p align="left">Parameters are placed between those two markers, and look like 
-    this:<br>
-    <font size="2" face="Courier New, Courier, mono">Parameter = <em>value</em></font></p>
-  <p align="left">Example:<br>
-    <font size="2" face="Courier New, Courier, mono">Name = Triton Center</font></p>
-  <p align="left"><strong>Parameters (all are optional):</strong></p>
-  <p align="left"><strong>1. Name</strong> - building name<br>
-    Example: <font size="2" face="Courier New, Courier, mono">Name = My Building</font></p>
-  <p align="left"> <strong>2. Designer</strong> - name of building's designer<br>
-    <font size="2" face="Courier New, Courier, mono">Designer = Me</font><br>
-    <br>
-    <strong>3. Location</strong> - location of the building<br>
-    <font size="2" face="Courier New, Courier, mono">Location = 100 Main Street</font></p>
-  <p align="left"> <strong>4. Description</strong> - Brief description of the 
-    building<br>
-    <font size="2" face="Courier New, Courier, mono">Description = A really average 
-    building</font><br>
-    <br>
-    <strong>5. Version</strong> - Version of the building (can be text)<br>
-    <font size="2" face="Courier New, Courier, mono">Version = 1</font><br>
-    <br>
-    <strong>6. CameraFloor</strong> - camera's starting floor, starting with 0 
-    (like Floors command) - default is 0<br>
-    <font size="2" face="Courier New, Courier, mono">CameraFloor = 0</font><br>
-    <br>
-    <strong>7. CameraPosition</strong> - camera's starting position in X (left/right) 
-    and Z (forward/backward) feet coordinates - default is "0, 0"<br>
-    Syntax: <font size="2" face="Courier New, Courier, mono">CameraPosition = 
-    <em>X</em>, <em>Z</em></font><br>
-    <font size="2" face="Courier New, Courier, mono">CameraPosition = 0, -10</font><br>
-    <br>
-    <strong>8. CameraDirection</strong> - specifies a 3D point that the camera is looking at on startup (instead of specifying rotation),
-    in X (left/right), Y (up down), and Z (forward/backward) feet coordinates.<br>
-    <font size="2" face="Courier New, Courier, mono">CameraDirection = 0, 10, 
-    28.8</font></p>
-  <p align="left"><strong>9. CameraRotation</strong> - axis rotation of the camera 
-    on startup - X is degrees up/down, Y is degrees left/right, and Z is spin.  Default is "0, 0, 0", and
-    the example makes the camera face right.<br>
-    Syntax: <font size="2" face="Courier New, Courier, mono">CameraRotation =
-        <em>X</em>, <em>Y</em>, <em>Z</em></font><br>
-    <font size="2" face="Courier New, Courier, mono">CameraRotation = 0, 90, 0</font></p>
-  <p align="left"><strong>10. Sky</strong> - which skybox texture pack to use. 
-    In the following example, the chosen pack is &quot;noon&quot;, and the file 
-    &quot;sky-noon.zip&quot; will be loaded.  Default is "noon".<br>
-    <font size="2" face="Courier New, Courier, mono">Sky = noon</font></p>
-  <p align="left"><strong>11. InterfloorOnTop</strong> - determines if the interfloor area should be located at the bottom or top of each floor. Default is false.<br>
-    <font size="2" face="Courier New, Courier, mono">InterfloorOnTop = true</font></p>
-  <p align="left">&nbsp;</p>
-  <p align="left"><strong> <font size="+1"><a name="Textures"></a>4. The <em>Textures</em> 
-    Section</font></strong></p>
-  <p align="left">The Textures section loads textures into the simulation and 
-    assigns names to them, for use in the rest of the sections. The section starts 
-    with this header:<br>
-    <font size="2" face="Courier New, Courier, mono">&lt;Textures&gt;</font></p>
-  <p align="left">and ends with this footer:<br>
-    <font size="2" face="Courier New, Courier, mono">&lt;EndTextures&gt;</font></p>
-  <p align="left"><strong>1. Load</strong> - loads a texture<br>
-    Syntax: <font size="2" face="Courier New, Courier, mono">Load <em>filename</em>, 
-    <em>name</em>, <em>tile_x</em>, <em>tile_y[, force</em></font>]<br>
-    Example: <font size="2" face="Courier New, Courier, mono">Load data\brick1.jpg, 
-    Brick, 1, 1</font></p>
-  <p align="left">This example will load the file brick.jpg and name it Brick. 
-    The values <em>tile_x</em> and <em>tile_y</em> are per-texture multipliers. 
-    For example, if you set <em>tile_x</em> to 2, and you specify a texture width 
-    (tw) of 2 during an <em>AddFloor</em> command later, the tiling value will 
-    be 4 (2 times 2), and the texture will be repeated 4 times horizontally. The 
-    <em>force</em> value is optional, and if set to false, autosizing will always 
-    be disabled for this texture; if set to true, autosizing will always be enabled.</p>
-  <p align="left"><strong>2. LoadRange</strong> - loads a numeric range of textures, 
-    and the current number is available in the <em>number</em> variable (<font size="2" face="Courier New, Courier, mono">%number%</font>)<br>
-    Syntax: <font size="2" face="Courier New, Courier, mono">LoadRange <em>startnumber</em>, 
-    <em>endnumber</em>, <em>filename</em>, <em>name</em>, <em>tile_x</em>, <em>tile_y[, 
-    force] </em></font><br>
-    Example: <font size="2" face="Courier New, Courier, mono">LoadRange 2, 138, 
-    data\floorindicators\%number%.jpg, Button%number%, 1, 1</font></p>
-  <p align="left">This example will load the file 2.jpg and name it Button2, 3.jpg 
-    as Button3, and so on. The values <em>tile_x</em> and <em>tile_y</em> are 
-    per-texture multipliers. For example, if you set <em>tile_x</em> to 2, and 
-    you specify a texture width (tw) of 2 during an <em>AddFloor</em> command 
-    later, the tiling value will be 4 (2 times 2), and the texture will be repeated 
-    4 times horizontally. The <em>force</em> value is optional, and if set to 
-    false, autosizing will always be disabled for this texture; if set to true, 
-    autosizing will always be enabled.</p>
-  <p align="left"><strong>3. AddText</strong> - draws text onto a texture - this 
-    only creates a new texture during runtime (in memory), and all changes are 
-    lost when the application shuts down<br>
-    Syntax: <font size="2" face="Courier New, Courier, mono">AddText texture_name, 
-    name, font_filename, font_size, text, x1, y1, x2, y2, h_align, v_align, ColorR, 
-    ColorG, ColorB[, force</font>]<br>
-    Example: <font size="2" face="Courier New, Courier, mono">AddText Black, Button100, 
-    nimbus_sans.ttf, 47, 100, -1, -1, -1, -1, center, center, 255, 255, 255</font></p>
-  <p align="left">With this command, texture_name is the name of the previously 
-    loaded texture to draw text onto (loaded with either Load or LoadRange). Name 
-    is the name to call this new texture. Font_filename is the filename of the 
-    font to use - fonts are in Skyscraper's data/fonts directory. X1, y1, x2, 
-    and y2 are coordinate values mainly used to position the text in a boxed area, 
-    with the position of 0, 0 (x 0, y 0) being on the top left.. If any value 
-    is -1, the dimension of the texture will be used (so in this example, the 
-    loaded texture has a size of 128x128 pixels, and so the values are 0, 0, 128, 
-    128). This will place the text in the center of the texture image, but to 
-    position it elsewhere, specify the pixel box to place it in. H_align and v_align 
-    determine the alignment of the text - for h_align, it can either be &quot;left&quot;, 
-    &quot;right&quot; or &quot;center&quot;, and for v_align either &quot;top&quot;, 
-    &quot;bottom&quot; or &quot;center&quot;. ColorR, ColorG and ColorB determine 
-    the color of the text, and the values range from 0 to 255. If all values are 
-    255, the text is white, and if all values are 0, then it's black. The <em>force</em> 
-    value is optional, and if set to false, autosizing will always be disabled 
-    for this texture; if set to true, autosizing will always be enabled. Note 
-    that the source texture needs to be a power-of-two size, such as 128x128, 
-    256x256, 512x512, etc - this is because the work is done directly on the graphics 
-    card, and the majority of cards only support those kinds of sizes. Normal 
-    textures loaded with the Load command are internally resized by Crystal Space 
-    before use, and don't have that limitation.</p>
-  <p align="left"><strong>4. AddTextRange</strong> - similar to LoadRange, but 
-    draws text onto a texture<br>
-    Syntax: <font size="2" face="Courier New, Courier, mono">AddText startnumber, 
-    endnumber, texture_name, name, font_filename, font_size, text, x1, y1, x2, 
-    y2, h_align, v_align, ColorR, ColorG, ColorB[, force</font>]<br>
-    Example: <font size="2" face="Courier New, Courier, mono">AddText 1, 100, 
-    Black, Button%number%, nimbus_sans.ttf, 47, %number%, -1, -1, -1, -1, center, 
-    center, 255, 255, 255</font></p>
-  <p align="left"><strong>5. LoadCropped</strong> - loads a cropped image.<br>
-    Syntax: <font size="2" face="Courier New, Courier, mono">LoadCropped filename, 
-    name, x, y, width, height, tile_x, tile_y[, force</font>]<br>
-    Example: <font size="2" face="Courier New, Courier, mono">LoadCropped data\brick1.jpg, 
-    Brick2, 10, 10, 20, 20, 1, 1</font></p>
-  <p align="left">This command is similar to the Load command, but loads only 
-    a portion of an image. In the above example, the command loads the file data\brick1.jpg 
-    as &quot;Brick2&quot;, but only loads the portion of the image starting at 
-    pixel 10, 10, with a width of 20 pixels and a heigth of 20 pixels. Pixel 0, 
-    0 is on the top left of the image. The <em>force</em> value is optional, and 
-    if set to false, autosizing will always be disabled for this texture; if set 
-    to true, autosizing will always be enabled.</p>
-  <p align="left"><strong>6. AddOverlay</strong> - draws an image on top of another 
-    image<br>
-    Syntax: <font size="2" face="Courier New, Courier, mono">AddOverlay texture_name, 
-    overlay_texture_name, name, x, y, width, height, tile_x, tile_y[, force]</font><br>
-    Example: <font size="2" face="Courier New, Courier, mono">AddOverlay Brick1, 
-    Brick2, NewBrick, 25, 25, 50, 50, 1, 1</font></p>
-  <p align="left">This command allows multiple textures to be combined into a 
-    single texture, by drawing one on top of the other. <em>Texture_name</em> 
-    specifies the original source texture name to use (all textures must be loaded 
-    beforehand), <em>overlay_texture_name</em> specifies the texture to draw on 
-    top of the source texture, and <em>name</em> specifies the name of the new 
-    texture. X and Y determine the position to place the top-left of the new image 
-    at (since position 0, 0 is the top left of the image), and width and height 
-    determine the size in pixels of the overlay texture. In the above example, 
-    the &quot;Brick2&quot; texture is drawn on top of the &quot;Brick1&quot; texture, 
-    starting at pixel position 25, 25, with a width of 50 and a height of 50. 
-    The resulting texture is called &quot;NewBrick&quot;. The <em>force</em> value 
-    is optional, and if set to false, autosizing will always be disabled for this 
-    texture; if set to true, autosizing will always be enabled.</p>
-  <p align="left"></p>
-  <p align="left"><strong><font size="+1"><a name="Floor"></a>5. The <em>Floor</em> 
-    Sections</font></strong></p>
-  <p align="left">There are 2 <em>Floor</em> sections available - <em>Floor</em> 
-    and <em>Floors</em>. <em>Floor</em> specifies a single floor, while <em>Floors</em> 
-    specifies a range of floors.<br>
-    For a single floor, the section would start with this:<br>
-    <font size="2" face="Courier New, Courier, mono">&lt;Floor <em>number</em>&gt;</font><br>
-    and end with this:<br>
-    <font size="2" face="Courier New, Courier, mono">&lt;EndFloor&gt;</font><br>
-    For example, a floor section for a lobby would use this:<br>
-    <font size="2" face="Courier New, Courier, mono">&lt;Floor 0&gt;</font></p>
-  <p align="left">For multiple floors, the section would start with this:<br>
-    <font size="2" face="Courier New, Courier, mono">&lt;Floors <em>start</em> 
-    to <em>finish</em>&gt;</font><br>
-    and end with this:<br>
-    <font size="2" face="Courier New, Courier, mono">&lt;EndFloors&gt;<br>
-    </font>For example, to work with floors 5-10, you would type:<font size="2" face="Courier New, Courier, mono"><br>
-    &lt;Floors 5 to 10&gt;</font></p>
-  <p align="left">Floors above ground start with 0 (so a 15-story building would 
-    have floors 0-14). Also, floors must be made in the proper order: basement 
-    levels must be made first in decending order (-1, -2, -3 etc), and then above-ground 
-    floors in ascending order (0, 1, 2, etc).</p>
-  <p align="left"><strong>Variables:</strong></p>
-  <p align="left"><font size="2" face="Courier New, Courier, mono"><strong>%floor%</strong></font> 
-    - contains the current floor number<br>
-    <font size="2" face="Courier New, Courier, mono"><strong>%height%</strong></font> 
-    - contains the current floor's ceiling height<br>
-    <font size="2" face="Courier New, Courier, mono"><strong>%interfloorheight%</strong></font> 
-    - contains the current floor's interfloor height (spacing between floors)<br>
-    <font size="2" face="Courier New, Courier, mono"><strong>%fullheight%</strong></font> 
-    - contains the current floor's total height, including the interfloor height<br>
-    <font size="2" face="Courier New, Courier, mono"><strong>%base%</strong></font>
-    - if the InterfloorOnTop parameter in the Globals section is set to 'false' (the default), then Base refers to the floor's altitude plus interfloor height; otherwise it's the floor's altitude<br>
-  </p>
-  <p align="left"><strong>Parameters:</strong></p>
-  <p align="left"><strong>1. Name</strong> - the name of the current floor, required<br>
-    Example: <font size="2" face="Courier New, Courier, mono">Name = Floor %floor%</font></p>
-  <p align="left"><strong>2. ID</strong> - the floor indicator name for the current 
-    floor, such as L (for Lobby), LL (lower level), M (Mezzanine), etc. This is 
-    also used to determine what texture should be loaded for the elevator floor 
-    indicators and floor signs. The texture name would be &quot;Button[ID]&quot; 
-    - so if the ID is 10, the texture name would be &quot;Button10&quot;.<br>
-    <font size="2" face="Courier New, Courier, mono">ID = %floor%</font></p>
-  <p align="left"><strong>3. Type</strong> - the type of floor the current floor 
-    is. The types are still being defined, but the currently used ones are Basement, 
-    Lobby, Mezzanine, Conference, Office, Service, Skylobby, Hotel, Apartment, 
-    Condominium, Restaurant, Observatory, Recreation, Ballroom, Communications, 
-    and Roof. (Required)<br>
-    <font size="2" face="Courier New, Courier, mono">Type = Office</font></p>
-  <p align="left"><strong>4. Description</strong> - description of the current 
-    floor, optional<br>
-    <font size="2" face="Courier New, Courier, mono">Description = Offices</font></p>
-  <p align="left"><strong>5. Height</strong> - the floor-to-ceiling height of 
-    the current floor, required<br>
-    <font size="2" face="Courier New, Courier, mono">Height = 9.5</font></p>
-  <p align="left"><strong>6. InterfloorHeight</strong> - the height in feet of 
-    the space between floors (below each floor), starting at the floor's altitude, 
-    and ending right below the level's floor; required.<br>
-    <font size="2" face="Courier New, Courier, mono">InterfloorHeight = 2.24</font></p>
-  <p align="left"><strong>7. Altitude</strong> - this parameter is optional and 
-    is only recommended if the first level has an interfloor area that needs to 
-    be below ground. If this parameter is not used, the altitude will be calculated 
-    automatically.<br>
-    <font size="2" face="Courier New, Courier, mono">Altitude = -2.24</font></p>
-  <p align="left"><strong>8. Group</strong> - group floors together. This is a 
-    list of comma-separated floor numbers (or a range specified with the - symbol) 
-    that should be enabled along with this floor when the user arrives at this 
-    floor. For example, if a 2-story room has a balcony, and the room base and 
-    balcony are separate floors, you would specify the other floor's number in 
-    this parameter.<br>
-    Examples:<br>
-    <font size="2" face="Courier New, Courier, mono">Group = 5</font><br>
-    <font size="2" face="Courier New, Courier, mono">Group = 4, 5<br>
-    Group = 4 - 10</font></p>
-  <p align="left"><br>
-    <strong>Commands:</strong></p>
-  <p align="left"><strong>1. Exit</strong> - exits the current floor section</p>
-  <p align="left"><strong>2. AddFloor</strong> - adds a textured floor with the 
-    specified dimensions to the current floor/level<br>
-    Syntax: <font size="2" face="Courier New, Courier, mono">AddFloor <em>name, 
-    texturename</em>, <em>thickness, x1</em>, <em>z1</em>, <em>x2</em>, <em>z2</em>, 
-    <em>voffset1</em>, <em>voffset2, tw</em>, <em>th, isexternal</em></font><br>
-    Example: <font size="2" face="Courier New, Courier, mono">AddFloor My Floor, 
-    brick, 0.5, -10, -10, 10, 10, 0, 0, 0, 0, False</font></p>
-  <p align="left"><em>Voffset1</em> and <em>voffset2</em> are the height in feet 
-    above the current floor's altitude; <em>tw</em> and <em>th</em> are to size/tile 
-    the texture (0 lets the app autosize them), and <em>isexternal</em> determines 
-    if the floor is part of the building's external framework, or is part of the 
-    current floor (is either True or False). <em>Name</em> is a user-defined name 
-    for the object.</p>
-  <p align="left"><strong>3. AddWall</strong> - adds a textured wall with the 
-    specified dimensions to the current floor/level<br>
-    Syntax: <font size="2" face="Courier New, Courier, mono">AddWall <em>name, 
-    texturename</em>, <em>thickness, x1</em>, <em>z1</em>, <em>x2</em>, <em>z2</em>, 
-    <em>height1</em>, <em>height2</em>, <em>voffset1</em>, <em>voffset2</em>, 
-    <em>tw</em>, <em>th</em>, <em>isexternal</em></font><br>
-    Example: <font size="2" face="Courier New, Courier, mono">AddWall My Wall, 
-    brick, 0.5, -10, -10, 10, 10, 10, 10, 0, 0, 0, 0, False</font></p>
-  <p align="left"><em>Height1</em> is the wall height in feet at the first coordinate 
-    set (x1 and z1), and <em>height2</em> is for the second set (x2, and z2). 
-    <em>Voffset1</em> is the vertical offset in feet (from the floor's altitude) 
-    for the first coordinate set, and <em>voffset2</em> is for the second set. 
-    <em>Tw</em> and <em>th</em> are the texture sizing/tiling multipliers, and 
-    <em>isexternal</em> determines if the wall is part of the building's external 
-    framework (true) or if it's part of the current floor (false).</p>
-  <p align="left"><strong>4. AddInterfloorFloor</strong> - adds a textured floor 
-    below the floor of the current floor/level<br>
-    Syntax: <font size="2" face="Courier New, Courier, mono">AddInterfloorFloor 
-    <em>name, texturename</em>, <em>thickness, x1</em>, <em>z1</em>, <em>x2</em>, 
-    <em>z2</em>, <em>voffset1</em>, <em>voffset2, tw</em>, <em>th</em></font><br>
-    Example: <font size="2" face="Courier New, Courier, mono">AddInterfloorFloor 
-    My IFloor, brick, 0.5, -10, -10, 10, 10, 0, 0, 0, 0</font></p>
-  <p align="left">The parameters are the same as the AddFloor command, except 
-    the <em>voffset</em> values are the height offset in feet above the current 
-    floor's altitude, and not above the base floor level.</p>
-  <p align="left"><strong>5. AddInterfloorWall</strong> - adds a textured wall 
-    below the floor of the current floor/level<br>
-    Syntax: <font size="2" face="Courier New, Courier, mono">AddInterfloorWall 
-    <em>name, texturename</em>, <em>thickness, x1</em>, <em>z1</em>, <em>x2</em>, 
-    <em>z2</em>, <em>height1</em>, <em>height2</em>, <em>voffset1</em>, <em>voffset2</em>, 
-    <em>tw</em>, <em>th</em></font></p>
-  <p align="left">The parameters are the same as the AddWall command, and the 
-    <em>voffset</em> values are the same as the AddInterfloorFloor command.</p>
-  <p align="left"><strong>6. AddShaftFloor</strong> - adds a textured floor to 
-    the specified shaft, on the current floor<br>
-    Syntax: <font size="2" face="Courier New, Courier, mono">AddShaftFloor <em>number, 
-    name, texturename</em>, <em>thickness, x1</em>, <em>z1</em>, <em>x2</em>, 
-    <em>z2</em>, <em>voffset1</em>, <em>voffset2, tw</em>, <em>th</em></font><br>
-    Example: <font size="2" face="Courier New, Courier, mono">AddShaftFloor 1, 
-    My Floor, brick, 0.5, -10, -10, 10, 10, 0, 0, 0, 0</font></p>
-  <p align="left">The parameters are the same as the AddFloor command, and the 
-    <em>number</em> value is the shaft number to use. The x1, z1, x2, and z2 parameters 
-    are offsets of the shaft's origin (similar to creating elevator walls and 
-    floors)</p>
-  <p align="left"><strong>7. AddShaftWall</strong> - adds a textured wall to the 
-    specified shaft, on the current floor<br>
-    Syntax: <font size="2" face="Courier New, Courier, mono">AddShaftWall <em>number, 
-    name, texturename</em>, <em>thickness, x1</em>, <em>z1</em>, <em>x2</em>, 
-    <em>z2</em>, <em>height1</em>, <em>height2</em>, <em>voffset1</em>, <em>voffset2</em>, 
-    <em> tw</em>, <em>th</em></font></p>
-  <p align="left">The parameters are the same as the AddWall command, and the 
-    <em>number</em> value is the shaft number to use. Also, the x1, z1, x2, and 
-    z2 parameters are offsets of the shaft's origin (similar to creating elevator 
-    walls and floors)</p>
-  <p align="left"><strong>8. AddStairsFloor</strong> - adds a textured floor to 
-    the specified stairwell, on the current floor<br>
-    Syntax: <font size="2" face="Courier New, Courier, mono">AddStairsFloor <em>number, 
-    name, texturename</em>, <em>thickness, x1</em>, <em>z1</em>, <em>x2</em>, 
-    <em>z2</em>, <em>voffset1</em>, <em>voffset2, tw</em>, <em>th</em></font><br>
-    Example: <font size="2" face="Courier New, Courier, mono">AddStairsFloor 1, 
-    My Floor, brick, 0.5, -10, -10, 10, 10, 0, 0, 0, 0</font></p>
-  <p align="left">The parameters are the same as the AddFloor command, and the 
-    <em>number</em> value is the stairwell number to use</p>
-  <p align="left"><strong>9. AddStairsWall</strong> - adds a textured wall to 
-    the specified stairwell, on the current floor<br>
-    Syntax: <font size="2" face="Courier New, Courier, mono">AddStairsWall <em>number, 
-    name, texturename</em>, <em>thickness, x1</em>, <em>z1</em>, <em>x2</em>, 
-    <em>z2</em>, <em>height1</em>, <em>height2</em>, <em>voffset1</em>, <em>voffset2</em>, 
-    <em>tw</em>, <em>th</em></font></p>
-  <p align="left">The parameters are the same as the AddWall command, and the 
-    <em>number</em> value is the stairwell number to use. Also, the x1, z1, x2, 
-    and z2 parameters are offsets of the stairwell's origin (similar to creating 
-    elevator walls and floors) </p>
-  <p align="left"><strong>10. ColumnWallBox</strong> - creates 4 walls (box) at 
-    the specified coordinate locations, as part of the current floor's columnframe 
-    mesh<br>
-    Syntax: <font size="2" face="Courier New, Courier, mono">ColumnWallBox <em>name, 
-    texturename</em>, <em>x1</em>, <em>x2</em>, <em>z1</em>, <em>z2</em>, <em>height</em>, 
-    <em>voffset</em>, <em>tw</em>, <em>th, inside, outside, top, bottom </em></font><br>
-    Example: <font size="2" face="Courier New, Courier, mono">ColumnWallBox My 
-    Box, brick, -10, 10, -10, 10, 15, 0, 0, 0, true, true, true, true</font></p>
-  <p align="left">For parameter information, see the CreateWallBox command above. 
-    In this command, the default voffset is the floor's altitude.</p>
-  <p align="left"><strong>11. ColumnWallBox2</strong> - creates 4 walls (box) 
-    at a specified central location, as part of the current floor's columnframe 
-    mesh <br>
-    Syntax: <font size="2" face="Courier New, Courier, mono">ColumnWallBox2 <em>name, 
-    texturename</em>, <em>centerx</em>, <em>centerz</em>, <em>widthx</em>, <em>lengthz</em>, 
-    <em>height</em>, <em>voffset</em>, <em>tw</em>, <em>th</em><em>, inside, outside, 
-    top, bottom </em></font><br>
-    Example: <font size="2" face="Courier New, Courier, mono">ColumnWallBox2 My 
-    Box, brick, 0, 0, 10, 10, 15, 0, 0, 0, false, true, false, false</font></p>
-  <p align="left">For parameter information, see the CreateWallBox2 command above. 
-    In this command, the default voffset is the floor's altitude.</p>
-  <p align="left"><strong>12. CallButtonElevators</strong> - comma-separated list 
-    of elevators the next created call button set will work with (this must be 
-    specified before CreateCallButtons)<br>
-    Example: <font size="2" face="Courier New, Courier, mono">CallButtonElevators 
-    = 1, 2, 3, 4</font></p>
-  <p align="left"> <strong>13. CreateCallButtons</strong> - creates a call button 
-    set<br>
-    Syntax: <font size="2" face="Courier New, Courier, mono">CreateCallButtons<em> 
-    BackTexture</em>, <em>UpButtonTexture</em>, <em>UpButtonTexture_Lit, DownButtonTexture, 
-    DownButtonTexture_Lit, CenterX, CenterZ, voffset, direction, BackWidth, BackHeight, 
-    ShowBack, tw, th<br>
-    </em></font>Example:<font size="2" face="Courier New, Courier, mono"><em> 
-    </em>Create Marble, CallButtonsUp, CallButtonsUpLit, CallButtonsDown, CallButtonsDownLit, 
-    -10, 0, 4, right, 0.5, 1, true, 1, 1</font></p>
-  <p align="left"><em>BackTexture</em> is the texture of the wall plate behind 
-    the buttons</p>
-  <p align="left"><em>UpButtonTexture</em> and <em>DownButtonTexture</em> are 
-    the textures used for the buttons themselves (unlit). <em>UpButtonTexture_Lit</em> 
-    and <em>DownButtonTexture_Lit</em> specify the lit button textures.</p>
-  <p align="left"><em>CenterX</em> and <em>CenterZ</em> are the central location 
-    of the call button set object</p>
-  <p align="left"><em>voffset</em> is the altitude offset that the object is above 
-    each floor</p>
-  <p align="left"><em>direction </em>determines the direction the call buttons 
-    face:<br>
-    'front' means they face towards the front of the building<br>
-    'back' means they face towards the back of the building<br>
-    'left' means they face left<br>
-    'right' means they face right</p>
-  <p align="left"><em>BackWidth</em> and <em>BackHeight</em> are the width and 
-    height of the wall plate</p>
-  <p align="left"><em>ShowBack</em> determines if the wall plate should be shown, 
-    and is either true or false</p>
-  <p align="left"><em>tw</em> and <em>th</em> are the texture scaling for the 
-    wall plate.</p>
-  <p align="left">The up and down buttons will be automatically created based 
-    on the range of the first specified elevator in the CallButtonElevators command 
-    (above).</p>
-  <p align="left"><strong>14. AddStairs</strong> - creates a custom staircase 
-    at the specified location.<br>
-    Syntax: <font size="2" face="Courier New, Courier, mono">AddStairs<em> number, 
-    name, texture, direction, CenterX, CenterZ, width, risersize, treadsize, num_stairs, 
-    voffset, tw, th</em></font><br>
-    Example: <font size="2" face="Courier New, Courier, mono">AddStairs 1, TestStairs, 
-    Brick, left, 10, 15, 5, 0.5, 0.5, 10, 0, 0, 0</font></p>
-  <p align="left">The <em>direction</em> parameter specifies the direction the 
-    staircase faces (where the bottom step is), and so if a staircase goes up 
-    from left to right, the direction would be <em>left</em>. <em>Width</em> specifies 
-    the step width; <em>risersize</em> specifies the height of each step riser 
-    (vertical portion); <em>treadsize</em> specifies the length of each step tread/run 
-    (horizontal portion); <em>num_stairs</em> specifies the total number of steps 
-    to create (including the above landing platform, but not including the base 
-    platform). To calculate the length of the staircase, multiply <em>(num_stairs</em> 
-    - 1) with <em>treadsize</em>; in the above example, that would be 9 * 0.5. 
-    To determine the height of the staircase, multiply <em>num_stairs</em> with 
-    <em>risersize</em>. Note that the tread of the top step is not drawn (the 
-    top step is the landing platform); therefore for a staircase containing 10 
-    steps, the total staircase width would be comprised of 9 treads (which is 
-    why the length calculation used num_stairs minus 1).</p>
-  <p align="left"><strong>15. AddDoor</strong> - adds a textured door in the specified 
-    location, and performs a wall cut on that area (this must be called after 
-    the associated wall is created)<br>
-    Syntax: <font size="2" face="Courier New, Courier, mono">AddDoor <em> opensound, 
-    closesound, open, texturename, thickness</em>, <em>direction, speed, CenterX</em>, 
-    <em>CenterZ</em>, <em>width</em>, <em>height</em>, <em>voffset</em>, <em>tw</em>, 
-    <em>th<br>
-    </em></font>Example:<font size="2" face="Courier New, Courier, mono"> AddDoor 
-    1, , , False, DoorTexture, 0.2, 1, 0, -8.5, 0, 3.5, 8, 0, 1, 1</font></p>
-  <p align="left">Direction specifies the direction the door faces (the side in 
-    which the handle is on the left) and also the direction it opens. These are 
-    the values:<br>
-    1 - faces left, opens left<br>
-    2 - faces left, opens right<br>
-    3 - faces right, opens right<br>
-    4 - faces right, opens left<br>
-    5 - faces front, opens front<br>
-    6 - faces front, opens back<br>
-    7 - faces back, opens back<br>
-    8 - faces back, opens front</p>
-  <p align="left">The default door speed is 75; you can also specify 0 for the 
-    speed to use the system default. The open parameter determines if the door 
-    should be opened on start; default is false.<br>
-  </p>
-  <p align="left"><strong>16. AddStairsDoor</strong> - adds a textured door for 
-    the specified stairwell, in a location relative to the stairwell's center. 
-    This also performs a wall cut on that area (this must be called after the 
-    associated wall is created)<br>
-    Syntax: <font size="2" face="Courier New, Courier, mono">AddStairsDoor <em> 
-    number, opensound, closesound, open, texturename, thickness</em>, <em>direction, 
-    speed, CenterX</em>, <em>CenterZ</em>, <em>width</em>, <em>height</em>, <em>voffset</em>, 
-    <em>tw</em>, <em>th</em></font></p>
-  <p align="left">Number specifies the stairwell number. Direction specifies the 
-    direction the door faces and also the direction it opens. For values of this, 
-    look at the AddDoor command above.</p>
-  <p align="left"><strong>17. AddDirectionalIndicator</strong> - creates a single 
-    elevator directional indicator/lantern on the current floor (similar to the 
-    CreateCallButtons command) <br>
-    Syntax: <font size="2" face="Courier New, Courier, mono">AddDirectionalIndicator<em> 
-    Elevator, Relative, ActiveDirection, Single, Vertical, BackTexture</em>, <em>UpTexture</em>, 
-    <em>UpTextureLit, DownTexture, DownTextureLit, CenterX, CenterZ, voffset, 
-    direction, BackWidth, BackHeight, ShowBack, tw, th<br>
-    </em></font>Example:<font size="2" face="Courier New, Courier, mono"><em> 
-    AddDirectionalIndicator 1, true, false, false, true, Metal, UpLight, UpLightOn, DownLight, 
-    DownLightOn, -3, -4.162, 6, front, 0.5, 1, true, 0, 0</em></font></p>
-  <p align="left">This command will create a directional indicator on the current 
-    floor (if ActiveDirection is false, then it'll only create it if the elevator 
-    serves that floor). It'll also automatically create the up and down lights 
-    depending on the floor.</p>
-  <p align="left"><em>Elevator</em> specifies the elevator to create the indicators 
-    for.</p>
-  <p align="left"><em>Relative</em> determines if the X and Z coordinates are 
-    relative to the elevator's origin (center) or not.</p>
-  <p align="left"><em>ActiveDirection</em> determines if the indicator should continuously 
-    display the active elevator direction (true), or if it should show the elevator's
-    direction for the current call (false, default)</p>
-  <p align="left"><em>Single</em> determines if a single indicator light should 
-    be created instead of two. If this is true, the unlit texture is specified 
-    in <em>UpLight</em>, and the <em>DownLight</em> value is ignored.</p>
-  <p align="left"><em>Vertical</em> determines if the two lights should be vertically 
-    separated (true), or horizontally separated (false)</p>
-  <p align="left"><em>BackTexture</em> is the texture of the wall plate behind 
-    the lights</p>
-  <p align="left"><em>UpTexture</em> and <em>DownTexture</em> are the textures 
-    used for the lights themselves, and the &quot;Lit&quot; texures are the ones 
-    to show when the light is on. <em>DownTexture</em> is ignored if <em>Single</em> 
-    is true.</p>
-  <p align="left"><em>CenterX</em> and <em>CenterZ</em> are the central location 
-    of the indicators</p>
-  <p align="left"><em>voffset</em> is the altitude offset that the object is above 
-    each floor</p>
-  <p align="left"><em>direction </em>determines the direction the indicators face:<br>
-    'front' means they face towards the front of the building<br>
-    'back' means they face towards the back of the building<br>
-    'left' means they face left<br>
-    'right' means they face right</p>
-  <p align="left"><em>BackWidth</em> and <em>BackHeight</em> are the width and 
-    height of the wall plate</p>
-  <p align="left"><em>ShowBack</em> determines if the wall plate should be shown, 
-    and is either true or false</p>
-  <p align="left"><em>tw</em> and <em>th</em> are the texture scaling for the 
-    wall plate.</p>
-  <p align="left"><strong>18. AddShaftDoor</strong> - creates shaft elevator doors 
-    on the current floor only<br>
-    Syntax: <font size="2" face="Courier New, Courier, mono">AddShaftDoor<em> 
-    elevator, number, lefttexture, righttexture</em>, <em>tw, th</em></font></p>
-  <p align="left">The AddShaftDoor command creates working shaft elevator doors 
-    on the current floor only - the other command, <em>AddShaftDoors</em> (in 
-    the <em>elevator</em> section) creates all shaft doors in a single command. 
-    This command is useful for specifying different textures for shaft doors depending 
-    on the floor, and also for only creating shaft doors on one side if an elevator 
-    serves a specific floor. The <em>SetShaftDoors</em> command in the elevator 
-    section must be used before using this command. Parameters such as width, 
-    height, and direction are taken from the <em>AddDoors</em> command (so the 
-    regular elevator doors need to be created first). These doors should be moved 
-    slightly away from the elevator doors (to separate them both). Also, this 
-    command cuts any shaft walls that are within the door area (and so this must 
-    be called after the shaft walls are created). <em>Number</em> specifies the 
-    number of the door to create (related to the <em>Doors</em> command) - if 
-    the elevator only has one door, or if the <em>Doors</em> command was not used, 
-    specify 1 here.</p>
-  <p align="left"><strong>19. AddFloorIndicator</strong> - creates a floor indicator 
-    associated with a specific elevator<br>
-    Syntax: <font size="2" face="Courier New, Courier, mono">AddFloorIndicator<em> 
-    elevator, relative, texture_prefix, direction, CenterX, CenterZ, width, height, 
-    voffset</em></font> </p>
-  <p align="left">The AddFloorIndicator command creates a floor indicator at the 
-    position specified by <em>CenterX</em> and <em>CenterZ</em>, associated with 
-    the elevator specified by <em>elevator</em>. <em>Direction</em> is the direction 
-    the indicator faces, and can be either &quot;left&quot;, &quot;right&quot;, 
-    &quot;front&quot; or &quot;back&quot;. <em>Relative</em> determines if the 
-    <em>CenterX</em> and <em>CenterZ</em> values are relative of the elevator's 
-    center or not. This command can be given multiple times to create multiple 
-    indicators. Texture_prefix is the base name of the texture to load when displaying 
-    a floor ID; for example if the indicator is on floor 3, and you specify a 
-    prefix of "Button", it'll load the "Button3" texture.</p>
-  <p align="left"><strong>20. Cut</strong> - performs a manual box cut on an area 
-    within the current floor<br>
-    Syntax: <font size="2" face="Courier New, Courier, mono">Cut x1, y1, z1, x2, 
-    y2, z2, cutwalls, cutfloors<br>
-    </font>Example: <font size="2" face="Courier New, Courier, mono">Cut -5, -5, 
-    -5, 5, 5, 5, false, true</font></p>
-  <p align="left">The x, y and z values specify the start and end coordinates 
-    of the box cut. The Y values are relative to the current floor's altitude. 
-    If cutwalls is true, the function will cut walls; if cutfloors is true, it'll 
-    cut floors.</p>
-  <p align="left"><strong>21. CutAll</strong> - performs a manual box cut on all 
-    objects associated with the current floor (the level itself, interfloor, shafts, stairs and external)<br>
-    Syntax: <font size="2" face="Courier New, Courier, mono">CutAll x1, y1, z1, 
-    x2, y2, z2, cutwalls, cutfloors<br>
-    </font>Example: <font size="2" face="Courier New, Courier, mono">CutAll -5, 
-    -5, -5, 5, 5, 5, false, true</font></p>
-  <p align="left">The x, y and z values specify the start and end coordinates 
-    of the box cut. The Y values are relative to the current floor's altitude. 
-    If cutwalls is true, the function will cut walls; if cutfloors is true, it'll 
-    cut floors.</p>
-  <p align="left"><strong>22. AddFillerWalls</strong> - helper function to add 
-    fillers around a door's cut location. When a door is created, the wall in 
-    it's location is cut to provide space; after the cut, the sides are open (if 
-    the wall has thickness) - this creates a covering wall on each side and a 
-    floor above the door frame to fill the area.<br>
-    Syntax: <font size="2" face="Courier New, Courier, mono">AddFillerWalls texture, 
-    thickness, CenterX, CenterZ, width, height, voffset, direction, tw, th<br>
-    </font>Example: <font size="2" face="Courier New, Courier, mono">AddFillerWalls 
-    ConnectionWall, 0.5, -10, 0, 3.5, 8, 0, true, 0, 0</font></p>
-  <p align="left">The parameters in this function are similar to the related door's 
-    parameters. Direction is either true if the door faces the front/back (width 
-    is along the X axis), or false if the door faces left/right (width is along 
-    the Z axis).</p>
-  <p align="left"><strong>23. AddSound</strong> - creates a user-defined looping 
-    sound at the specified position<br>
-    Syntax: <font size="2" face="Courier New, Courier, mono">AddSound <em>name, 
-    filename, x, y, z[, volume, speed, min_distance, max_distance, dir_radiation, 
-    direction_x, direction_y, direction_z]</em></font><br>
-    Example 1: <font size="2" face="Courier New, Courier, mono">AddSound MySound, 
-    data/sound.wav, 10, 100, 5<br>
-    </font>Example 2: <font size="2" face="Courier New, Courier, mono">AddSound 
-    MySound, data/sound.wav, 10, 100, 5, 1, 100, 1, -1, 0, 0, 0, 0</font></p>
-  <p align="left">For information on the parameters, see the AddSound command 
-    in the Globals section. The only difference here is that the Y value is relative 
-    of the floor's base (altitude plus interfloor height).</p>
-  <p align="left"><strong>24. AddShaftDoorComponent</strong> - creates a single 
-    shaft door component, used for creating custom door styles<br>
-    Syntax: <font size="2" face="Courier New, Courier, mono">AddShaftDoorComponent 
-    <em>elevator, number, name, texture, sidetexture, thickness, direction, openspeed, 
-    closespeed, x1, z1, x2, z2, height, voffset, tw, th, side_tw, side_th</em></font></p>
-  <p align="left">This command is almost identical to the AddDoorComponent command (in the elevator section below -
-    see that for more information), except that it creates shaft doors. Use the FinishShaftDoor command after
-    creating the components. This command replaces the AddShaftDoor command.</p>
-  <p align="left"><strong>25. FinishShaftDoor</strong> - finishes shaft door creation 
-    - use this after all related AddShaftDoorComponent commands are used, or specify 
-    it without the AddShaftDoorComponent commands if you're creating a manual 
-    shaft door.<br>
-    Syntax: <font size="2" face="Courier New, Courier, mono">FinishShaftDoor<em> 
-    elevator, number</em></font></p>
-  <p align="left">This command is almost identical to the FinishDoors command 
-    (in the elevator section below - see that for more information) except that 
-    it's used for finishing a shaft door.</p>
-  <p align="left"><strong>26. AddModel</strong> - adds a 3D model to the 
-    floor. The model's textures/materials must be defined in a separate ".material" file, and a separate collider mesh ".collider" will be loaded.  If a collider mesh isn't available, a simple box collider will be created.<br> 
-    Syntax: <font size="2" face="Courier New, Courier, mono">AddModel<em> name, 
-    filename, CenterX, CenterY, CenterZ, RotationX, RotationY, RotationZ, MaxRenderDistance, 
-    ScaleMultiplier, EnablePhysics, Restitution, Friction, Mass</em><em><br>
-    </em></font>Example:<font size="2" face="Courier New, Courier, mono"> AddModel 
-    MyModel, cube.mesh, 0, 0, 0, 0, 0, 0, 0, 1, false, 0, 0, 0</font></p>
-  <p align="left">The CenterY value is relative to the current floor's base. MaxRenderDistance 
-    determines the maximum distance in feet that the object will be shown (0 means 
-    unlimited). ScaleMultiplier allows you to change the size of the object during 
-    the load - for example, set to 2 to double the size. Models are in the OGRE native mesh format. In the example, the material/texture file is cube.material, and the optional collider mesh file is cube.collider. EnablePhysics enables Bullet physics on the object, and Restitution, Friction and Mass determine the physical properties of the object.</p> 
-  <p align="left"><strong>27. AddStairsModel</strong> - adds a 3D model 
-    to the specified stairwell, on the current floor. See the AddModel command 
-    above for parameter information.<br>
-    Syntax: <font size="2" face="Courier New, Courier, mono">AddStairsModel<em> 
-    number, name, filename, CenterX, CenterY, CenterZ, RotationX, RotationY, RotationZ, 
-    MaxRenderDistance, ScaleMultiplier, EnablePhysics, Restitution, Friction, Mass</em><em><br>
-    </em></font>Example:<font size="2" face="Courier New, Courier, mono"> AddModel 
-    1, MyModel, cube.dae, 0, 0, 0, 0, 0, 0, 0, 1, false, 0, 0, 0</font></p>
-  <p align="left">The CenterY value is relative to the current floor's altitude. 
-  </p>
-  <p align="left"><strong>28. AddShaftModel</strong> - adds a 3D model 
-    to the specified shaft, on the current floor. See the AddModel command above 
-    for parameter information.<br>
-    Syntax: <font size="2" face="Courier New, Courier, mono">AddShaftModel<em> 
-    number, name, filename, CenterX, CenterY, CenterZ, RotationX, RotationY, RotationZ, 
-    MaxRenderDistance, ScaleMultiplier, EnablePhysics, Restitution, Friction, Mass</em><em><br>
-    </em></font>Example:<font size="2" face="Courier New, Courier, mono"> AddModel 
-    1, MyModel, cube.dae, 0, 0, 0, 0, 0, 0, 0, 1, false, 0, 0, 0</font></p>
-  <p align="left">The CenterY value is relative to the current floor's altitude. 
-  </p>
-  <p align="left"><strong></strong></p>
-  <p align="left"><strong><font size="+1"><a name="Elevator"></a>6. The <em>Elevator</em> 
-    Section</font></strong></p>
-  <p align="left">The <em>Elevator</em> section allows you to create elevators 
-    for your building. Elevators are numbered, starting with 1. Parameters that 
-    have defaults listed are optional.</p>
-  <p align="left">The section headers and footers are similar to the ones in the 
-    Floor section.<br>
-    To specify a single elevator, you would type something like:<br>
-    <font size="2" face="Courier New, Courier, mono">&lt;Elevator 1&gt;</font><br>
-    and end it with:<br>
-    <font size="2" face="Courier New, Courier, mono">&lt;EndElevator&gt;</font><br>
-    <br>
-    For a range of elevators, you would use something like:<br>
-    <font size="2" face="Courier New, Courier, mono">&lt;Elevators 2 to 10&gt;</font><br>
-    and end with:<br>
-    <font size="2" face="Courier New, Courier, mono">&lt;EndElevators&gt;</font></p>
-  <p align="left"><strong>Variables:</strong></p>
-  <p align="left"><font size="2" face="Courier New, Courier, mono"><strong>%elevator%</strong></font> 
-    - number of the current elevator</p>
-  <p align="left"><strong>Parameters</strong>:</p>
-  <p align="left"><strong>1. Name</strong> - sets the name of the elevator<br>
-    Example: <font size="2" face="Courier New, Courier, mono">Name = Service Elevator</font></p>
-  <p align="left"><strong>2. Speed</strong> - maximum speed of the elevator, in 
-    feet per second<br>
-    Example: <font size="2" face="Courier New, Courier, mono">Speed = 20</font></p>
-  <p align="left"><strong>3. Acceleration</strong> - acceleration speed of the 
-    elevator, in feet per second<br>
-    Example: <font size="2" face="Courier New, Courier, mono">Acceleration = 0.015</font></p>
-  <p align="left"><strong>4. Deceleration</strong> - deceleration speed of the 
-    elevator, in feet per second<br>
-    Example: <font size="2" face="Courier New, Courier, mono">Deceleration = 0.0075</font></p>
-  <p align="left"><strong>5. OpenSpeed</strong> - open/close speed of the elevator 
-    doors. This must be specified after the CreateElevator command.<br>
-    Syntax: <font size="2" face="Courier New, Courier, mono">OpenSpeed <em>doornumber</em> 
-    = <em>value</em></font><br>
-    Example: <font size="2" face="Courier New, Courier, mono">OpenSpeed 1 = 0.2</font></p>
-  <p align="left"><strong>6. SlowSpeed</strong> - open/close speed multiplier 
-    of the elevator doors used for slow movement, usually nudge mode. The default 
-    is 0.5, which ends up being half of the door's speed value. This must be specified 
-    after the CreateElevator command.<br>
-    Syntax: <font size="2" face="Courier New, Courier, mono">SlowSpeed <em>doornumber</em> 
-    = <em>value</em></font><br>
-    Example: <font size="2" face="Courier New, Courier, mono">SlowSpeed 1 = 0.2</font></p>
-  <p align="left"><strong>7. ManualSpeed</strong> - open/close speed multiplier 
-    of the elevator doors used for manual movement. The default is 0.2. This must 
-    be specified after the CreateElevator command.<br>
-    Syntax: <font size="2" face="Courier New, Courier, mono">ManualSpeed <em>doornumber</em> 
-    = <em>value</em></font><br>
-    Example: <font size="2" face="Courier New, Courier, mono">ManualSpeed 1 = 
-    0.2</font></p>
-  <p align="left"><strong>8. ServicedFloors</strong> - a comma-separated list 
-    of floors this elevator services. Ranges can also be specified by putting 
-    a &quot;-&quot; between the numbers<br>
-    Example: <font size="2" face="Courier New, Courier, mono">ServicedFloors = 
-    0, 5, 6, 7-30, 31</font></p>
-  <p align="left"><strong>9. AssignedShaft</strong> - the shaft number this elevator 
-    is in<br>
-    Example: <font size="2" face="Courier New, Courier, mono">AssignedShaft = 
-    1</font></p>
-  <p align="left"><strong>10. DoorTimer</strong> - the length of time (in milliseconds) 
-    that the elevator doors should stay open before automatically closing. The 
-    default is 5000, or 5 seconds. This must be specified after the CreateElevator 
-    command.<br>
-    Syntax: <font size="2" face="Courier New, Courier, mono">DoorTimer <em>doornumber</em> 
-    = <em>value</em></font><br>
-    Example: <font size="2" face="Courier New, Courier, mono">DoorTimer 1 = 10000</font></p>
-  <p align="left"><strong>11. QuickClose</strong> - the length of time (in milliseconds) 
-    that the elevator doors should stay open before automatically closing, in 
-    quick-close mode. The default is 3000, or 3seconds. This must be specified 
-    after the CreateElevator command.<br>
-    Syntax: <font size="2" face="Courier New, Courier, mono">QuickClose <em>doornumber</em> 
-    = <em>value</em></font><br>
-    Example: <font size="2" face="Courier New, Courier, mono">QuickClose 1 = 10000</font></p>
-  <p align="left"><strong>12. NudgeTimer</strong> - the length of time (in seconds) 
-    that the doors have to remain open before the elevator activates nudge mode 
-    for the related door. Specify 0 to disable. The default is 30 seconds. This 
-    must be specified after the CreateElevator command.<br>
-    Syntax: <font size="2" face="Courier New, Courier, mono">NudgeTimer <em>doornumber</em> 
-    = <em>value</em></font><br>
-    Example: <font size="2" face="Courier New, Courier, mono">NudgeTimer 1 = 10</font></p>
-  <p align="left"><strong>13. OpenSound</strong> - the sound file to play when 
-    the elevator doors open. Default is <em>elevatoropen.wav</em>. This must be 
-    specified after the CreateElevator command.<br>
-    Syntax: <font size="2" face="Courier New, Courier, mono">OpenSound <em>doornumber</em> 
-    = <em>filename</em></font><br>
-    Example: <font size="2" face="Courier New, Courier, mono">OpenSound 1 = open.wav</font></p>
-  <p align="left"><strong>14. CloseSound</strong> - the sound file to play when 
-    the elevator doors close. Default is <em>elevatorclose.wav</em>. This must 
-    be specified after the CreateElevator command.<br>
-    Syntax: <font size="2" face="Courier New, Courier, mono">CloseSound <em>doornumber</em> 
-    = <em>filename</em></font><br>
-    Example: <font size="2" face="Courier New, Courier, mono">CloseSound 1 = close.wav</font></p>
-  <p align="left"><strong>15. CarStartSound</strong> - the sound file to play 
-    when the elevator starts moving/speeds up. By default no sound is played.<br>
-    Example: <font size="2" face="Courier New, Courier, mono">CarStartSound = 
-    start.wav</font></p>
-  <p align="left"><strong>16. CarMoveSound</strong> - the sound file to play while 
-    the elevator is moving. This file is automatically looped by the simulator. 
-    By default no sound is played.<br>
-    Example: <font size="2" face="Courier New, Courier, mono">CarMoveSound = move.wav</font></p>
-  <p align="left"><strong>17. CarStopSound</strong> - the sound file to play when 
-    the elevator slows down and stops. By default no sound is played.<br>
-    Example: <font size="2" face="Courier New, Courier, mono">CarStopSound = stop.wav</font></p>
-  <p align="left"><strong>18. CarIdleSound</strong> - the sound file to play when 
-    the elevator is idle (generally the fan sound). Default is <em>elevidle.wav</em>.<br>
-    Example: <font size="2" face="Courier New, Courier, mono">CarIdleSound = idle.wav</font></p>
-  <p align="left"><strong>19. MotorStartSound</strong> - the sound file to play 
-    when the elevator motor starts moving/speeds up. Default is <em>elevstart.wav</em>.<br>
-    Example: <font size="2" face="Courier New, Courier, mono">MotorStartSound 
-    = start.wav</font></p>
-  <p align="left"><strong>20. MotorRunSound</strong> - the sound file to play 
-    while the elevator motor is running. This file is automatically looped by 
-    the simulator. Default is <em>elevmove.wav</em>.<br>
-    Example: <font size="2" face="Courier New, Courier, mono">MotorRunSound = 
-    run.wav</font></p>
-  <p align="left"><strong>21. MotorStopSound</strong> - the sound file to play 
-    when the elevator motor slows down and stops. Default is <em>elevstop.wav</em>.<br>
-    Example: <font size="2" face="Courier New, Courier, mono">MotorStopSound = 
-    stop.wav</font></p>
-  <p align="left"><strong>22. MotorIdleSound</strong> - the sound file to play 
-    when the elevator motor is idling. There is no default yet.<br>
-    Example: <font size="2" face="Courier New, Courier, mono">MotorIdleSound = 
-    idle.wav</font></p>
-  <p align="left"><strong>23. ChimeSound</strong> - the sound file to play when 
-    the elevator arrives at a floor. Default is <em>chime1.wav</em>. This must 
-    be specified after the CreateElevator command. This is used for both up and 
-    down chimes.<br>
-    Syntax: <font size="2" face="Courier New, Courier, mono">ChimeSound <em>doornumber</em> 
-    = <em>filename</em></font><br>
-    Example: <font size="2" face="Courier New, Courier, mono">ChimeSound 1 = chime.wav</font></p>
-  <p align="left"><strong>24. UpChimeSound</strong> - the sound file to play when 
-    the elevator arrives at a floor and it's direction is up. Default is <em>chime1.wav</em>. 
-    This must be specified after the CreateElevator command.<br>
-    Syntax: <font size="2" face="Courier New, Courier, mono">UpChimeSound <em>doornumber</em> 
-    = <em>filename</em></font><br>
-    Example: <font size="2" face="Courier New, Courier, mono">UpChimeSound 1 = 
-    chime.wav</font></p>
-  <p align="left"><strong>25. DownChimeSound</strong> - the sound file to play 
-    when the elevator arrives at a floor and it's direction is down. Default is 
-    <em>chime1.wav</em>. This must be specified after the CreateElevator command.<br>
-    Syntax: <font size="2" face="Courier New, Courier, mono">DownChimeSound <em>doornumber</em> 
-    = <em>filename</em></font><br>
-    Example: <font size="2" face="Courier New, Courier, mono">DownChimeSound 1 
-    = chime.wav</font></p>
-  <p align="left"><strong>26. AlarmSound</strong> - the sound file to play when 
-    the elevator alarm button is pressed. Default is <em>bell1.wav</em>.<br>
-    Example: <font size="2" face="Courier New, Courier, mono">AlarmSound = bell2.wav</font></p>
-  <p align="left"><strong>27. AlarmSoundStop</strong> - the sound file to play 
-    when the elevator alarm button is released. Default is <em>bell1-stop.wav</em>.<br>
-    Example: <font size="2" face="Courier New, Courier, mono">AlarmSoundStop = 
-    bell2-stop.wav</font></p>
-  <p align="left"><strong>28. BeepSound</strong> - the sound file to play when 
-    the elevator reaches a new floor. There is no default; if this is set, the 
-    beeps will be automatically enabled. If an asterisk (*) is specified, it is 
-    replaced with the current floor number.<br>
-    Example: <font size="2" face="Courier New, Courier, mono">BeepSound = beep.wav</font></p>
-  <p align="left"><strong>29. FloorSound</strong> - the sound file(s) to play 
-    when the elevator arrives at a floor; normally this is used for files that 
-    speak the floor number. There is no default; if this is set, the sounds will 
-    be automatically enabled. If an asterisk (*) is specified, it is replaced 
-    with the current floor number.<br>
-    Example: <font size="2" face="Courier New, Courier, mono">FloorSound = floor*.wav</font></p>
-  <p align="left"><strong>30. UpMessage</strong> - the sound file(s) to play after 
-    the elevator arrives at a floor and the doors open - this tells the passengers 
-    that the elevator is going up. There is no default; if this is set, the sound 
-    will be automatically enabled. If an asterisk (*) is specified, it is replaced 
-    with the current floor number.<br>
-    Example: <font size="2" face="Courier New, Courier, mono">UpMessage = goingup.wav</font></p>
-  <p align="left"><strong>31. DownMessage</strong> - the sound file(s) to play 
-    after the elevator arrives at a floor and the doors open - this tells the 
-    passengers that the elevator is going down. There is no default; if this is 
-    set, the sound will be automatically enabled. If an asterisk (*) is specified, 
-    it is replaced with the current floor number.<br>
-    Example: <font size="2" face="Courier New, Courier, mono">DownMessage = goingdown.wav</font></p>
-  <p align="left"><strong>32. Music</strong> - the sound file to play for the 
-    elevator music - the sound is automatically looped. There is no default; if 
-    this is set, the sound will be automatically enabled. <br>
-    Example: <font size="2" face="Courier New, Courier, mono">Music = musicfile.wav</font></p>
-  <p align="left"><strong>33. NudgeSound</strong> - the sound file to play while 
-    in nudge mode. Default is <em>buzz.wav</em>. This must be specified after 
-    the CreateElevator command.<br>
-    Syntax: <font size="2" face="Courier New, Courier, mono">NudgeSound <em>doornumber</em> 
-    = <em>filename</em></font><br>
-    Example: <font size="2" face="Courier New, Courier, mono">NudgeSound 1 = buzz.wav</font></p>
-  <p align="left"><strong>34. FloorSkipText</strong> - sets the text that will 
-    be shown in the floor indicator when passing non-serviced floors. The texture 
-    for this must be loaded for it to show - of you set this to EX for example, 
-    the texture it'll load is ButtonEX.jpg. Common values for this are EZ, X, 
-    and EX (which stand for Express Zone).<br>
-    Example: <font size="2" face="Courier New, Courier, mono">FloorSkipText = 
-    EZ </font></p>
-  <p align="left"><strong>35. RecallFloor</strong> - sets the floor the elevator 
-    will recall to during fire service phase 1 mode. Default is the lowest serviced 
-    floor. <br>
-    Example: <font size="2" face="Courier New, Courier, mono">RecallFloor = 5</font></p>
-  <p align="left"><strong>36. AlternateRecallFloor</strong> - sets the alternate 
-    floor the elevator will recall to during fire service phase 1 mode. Default 
-    is the highest serviced floor. <br>
-    Example: <font size="2" face="Courier New, Courier, mono">AlternateRecallFloor 
-    = 6</font></p>
-  <p align="left"><strong>37. ACP</strong> - enables ACP (Anti-Crime Protection) 
-    mode<br>
-    Example: <font size="2" face="Courier New, Courier, mono">ACP = true</font></p>
-  <p align="left"><strong>38. ACPFloor</strong> - sets the floor the elevator 
-    will stop at while in ACP mode. Default is the lowest serviced floor. <br>
-    Example: <font size="2" face="Courier New, Courier, mono">ACPFloor = 5</font></p>
-  <p align="left"><strong>39. Doors</strong> - sets the number of doors the elevator 
-    will have. The default is 1. Set to 0 in order to have a doorless elevator.<br>
-    Example: <font size="2" face="Courier New, Courier, mono">Doors = 2</font></p>
-  <p align="left"><strong>40. MotorPosition</strong> - sets the position of the 
-    motor sound emitter; if this command is not specified, it'll be placed at 
-    the base (altitude + interfloor) of the highest floor in the corresponding 
-    shaft. The X and Z values are relative of the elevator center.<br>
-    Syntax: <font size="2" face="Courier New, Courier, mono">MotorPosition = x, 
-    y, z<br>
-    </font>Example: <font size="2" face="Courier New, Courier, mono">MotorPosition 
-    = 0, 100, 0</font></p>
-  <p align="left"><strong>41. QueueResets</strong> - set this to true if you want 
-    the elevator to reset the related queue (up or down) after it reaches the 
-    last valid entry. If the elevator is moving up for example with this setting 
-    on, and you press buttons for floors below you, the elevator will remove those 
-    entries after it reaches the highest selected floor.<br>
-    Example: <font size="2" face="Courier New, Courier, mono">QueueResets = true</font></p>
-  <p align="left"><strong>42. UpPeak</strong> - enables up peak mode for this 
-    elevator.<br>
-    Example: <font size="2" face="Courier New, Courier, mono">UpPeak = true</font></p>
-  <p align="left"><strong>43. DownPeak</strong> - enables down peak mode for this 
-    elevator.<br>
-    Example: <font size="2" face="Courier New, Courier, mono">DownPeak = true</font></p>
-  <p align="left"><strong>44. IndependentService</strong> - enables independent 
-    service mode for this elevator.<br>
-    Example: <font size="2" face="Courier New, Courier, mono">IndependentService 
-    = true</font></p>
-  <p align="left"><strong>45. InspectionService</strong> - enables inspection 
-    service mode for this elevator.<br>
-    Example: <font size="2" face="Courier New, Courier, mono">InspectionService 
-    = true</font></p>
-  <p align="left"><strong>46. Parking</strong> - enables automatic elevator parking. 
-    If this option is used, the elevator will automatically send itself to the 
-    specified parking floor after the number of seconds specified in <em>delay</em>. 
-    <br>
-    Syntax: <font size="2" face="Courier New, Courier, mono">Parking = <em>floor, 
-    delay</em></font></p>
-  <p align="left"><strong>47. LevelingSpeed</strong> - elevator's leveling speed. 
-    Default is 0.2<br>
-    Syntax: <font size="2" face="Courier New, Courier, mono">LevelingSpeed = <em>speed</em></font></p>
-  <p align="left"><strong>48. LevelingOffset</strong> - distance in feet from 
-    the destination floor that the elevator will switch into leveling mode. Default 
-    is 0.5<br>
-    Syntax: <font size="2" face="Courier New, Courier, mono">LevelingOffset = 
-    <em>distance</em></font></p>
-  <p align="left"><strong>49. LevelingOpen</strong> - distance in feet from the 
-    destination floor that the elevator will open the doors. Default is 0.<br>
-    Syntax: <font size="2" face="Courier New, Courier, mono">LevelingOpen = <em>distance</em></font></p>
-  <p align="left"><strong>50. NotifyEarly</strong> - changes behavior of arrival 
-    notifications (chime and lighting of directional indicator). 0 is the default 
-    and notifies when the elevator stops on the floor. 1 notifies when the elevator 
-    starts the leveling process, and 2 notifies when the elevator starts decelerating.<br>
-    Syntax: <font size="2" face="Courier New, Courier, mono">NotifyEarly = <em>value</em></font></p>
-  <p align="left"><strong>51. MusicPosition</strong> - sets the position of the 
-    music sound emitter relative of the elevator's position. If this command is 
-    not specified, it'll be placed in the center of the elevator on the ceiling.<br>
-    Syntax: <font size="2" face="Courier New, Courier, mono">MusicPosition = x, 
-    y, z<br>
-    </font>Example: <font size="2" face="Courier New, Courier, mono">MusicPosition 
-    = 0, 8, 0</font></p>
-  <p align="left"><strong>52. DepartureDelay</strong> - sets the time in seconds 
-    that the elevator waits before proceeding to the next floor. Default is 0.<br>
-    Syntax: <font size="2" face="Courier New, Courier, mono">DepartureDelay = 
-    <em>1</em> </font></p>
-  <p align="left"><strong>53. ArrivalDelay</strong> - sets the time in seconds 
-    that the elevator waits before opening the doors after arriving at a floor. 
-    The default is 0. Note that a value greater than 0 will switch off the LevelingOpen 
-    setting.<br>
-    Syntax: <font size="2" face="Courier New, Courier, mono">ArrivalDelay = <em>0.5</em></font></p>
-  <p align="left"><strong></strong></p>
-  <p align="left"><strong>Commands:</strong></p>
-  <p align="left"><strong>1. CreateElevator</strong> - creates an elevator at 
-    the specified location<br>
-    Syntax: <font size="2" face="Courier New, Courier, mono">CreateElevator <em>relative, 
-    x</em>, <em>z</em>, <em>floor<br>
-    </em></font>Example:<font size="2" face="Courier New, Courier, mono"><em> 
-    </em>CreateElevator false, 0, 10, 0</font></p>
-  <p align="left"><em>Relative </em>determines if the coordinates are relative 
-    to the shaft center, or if they're absolute, <em>X</em> and <em>Z </em>are 
-    the coordinates to place the center of the elevator at, and <em>Floor</em> 
-    is the floor to place the elevator on.</p>
-  <p align="left"><strong>2. AddFloor</strong> - adds a textured floor with the 
-    specified dimensions for the elevator<br>
-    Syntax: <font size="2" face="Courier New, Courier, mono">AddFloor <em>name, 
-    texturename</em>, <em>thickness, x1</em>, <em>z1</em>, <em>x2</em>, <em>z2</em>, 
-    <em>voffset1</em>, <em>voffset2, tw</em>, <em>th</em></font><br>
-    Example: <font size="2" face="Courier New, Courier, mono">AddFloor Floor1, 
-    Wood2, 0.5, -3.5, -3, 3.5, 3, 0, 0, 0, 0</font></p>
-  <p align="left"><strong>3. AddWall</strong> - adds a textured wall for the elevator<br>
-    Syntax: <font size="2" face="Courier New, Courier, mono">AddWall <em>name, 
-    texturename</em>, <em>thickness, x1</em>, <em>z1</em>, <em>x2</em>, z2, <em>height1</em>, 
-    <em>height2</em>, <em>voffset1</em>, <em>voffset2, </em><em>tw</em>, <em>th</em></font><br>
-    Example: <font size="2" face="Courier New, Courier, mono">AddWall Wall1, Wood1, 
-    0.5, -3.5, 3, 3.5, 3, 8, 8, 0, 0, 2, 2</font></p>
-  <p align="left">The elevator's AddWall command is similar to the other AddWall 
-    commands.</p>
-  <p align="left"><strong>4. AddDoors</strong> - creates elevator doors<br>
-    Syntax: <font size="2" face="Courier New, Courier, mono">AddDoors <em>number, 
-    lefttexture, righttexture</em>, <em>thickness, CenterX, CenterZ, width, height, 
-    direction, tw, th</em></font></p>
-  <p align="left">The AddDoors command creates working elevator doors at the central 
-    location specified by <em>CenterX</em> and <em>CenterZ</em>, with <em>width</em> 
-    and <em>height</em> specifiying the width and height of each door, and <em>Direction</em> 
-    specifying the direction that the doors face (currently there are only 2: 
-    <em>false</em> if the doors are on the left or right sides, and <em>true</em> 
-    if the doors are on the front or back sides). <em>Number</em> specifies the 
-    number of the door to create (related to the <em>Doors</em> command) - if 
-    the elevator only has one door, or if the Doors command was not used, specify 
-    1 here.</p>
-  <p align="left"><strong>5. AddShaftDoors</strong> - creates shaft elevator doors<br>
-    Syntax: <font size="2" face="Courier New, Courier, mono">AddShaftDoors <em>number, 
-    lefttexture, righttexture</em>, <em>thickness, CenterX, CenterZ, tw, th</em></font></p>
-  <p align="left">The AddShaftDoors command creates working shaft elevator doors 
-    at the central location specified by <em>CenterX</em> and <em>CenterZ</em>. 
-    Other parameters such as width, height, and direction are taken from the AddDoors 
-    command (so the regular elevator doors need to be created first). These doors 
-    should be moved slightly away from the elevator doors (to separate them both). 
-    Also, this command creates doors at all the floors specified in the ServicedFloors 
-    value, and cuts any shaft walls that are within the door area (and so this 
-    must be called after the shaft walls are created). <em>Number</em> specifies 
-    the number of the door to create (related to the <em>Doors</em> command) - 
-    if the elevator only has one door, or if the Doors command was not used, specify 
-    1 here.</p>
-  <p align="left"><strong>6. CreatePanel</strong> - creates a button panel<br>
-    Syntax: <font size="2" face="Courier New, Courier, mono">CreatePanel <em>texturename</em>, 
-    <em>rows, columns, direction, CenterX, CenterZ, buttonwidth, buttonheight, 
-    spacingX, spacingY, voffset, tw, th<br>
-    </em></font> Example<font size="2" face="Courier New, Courier, mono"><em>: 
-    </em><font size="2" face="Courier New, Courier, mono">CreatePanel Wall1, 5, 
-    5, right, -3, -3, 0.15, 0.15, 0.3, 0.45, 4.5, 0, 0</font></font></p>
-  <p align="left">The CreatePanel command creates a button panel at a position 
-    relative to the elevator's center position (origin). <em>Rows</em> and <em>Columns</em> 
-    define the grid size of the panel. <em>Direction</em> is either &quot;front&quot;, 
-    &quot;back&quot;, &quot;left&quot; or &quot;right&quot;, defining which direction 
-    the panel faces. <em>SpacingX</em> is the space (percent of a button's width) 
-    horizontally between each button, and <em>spacingY</em> is the space (percent 
-    of a button's height) vertically between each button. Not all positions need 
-    to be used; this is simply to provide a grid layout for the panel. This command 
-    also determines the width and height of the panel based on the spacing and 
-    button sizes. A simple formula for determining panel width or height is this 
-    - for width, it's (columns * buttonwidth) + (spacingX * (columns + 1)); for 
-    height, just swap columns with rows and spacingX with spacingY.</p>
-  <p align="left"><strong>7. AddButton</strong> - creates a standard button on 
-    the panel<br>
-    Syntax: <font size="2" face="Courier New, Courier, mono">AddButton <em>panel_number, 
-    sound, texture_unlit</em>, <em>texture_lit, row, column, floor/type, width, 
-    height[, hoffset, voffset]</em></font><br>
-    Example 1: <font size="2" face="Courier New, Courier, mono">AddButton 1, switch.wav, 
-    Button5, ButtonLit5, 7, 3, 4, 1, 1</font><br>
-    Example 2: <font size="2" face="Courier New, Courier, mono">AddButton 1, , 
-    Button5, ButtonLit5, 7, 3, 4, 1, 1, 0.1, -0.1</font></p>
-  <p align="left">The AddButton command creates a button on the button panel created 
-    with CreatePanel. Panel_number specifies the number of the panel to add the 
-    button to. <em>Row</em> and <em>Column</em> specify the position on the grid 
-    where the button should be. <em>Floor/Type</em> specifies either the floor 
-    number that this button calls, or the action name such as &quot;Open&quot; 
-    (see the AddControl command for more info). <em>Width</em> and <em>Height</em> 
-    specify the width and height of the button, as a percentage of a single grid 
-    unit size (1 being 100%, 0.5 being 50%). If both values are 0, the default 
-    of 1 is used for both values. If only one of the values is 0, then the exact 
-    size other is used; for example, if <em>width</em> is 0 and <em>height</em> 
-    is 1 (or any other number), then the width will end up being the same size 
-    as the height. <em>Hoffset</em> and <em>Voffset</em> are optional parameters, 
-    and are used to position the button outside the normal grid, and are in grid 
-    units (buttonwidth and buttonheight parameters of the CreatePanel function). 
-    In the second example, the button is positioned 0.1 grid units to the right, 
-    and 0.1 grid units down. Notice that no sound is specified in the 2nd example 
-    - this means that a sound won't be played.</p>
-  <p align="left"><strong>8. AddControl</strong> - advanced command for creating 
-    buttons, switches and knobs on the panel<br>
-    Syntax: <font size="2" face="Courier New, Courier, mono">AddControl <em>panel_number, 
-    sound, row, column, width, height, hoffset, voffset, action_name(s), texture_name(s)<br>
-    </em></font>Example 1: <font size="2" face="Courier New, Courier, mono">AddControl 
-    1, switch.wav, 7, 3, 1, 1, 0, 0, open, ButtonOpen</font><br>
-    Example 2: <font size="2" face="Courier New, Courier, mono">AddControl 1, 
-    switch.wav, 7, 3, 1, 1, 0, 0, FanOff, FanOn, SwitchFanOff, SwitchFanOn</font><br>
-    Example 3: <font size="2" face="Courier New, Courier, mono">AddControl 1, 
-    switch.wav, 7, 3, 1, 1, 0, 0, Off, 4, Button5, ButtonLit5</font><br>
-    Example 4: <font size="2" face="Courier New, Courier, mono">AddControl 1, 
-    switch.wav, 7, 3, 1, 1, 0, 0, Fire2Off, Fire2On, Fire2Hold, FireKnob1, FireKnob2, 
-    FireKnob3</font></p>
-  <p align="left">The AddControl command creates an advanced control on the specified 
-    button panel (created with CreatePanel). Most of the parameters are the same 
-    as the AddButton command, but the action_name(s) and texture_name(s) parameters 
-    allow you to specify a list of actions, and a list of textures to go along 
-    with those actions. There needs to be a texture for every action; if you specify 
-    3 actions and only 2 textures, you will get an error. The first example shows 
-    a door open button being created, with the action &quot;open&quot; and the 
-    texture &quot;ButtonOpen&quot;. The 2nd example shows a fan switch being created, 
-    with the first action being &quot;FanOff&quot; with the &quot;SwitchFanOff&quot; 
-    texture being used for that, and &quot;FanOn&quot; for the second action with 
-    the &quot;SwitchFanOn&quot; texture being used for that. Example 3 shows a 
-    standard floor button being created (which is what the AddButton command does) 
-    and example 4 shows a fire service mode knob being created with 3 positions.</p>
-  <p align="left">Available action names: <em>Off</em> (no action), [floor number], 
-    <em>Open</em> (open doors), <em>Close</em> (close doors), <em>Cancel</em> 
-    (call cancel), <em>Run</em> (put elevator in run state), <em></em><em>Stop</em> 
-    (put elevator in stop state), <em>EStop</em> (emergency stop), <em></em><em>Alarm</em>, 
-    <em>Fire1Off</em> (fire service phase 1 off), <em>Fire1On</em> (fire service 
-    phase 1 on), <em>Fire1Bypass</em> (fire service phase 1 bypass), <em>Fire2Off</em> 
-    (fire service phase 2 off), <em>Fire2On</em> (fire service phase 2 on), <em>Fire2Hold</em> 
-    (fire service phase 2 hold), <em>UpPeakOn</em> (enable up peak), <em>UpPeakOff</em> 
-    (disable up peak), <em>DownPeakOn</em> (enable down peak), <em>DownPeakOff</em> 
-    (disable down peak), <em>IndOn</em> (enable independent service mode), <em>IndOff</em> 
-    (disable independent service), <em>InsOn</em> (enable inspection service mode), 
-    <em>InsOff</em> (disable inspection service), <em>AcpOn</em> (enable ACP mode), 
-    <em>AcpOff</em> (disable ACP mode), <em>FanOn</em> (enable fan/idle sound), 
-    <em>FanOff</em> (disable fan/idle sound), <em>Hold</em> (hold door), <em>MusicOn</em>, 
-    and <em>MusicOff</em>.</p>
-  <p align="left">In the above list, <em>Open</em>, <em>Close</em>, and <em>Hold</em> 
-    can have the door number after the name - for example, <em>Open2</em> will 
-    open door 2, while <em>Open</em> will open all doors.<br>
-    <br>
-    <strong>9. AddFloorIndicator</strong> - creates a floor indicator<br>
-    Syntax: <font size="2" face="Courier New, Courier, mono">AddFloorIndicator<em> 
-    texture_prefix, direction, CenterX, CenterZ, width, height, voffset</em></font> 
-  </p>
-  <p align="left">The AddFloorIndicator command creates a floor indicator at the 
-    position (relative to the elevator) specified by <em>CenterX</em> and <em>CenterZ</em>. 
-    <em>Direction</em> is the direction the indicator faces, and can be either 
-    &quot;left&quot;, &quot;right&quot;, &quot;front&quot; or &quot;back&quot;. 
-    This command can be given multiple times to create multiple indicators. Texture_prefix 
-    is the base name of the texture to load when displaying a floor ID; for example 
-    if the elevator is on floor 3, and you specify a prefix of "Button", it'll 
-    load the "Button3" texture.</p>
-  <p align="left"><strong>10. AddDirectionalIndicator</strong> - creates an internal 
-    directional indicator/lantern<br>
-    Syntax: <font size="2" face="Courier New, Courier, mono">AddDirectionalIndicator<em> 
-    ActiveDirection, Single, Vertical, BackTexture</em>, <em>UpTexture</em>, <em>UpTextureLit, 
-    DownTexture, DownTextureLit, CenterX, CenterZ, voffset, direction, BackWidth, 
-    BackHeight, ShowBack, tw, th<br>
-    </em></font>Example:<font size="2" face="Courier New, Courier, mono"><em> 
-    AddDirectionalIndicator false, false, true, Metal, UpLight, UpLightOn, DownLight, 
-    DownLightOn, -3, -4.162, 6, front, 0.5, 1, true, 0, 0</em></font></p>
-  <p align="left">This command will create a directional indicator inside the 
-    elevator, and the positioning is relative of the elevator's center.</p>
-  <p align="left"><em>ActiveDirection</em> determines if the indicator should 
-    continuously display the active elevator direction (true), or if it should 
-    show the elevator's direction for the current call (false, default)</p>
-  <p align="left"><em>Single</em> determines if a single indicator light should 
-    be created instead of two. If this is true, the unlit texture is specified 
-    in <em>UpLight</em>, and the <em>DownLight</em> value is ignored.</p>
-  <p align="left"><em>Vertical</em> determines if the two lights should be vertically 
-    separated (true), or horizontally separated (false)</p>
-  <p align="left"><em>BackTexture</em> is the texture of the wall plate behind 
-    the lights</p>
-  <p align="left"><em>UpTexture</em> and <em>DownTexture</em> are the textures 
-    used for the lights themselves, and the &quot;Lit&quot; texures are the ones 
-    to show when the light is on. <em>DownTexture</em> is ignored if <em>Single</em> 
-    is true.</p>
-  <p align="left"><em>CenterX</em> and <em>CenterZ</em> are the central location 
-    of the indicators</p>
-  <p align="left"><em>voffset</em> is the altitude offset that the object is above 
-    each floor</p>
-  <p align="left"><em>direction </em>determines the direction the indicators face:<br>
-    'front' means they face towards the front of the building<br>
-    'back' means they face towards the back of the building<br>
-    'left' means they face left<br>
-    'right' means they face right</p>
-  <p align="left"><em>BackWidth</em> and <em>BackHeight</em> are the width and 
-    height of the wall plate</p>
-  <p align="left"><em>ShowBack</em> determines if the wall plate should be shown, 
-    and is either true or false</p>
-  <p align="left"><em>tw</em> and <em>th</em> are the texture scaling for the 
-    wall plate.</p>
-  <p align="left"><strong></strong><strong>11. AddDirectionalIndicators</strong> 
-    - creates the elevator's exterior directional indicator/lanterns (similar 
-    to the CreateCallButtons command) <br>
-    Syntax: <font size="2" face="Courier New, Courier, mono">AddDirectionalIndicators<em> 
-    Relative, ActiveDirection, Single, Vertical, BackTexture</em>, <em>UpTexture</em>, 
-    <em>UpTextureLit, DownTexture, DownTextureLit, CenterX, CenterZ, voffset, 
-    direction, BackWidth, BackHeight, ShowBack, tw, th<br>
-    </em></font>Example:<font size="2" face="Courier New, Courier, mono"><em> 
-    AddDirectionalIndicators true, false, false, true, Metal, UpLight, UpLightOn, 
-    DownLight, DownLightOn, -3, -4.162, 6, front, 0.5, 1, true, 0, 0</em></font></p>
-  <p align="left">This command will create directional indicators on all floors 
-    the elevator serves. It'll also automatically create the up and down lights 
-    depending on the floor. To create indicators on a per-floor basis, use the 
-    AddDirectionalIndicator command in the Floor section.</p>
-  <p align="left"><em>Relative</em> determines if the X and Z coordinates are 
-    relative to the elevator's origin (center) or not.</p>
-  <p align="left"><em>ActiveDirection</em> determines if the indicator should continuously
-    display the active elevator direction (true), or if it should show the elevator's
-    direction for the current call (false, default)</p>
-  <p align="left"><em>Single</em> determines if a single indicator light should 
-    be created instead of two. If this is true, the unlit texture is specified 
-    in <em>UpLight</em>, and the <em>DownLight</em> value is ignored.</p>
-  <p align="left"><em>Vertical</em> determines if the two lights should be vertically 
-    separated (true), or horizontally separated (false)</p>
-  <p align="left"><em>BackTexture</em> is the texture of the wall plate behind 
-    the lights</p>
-  <p align="left"><em>UpTexture</em> and <em>DownTexture</em> are the textures 
-    used for the lights themselves, and the &quot;Lit&quot; texures are the ones 
-    to show when the light is on. <em>DownTexture</em> is ignored if <em>Single</em> 
-    is true.</p>
-  <p align="left"><em>CenterX</em> and <em>CenterZ</em> are the central location 
-    of the indicators</p>
-  <p align="left"><em>voffset</em> is the altitude offset that the object is above 
-    each floor</p>
-  <p align="left"><em>direction </em>determines the direction the indicators face:<br>
-    'front' means they face towards the front of the building<br>
-    'back' means they face towards the back of the building<br>
-    'left' means they face left<br>
-    'right' means they face right</p>
-  <p align="left"><em>BackWidth</em> and <em>BackHeight</em> are the width and 
-    height of the wall plate</p>
-  <p align="left"><em>ShowBack</em> determines if the wall plate should be shown, 
-    and is either true or false</p>
-  <p align="left"><em>tw</em> and <em>th</em> are the texture scaling for the 
-    wall plate.</p>
-  <p align="left"><strong>12. SetShaftDoors</strong> - sets positioning and thickness 
-    of shaft doors which will be created with the <em>AddShaftDoor</em> command<br>
-    Syntax: <font size="2" face="Courier New, Courier, mono">SetShaftDoors<em> 
-    number</em>, <em>thickness, CenterX, CenterZ</em></font> </p>
-  <p align="left">This command must be used before calling <em>AddShaftDoor</em>. 
-    This specifies the thickness and X/Z positioning for the shaft doors that 
-    will be created. <em>Number</em> specifies the door number this is associated 
-    with (use 1 if only one door).</p>
-  <p align="left"><strong>13. AddFloorSigns</strong> - creates floor signs on 
-    all floors serviced by the elevator<br>
-    Syntax: <font size="2" face="Courier New, Courier, mono">AddFloorSigns<em> 
-    door_number, relative, texture_prefix, direction, CenterX, CenterZ, width, 
-    height, voffset</em></font> </p>
-  <p align="left">The AddFloorSigns command creates floor signs (similar to floor 
-    indicators) on all the floors serviced by the current elevator. Direction 
-    is the direction the signs face, and can be either &quot;left&quot;, &quot;right&quot;, 
-    &quot;front&quot; or &quot;back&quot;. Texture_prefix is the base name of 
-    the texture to load when displaying a floor ID; for example if the sign is 
-    on floor 3, and you specify a prefix of "Button", it'll load the "Button3" 
-    texture. Door_number specifies the door number to check against, meaning if 
-    shaft doors don't exist on a certain floor for the specified door, the sign 
-    won't be created on that floor. This can be bypassed by setting door_number 
-    to 0.</p>
-  <p align="left"><strong>14. AddSound</strong> - creates a user-defined looping 
-    sound at the specified position<br>
-    Syntax: <font size="2" face="Courier New, Courier, mono">AddSound <em>name, 
-    filename, x, y, z[, volume, speed, min_distance, max_distance, dir_radiation, 
-    direction_x, direction_y, direction_z]</em></font><br>
-    Example 1: <font size="2" face="Courier New, Courier, mono">AddSound MySound, 
-    data/sound.wav, 10, 100, 5<br>
-    </font>Example 2: <font size="2" face="Courier New, Courier, mono">AddSound 
-    MySound, data/sound.wav, 10, 100, 5, 1, 100, 1, -1, 0, 0, 0, 0</font></p>
-  <p align="left">For information on the parameters, see the AddSound command 
-    in the Globals section. The only difference here is that the X, Y and Z position 
-    values are relative of the elevator's center/origin.</p>
-  <p align="left"><strong>15. AddDoorComponent</strong> - creates a single elevator 
-    door component, used for creating custom door styles<br>
-    Syntax: <font size="2" face="Courier New, Courier, mono">AddDoorComponent 
-    <em>number, name, texture, sidetexture, thickness, direction, openspeed, closespeed, 
-    x1, z1, x2, z2, height, voffset, tw, th, side_tw, side_th</em></font></p>
-  <p align="left">Example: <font size="2" face="Courier New, Courier, mono">AddDoorComponent 
-    1, Left, ElevDoors, Black, 0.2, left, 0.3, 0.3, -1.75, 0, 0, 0, 8, 0, 0, 0, 
-    0, 0</font></p>
-  <p align="left">The AddDoorComponent command allows you to create your own custom 
-    door styles. It creates a single door component within a set - for example, 
-    the standard center-open doors have 2 door components: left and right. With 
-    this command you specify the positioning of a component similar to wall creation, 
-    specify it's textures, tell it which direction it's going to travel during 
-    opening, and what it's speed will be. <em>Number</em> specifies the number 
-    of the door to create (related to the <em>Doors</em> command) - if the elevator 
-    only has one door, or if the Doors command was not used, specify 1 here. <em>Texture</em> 
-    refers to the texture used on the main (front and back) sides of the door. 
-    <em>SideTexture</em> refers to the texture used on the sides (and top/bottom) 
-    of the door. <em>Direction</em> is either Up, Down, Left (or Front; is the 
-    same), or Right (or Back; is also the same). <em>Side_tw</em> and <em>side_th</em> 
-    specify the texture tiling for the sides. Use the FinishDoors command after 
-    creating the components. The above example creates the left door component 
-    for the standard center-open doors, and uses default speed values. This command 
-    replaces the AddDoors command.</p>
-  <p align="left"><strong>16. AddShaftDoorsComponent</strong> - creates a single 
-    shaft door component for all serviced floors - used for creating custom door 
-    styles<br>
-    Syntax: <font size="2" face="Courier New, Courier, mono">AddShaftDoorsComponent 
-    <em>number, name, texture, sidetexture, thickness, direction, openspeed, closespeed, 
-    x1, z1, x2, z2, height, voffset, tw, th, side_tw, side_th</em></font></p>
-  <p align="left">This command is almost identical to the AddDoorComponent command,
-    except that it creates shaft doors. Use the FinishShaftDoors command after
-    creating the components. This command replaces the AddShaftDoors command.  To create
-    shaft doors on a per-floor basis, use the AddShaftDoorComponent command in the Floors section.</p>
-  <p align="left"><strong>17. FinishDoors</strong> - finishes elevator door creation 
-    - use this after all related AddDoorComponent commands are used.<br>
-    Syntax: <font size="2" face="Courier New, Courier, mono">FinishDoors <em>number</em></font></p>
-  <p align="left">This command completes the elevator door creation by storing 
-    the central location and shift factor, cutting walls for the door, creating 
-    side connection pieces for the cut, etc.</p>
-  <p align="left"><strong>18. FinishShaftDoors</strong> - finishes shaft door 
-    creation for all serviced floors - use this after all related AddShaftDoorsComponent 
-    commands are used, or specify it without the AddShaftDoorComponent commands 
-    if you're creating a manual shaft door.<br>
-    Syntax: <font size="2" face="Courier New, Courier, mono">FinishShaftDoors 
-    <em>number</em></font></p>
-  <p align="left">This command is almost identical to the FinishDoors command 
-    except that it's used for finishing shaft doors on all serviced floors.</p>
-  <p align="left"><strong>19. AddDoor</strong> - adds a textured door in the specified 
-    location, which moves with the elevator<br>
-    Syntax: <font size="2" face="Courier New, Courier, mono">AddDoor <em> opensound, 
-    closesound, texturename, open, thickness</em>, <em>direction, speed, CenterX</em>, 
-    <em>CenterZ</em>, <em>width</em>, <em>height</em>, <em>voffset</em>, <em>tw</em>, 
-    <em>th</em></font></p>
-  <p align="left">Direction specifies the direction the door faces (the side in 
-    which the handle is on the left) and also the direction it opens. These are 
-    the values:<br>
-    1 - faces left, opens left<br>
-    2 - faces left, opens right<br>
-    3 - faces right, opens right<br>
-    4 - faces right, opens left<br>
-    5 - faces front, opens front<br>
-    6 - faces front, opens back<br>
-    7 - faces back, opens back<br>
-    8 - faces back, opens front</p>
-  <p align="left"><strong>20. AddModel</strong>adds a 3D model to the
-      floor. The model's textures/materials must be defined in a separate ".material" file, and a separate collider mesh ".collider" will be loaded.  If a collider mesh isn't available, a simple box collider will be created.<br>
-    Syntax: <font size="2" face="Courier New, Courier, mono">AddModel<em> name, 
-    filename, CenterX, CenterY, CenterZ, RotationX, RotationY, RotationZ, MaxRenderDistance, 
-    ScaleMultiplier, EnablePhysics, Restitution, Friction, Mass</em><em><br>
-    </em></font>Example:<font size="2" face="Courier New, Courier, mono"> AddModel 
-    MyModel, cube.dae, 0, 0, 0, 0, 0, 0, 0, 1, false, 0, 0, 0</font></p>
-  <p align="left">The CenterY value is relative to the current floor's base. MaxRenderDistance determines the maximum distance in feet that the object will be shown (0 means unlimited). ScaleMultiplier allows you to change the size of the object during the load - for example, set to 2 to double the size. Models are in the OGRE native mesh format. In the example, the material/texture file is cube.material, and the optional collider mesh file is cube.collider. EnablePhysics enables Bullet physics on the object, and Restitution, Friction and Mass determine the physical properties of the object.</p>
-  <p align="left">&nbsp;</p>
-  <p align="left"><strong><font size="+1"><a name="GlobalCommands" id="GlobalCommands"></a>8. 
-    Global Commands/Functions</font></strong></p>
-  <p align="left">These commands and functions can be used anywhere in the script. 
-    In this section, <em>Destobject</em> refers to the destination object to create 
-    other objects in. It can be either <em>floor </em>(only available within a 
-    Floor section)<em>, elevator </em>(only available within an Elevator section), 
-    <em>external</em>, <em>landscape</em>, or <em>buildings</em> (more will come 
-    soon). When the command is used inside a <em>Floor</em> section, and <em>Destobject</em> 
-    is not <em>floor</em>, the altitude of the current floor will be used, and 
-    altitude/y values specified in these commands will be offsets of that altitude.</p>
-  <p align="left"><br>
-    <strong>a. AddTriangleWall</strong> - adds a textured triangular wall<br>
-    Syntax: <font size="2" face="Courier New, Courier, mono">AddTriangleWall <em>destobject, 
-    name, texturename</em>, <em>x1</em>, <em>y1</em>, <em>z1</em>, <em>x2</em>, 
-    <em>y2</em>, <em>z2</em>, <em>x3</em>, <em>y3</em>, <em>z3</em>, <em>tw</em>, 
-    <em>th</em></font><br>
-    Example: <font size="2" face="Courier New, Courier, mono">AddTrianglewall 
-    external, My Triangle, brick, 0, 0, 0, 0, 10, 0, 0, 0, 10, 0, 0</font></p>
-  <p align="left"><strong>b. AddWall</strong> - adds a textured wall<br>
-    Syntax: <font size="2" face="Courier New, Courier, mono">AddWall <em>destobject, 
-    name, texturename</em>, <em>thickness, x1</em>, <em>z1</em>, <em>x2</em>, 
-    z2, <em>height1</em>, <em>height2</em>, <em>altitude1</em>, <em>altitude2</em>, 
-    <em>tw</em>, <em>th</em></font><br>
-    Example: <font size="2" face="Courier New, Courier, mono">AddWall buildings, 
-    Wall1, brick, 0.5, -10, -10, 10, 10, 15, 15, Floor(2).Altitude, Floor(2).Altitude, 
-    0, 0</font></p>
-  <p align="left">The command's parameters are the same as the Floor section's 
-    AddWall command.</p>
-  <p align="left"><strong>c. AddFloor</strong> - adds a textured floor<br>
-    Syntax: <font size="2" face="Courier New, Courier, mono">AddFloor <em>destobject, 
-    name, texturename</em>, <em>thickness, x1</em>, <em>z1</em>, <em>x2</em>, 
-    <em>z2</em>, <em>altitude1</em>, <em>altitude2</em>, <em> tw</em>, <em>th</em></font></p>
-  <p align="left">The command's parameters are the same as the Floor section's 
-    AddFloor command.</p>
-  <p align="left"><strong>d. AddGround</strong> - adds a tile-based ground<br>
-    Syntax: <font size="2" face="Courier New, Courier, mono">AddGround <em> name, 
-    texturename</em>, <em>x1</em>, <em>z1</em>, <em>x2</em>, <em>z2</em>, <em>altitude</em>, 
-    <em>tile_x</em>, <em>tile_y<br>
-    </em></font>Example: <font size="2" face="Courier New, Courier, mono">AddGround 
-    AddGround Ground, Downtown, -158400, -158400, 158400, 158400, 0, 7920, 7920</font></p>
-  <p align="left">This command is mainly for creating large ground sections, since 
-    using the AddFloor function with a large amount of texture tiling causes interference 
-    problems. The X and Z values specify the total size of the ground, and the 
-    tile_x and tile_y specify the size of each tile square to create. For example, 
-    if the ground is 10,000 feet wide, and tile_x and tile_y are both 1000, then 
-    100 total tiles will be created; 10 wide and 10 deep. In the example above 
-    7920 is 1/40 of the total width (316800 which is 158400 * 2), so the tile 
-    grid will be 40x40 tiles.</p>
-  <p align="left"><strong>e. CreateWallBox</strong> - creates 4 walls (box) at 
-    the specified coordinate locations<br>
-    Syntax: <font size="2" face="Courier New, Courier, mono">CreateWallBox <em>destobject</em>, 
-    <em>name, texturename</em>, <em>x1</em>, <em>x2</em>, <em>z1</em>, <em>z2</em>, 
-    <em>height</em>, <em>voffset</em>, <em>tw</em>, <em>th, inside, outside, top, 
-    bottom </em></font><br>
-    Example: <font size="2" face="Courier New, Courier, mono">CreateWallBox external, 
-    My Box, brick, -10, 10, -10, 10, 15, 0, 0, 0, true, true, true, true</font></p>
-  <p align="left">The parameters in this command are very similar to the ones 
-    in the AddWall command shown below in the Floor section, except that a box 
-    is created instead of a single wall. <em>Inside</em> and <em>outside</em> 
-    determine if the wall should be visible from the inside/outside, and <em>top</em> 
-    and <em>bottom</em> determine if the top and bottom walls should be drawn.</p>
-  <p align="left"><strong>f. CreateWallBox2</strong> - creates 4 walls (box) at 
-    a specified central location<br>
-    Syntax: <font size="2" face="Courier New, Courier, mono">CreateWallBox2 <em>destobject</em>, 
-    <em>name, texturename</em>, <em>centerx</em>, <em>centerz</em>, <em>widthx</em>, 
-    <em>lengthz</em>, <em>height</em>, <em>voffset</em>, <em>tw</em>, <em>th</em></font><font size="2" face="Courier New, Courier, mono"><em>, 
-    inside, outside, top, bottom </em></font><br>
-    Example: <font size="2" face="Courier New, Courier, mono">CreateWallBox2 external, 
-    My Box, brick, 0, 0, 10, 10, 15, 0, 0, 0, false, true, false, false</font></p>
-  <p align="left">The parameters are the same as the above command, except that<em> 
-    centerx</em> and <em>centerz</em> define the center of the box, and <em>widthx</em> 
-    and <em>lengthz</em> specify the width and length off of the center.<br>
-    <br>
-    <strong>g. AddCustomWall</strong> - creates a custom polygon (wall, floor, 
-    etc) with any number of vertex points. For example, a triangular wall has 
-    3 vertex points, and a standard wall has 4. This function allows at least 
-    3 vertices.<br>
-    Syntax: <font size="2" face="Courier New, Courier, mono">AddCustomWall <em>destobject, 
-    name, texturename, x1, y1, z1, x2, y2, z2, x3, y3, z3, ..., tw, th</em></font><br>
-    Example: <font size="2" face="Courier New, Courier, mono">AddCustomWall external, 
-    My Wall, brick, 0, 0, 0, 0, 10, 0, 10, 10, 0, 10, 0, 10, 0, 0</font></p>
-  <p align="left"><strong>h. AddShaft</strong> - creates a shaft at a specified 
-    location and floor range<br>
-    Syntax: <font size="2" face="Courier New, Courier, mono">AddShaft number, 
-    type, centerx, centerz, startfloor, endfloor</font><br>
-    Example: <font size="2" face="Courier New, Courier, mono">AddShaft 1, 2, 10, 
-    10, 0, 9</font></p>
-  <p align="left">The number parameter specifies the shaft number to create. <em>Type</em> 
-    is either 1 for a pipe/utility shaft, 2 for an elevator shaft, and 3 for a 
-    stairwell shaft. This command just tells the simulator the area that the shaft 
-    will take up, and does not create the actual shaft walls. Later on when you 
-    create the walls/floors for the shaft, make sure that you make a floor at 
-    the very bottom and very top of the shaft (they can extend beyond the walls).</p>
-  <p align="left"><strong>i. CreateStairwell</strong> - creates a stairwell at 
-    a specified location and floor range<br>
-    Syntax: <font size="2" face="Courier New, Courier, mono">CreateStairwell number, 
-    centerx, centerz, startfloor, endfloor</font><br>
-    Example: <font size="2" face="Courier New, Courier, mono">CreateStairwell 
-    1, 10, 10, 0, 9</font></p>
-  <p align="left">The number parameter specifies the stairwell number to create. 
-    This command just tells the simulator the area that the stairwell will take 
-    up, and does not create the actual walls.</p>
-  <p align="left"><strong>j. WallOrientation</strong> - changes the internal wall 
-    orientation parameter, which is used for determining the wall thickness boundaries 
-    in relation to their coordinates.<br>
-    Syntax:<font size="2" face="Courier New, Courier, mono"> WallOrientation = 
-    <em>direction</em></font><br>
-    Example: <font size="2" face="Courier New, Courier, mono">WallOrientation 
-    = left</font></p>
-  <p align="left">The direction parameter can either be left, center, or right. 
-    Center is default. For example, if center is used, than half of the wall's 
-    thickness is to the right (positive) of it's x1/x2 or z1/z2 coordinates, and 
-    half is to the left (negative) of the coordinates. If left is used, than the 
-    coordinates define the wall's left (negative) edge, and the full thickness 
-    is to the right (positive) of those. If right is used, then again the coordinates 
-    define the wall's right (positive) edge, and the full thickness is to the 
-    left (negative) of those. See this graphic for a good example:</p>
-  <p align="left"><img src="guide/wall_info.jpg"></p>
-  <p align="left">In the graphic above, the large box at the top shows what the 
-    X and Z coordinates correspond to. The lower examples show the wall orientation 
-    as left or right, and if either the difference in x values or z values is 
-    larger.</p>
-  <p align="left"><strong>k. FloorOrientation</strong> - changes the internal 
-    floor orientation parameter, which is used for determining the floor thickness 
-    boundaries in relation to their coordinates.<br>
-    Syntax:<font size="2" face="Courier New, Courier, mono"> FloorOrientation 
-    = <em>direction</em></font><br>
-    Example: <font size="2" face="Courier New, Courier, mono">FloorOrientation 
-    = bottom</font></p>
-  <p align="left">The direction parameter can either be bottom, center, or top. 
-    Top is default. For example, if center is used, than half of the floor's thickness 
-    is above (positive) it's x1/x2 or z1/z2 coordinates, and half is below (negative) 
-    the coordinates. If bottom is used, than the coordinates define the floor's 
-    bottom edge, and the full thickness is the top (positive). If top is used, 
-    then again the coordinates define the floor's top edge, and the full thickness 
-    is the bottom (negative).</p>
-  <p align="left"><strong>l. DrawWalls</strong> - specifies which parts of a wall 
-    or floor should be drawn.<br>
-    Syntax:<font size="2" face="Courier New, Courier, mono"> DrawWalls = <em>MainNegative, 
-    MainPositive, SideNegative, SidePositive, Top, Bottom</em></font><br>
-    Example: <font size="2" face="Courier New, Courier, mono">DrawWalls = true, 
-    true, false, false, false, false</font></p>
-  <p align="left">The example shown is the default setting. This can seem complex, 
-    but I'll provide a graphic soon to explain it more easily. MainNegative is 
-    the main (that makes up the length if a wall, or the main area if a floor) 
-    face on the negative side, MainPositive is the main face on the positive side, 
-    SideNegative is the side (the part that is along the thickness) face on the 
-    negative side, SidePositive is the side face on the positive side; Top refers 
-    to either the top side if a wall, or to the positive X face if a floor; Bottom 
-    refers to either the bottom side if a wall, or the negative X face if a floor. 
-    In the graphic above in the WallOrientation section, let's say that the large 
-    box's difference in x values are larger (meaning that it is horizontal from 
-    the left to the right), and that it has the same z values. With that, MainNegative 
-    would be the front wall, MainPositive the back, SideNegative the left, SidePositive 
-    the right, etc.</p>
-  <p align="left"><strong>m. SetPlanarMapping</strong> - sets the planar texture 
-    mapper's parameters.<br>
-    Syntax:<font size="2" face="Courier New, Courier, mono"> SetPlanarMapping 
-    Flat, X, Y, Z</font><br>
-    Example: <font size="2" face="Courier New, Courier, mono">SetPlanarMapping 
-    false, false, false, true</font></p>
-  <p align="left">X, Y and Z reverse the texture mapping per axis, and Flat has 
-    it ignore depth. Skyscraper by default uses a simple planar texture mapper, 
-    which in simple terms draws the texture in a box around the object. With a 
-    basic wall, the top-left of the texture image is mapped to the top left of 
-    the wall, the top-right is mapped to the top-right of the wall, etc. If you 
-    want the top-right of the texture mapped to the top-left of the wall for example 
-    (to flip or change alignment), you'd set X to false. This command is mainly 
-    used to change alignment - since the top-left of the texture is mapped to 
-    the top-left of the object, that means that textures have a left/top alignment 
-    by default. If you change X to true, it'll be right-aligned. If you change 
-    Y to true, it'll be bottom-aligned. See this picture for an example:</p>
-  <p align="left"><img src="guide/extents.jpg"></p>
-  <p align="left">In the above picture, I tiled a texture (a black box with yellow 
-    around it) 2.5 times on width and height. The bottom floor shows the default 
-    texture mapping (ReverseExtents false, false, false); you'll notice that it's 
-    aligned to the top-left. In the middle one, I set the X value to true (ReverseExtents 
-    true, false, false). In the top one, I set the Y value to true (ReverseExtents 
-    false, true, false).</p>
-  <p align="left"><strong>m. SetTextureMapping</strong> - manually sets UV texture 
-    mapping for all polygons generated after this command; ResetTextureMapping 
-    restores the values to the defaults or previous<br>
-    Syntax:<font size="2" face="Courier New, Courier, mono"> SetTextureMapping 
-    vertex1, u1, v1, vertex2, u2, v2, vertex3, u3, v3</font><br>
-    Example: <font size="2" face="Courier New, Courier, mono">SetTextureMapping 
-    0, 0, 0, 1, 1, 0, 2, 1, 1</font></p>
-  <p align="left">The example shown above is the default value used by the simulator. 
-    This command maps the texture coordinates to the specified 3 vertex indices 
-    - normally a side of a wall will have 4 vertices/sets of coordinates (0 to 
-    3), and by default the first three are used (top left, top right and bottom 
-    right respectively), with the UV coordinates representing the size percentage 
-    of the texture (with 1 being 100%, 0.5 being 50%, etc; normally this would 
-    relate to absolute texture coordinates) - so in the example, texture coordinate 
-    0,0 (top left) is mapped at the first vertex (top left); texture coordinate 
-    1,0 (really &quot;width, 0&quot;) being mapped at the second vertex (top right), 
-    and texture coordinate 1,1 (really &quot;width, height&quot;) being mapped 
-    to the bottom right. For a standard wall, the valid vertex values are from 
-    0 to 3. If a wall or floor is created with AddCustomWall, and if it has for 
-    example 7 vertex points, the valid values for this command would then be 0 
-    to 6 (but only 3 vertices can be used for mapping purposes). Textures can 
-    also be cropped with this command - for example, to map only a central square 
-    of a texture, you'd use:<br>
-    <font size="2" face="Courier New, Courier, mono">SetTextureMapping 0, 0.25, 
-    0.25, 1, 0.75, 0.25, 2, 0.75, 0.75</font></p>
-  <p align="left">Here's an easier way to see the example above:</p>
-  <p align="left"><font size="2" face="Courier New, Courier, mono">0 -&gt; 0, 
-    0<br>
-    1 -&gt; 1, 0<br>
-    2 -&gt; 1, 1</font></p>
-  <p align="left">The following diagram shows the mapping described above. Texture 
-    location 0,0 is mapped to wall vertex 0, location 1,0 is mapped to vertex 
-    1, etc:</p>
-  <p align="left"><img src="guide/texture_mapping.jpg" width="300" height="300"></p>
-  <p align="left"><strong>n. SetTextureMapping2</strong> - advanced version of 
-    SetTextureMapping - manually sets UV texture mapping for all polygons generated 
-    after this command; ResetTextureMapping restores the values to the defaults 
-    or previous<br>
-    Syntax:<font size="2" face="Courier New, Courier, mono"> SetTextureMapping2 
-    v1x, v1y, v1z, u1, v1, v2x, v2y, v2z, u2, v2, v3x, v3y, v3z, u3, v3</font><br>
-    Example: <font size="2" face="Courier New, Courier, mono">SetTextureMapping2 
-    x0, y0, z0, 0, 0, x1, y1, z1, 1, 0, x2, y2, z2, 1, 1</font></p>
-  <p align="left">See the above description of SetTextureMapping for a detailed 
-    description on texture mapping in general. This command mostly does the same 
-    as that command, and the example given is the default command (and is equivalent 
-    to the SetTextureMapping example). Instead of just choosing which vertex indices 
-    to use like SetTextureMapping, this command lets you create your own texture 
-    vertices (sets of coordinates) using coordinates of already-existing vertices. 
-    The vertex values that can be used start with an &quot;x&quot;, &quot;y&quot; 
-    or &quot;z&quot;, followed by the vertex index. In the example, the X, Y and 
-    Z values of the first vertex are mapped to UV coordinate 0,0 - this is because 
-    &quot;x0, y0, z0&quot; was specified. A specification of &quot;x0, y2, z0&quot; 
-    will use the X and Z values from vertex 0, but the Y value from vertex 2. 
-    This way you can specify coordinates outside of the wall/polygon's range. 
-    Here's an easier way to see the example:</p>
-  <p align="left"><font size="2" face="Courier New, Courier, mono">x0, y0, z0 
-    -&gt; 0, 0<br>
-    x1, y1, z1 -&gt; 1, 0<br>
-    x2, y2, z2 -&gt; 1, 1</font></p>
-  <p align="left"><strong>o. ResetTextureMapping</strong> - resets the texture 
-    mapping parameters to either the default or previous values<br>
-    Syntax:<font size="2" face="Courier New, Courier, mono"> ResetTextureMapping 
-    = default</font><br>
-    Example: <font size="2" face="Courier New, Courier, mono">ResetTextureMapping 
-    = true </font></p>
-  <p align="left">If <em>default</em> is true, the texture mapping values are 
-    reset to the default, which is shown above in the SetTextureMapping's example. 
-    If <em>default</em> is false, the previous values will be loaded and used.</p>
-  <p align="left"><strong>p. ReverseAxis</strong> - reverses the axis that the 
-    difference in altitude/voffset for floors corresponds to. In the AddFloor 
-    command, there are parameters for specifying two different altitudes. By default, 
-    if the altitudes are different, the floor will angle upward/downward along 
-    the Z axis (front/back), but if this is set to true, the floor will angle 
-    along the X axis (left/right).<br>
-    Syntax:<font size="2" face="Courier New, Courier, mono"> ReverseAxis = value</font></p>
-  <p align="left"> <strong>q. ShaftCut</strong> - used in conjunction with a shaft 
-    object - performs a vertical box cut on all floor objects (floors, ceilings, 
-    interfloor, etc) in the specified range.<br>
-    Syntax:<font size="2" face="Courier New, Courier, mono"> ShaftCut number, 
-    startx, startz, endx, endz, start_voffset, end_voffset</font><br>
-    Example: <font size="2" face="Courier New, Courier, mono">ShaftCut 1, -4, 
-    -3.5, 4, 3.5, 0, 5</font></p>
-  <p align="left"><em>Number</em> is the number of the shaft object to work with. 
-    <em>Startx</em>, <em>startz</em>, <em>endx</em>, and <em>endz</em> are two 
-    sets of coordinates that specify the cut box's start position and end position, 
-    relative to the shaft's central position. <em>Start_voffset</em> is the position 
-    above the starting floor's altitude to start the cut at, and <em>end_voffset</em> 
-    is the position above the ending floor's altitude to end the cut at. The example 
-    cuts a box for shaft 1, with a width from -4 to 4, and a length from -3.5 
-    to 3.5, starting at the starting floor's altitude, and ending at 5 feet above 
-    the ending floor's altitude.</p>
-  <p align="left"><strong>r. CutStairwell</strong> - used in conjunction with 
-    a stairwell object - performs a vertical box cut on all floor objects (floors, 
-    ceilings, interfloor, etc) in the specified range. For the parameters, see 
-    the ShaftCut command.<strong><br>
-    </strong>Syntax: <font size="2" face="Courier New, Courier, mono">CutStairwell 
-    number, startx, startz, endx, endz, start_voffset, end_voffset</font><br>
-    Example: <font size="2" face="Courier New, Courier, mono">CutStairwell 1, 
-    -4, -3.5, 4, 3.5, 0, 5</font></p>
-  <p align="left"><strong>s. Isect</strong> - the Isect function calculates the 
-    position that a line intersects with a certain object, such as a floor. Since 
-    this is a function, it can be used in-line anywhere.<br>
-    Syntax:<font size="2" face="Courier New, Courier, mono"> isect(destobject, 
-    objectname, startx, starty, startz, endx, endy, endz)</font><br>
-    Example: <font size="2" face="Courier New, Courier, mono">isect(external, 
-    wall1, 10, 10, 0, -10, 10, 0)</font></p>
-  <p align="left"><em>Destobject</em> is the destination object to get the object 
-    from (floor, external, landscape, or buildings). <em>Startx</em>, <em>starty</em>, 
-    and <em>startz</em> make up the position of the starting position, and <em>endx</em>, 
-    <em>endy</em> and <em>endz</em> make up the ending position. The first intersection 
-    of the named object is the return value, in &quot;X, Y, Z&quot; format (for 
-    example, &quot;10, 1, 3&quot;).</p>
-  <p align="left"><strong>t. SetAutoSize</strong> - enables or disables texture 
-    autosizing<br>
-    Syntax:<font size="2" face="Courier New, Courier, mono"> SetAutoSize = <em>AutoWidth, 
-    AutoHeight </em></font><br>
-    Example: <font size="2" face="Courier New, Courier, mono">SetAutoSize = true, 
-    true</font></p>
-  <p align="left">This command will determine if the simulator should automatically 
-    size texture appropriately when applied to an object, such as a wall or floor. 
-    By default, both are enabled. The <em>AutoWidth</em> and <em>AutoHeight</em> 
-    parameters correspond to the &quot;<em>tw</em>&quot; and &quot;<em>th</em>&quot; 
-    parameters of the <em>AddWall</em>, <em>AddFloor</em>, etc commands. If any 
-    are false, then the parameters specified in the <em>AddWall</em> etc commands 
-    multiply the texture values stored with with the <em>Load</em> or <em>LoadRange</em> 
-    commands (see below); those values relate to the number of times a texture 
-    is tiled; so if <em>AutoHeight</em> is set to False, &quot;2&quot; is specified 
-    in the &quot;<em>th</em>&quot; value of <em>AddWall</em>, and the texture's 
-    stored &quot;th&quot; value is 1, then the texture will be tiled twice vertically. 
-    If either are true, the specified value will me multiplied by the related 
-    stored texture value and then autoadjusted.</p>
-  <p align="left"><strong>u. TextureOverride</strong> - overrides textures for 
-    the next command. Currently only works with the different AddWall, AddFloor 
-    and AddInterFloor commands.<br>
-    Syntax:<font size="2" face="Courier New, Courier, mono"> TextureOverride <em>MainNegativeTex, 
-    MainPositiveTex, SideNegativeTex, SidePositiveTex, TopTex, Bottom</em></font><font size="2" face="Courier New, Courier, mono"><em>Tex</em></font><br>
-    Example: <font size="2" face="Courier New, Courier, mono">TextureOverride 
-    Metal1, ElevFloor, Metal1, Metal1, Metal1, Metal1</font></p>
-  <p align="left">This command will allow you to specify multiple textures for 
-    a single command such as AddWall. It will only work on the command immediately 
-    after this one. In the above example, the Main Positive side of the object 
-    will have the texture &quot;ElevFloor&quot;, but all other sides will use 
-    &quot;Metal1&quot;.</p>
-  <p align="left"><strong>v. ShaftShowFloors</strong> - allows a range of floors 
-    to be shown either while inside the specified shaft or while inside an elevator 
-    in the shaft - primarily for glass elevators.<br>
-    Syntax:<font size="2" face="Courier New, Courier, mono"> ShaftShowFloors <em>ShaftNumber</em> 
-    = <em>range/list</em></font><br>
-    Example: <font size="2" face="Courier New, Courier, mono">ShaftShowFloors 
-    1 = 1 - 10</font></p>
-  <p align="left">In the above example, let's say the user is in an elevator in 
-    shaft 1, and is moving upwards from the 2nd floor. In this situation, the 
-    2nd floor will be visible/enabled while they're in the elevator (since it 
-    was in the range specified with this command), but when they reach the 11th 
-    floor, that floor will be invisible/disabled.</p>
-  <p align="left"><strong>w. ShaftShowOutside</strong> - allows objects outside 
-    the building (sky, landscape, etc) to be enabled while the user is both inside 
-    the specified shaft and on one of the specified floors - primarily for glass 
-    elevators.<br>
-    Syntax:<font size="2" face="Courier New, Courier, mono"> ShowShaftOutside 
-    <em>ShaftNumber</em> = <em>range/list</em></font><br>
-    Example: <font size="2" face="Courier New, Courier, mono">ShowShaftOutside 
-    1 = 1 - 10</font></p>
-  <p align="left">In the above example, if a user is riding an elevator in shaft 
-    1, the outside (sky, landscape, etc) will be enabled while the elevator is 
-    on any of the floors from 1 to 10. Once the elevator reaches the 11th floor, 
-    the outside will be disabled. This command can be mixed with <em>ShaftShowFloors</em> 
-    for mixed atrium/external glass elevators such as the ones in the Glass Tower, 
-    where the elevator moves upwards through an indoor atrium, and eventually 
-    outside above the atrium. In that situation, the floors that comprise the 
-    lower (atrium) section would be specified using <em>ShaftShowFloors</em> (such 
-    as 1-10), while the upper (outdoor) floors would be specified using <em>ShaftShowOutside</em> 
-    (such as 11-20).</p>
-  <p align="left"><strong>x. ShowFullShaft</strong> - determines if an entire 
-    shaft should always be shown, such as a glass elevator track.<br>
-    Syntax:<font size="2" face="Courier New, Courier, mono"> ShowFullShaft <em>ShaftNumber</em> 
-    = <em>value</em></font><br>
-    Example: <font size="2" face="Courier New, Courier, mono">ShowFullShaft 1 
-    = true</font></p>
-  <p align="left"><strong>y. TextureFlip</strong> - flips specified textures for 
-    the next command.. Currently only works with the different AddWall, AddFloor 
-    and AddInterFloor commands. The values available are 0 for no flipping, 1 
-    for horizontal flip, 2 for vertical flip, and 3 for both horizontal and vertical.<br>
-    Syntax:<font size="2" face="Courier New, Courier, mono"> TextureFlip <em>MainNegative, 
-    MainPositive, SideNegative, SidePositive, Top, Bottom</em></font><br>
-    Example: <font size="2" face="Courier New, Courier, mono">TextureFlip 1, 1, 
-    0, 0, 0, 0</font></p>
-  <p align="left">This command will allow you to flip textures on specific parts 
-    of a wall or floor created with a command such as AddWall. It will only work 
-    on the command immediately after this one. In the above example, the Main 
-    Positive and Main Negative sides of the object will have their textures flipped 
-    horizontally.</p>
-  <p align="left"><strong>z. Cut</strong> - performs a manual box cut on an object<br>
-    Syntax: <font size="2" face="Courier New, Courier, mono">Cut <em>destobject</em>, 
-    x1, y1, z1, x2, y2, z2, cutwalls, cutfloors<br>
-    </font>Example: <font size="2" face="Courier New, Courier, mono">Cut external, 
-    -5, -5, -5, 5, 5, 5, false, true</font></p>
-  <p align="left">The x, y and z values specify the start and end coordinates 
-    of the box cut. If cutwalls is true, the function will cut walls; if cutfloors 
-    is true, it'll cut floors.</p>
-  <p align="left"><strong>aa. Mount</strong> - mounts a zip file in the data directory 
-    into a virtual path.<br>
-    Syntax: <font size="2" face="Courier New, Courier, mono">Mount <em>filename</em>, 
-    <em>path</em></font><br>
-    Example: <font size="2" face="Courier New, Courier, mono">Mount myfile.zip, 
-    mydirectory</font></p>
-  <p align="left">In this example, the file myfile.zip located in Skyscraper's 
-    data directory will be mounted as &quot;mydirectory&quot;, and so a file such 
-    as test.jpg inside that zip file will appear as &quot;mydirectory/test.jpg&quot;.</p>
-  <p align="left"><strong>ab. AddFloorAutoArea</strong> - defines an area that 
-    will automatically enable and disable floors when the user moves within it, 
-    similar to a stairwell<br>
-    Syntax: <font size="2" face="Courier New, Courier, mono">AddFloorAutoArea 
-    <em>x1, y1, z1, x2, y2, z2</em></font><br>
-    Example: <font size="2" face="Courier New, Courier, mono">AddFloorAutoArea 
-    -100, 0, -100, 100, 100, 100</font></p>
-  <p align="left"><strong>ac. AddSound</strong> - creates a user-defined looping 
-    sound at the specified position<br>
-    Syntax: <font size="2" face="Courier New, Courier, mono">AddSound <em>name, 
-    filename, x, y, z[, volume, speed, min_distance, max_distance, dir_radiation, 
-    direction_x, direction_y, direction_z]</em></font><br>
-    Example 1: <font size="2" face="Courier New, Courier, mono">AddSound MySound, 
-    sound.wav, 10, 100, 5<br>
-    </font>Example 2: <font size="2" face="Courier New, Courier, mono">AddSound 
-    MySound, ambient.ogg, 10, 100, 5, 1, 100, 1, -1, 0, 0, 0, 0</font></p>
-  <p align="left">This command creates a custom sound in the specified position, 
-    and has a number of optional parameters - the defaults for the optional parameters 
-    are shown in Example 2. If you're going to use any of the optional parameters, 
-    you must specify them all. <em>X</em>, <em>Y</em> and <em>Z</em> specify the 
-    location in 3D space that the sound will be at, <em>volume</em> specifies 
-    the volume percentage (with 1.0 being 100%) of the sound, <em>speed</em> determines 
-    the playback speed of the sound in percent, <em>min_distance</em> and <em>max_distance</em> 
-    set the minimum and maximum distances that the sound can be heard at full 
-    volume - by default, minimum is 1 and maximum is -1. <em>Dir_radiation</em> 
-    specifies the directional radiation of the sound in radians (more info below), 
-    and <em>direction_x</em>, <em>direction_y</em> and <em>direction_z</em> specify 
-    the direction of the sound cone.</p>
-  <p align="left"> From the Crystal Space docs on directional radiation:<br>
-    &quot;The directional radiation applies to sound that are oriented in a particular 
-    direction. This value is expressed in radians and describes the half-angle 
-    of a cone spreading from the position of the source and opening in the direction 
-    of the source. Set this value to 0.0 for an omni-directional sound.&quot;</p>
-  <p align="left"><strong>ad. GetWallExtents</strong> - the GetWallExtents command 
-    returns the X and Z extents (minimum and maximum values) of a wall, at the 
-    specified altitude. The command will return the results in the MinX, MinZ, 
-    MaxX and MaxZ variables.<br>
-    Syntax:<font size="2" face="Courier New, Courier, mono"> GetWallExtents destobject, 
-    wallname, altitude</font><br>
-    Example: <font size="2" face="Courier New, Courier, mono">GetWallExtents external, 
-    wall1:front, 10</font></p>
-  <p align="left">Then to use the values:<br>
-    Example: <font size="2" face="Courier New, Courier, mono">Set 2 = %minz%</font></p>
-  <p align="left"><em>Destobject</em> is the destination object to get the object 
-    from (floor, external, landscape, or buildings). <em>Wallname </em>specifies 
-    the name of the wall to get the extents from. Generally this should be in 
-    the form of &quot;name:side&quot;, but if you leave out the &quot;side&quot; 
-    parameter, it'll choose one of the sides from a pre-defined search list. Sides 
-    of walls made from any AddWall command generally have &quot;front&quot;, &quot;back&quot;, 
-    &quot;left&quot; and &quot;right&quot; sides. Walls made using AddCustomWall 
-    and AddTriangleWall have sides of &quot;0&quot; (front) and &quot;1&quot; 
-    (back), so with those you'd specify &quot;name:0&quot; for the front. <em>Altitude</em> 
-    specifies the altitude to use for the check - basically it makes a copy of 
-    the wall, cuts it down to a line at that altitude, and returns the coordinates 
-    of the endpoints. The command will store the results in the MinX, MinZ, MaxX 
-    and MaxZ variables, which can be used anywhere in the script - to get the 
-    minimum X result, you'd use %minx%.</p>
-  <p align="left"><strong>ae. Print</strong> - prints the contents of a line to 
-    the console. This command will still convert variables and even math expressions, 
-    and output the results.<br>
-    Syntax:<font size="2" face="Courier New, Courier, mono"> Print text</font><br>
-    Example: <font size="2" face="Courier New, Courier, mono">Print 1+1</font></p>
-  <p align="left">&nbsp;</p>
-  <p align="left"><strong>8. END command</strong></p>
-  <p align="left">The End command tells the software to stop processing the current 
-    script and start the simulation. This is optional.<br>
-    Example: <font size="2" face="Courier New, Courier, mono">&lt;end&gt;</font></p>
-  <p align="left"><br>
-    <strong>10. BREAK command</strong></p>
-  <p align="left">The Break command triggers a break section in the script processor, 
-    and is used when running the simulator in debug mode. A debugger breakpoint 
-    can be set on the associated line in fileio.cpp, and when this command is 
-    called, the debugger will hit the breakpoint.<br>
-    Example: <font size="2" face="Courier New, Courier, mono">&lt;break&gt;</font></p>
-  <p align="left">&nbsp;</p>
-  <p align="left"><strong><font size="+1"><a name="Functions" id="Functions"></a>9. 
-    Predefined Functions</font></strong></p>
-  <p align="left">There are a number of script functions provided by the simulator. 
-    Currently there's only a single script for elevator doors - see the Simple 
-    building (noted at the bottom of this page) for an example. These functions 
-    can be used by putting this line in your script:</p>
-  <p align="left"><font size="2" face="Courier New, Courier, mono">&lt;Include data/scripts/elevator_doors.txt&gt;</font></p>
-  <p align="left">You'll then be able to use some predefined door functions:</p>
-  <p align="left"><strong>1. elevdoor_single</strong> - creates a single-slide 
-    elevator door.<br>
-    Syntax: <font size="2" face="Courier New, Courier, mono">elevdoor_single(<em>door_number, 
-    texture, side_texture, thickness, CenterX, CenterZ, width, height, door_direction, 
-    movement_direction, speed, is_shaft_door</em>)</font></p>
-  <p align="left">Door_Direction is either &quot;left&quot;, &quot;right&quot;, 
-    &quot;front&quot; or &quot;back&quot; and is the direction the doors face 
-    (torwards the outside of the elevator). Movement_direction is the direction 
-    the door should move.</p>
-  <p align="left"><strong>2. elevdoor_center</strong> - creates a center-open 
-    elevator door.<br>
-    Syntax: <font size="2" face="Courier New, Courier, mono">elevdoor_center(<em>door_number, 
-    texture, side_texture, thickness, CenterX, CenterZ, width, height, door_direction, 
-    speed, is_shaft_door</em>)</font></p>
-  <p align="left"><strong>3. elevdoor_center_classic</strong> - creates a center-open 
-    elevator door with a partially open interior door.<br>
-    Syntax: <font size="2" face="Courier New, Courier, mono">elevdoor_center_classic(<em>door_number, 
-    texture, side_texture, thickness, CenterX, CenterZ, width, height, door_direction, 
-    speed, is_shaft_door</em>)</font></p>
-  <p align="left"><strong>4. elevdoor_dualspeed_left</strong> - creates a dual-speed 
-    door that opens to the left<br>
-    Syntax: <font size="2" face="Courier New, Courier, mono">elevdoor_dualspeed_left(<em>door_number, 
-    texture, side_texture, thickness, CenterX, CenterZ, width, height, door_direction, 
-    speed, is_shaft_door</em>)</font></p>
-  <p align="left"><strong>5. </strong><strong>elevdoor_dualspeed_right</strong> 
-    - creates a dual-speed door that opens to the right<br>
-    Syntax: <font size="2" face="Courier New, Courier, mono">elevdoor_dualspeed_right(<em>door_number, 
-    texture, side_texture, thickness, CenterX, CenterZ, width, height, door_direction, 
-    speed, is_shaft_door</em>)</font></p>
-  <p align="left"><strong>6. </strong><strong>elevdoor_center_dualspeed</strong> 
-    - creates a dual-speed center-open door<br>
-    Syntax: <font size="2" face="Courier New, Courier, mono">elevdoor_center_dualspeed(<em>door_number, 
-    texture, side_texture, thickness, CenterX, CenterZ, width, height, door_direction, 
-    speed, is_shaft_door</em>)</font></p>
-  <p align="left">&nbsp;</p>
-  <p align="left"><strong><font size="+1"><a name="Example"></a>10. Small Example 
-    Building</font></strong></p>
-  <p align="left">To see an example of a small simplistic building in code, look 
-    at the Simple.bld file in Skyscraper's buildings directory. It's also available 
-    online <a href="http://cvs.tliquest.net/viewvc/*checkout*/skyscraper/buildings/Simple.bld">here</a>.</p>
-  <p align="left">&nbsp;</p>
+<p align="left"><strong><font size="+1"><a name="Globals"></a>3. The
+<em>Globals</em> Section</font></strong></p>
+
+<p align="left">The <em>Globals</em> section contains the general information
+about your building. The section starts with this header:<br>
+<font face="Courier New, Courier, mono" size="2">&lt;Globals&gt;</font></p>
+
+<p align="left">and ends with this footer:<br>
+<font face="Courier New, Courier, mono" size="2">&lt;EndGlobals&gt;</font></p>
+
+<p align="left">Parameters are placed between those two markers, and look like
+this:<br>
+<font face="Courier New, Courier, mono" size="2">Parameter =
+<em>value</em></font></p>
+
+<p align="left">Example:<br>
+<font face="Courier New, Courier, mono" size="2">Name = Triton Center</font></p>
+
+<p align="left"><strong>Parameters (all are optional):</strong></p>
+
+<p align="left"><strong>1. Name</strong> - building name<br>
+Example: <font face="Courier New, Courier, mono" size="2">Name = My
+Building</font></p>
+
+<p align="left"><strong>2. Designer</strong> - name of building's designer<br>
+<font face="Courier New, Courier, mono" size="2">Designer = Me</font><br>
+<br>
+<strong>3. Location</strong> - location of the building<br>
+<font face="Courier New, Courier, mono" size="2">Location = 100 Main
+Street</font></p>
+
+<p align="left"><strong>4. Description</strong> - Brief description of the
+building<br>
+<font face="Courier New, Courier, mono" size="2">Description = A really average
+building</font><br>
+<br>
+<strong>5. Version</strong> - Version of the building (can be text)<br>
+<font face="Courier New, Courier, mono" size="2">Version = 1</font><br>
+<br>
+<strong>6. CameraFloor</strong> - camera's starting floor, starting with 0
+(like Floors command) - default is 0<br>
+<font face="Courier New, Courier, mono" size="2">CameraFloor = 0</font><br>
+<br>
+<strong>7. CameraPosition</strong> - camera's starting position in X
+(left/right) and Z (forward/backward) feet coordinates - default is "0, 0"<br>
+Syntax: <font face="Courier New, Courier, mono" size="2">CameraPosition =
+<em>X</em>, <em>Z</em></font><br>
+<font face="Courier New, Courier, mono" size="2">CameraPosition = 0,
+-10</font><br>
+<br>
+<strong>8. CameraDirection</strong> - specifies a 3D point that the camera is
+looking at on startup (instead of specifying rotation), in X (left/right), Y
+(up down), and Z (forward/backward) feet coordinates.<br>
+<font face="Courier New, Courier, mono" size="2">CameraDirection = 0, 10,
+28.8</font></p>
+
+<p align="left"><strong>9. CameraRotation</strong> - axis rotation of the
+camera on startup - X is degrees up/down, Y is degrees left/right, and Z is
+spin. Default is "0, 0, 0", and the example makes the camera face right.<br>
+Syntax: <font face="Courier New, Courier, mono" size="2">CameraRotation =
+<em>X</em>, <em>Y</em>, <em>Z</em></font><br>
+<font face="Courier New, Courier, mono" size="2">CameraRotation = 0, 90,
+0</font></p>
+
+<p align="left"><strong>10. Sky</strong> - which skybox texture pack to use, if
+the Caelum sky system is off. In the following example, the chosen pack is
+"noon", and the file "sky-noon.zip" will be loaded. Default is "noon".<br>
+<font face="Courier New, Courier, mono" size="2">Sky = noon<br>
+</font></p>
+
+<p align="left"><strong>11. DynamicSky </strong>- which Caelum sky script to
+use. In the following example, the script is "RainWind", which is listed in the
+data/caelum/sky.os resource file.  Default is "DefaultSky".<br>
+<font face="Courier New, Courier, mono" size="2">DynamicSky = RainWind<br>
+</font></p>
+
+<p style="text-align:left;margin-left:0;margin-right:auto;">Available sky types
+in data/caelum/sky.os file:<br>
+DefaultBase<br>
+DefaultSky<br>
+BigPuffyStars<br>
+BigPuffyStarsWithFogComposer<br>
+MidnightSun<br>
+Eclipse<br>
+FogSky<br>
+RainWind<br>
+RainUp<br>
+ShadowDebug<br>
+HugeAmbientFactor<br>
+BasicCloud<br>
+OverrideCloud<br>
+CloudMesh<br>
+CloudFade<br>
+SkyDomeOverrideHazeTest<br>
+GroundFogNoise<br>
+SandStormTest</p>
+
+<p align="left"><strong>12. InterfloorOnTop</strong> - determines if the
+interfloor area should be located at the bottom or top of each floor.
+Interfloor areas represent the area used by floor trusses (supports), between a
+level's ceiling and the next level. Since each floor needs supports below it,
+the default is false.<br>
+<font face="Courier New, Courier, mono" size="2">InterfloorOnTop =
+true</font></p>
+
+<p align="left"><strong>13. Collisions</strong> - enables/disables collisions
+(default is true)<br>
+<font face="Courier New, Courier, mono" size="2">Collisions = false</font></p>
+
+<p align="left"><strong>14. Gravity</strong> - enables/disables gravity
+(default is true)<br>
+<font face="Courier New, Courier, mono" size="2">Gravity = false</font></p>
+
+<p align="left"> </p>
+
+<p align="left"><strong><font size="+1"><a name="Textures"></a>4. The
+<em>Textures</em> Section</font></strong></p>
+
+<p align="left">The Textures section loads textures into the simulation and
+assigns names to them, for use in the rest of the sections. The section starts
+with this header:<br>
+<font face="Courier New, Courier, mono" size="2">&lt;Textures&gt;</font></p>
+
+<p align="left">and ends with this footer:<br>
+<font face="Courier New, Courier, mono" size="2">&lt;EndTextures&gt;</font></p>
+
+<p align="left"><strong>1. Load</strong> - loads a texture<br>
+Syntax: <font face="Courier New, Courier, mono" size="2">Load
+<em>filename</em>, <em>name</em>, <em>tile_x</em>, <em>tile_y[,
+force</em></font>]<br>
+Example: <font face="Courier New, Courier, mono" size="2">Load data\brick1.jpg,
+Brick, 1, 1</font></p>
+
+<p align="left">This example will load the file brick.jpg and name it Brick.
+The values <em>tile_x</em> and <em>tile_y</em> are per-texture multipliers. For
+example, if you set <em>tile_x</em> to 2, and you specify a texture width (tw)
+of 2 during an <em>AddFloor</em> command later, the tiling value will be 4 (2
+times 2), and the texture will be repeated 4 times horizontally. The
+<em>force</em> value is optional, and if set to false, autosizing will always
+be disabled for this texture; if set to true, autosizing will always be
+enabled.</p>
+
+<p align="left"><strong>2. LoadRange</strong> - loads a numeric range of
+textures, and the current number is available in the <em>number</em> variable
+(<font face="Courier New, Courier, mono" size="2">%number%</font>)<br>
+Syntax: <font face="Courier New, Courier, mono" size="2">LoadRange
+<em>startnumber</em>, <em>endnumber</em>, <em>filename</em>, <em>name</em>,
+<em>tile_x</em>, <em>tile_y[, force] </em></font><br>
+Example: <font face="Courier New, Courier, mono" size="2">LoadRange 2, 138,
+data\floorindicators\%number%.jpg, Button%number%, 1, 1</font></p>
+
+<p align="left">This example will load the file 2.jpg and name it Button2,
+3.jpg as Button3, and so on. The values <em>tile_x</em> and <em>tile_y</em> are
+per-texture multipliers. For example, if you set <em>tile_x</em> to 2, and you
+specify a texture width (tw) of 2 during an <em>AddFloor</em> command later,
+the tiling value will be 4 (2 times 2), and the texture will be repeated 4
+times horizontally. The <em>force</em> value is optional, and if set to false,
+autosizing will always be disabled for this texture; if set to true, autosizing
+will always be enabled.</p>
+
+<p style="text-align:left;margin-left:0;margin-right:auto;"><strong>3.
+LoadAnimated</strong> - loads a set of textures to use as a single animated
+texture<br>
+Syntax: <font face="Courier New, Courier, mono" size="2">LoadAnimated
+<em>filename1, filename2, ..., name, duration, tile_x, tile_y[, force]<br>
+</em></font>Example: <font face="Courier New, Courier, mono"
+size="2">LoadAnimated data/pic1.jpg, data/pic2.jpg, data/pic3.jpg, myanimation,
+2, 1, 1</font></p>
+
+<p style="text-align:left;margin-left:0;margin-right:auto;">This example will
+load the files pic1.jpg, pic2.jpg and pic3.jpg and associate them with the
+texture material "myanimation". When "myanimation" is used, those three images
+will automatically be displayed in order, in a loop. <em>Duration</em> refers
+to the length of the animation in seconds. The values <em>tile_x</em> and
+<em>tile_y</em> are per-texture multipliers. For example, if you set
+<em>tile_x</em> to 2, and you specify a texture width (tw) of 2 during an
+<em>AddFloor</em> command later, the tiling value will be 4 (2 times 2), and
+the texture will be repeated 4 times horizontally. The <em>force</em> value is
+optional, and if set to false, autosizing will always be disabled for this
+texture; if set to true, autosizing will always be enabled.</p>
+
+<p style="text-align:left;margin-left:0;margin-right:auto;"><strong>4.
+LoadAlphaBlend</strong> - loads a texture with a specular mask texture and
+blending texture, used to make things like reflection effects<br>
+Syntax: <font face="Courier New, Courier, mono" size="2">LoadAlphaBlend
+<em>filename, specular_filename, blend_filename, name, spherical, tile_x,
+tile_y[, force]<br>
+</em></font>Example: <font face="Courier New, Courier, mono"
+size="2">LoadAlphaBlend data/windows.jpg, data/windows_spec.png, data/sky.jpg,
+mywindows, true, 1, 1<br>
+</font>This example will load the texture windows.jpg normally, and will load
+windows_spec.png as a specular mask (which needs to be a file that contains an
+alpha blended image that is used to determine how the blending texture applies
+to the original texture), and loads a texture to blend as sky.jpg (see
+Skyscraper's data folder for examples of this). The <em>spherical</em>
+parameter determines if the texture is spherically mapped (true) or planar
+mapped (false). The values <em>tile_x</em> and <em>tile_y</em> are per-texture
+multipliers. For example, if you set <em>tile_x</em> to 2, and you specify a
+texture width (tw) of 2 during an <em>AddFloor</em> command later, the tiling
+value will be 4 (2 times 2), and the texture will be repeated 4 times
+horizontally. The <em>force</em> value is optional, and if set to false,
+autosizing will always be disabled for this texture; if set to true, autosizing
+will always be enabled.</p>
+
+<p style="text-align:left;margin-left:0;margin-right:auto;"><strong>5.
+LoadMaterial</strong> - loads a custom OGRE material, used for
+advanced/specific texture definitions<br>
+Syntax: <font face="Courier New, Courier, mono" size="2">LoadMaterial
+<em>material_name, name, </em><em><em>tile_x, tile_y[, force]<br>
+</em></em></font>Example: <font face="Courier New, Courier, mono"
+size="2">LoadMaterial testmat, mycustommaterial, 1, 1<br>
+</font>Material definitions (and their associated textures) are stored in
+Skyscraper's data/materials folder, and are all automatically loaded on
+startup. The material definitions (the example being testmat.material) contain
+a material name along with the texture processing parameters. The material name
+specified in this command needs to match the one in the material definition you
+want to use; the example file is named "testmat". <em>Name</em> is the standard
+texture name you want to map it to, to use with other commands. The other
+commands are the same as in previous commands. For more information on how to
+make material definition scripts, see the <a
+href="http://www.ogre3d.org/docs/manual/manual_14.html#Material-Scripts">OGRE
+manual's "Material Scripts" section</a>.</p>
+
+<p align="left"><strong>6. AddText</strong> - draws text onto a texture - this
+only creates a new texture during runtime (in memory), and all changes are lost
+when the application shuts down<br>
+Syntax: <font face="Courier New, Courier, mono" size="2">AddText
+<em>texture_name, name, font_filename, font_size, text, x1, y1, x2, y2,
+h_align, v_align, ColorR, ColorG, ColorB[, force</em></font><em>]<br>
+</em>Example: <font face="Courier New, Courier, mono" size="2">AddText Black,
+Button100, nimbus_sans.ttf, 47, 100, -1, -1, -1, -1, center, center, 255, 255,
+255</font></p>
+
+<p align="left">With this command, <em>texture_name</em> is the name of the
+previously loaded texture to draw text onto (loaded with either Load or
+LoadRange). <em>Name</em> is the name to call this new texture.
+<em>Font_filename</em> is the filename of the font to use - fonts are in
+Skyscraper's data/fonts directory. <em>X1</em>, <em>y1</em>, <em>x2</em>, and
+<em>y2</em> are coordinate values mainly used to position the text in a boxed
+area, with the position of 0, 0 (x 0, y 0) being on the top left.. If any value
+is -1, the dimension of the texture will be used (so in this example, the
+loaded texture has a size of 128x128 pixels, and so the values are 0, 0, 128,
+128). This will place the text in the center of the texture image, but to
+position it elsewhere, specify the pixel box to place it in. <em>H_align</em>
+and <em>v_align</em> determine the alignment of the text - for h_align, it can
+either be "left", "right" or "center", and for v_align either "top", "bottom"
+or "center". <em>ColorR</em>, <em>ColorG</em> and <em>ColorB</em> determine the
+color of the text, and the values range from 0 to 255. If all values are 255,
+the text is white, and if all values are 0, then it's black. The <em>force</em>
+value is optional, and if set to false, autosizing will always be disabled for
+this texture; if set to true, autosizing will always be enabled.</p>
+
+<p align="left"><strong>7. AddTextRange</strong> - similar to LoadRange, but
+draws text onto a texture<br>
+Syntax: <font face="Courier New, Courier, mono" size="2">AddText
+<em>startnumber, endnumber, texture_name, name, font_filename, font_size, text,
+x1, y1, x2, y2, h_align, v_align, ColorR, ColorG, ColorB[,
+force</em></font><em>]<br>
+</em>Example: <font face="Courier New, Courier, mono" size="2">AddText 1, 100,
+Black, Button%number%, nimbus_sans.ttf, 47, %number%, -1, -1, -1, -1, center,
+center, 255, 255, 255</font></p>
+
+<p align="left"><strong>8. LoadCropped</strong> - loads a cropped image.<br>
+Syntax: <font face="Courier New, Courier, mono" size="2">LoadCropped
+<em>filename, name, x, y, width, height, tile_x, tile_y[,
+force</em></font><em>]<br>
+</em>Example: <font face="Courier New, Courier, mono" size="2">LoadCropped
+data\brick1.jpg, Brick2, 10, 10, 20, 20, 1, 1</font></p>
+
+<p align="left">This command is similar to the Load command, but loads only a
+portion of an image. In the above example, the command loads the file
+data\brick1.jpg as "Brick2", but only loads the portion of the image starting
+at pixel 10, 10, with a width of 20 pixels and a heigth of 20 pixels. Pixel 0,
+0 is on the top left of the image. The <em>force</em> value is optional, and if
+set to false, autosizing will always be disabled for this texture; if set to
+true, autosizing will always be enabled.</p>
+
+<p align="left"><strong>9. AddOverlay</strong> - draws an image on top of
+another image<br>
+Syntax: <font face="Courier New, Courier, mono" size="2">AddOverlay
+<em>texture_name, overlay_texture_name, name, x, y, width, height, tile_x,
+tile_y[, force]</em></font><em><br>
+</em>Example: <font face="Courier New, Courier, mono" size="2">AddOverlay
+Brick1, Brick2, NewBrick, 25, 25, 50, 50, 1, 1</font></p>
+
+<p align="left">This command allows multiple textures to be combined into a
+single texture, by drawing one on top of the other. <em>Texture_name</em>
+specifies the original source texture name to use (all textures must be loaded
+beforehand), <em>overlay_texture_name</em> specifies the texture to draw on top
+of the source texture, and <em>name</em> specifies the name of the new texture.
+<em>X</em> and <em>Y</em> determine the position to place the top-left of the
+new image at (since position 0, 0 is the top left of the image), and
+<em>width</em> and <em>height</em> determine the size in pixels of the overlay
+texture. In the above example, the "Brick2" texture is drawn on top of the
+"Brick1" texture, starting at pixel position 25, 25, with a width of 50 and a
+height of 50. The resulting texture is called "NewBrick". The <em>force</em>
+value is optional, and if set to false, autosizing will always be disabled for
+this texture; if set to true, autosizing will always be enabled.</p>
+
+<p align="left"><strong>10. Rotate</strong> - sets a texture's rotation to a
+set amount. This can be used with other texture modifiers.<br>
+Syntax: <font face="Courier New, Courier, mono" size="2">Rotate <em>name,
+angle<br>
+</em></font>Example: <font face="Courier New, Courier, mono" size="2">Rotate
+Brick1, 30</font></p>
+
+<p align="left" style="text-align:left;margin-left:0;margin-right:auto;">This
+command sets the texture's rotation value. In the example, the Brick1 texture's
+rotation is set to 30 degrees (clockwise).</p>
+
+<p style="text-align:left;margin-left:0;margin-right:auto;"><strong>11.
+RotateAnim</strong> - applies rotation animation to a texture. This can be used
+with other texture modifiers.<br>
+Syntax: <font face="Courier New, Courier, mono" size="2">RotateAnim <em>name,
+speed<br>
+</em></font>Example: <font face="Courier New, Courier, mono"
+size="2">RotateAnim Brick1, 0.2</font></p>
+
+<p align="left">This command sets the texture's animated rotation value.
+<em>Speed</em> is in rotations per second. In the example, the Brick1 texture's
+rotation animation is set to 0.2 rotations per second.</p>
+
+<p style="text-align:left;margin-left:0;margin-right:auto;"><strong>12.
+Scroll</strong> - set's a texture's fixed scrolling value. This can be used
+with other texture modifiers.<br>
+Syntax: <font face="Courier New, Courier, mono" size="2">Scroll <em>name,
+x_offset, y_offset<br>
+</em></font>Example: <font face="Courier New, Courier, mono" size="2">Scroll
+Brick1, 0.5, 0.5</font></p>
+
+<p align="left">This command sets the texture's scrolling value. In the
+example, the Brick1 texture is shifted to the right halfway, and shifted up
+halfway.</p>
+
+<p style="text-align:left;margin-left:0;margin-right:auto;"><strong>13.
+ScrollAnim</strong> - applies scrolling animation to a texture. This can be
+used with other texture modifiers.<br>
+Syntax: <font face="Courier New, Courier, mono" size="2">ScrollAnim <em>name,
+x_speed, y_speed<br>
+</em></font>Example: <font face="Courier New, Courier, mono"
+size="2">ScrollAnim Brick1, 1, 1</font></p>
+
+<p align="left">The <em>speed</em> values are the number of full scrolls per
+second. In the example, the Brick1 texture will scroll to the right once per
+second, and up once per second.</p>
+
+<p style="text-align:left;margin-left:0;margin-right:auto;"><strong>14.
+Scale</strong> - sets a texture's scaling factor. This can be used with other
+texture modifiers.<br>
+Syntax: <font face="Courier New, Courier, mono" size="2">Scale <em>name,
+x_scale, y_scale<br>
+</em></font>Example: <font face="Courier New, Courier, mono" size="2">Scale
+Brick1, 30</font></p>
+
+<p align="left">In the example, the Brick1 texture is scaled to half the size,
+in both width and height.</p>
+
+<p style="text-align:left;margin-left:0;margin-right:auto;"><strong>15.
+Transform</strong> - sets an advanced transformation method on the texture.
+This can be used with other texture modifiers, and also can be used multiple
+times to create multiple transformations.<br>
+Syntax: <font face="Courier New, Courier, mono" size="2">Transform <em>name,
+type, wave_type, base, frequency, phase, amplitude<br>
+</em></font>Example: <font face="Courier New, Courier, mono" size="2">Transform
+Brick1, rotate, sine, 0.2, 0.2, 0.1, 1.0</font></p>
+
+<p align="left">This command applies an advanced transformation method on the
+texture. Type is the animation type modified, and can either be <em>scroll_x,
+scroll_y, rotate, </em><em></em><em>scale_x</em><em></em>, or
+<em>scale</em><em>_y</em>. <em>Wave_type</em> defines the type of waveform
+applied to the transformation, which creates a variable speed of the animation.
+The values are <em>sine</em> (a typical sine wave which smoothly loops between
+min and max values), <em>triangle</em> (an angled wave which increases &amp;
+decreases at constant speed, changing instantly at the extremes),
+<em>square</em> (max for half the wavelength, min for the rest with instant
+transition between), <em>sawtooth</em> (gradual steady increase from min to max
+over the period with an instant return to min at the end),
+<em>inverse_sawtooth</em> (gradual steady decrease from max to min over the
+period, with an instant return to max at the end), or <em>pwm</em> (Pulse Width
+Modulation; like square, except the high to low transition is controlled by
+duty cycle). <em>Base</em> is the base value of the wave (base value, the
+minimum if amplitude &gt; 0, the maximum if amplitude &lt; 0),
+<em>frequency</em> is the number of wave iterations per second (speed),
+<em>phase</em> is the offset of the wave start, and <em>amplitude</em> is the
+size of the wave.</p>
+
+<p></p>
+
+<p></p>
+<br>
+
+
+<p align="left"><strong><font size="+1"><a name="Floor"></a>5. The
+<em>Floor</em> Sections</font></strong></p>
+
+<p align="left">The Floor section can either be defined as a single floor,
+using the <em>Floor</em> name, or as a range of floors, using the
+<em>Floors</em> name.<br>
+For a single floor, the section would start with this:<br>
+<font face="Courier New, Courier, mono" size="2">&lt;Floor
+<em>number</em>&gt;</font><br>
+and end with this:<br>
+<font face="Courier New, Courier, mono" size="2">&lt;EndFloor&gt;</font><br>
+For example, a floor section for a lobby would use this:<br>
+<font face="Courier New, Courier, mono" size="2">&lt;Floor 0&gt;</font></p>
+
+<p align="left">For multiple floors, the section would start with this:<br>
+<font face="Courier New, Courier, mono" size="2">&lt;Floors <em>start</em> to
+<em>finish</em>&gt;</font><br>
+and end with this:<br>
+<font face="Courier New, Courier, mono" size="2">&lt;EndFloors&gt;<br>
+</font>For example, to work with floors 5-10, you would type:<font
+face="Courier New, Courier, mono" size="2"><br>
+&lt;Floors 5 to 10&gt;</font><br>Or to work with basement floors -1 to -5, you would type:
+<font face="Courier New, Courier, mono" size="2"><br>&lt;Floors -1 to -5&gt;</font></p>
+
+<p align="left">Ranges in this can be specified in either direction.  Floors above ground start with 0 (so a 15-story building would
+have floors 0-14). Also, floors must be made in the proper order: basement
+levels must be made first in decending order (-1, -2, -3 etc), and then
+above-ground floors in ascending order (0, 1, 2, etc).</p>
+
+<p align="left"><strong>Variables:</strong></p>
+
+<p align="left"><font face="Courier New, Courier, mono"
+size="2"><strong>%floor%</strong></font> - contains the current floor number<br>
+<font face="Courier New, Courier, mono"
+size="2"><strong>%height%</strong></font> - contains the current floor's
+ceiling height<br>
+<font face="Courier New, Courier, mono"
+size="2"><strong>%interfloorheight%</strong></font> - contains the current
+floor's interfloor height (spacing between floors)<br>
+<font face="Courier New, Courier, mono"
+size="2"><strong>%fullheight%</strong></font> - contains the current floor's
+total height, including the interfloor height<br>
+<font face="Courier New, Courier, mono" size="2"><strong>%base%</strong></font>
+- if the InterfloorOnTop parameter in the Globals section is set to 'false'
+(the default), then Base refers to the floor's altitude plus interfloor height;
+otherwise it's the floor's altitude<br>
+</p>
+
+<p align="left"><strong>Parameters:</strong></p>
+
+<p align="left"><strong>1. Name</strong> - the name of the current floor,
+required<br>
+Example: <font face="Courier New, Courier, mono" size="2">Name = Floor
+%floor%</font></p>
+
+<p align="left"><strong>2. ID</strong> - the floor indicator name for the
+current floor, such as L (for Lobby), LL (lower level), M (Mezzanine), etc.
+This is also used to determine what texture should be loaded for the elevator
+floor indicators and floor signs. The texture name would be "Button[ID]" - so
+if the ID is 10, the texture name would be "Button10".<br>
+<font face="Courier New, Courier, mono" size="2">ID = %floor%</font></p>
+
+<p align="left"><strong>3. Type</strong> - the type of floor the current floor
+is. The types are still being defined, but the currently used ones are
+Basement, Lobby, Mezzanine, Conference, Office, Service, Skylobby, Hotel,
+Apartment, Condominium, Restaurant, Observatory, Recreation, Ballroom,
+Communications, and Roof. (Required)<br>
+<font face="Courier New, Courier, mono" size="2">Type = Office</font></p>
+
+<p align="left"><strong>4. Description</strong> - description of the current
+floor, optional<br>
+<font face="Courier New, Courier, mono" size="2">Description =
+Offices</font></p>
+
+<p align="left"><strong>5. Height</strong> - the floor-to-ceiling height of the
+current floor, required<br>
+<font face="Courier New, Courier, mono" size="2">Height = 9.5</font></p>
+
+<p align="left"><strong>6. InterfloorHeight</strong> - the height in feet of
+the space between floors (below each floor), starting at the floor's altitude,
+and ending right below the level's floor; required.<br>
+<font face="Courier New, Courier, mono" size="2">InterfloorHeight =
+2.24</font></p>
+
+<p align="left"><strong>7. Altitude</strong> - this parameter is optional and
+is only recommended if the first level has an interfloor area that needs to be
+below ground. If this parameter is not used, the altitude will be calculated
+automatically.<br>
+<font face="Courier New, Courier, mono" size="2">Altitude = -2.24</font></p>
+
+<p align="left"><strong>8. Group</strong> - group floors together. This is a
+list of comma-separated floor numbers (or a range specified with the - symbol)
+that should be enabled along with this floor when the user arrives at this
+floor. For example, if a 2-story room has a balcony, and the room base and
+balcony are separate floors, you would specify the other floor's number in this
+parameter.<br>
+Examples:<br>
+<font face="Courier New, Courier, mono" size="2">Group = 5</font><br>
+<font face="Courier New, Courier, mono" size="2">Group = 4, 5<br>
+Group = 4 - 10</font></p>
+
+<p align="left"><br>
+<strong>Commands:</strong></p>
+
+<p align="left"><strong>1. Exit</strong> - exits the current floor section</p>
+
+<p align="left"><strong>2. AddFloor</strong> - adds a textured floor with the
+specified dimensions to the current floor/level<br>
+Syntax: <font face="Courier New, Courier, mono" size="2">AddFloor <em>name,
+texturename</em>, <em>thickness, x1</em>, <em>z1</em>, <em>x2</em>,
+<em>z2</em>, <em>voffset1</em>, <em>voffset2, reverse_axis, texture_direction,
+tw</em>, <em>th, isexternal</em></font><br>
+Example: <font face="Courier New, Courier, mono" size="2">AddFloor My Floor,
+brick, 0.5, -10, -10, 10, 10, 0, 0, False, False, 0, 0, False</font></p>
+
+<p align="left"><em>Voffset1</em> and <em>voffset2</em> are the height in feet
+above the current floor's altitude; <em>tw</em> and <em>th</em> are to
+size/tile the texture (0 lets the app autosize them), and <em>isexternal</em>
+determines if the floor is part of the building's external framework, or is
+part of the current floor (is either True or False). <em>Name</em> is a
+user-defined name for the object. The <em>reverse_axis</em> parameter reverses
+the axis that the difference in altitude/voffset for floors corresponds to. If
+this is false, and the altitude values are different, the floor will angle
+upward/downward along the Z axis (front/back), and if set to true, the floor
+will angle along the X axis (left/right). If <em>texture_direction</em> is
+false, the texture will be mapped horizontally on the floor; if true, it'll be
+mapped vertically.</p>
+
+<p align="left"><strong>3. AddWall</strong> - adds a textured wall with the
+specified dimensions to the current floor/level<br>
+Syntax: <font face="Courier New, Courier, mono" size="2">AddWall <em>name,
+texturename</em>, <em>thickness, x1</em>, <em>z1</em>, <em>x2</em>,
+<em>z2</em>, <em>height1</em>, <em>height2</em>, <em>voffset1</em>,
+<em>voffset2</em>, <em>tw</em>, <em>th</em>, <em>isexternal</em></font><br>
+Example: <font face="Courier New, Courier, mono" size="2">AddWall My Wall,
+brick, 0.5, -10, -10, 10, 10, 10, 10, 0, 0, 0, 0, False</font></p>
+
+<p align="left"><em>Height1</em> is the wall height in feet at the first
+coordinate set (x1 and z1), and <em>height2</em> is for the second set (x2, and
+z2). <em>Voffset1</em> is the vertical offset in feet (from the floor's
+altitude) for the first coordinate set, and <em>voffset2</em> is for the second
+set. <em>Tw</em> and <em>th</em> are the texture sizing/tiling multipliers, and
+<em>isexternal</em> determines if the wall is part of the building's external
+framework (true) or if it's part of the current floor (false).</p>
+
+<p align="left"><strong>4. AddInterfloorFloor</strong> - adds a textured floor
+below the floor of the current floor/level<br>
+Syntax: <font face="Courier New, Courier, mono" size="2">AddInterfloorFloor
+<em>name, texturename</em>, <em>thickness, x1</em>, <em>z1</em>, <em>x2</em>,
+<em>z2</em>, <em>voffset1</em>, <em>voffset2, reverse_axis, texture_direction,
+tw</em>, <em>th</em></font><br>
+Example: <font face="Courier New, Courier, mono" size="2">AddInterfloorFloor My
+IFloor, brick, 0.5, -10, -10, 10, 10, 0, 0, 0, 0</font></p>
+
+<p align="left">The parameters are the same as the AddFloor command, except the
+<em>voffset</em> values are the height offset in feet above the current floor's
+altitude, and not above the base floor level.</p>
+
+<p align="left"><strong>5. AddInterfloorWall</strong> - adds a textured wall
+below the floor of the current floor/level<br>
+Syntax: <font face="Courier New, Courier, mono" size="2">AddInterfloorWall
+<em>name, texturename</em>, <em>thickness, x1</em>, <em>z1</em>, <em>x2</em>,
+<em>z2</em>, <em>height1</em>, <em>height2</em>, <em>voffset1</em>,
+<em>voffset2</em>, <em>tw</em>, <em>th</em></font></p>
+
+<p align="left">The parameters are the same as the AddWall command, and the
+<em>voffset</em> values are the same as the AddInterfloorFloor command.</p>
+
+<p align="left"><strong>6. AddShaftFloor</strong> - adds a textured floor to
+the specified shaft, on the current floor<br>
+Syntax: <font face="Courier New, Courier, mono" size="2">AddShaftFloor
+<em>number, name, texturename</em>, <em>thickness, x1</em>, <em>z1</em>,
+<em>x2</em>, <em>z2</em>, <em>voffset1</em>, <em>voffset2, reverse_axis,
+texture_direction, tw</em>, <em>th</em></font><br>
+Example: <font face="Courier New, Courier, mono" size="2">AddShaftFloor 1, My
+Floor, brick, 0.5, -10, -10, 10, 10, 0, 0, false, false, 0, 0</font></p>
+
+<p align="left">The parameters are the same as the AddFloor command, and the
+<em>number</em> value is the shaft number to use. The <em>x1</em>, <em>z1</em>,
+<em>x2,</em> and <em>z2</em> parameters are offsets of the shaft's origin
+(similar to creating elevator walls and floors)</p>
+
+<p align="left"><strong>7. AddShaftWall</strong> - adds a textured wall to the
+specified shaft, on the current floor<br>
+Syntax: <font face="Courier New, Courier, mono" size="2">AddShaftWall
+<em>number, name, texturename</em>, <em>thickness, x1</em>, <em>z1</em>,
+<em>x2</em>, <em>z2</em>, <em>height1</em>, <em>height2</em>,
+<em>voffset1</em>, <em>voffset2</em>, <em>tw</em>, <em>th</em></font></p>
+
+<p align="left">The parameters are the same as the AddWall command, and the
+<em>number</em> value is the shaft number to use. Also, the <em>x1</em>,
+<em>z1</em>, <em>x2,</em> and <em>z2</em> parameters are offsets of the shaft's
+origin (similar to creating elevator walls and floors)</p>
+
+<p align="left"><strong>8. AddStairsFloor</strong> - adds a textured floor to
+the specified stairwell, on the current floor<br>
+Syntax: <font face="Courier New, Courier, mono" size="2">AddStairsFloor
+<em>number, name, texturename</em>, <em>thickness, x1</em>, <em>z1</em>,
+<em>x2</em>, <em>z2</em>, <em>voffset1</em>, <em>voffset2, reverse_axis,
+texture_direction, tw</em>, <em>th</em></font><br>
+Example: <font face="Courier New, Courier, mono" size="2">AddStairsFloor 1, My
+Floor, brick, 0.5, -10, -10, 10, 10, 0, 0, false, false, 0, 0</font></p>
+
+<p align="left">The parameters are the same as the AddFloor command, and the
+<em>number</em> value is the stairwell number to use</p>
+
+<p align="left"><strong>9. AddStairsWall</strong> - adds a textured wall to the
+specified stairwell, on the current floor<br>
+Syntax: <font face="Courier New, Courier, mono" size="2">AddStairsWall
+<em>number, name, texturename</em>, <em>thickness, x1</em>, <em>z1</em>,
+<em>x2</em>, <em>z2</em>, <em>height1</em>, <em>height2</em>,
+<em>voffset1</em>, <em>voffset2</em>, <em>tw</em>, <em>th</em></font></p>
+
+<p align="left">The parameters are the same as the AddWall command, and the
+<em>number</em> value is the stairwell number to use. Also, the <em>x1</em>,
+<em>z1</em>, <em>x2</em>, and <em>z2</em> parameters are offsets of the
+stairwell's origin (similar to creating elevator walls and floors) </p>
+
+<p align="left"><strong>10. ColumnWallBox</strong> - creates 4 walls (box) at
+the specified coordinate locations, as part of the current floor's columnframe
+mesh<br>
+Syntax: <font face="Courier New, Courier, mono" size="2">ColumnWallBox
+<em>name, texturename</em>, <em>x1</em>, <em>x2</em>, <em>z1</em>, <em>z2</em>,
+<em>height</em>, <em>voffset</em>, <em>tw</em>, <em>th, inside, outside, top,
+bottom </em></font><br>
+Example: <font face="Courier New, Courier, mono" size="2">ColumnWallBox My Box,
+brick, -10, 10, -10, 10, 15, 0, 0, 0, true, true, true, true</font></p>
+
+<p align="left">For parameter information, see the CreateWallBox command above.
+In this command, the default voffset is the floor's altitude.</p>
+
+<p align="left"><strong>11. ColumnWallBox2</strong> - creates 4 walls (box) at
+a specified central location, as part of the current floor's columnframe mesh
+<br>
+Syntax: <font face="Courier New, Courier, mono" size="2">ColumnWallBox2
+<em>name, texturename</em>, <em>centerx</em>, <em>centerz</em>,
+<em>widthx</em>, <em>lengthz</em>, <em>height</em>, <em>voffset</em>,
+<em>tw</em>, <em>th</em><em>, inside, outside, top, bottom </em></font><br>
+Example: <font face="Courier New, Courier, mono" size="2">ColumnWallBox2 My
+Box, brick, 0, 0, 10, 10, 15, 0, 0, 0, false, true, false, false</font></p>
+
+<p align="left">For parameter information, see the CreateWallBox2 command
+above. In this command, the default voffset is the floor's altitude.</p>
+
+<p align="left"><strong>12. CallButtonElevators</strong> - comma-separated list
+of elevators the next created call button set will work with (this must be
+specified before CreateCallButtons)<br>
+Example: <font face="Courier New, Courier, mono" size="2">CallButtonElevators =
+1, 2, 3, 4</font></p>
+
+<p align="left"><strong>13. CreateCallButtons</strong> - creates a call button
+set<br>
+Syntax: <font face="Courier New, Courier, mono" size="2">CreateCallButtons
+<em>BackTexture</em>, <em>UpButtonTexture</em>, <em>UpButtonTexture_Lit,
+DownButtonTexture, DownButtonTexture_Lit, CenterX, CenterZ, voffset, direction,
+BackWidth, BackHeight, ShowBack, tw, th<br>
+</em></font>Example:<font face="Courier New, Courier, mono"
+size="2"><em></em>Create Marble, CallButtonsUp, CallButtonsUpLit,
+CallButtonsDown, CallButtonsDownLit, -10, 0, 4, right, 0.5, 1, true, 1,
+1</font></p>
+
+<p align="left"><em>BackTexture</em> is the texture of the wall plate behind
+the buttons</p>
+
+<p align="left"><em>UpButtonTexture</em> and <em>DownButtonTexture</em> are the
+textures used for the buttons themselves (unlit). <em>UpButtonTexture_Lit</em>
+and <em>DownButtonTexture_Lit</em> specify the lit button textures.</p>
+
+<p align="left"><em>CenterX</em> and <em>CenterZ</em> are the central location
+of the call button set object</p>
+
+<p align="left"><em>voffset</em> is the altitude offset that the object is
+above each floor</p>
+
+<p align="left"><em>direction </em>determines the direction the call buttons
+face:<br>
+'front' means they face towards the front of the building<br>
+'back' means they face towards the back of the building<br>
+'left' means they face left<br>
+'right' means they face right</p>
+
+<p align="left"><em>BackWidth</em> and <em>BackHeight</em> are the width and
+height of the wall plate</p>
+
+<p align="left"><em>ShowBack</em> determines if the wall plate should be shown,
+and is either true or false</p>
+
+<p align="left"><em>tw</em> and <em>th</em> are the texture scaling for the
+wall plate.</p>
+
+<p align="left">The up and down buttons will be automatically created based on
+the combined range of the elevators specified with the CallButtonElevators command
+(above).</p>
+
+<p align="left"><strong>14. AddStairs</strong> - creates a custom staircase at
+the specified location.<br>
+Syntax: <font face="Courier New, Courier, mono" size="2">AddStairs <em>number,
+name, texture, direction, CenterX, CenterZ, width, risersize, treadsize,
+num_stairs, voffset, tw, th</em></font><br>
+Example: <font face="Courier New, Courier, mono" size="2">AddStairs 1,
+TestStairs, Brick, left, 10, 15, 5, 0.5, 0.5, 10, 0, 0, 0</font></p>
+
+<p align="left">The <em>direction</em> parameter specifies the direction the
+staircase faces (where the bottom step is), and so if a staircase goes up from
+left to right, the direction would be <em>left</em>. <em>Width</em> specifies
+the step width; <em>risersize</em> specifies the height of each step riser
+(vertical portion); <em>treadsize</em> specifies the length of each step
+tread/run (horizontal portion); <em>num_stairs</em> specifies the total number
+of steps to create (including the above landing platform, but not including the
+base platform). To calculate the length of the staircase, multiply
+<em>(num_stairs</em> - 1) with <em>treadsize</em>; in the above example, that
+would be 9 * 0.5. To determine the height of the staircase, multiply
+<em>num_stairs</em> with <em>risersize</em>. Note that the tread of the top
+step is not drawn (the top step is the landing platform); therefore for a
+staircase containing 10 steps, the total staircase width would be comprised of
+9 treads (which is why the length calculation used num_stairs minus 1).</p>
+
+<p align="left"><strong>15. AddDoor</strong> - adds a textured door in the
+specified location, and performs a wall cut on that area (this must be called
+after the associated wall is created)<br>
+Syntax: <font face="Courier New, Courier, mono" size="2">AddDoor <em>opensound,
+closesound, open, texturename, thickness</em>, <em>direction, speed,
+CenterX</em>, <em>CenterZ</em>, <em>width</em>, <em>height</em>,
+<em>voffset</em>, <em>tw</em>, <em>th<br>
+</em></font>Example:<font face="Courier New, Courier, mono" size="2"> AddDoor
+1, , , False, DoorTexture, 0.2, 1, 0, -8.5, 0, 3.5, 8, 0, 1, 1</font></p>
+
+<p align="left"><em>Direction</em> specifies the direction the door faces (the
+side in which the handle is on the left) and also the direction it opens. These
+are the values:<br>
+1 - faces left, opens left<br>
+2 - faces left, opens right<br>
+3 - faces right, opens right<br>
+4 - faces right, opens left<br>
+5 - faces front, opens front<br>
+6 - faces front, opens back<br>
+7 - faces back, opens back<br>
+8 - faces back, opens front</p>
+
+<p align="left">The default door speed is 75; you can also specify 0 for the
+speed to use the system default. The <em>open</em> parameter determines if the
+door should be opened on start; default is false. Leave the sound fields blank
+for no sounds to be played.<br>
+</p>
+
+<p align="left"><strong>16. AddStairsDoor</strong> - adds a textured door for
+the specified stairwell, in a location relative to the stairwell's center. This
+also performs a wall cut on that area (this must be called after the associated
+wall is created)<br>
+Syntax: <font face="Courier New, Courier, mono" size="2">AddStairsDoor
+<em>number, opensound, closesound, open, texturename, thickness</em>,
+<em>direction, speed, CenterX</em>, <em>CenterZ</em>, <em>width</em>,
+<em>height</em>, <em>voffset</em>, <em>tw</em>, <em>th</em></font></p>
+
+<p align="left"><em>Number</em> specifies the stairwell number.
+<em>Direction</em> specifies the direction the door faces and also the
+direction it opens. For values of this, look at the AddDoor command above.
+Leave the <em>sound</em> fields blank for no sounds to be played.</p>
+
+<p style="text-align:left;margin-left:0;margin-right:auto;"><strong>17.
+AddShaftStdDoor</strong> - adds a standard textured door for the specified
+shaft, in a location relative to the shaft's center. This also performs a wall
+cut on that area (this must be called after the associated wall is created).
+This shouldn't be confused with the AddShaftDoor command, which creates
+elevator shaft doors.<br>
+Syntax: <font face="Courier New, Courier, mono" size="2">AddShaftStdDoor
+<em>number, opensound, closesound, open, texturename, thickness</em>,
+<em>direction, speed, CenterX</em>, <em>CenterZ</em>, <em>width</em>,
+<em>height</em>, <em>voffset</em>, <em>tw</em>, <em>th</em></font><em><br>
+<br>
+Number</em> specifies the stairwell number. <em>Direction</em> specifies the
+direction the door faces and also the direction it opens. For values of this,
+look at the AddDoor command above. Leave the <em>sound</em> fields blank for no
+sounds to be played.</p>
+
+<p align="left"><strong>17. AddDirectionalIndicator</strong> - creates a single
+elevator directional indicator/lantern on the current floor (similar to the
+CreateCallButtons command) <br>
+Syntax: <font face="Courier New, Courier, mono"
+size="2">AddDirectionalIndicator<em> Elevator, Relative, ActiveDirection,
+Single, Vertical, BackTexture</em>, <em>UpTexture</em>, <em>UpTextureLit,
+DownTexture, DownTextureLit, CenterX, CenterZ, voffset, direction, BackWidth,
+BackHeight, ShowBack, tw, th<br>
+</em></font>Example: <font face="Courier New, Courier, mono"
+size="2"><em>AddDirectionalIndicator 1, true, false, false, true, Metal,
+UpLight, UpLightOn, DownLight, DownLightOn, -3, -4.162, 6, front, 0.5, 1, true,
+0, 0</em></font></p>
+
+<p align="left">This command will create a directional indicator on the current
+floor (if <em>ActiveDirection</em> is false, then it'll only create it if the
+elevator serves that floor). It'll also automatically create the up and down
+lights depending on the floor.</p>
+
+<p align="left"><em>Elevator</em> specifies the elevator to create the
+indicators for.</p>
+
+<p align="left"><em>Relative</em> determines if the X and Z coordinates are
+relative to the elevator's origin (center) or not.</p>
+
+<p align="left"><em>ActiveDirection</em> determines if the indicator should
+continuously display the active elevator direction (true), or if it should show
+the elevator's direction for the current call (false, default)</p>
+
+<p align="left"><em>Single</em> determines if a single indicator light should
+be created instead of two. If this is true, the unlit texture is specified in
+<em>UpLight</em>, and the <em>DownLight</em> value is ignored.</p>
+
+<p align="left"><em>Vertical</em> determines if the two lights should be
+vertically separated (true), or horizontally separated (false)</p>
+
+<p align="left"><em>BackTexture</em> is the texture of the wall plate behind
+the lights</p>
+
+<p align="left"><em>UpTexture</em> and <em>DownTexture</em> are the textures
+used for the lights themselves, and the "Lit" texures are the ones to show when
+the light is on. <em>DownTexture</em> is ignored if <em>Single</em> is true.</p>
+
+<p align="left"><em>CenterX</em> and <em>CenterZ</em> are the central location
+of the indicators</p>
+
+<p align="left"><em>voffset</em> is the altitude offset that the object is
+above each floor</p>
+
+<p align="left"><em>direction </em>determines the direction the indicators
+face:<br>
+'front' means they face towards the front of the building<br>
+'back' means they face towards the back of the building<br>
+'left' means they face left<br>
+'right' means they face right</p>
+
+<p align="left"><em>BackWidth</em> and <em>BackHeight</em> are the width and
+height of the wall plate</p>
+
+<p align="left"><em>ShowBack</em> determines if the wall plate should be shown,
+and is either true or false</p>
+
+<p align="left"><em>tw</em> and <em>th</em> are the texture scaling for the
+wall plate.</p>
+
+<p align="left"><strong>18. AddShaftDoor</strong> - creates shaft elevator
+doors on the current floor only<br>
+Syntax: <font face="Courier New, Courier, mono"
+size="2">AddShaftDoor<em> elevator, number, lefttexture, righttexture</em>,
+<em>thickness, CenterX, CenterZ, voffset, tw, th</em></font><br>
+Syntax (with old SetShaftDoors command): <font
+face="Courier New, Courier, mono" size="2">AddShaftDoor<em> elevator, number,
+lefttexture, righttexture</em>, <em>tw, th</em></font></p>
+
+<p align="left">The AddShaftDoor command creates working shaft elevator doors
+on the current floor only - the other command, <em>AddShaftDoors</em> (in the
+<em>elevator</em> section) creates all shaft doors in a single command. This
+command is useful for specifying different textures for shaft doors depending
+on the floor, and also for only creating shaft doors on one side if an elevator
+serves a specific floor. The <em>SetShaftDoors</em> command in the elevator
+section must be used before using this command. Parameters such as width,
+height, and direction are taken from the <em>AddDoors</em> command (so the
+regular elevator doors need to be created first). The <em>voffset</em>
+parameter allows you to create shaft doors at a different vertical position
+than the base of the floor, and the elevator will automatically stop according
+to the shaft door's voffset for that floor. These doors should be moved
+slightly away from the elevator doors (to separate them both). Also, this
+command cuts any shaft walls that are within the door area (and so this must be
+called after the shaft walls are created). <em>Number</em> specifies the number
+of the door to create (related to the <em>Doors</em> command) - if the elevator
+only has one door, or if the <em>Doors</em> command was not used, specify 1
+here.</p>
+
+<p align="left"><strong>19. AddFloorIndicator</strong> - creates a floor
+indicator associated with a specific elevator<br>
+Syntax: <font face="Courier New, Courier, mono"
+size="2">AddFloorIndicator<em> elevator, relative, texture_prefix, direction,
+CenterX, CenterZ, width, height, voffset</em></font> </p>
+
+<p align="left">The AddFloorIndicator command creates a floor indicator at the
+position specified by <em>CenterX</em> and <em>CenterZ</em>, associated with
+the elevator specified by <em>elevator</em>. <em>Direction</em> is the
+direction the indicator faces, and can be either "left", "right", "front" or
+"back". <em>Relative</em> determines if the <em>CenterX</em> and
+<em>CenterZ</em> values are relative of the elevator's center or not. This
+command can be given multiple times to create multiple indicators.
+<em>Texture_prefix</em> is the base name of the texture to load when displaying
+a floor ID; for example if the indicator is on floor 3, and you specify a
+prefix of "Button", it'll load the "Button3" texture.</p>
+
+<p align="left"><strong>20. Cut</strong> - performs a manual box cut on an area
+within the current floor<br>
+Syntax: <font face="Courier New, Courier, mono" size="2">Cut <em>x1, y1, z1,
+x2, y2, z2, cutwalls, cutfloors</em><br>
+</font>Example: <font face="Courier New, Courier, mono" size="2">Cut -5, -5,
+-5, 5, 5, 5, false, true</font></p>
+
+<p align="left">The <em>x</em>, <em>y</em> and <em>z</em> values specify the
+start and end coordinates of the box cut. The Y values are relative to the
+current floor's altitude. If <em>cutwalls</em> is true, the function will cut
+walls; if <em>cutfloors</em> is true, it'll cut floors.</p>
+
+<p align="left"><strong>21. CutAll</strong> - performs a manual box cut on all
+objects associated with the current floor (the level itself, interfloor,
+shafts, stairs and external)<br>
+Syntax: <font face="Courier New, Courier, mono" size="2">CutAll <em>x1, y1, z1,
+x2, y2, z2, cutwalls, cutfloors</em><br>
+</font>Example: <font face="Courier New, Courier, mono" size="2">CutAll -5, -5,
+-5, 5, 5, 5, false, true</font></p>
+
+<p align="left">The <em>x</em>, <em>y</em> and <em>z</em> values specify the
+start and end coordinates of the box cut. The Y values are relative to the
+current floor's altitude. If <em>cutwalls</em> is true, the function will cut
+walls; if <em>cutfloors</em> is true, it'll cut floors.</p>
+
+<p align="left"><strong>22. AddFillerWalls</strong> - helper function to add
+fillers around a door's cut location. When a door is created, the wall in it's
+location is cut to provide space; after the cut, the sides are open (if the
+wall has thickness) - this creates a covering wall on each side and a floor
+above the door frame to fill the area.<br>
+Syntax: <font face="Courier New, Courier, mono" size="2">AddFillerWalls
+<em>texture, thickness, CenterX, CenterZ, width, height, voffset, direction,
+tw, th</em><br>
+</font>Example: <font face="Courier New, Courier, mono" size="2">AddFillerWalls
+ConnectionWall, 0.5, -10, 0, 3.5, 8, 0, true, 0, 0</font></p>
+
+<p align="left">The parameters in this function are similar to the related
+door's parameters. <em>Direction</em> is either true if the door faces the
+front/back (width is along the X axis), or false if the door faces left/right
+(width is along the Z axis).</p>
+
+<p align="left"><strong>23. AddSound</strong> - creates a user-defined sound at
+the specified position<br>
+Syntax: <font face="Courier New, Courier, mono" size="2">AddSound <em>name,
+filename, x, y, z, loop[, volume, speed, min_distance, max_distance,
+doppler_level, cone_inside_angle, cone_outside_angle, cone_outside_volume,
+direction_x, direction_y, direction_z]</em></font><br>
+Example 1: <font face="Courier New, Courier, mono" size="2">AddSound MySound,
+sound.wav, 10, 100, 5, true<br>
+</font>Example 2: <font face="Courier New, Courier, mono" size="2">AddSound
+MySound, sound.wav, 10, 100, 5, true, 1, 100, 1, -1, 0, 360, 360, 1, 0, 0,
+0</font></p>
+
+<p align="left">For information on the parameters, see the AddSound command in
+the Globals section. The only difference here is that the Y value is relative
+of the floor's base (altitude plus interfloor height). <em>Loop</em> specifies
+if the sound should loop and play on startup.</p>
+
+<p align="left"><strong>24. AddShaftDoorComponent</strong> - creates a single
+shaft door component, used for creating custom door styles<br>
+Syntax: <font face="Courier New, Courier, mono" size="2">AddShaftDoorComponent
+<em>elevator, number, name, texture, sidetexture, thickness, direction,
+openspeed, closespeed, x1, z1, x2, z2, height, voffset, tw, th, side_tw,
+side_th</em></font></p>
+
+<p align="left">This command is almost identical to the AddDoorComponent
+command (in the elevator section below - see that for more information), except
+that it creates shaft doors. Use the FinishShaftDoor command after creating the
+components. The components don't need to line up with the floor's base; the
+elevator will automatically stop at the base of the shaft door for each floor.
+This command replaces the AddShaftDoor command.</p>
+
+<p align="left"><strong>25. FinishShaftDoor</strong> - finishes shaft door
+creation - use this after all related AddShaftDoorComponent commands are used,
+or specify it without the AddShaftDoorComponent commands if you're creating a
+manual shaft door.<br>
+Syntax: <font face="Courier New, Courier, mono"
+size="2">FinishShaftDoor<em> elevator, number[, create_walls]</em></font></p>
+
+<p align="left">This command is almost identical to the FinishDoors command (in
+the elevator section below - see that for more information) except that it's
+used for finishing a shaft door.</p>
+
+<p style="text-align:left;margin-left:0;margin-right:auto;"><strong>26.
+AddModel</strong> - adds a 3D model to the floor. The model's
+textures/materials must be defined in a separate ".material" file, and a
+separate collider mesh ".collider" will be loaded. If a collider mesh isn't
+available, a simple box collider will be created.<br>
+Syntax: <font face="Courier New, Courier, mono" size="2">AddModel<em> name,
+filename, center, CenterX, CenterY, CenterZ, RotationX, RotationY, RotationZ,
+MaxRenderDistance, ScaleMultiplier, EnablePhysics, Restitution, Friction,
+Mass</em><em><br>
+</em></font>Example:<font face="Courier New, Courier, mono" size="2"> AddModel
+MyModel, cube.mesh, true, 0, 0, 0, 0, 0, 0, 0, 1, false, 0, 0, 0</font><br>
+Example:<font face="Courier New, Courier, mono" size="2"> AddModel MyModel,
+cube.mesh, true, 0, 0, 0, 0, 0, 0, 0, 1, true, 0.1, 0.5, 0.1</font></p>
+
+<p></p>
+
+<p align="left">The <em>Center</em> value is either true or false, and
+determines if the loaded model should be automatically centered, otherwise the
+exact mesh positioning in the model file will be used. The <em>CenterY</em>
+value is relative to the current floor's base. <em>MaxRenderDistance</em>
+determines the maximum distance in feet that the object will be shown (0 means
+unlimited). <em>ScaleMultiplier</em> allows you to change the size of the
+object during the load - for example, set to 2 to double the size. Models are
+in the OGRE native mesh format. In the example, the material/texture file is
+cube.material, and the optional collider mesh file is cube.collider.
+<em>EnablePhysics</em> enables Bullet physics on the object (physics will only
+work if you don't provide a collider mesh), and <em>Restitution</em>,
+<em>Friction</em> and <em>Mass</em> determine the physical properties of the
+object.</p>
+
+<p align="left"><strong>27. AddStairsModel</strong> - adds a 3D model to the
+specified stairwell, on the current floor. See the AddModel command above for
+parameter information.<br>
+Syntax: <font face="Courier New, Courier, mono"
+size="2">AddStairsModel<em> number, name, filename, center, CenterX, CenterY,
+CenterZ, RotationX, RotationY, RotationZ, MaxRenderDistance, ScaleMultiplier,
+EnablePhysics, Restitution, Friction, Mass</em><em><br>
+</em></font>Example:<font face="Courier New, Courier, mono" size="2"> AddModel
+1, MyModel, cube.mesh, true, 0, 0, 0, 0, 0, 0, 0, 1, false, 0, 0, 0</font></p>
+
+<p align="left">The <em>CenterY</em> value is relative to the current floor's
+altitude. </p>
+
+<p align="left"><strong>28. AddShaftModel</strong> - adds a 3D model to the
+specified shaft, on the current floor. See the AddModel command above for
+parameter information.<br>
+Syntax: <font face="Courier New, Courier, mono"
+size="2">AddShaftModel<em> number, name, filename, center, CenterX, CenterY,
+CenterZ, RotationX, RotationY, RotationZ, MaxRenderDistance, ScaleMultiplier,
+EnablePhysics, Restitution, Friction, Mass</em><em><br>
+</em></font>Example:<font face="Courier New, Courier, mono" size="2"> AddModel
+1, MyModel, cube.mesh, true, 0, 0, 0, 0, 0, 0, 0, 1, false, 0, 0, 0</font></p>
+
+<p align="left">The <em>CenterY</em> value is relative to the current floor's
+altitude. </p>
+
+<p style="text-align:left;margin-left:0;margin-right:auto;"><strong>29.
+AddActionControl</strong> - creates a custom control that uses a specific
+action defined by AddAction.<br>
+Syntax: <font face="Courier New, Courier, mono" size="2">AddActionControl
+<em>name, sound, direction, centerx, centerz, width, height, voffset,
+action_name(s), texture_name(s)<br>
+</em></font>Example: <font face="Courier New, Courier, mono"
+size="2">AddActionControl MyControl, switch.wav, front, -10, 10, 1.5, 1.5, 4,
+UndoMyAction, MyAction, Touch, TouchLit<br>
+</font><br>
+AddActionControl command creates an advanced control similar to elevator button
+panel controls, but assigned to an action created with the AddAction command.
+The <em>action_name(s)</em> and <em>texture_name(s)</em> parameters allow you
+to specify a list of actions, and a list of textures to go along with those
+actions. There needs to be a texture for every action; if you specify 3 actions
+and only 2 textures, you will get an error. The control starts up in the first
+action, and switches to the next actions in sequence when it's clicked.
+<em>Direction</em> is the direction the control itself will face in 3D space
+(front, left, right, back). <em>Voffset</em> is relative of the floor's base.
+Leave the <em>sound</em> field blank for no sound to be played.</p>
+
+<p style="text-align:left;margin-left:0;margin-right:auto;"><strong>30.
+AddShaftActionControl</strong> - creates a custom control in a specified shaft
+that uses a specific action defined by AddAction.<br>
+Syntax: <font face="Courier New, Courier, mono" size="2">AddShaftActionControl
+<em>number, name, sound, direction, centerx, centerz, width, height, voffset,
+action_name(s), texture_name(s)<br>
+</em></font>Example: <font face="Courier New, Courier, mono"
+size="2">AddShaftActionControl 1, MyControl, switch.wav, front, -10, 10, 1.5,
+1.5, 4, UndoMyAction, MyAction, Touch, TouchLit<br>
+</font><br>
+This command creates an advanced control similar to elevator button panel
+controls, but assigned to an action created with the AddAction command. The
+<em>action_name(s)</em> and <em>texture_name(s)</em> parameters allow you to
+specify a list of actions, and a list of textures to go along with those
+actions. There needs to be a texture for every action; if you specify 3 actions
+and only 2 textures, you will get an error. The control starts up in the first
+action, and switches to the next actions in sequence when it's clicked.
+<em>Direction</em> is the direction the control itself will face in 3D space
+(front, left, right, back). <em>Voffset</em> is relative of the floor's base.
+Leave the <em>sound</em> field blank for no sound to be
+played.<strong></strong></p>
+
+<p style="text-align:left;margin-left:0;margin-right:auto;"><strong>31.
+AddStairsActionControl</strong> - creates a custom control in a specified
+stairwell that uses a specific action defined by AddAction.<br>
+Syntax: <font face="Courier New, Courier, mono" size="2">AddStairsActionControl
+<em>number, name, sound, direction, centerx, centerz, width, height, voffset,
+action_name(s), texture_name(s)<br>
+</em></font>Example: <font face="Courier New, Courier, mono"
+size="2">AddStairsActionControl 1, MyControl, switch.wav, front, -10, 10, 1.5,
+1.5, 4, UndoMyAction, MyAction, Touch, TouchLit<br>
+</font><br>
+This command creates an advanced control similar to elevator button panel
+controls, but assigned to an action created with the AddAction command. The
+<em>action_name(s)</em> and <em>texture_name(s)</em> parameters allow you to
+specify a list of actions, and a list of textures to go along with those
+actions. There needs to be a texture for every action; if you specify 3 actions
+and only 2 textures, you will get an error. The control starts up in the first
+action, and switches to the next actions in sequence when it's clicked.
+<em>Direction</em> is the direction the control itself will face in 3D space
+(front, left, right, back). <em>Voffset</em> is relative of the floor's base.
+Leave the <em>sound</em> field blank for no sound to be
+played.<strong></strong></p>
+
+<p style="text-align:left;margin-left:0;margin-right:auto;"><strong>32.
+AddTrigger</strong> - creates a trigger that is used to signal an action when
+the user's camera enters or leaves the defined area.<br>
+Syntax: <font face="Courier New, Courier, mono" size="2">AddTrigger <em>name,
+sound, start_x, start_y, start_z, end_x, end_y, end_z, action_names(s)<br>
+</em></font>Example:<font face="Courier New, Courier, mono"
+size="2"> AddTrigger MyTrigger, switch.wav, -30, 0, -30, -20, 10, -20,
+UndoMyAction, MyAction</font><br>
+<br>
+AddTrigger creates a trigger similar to action controls (AddActionControl) and
+elevator controls. The <em>action_names(s)</em> parameter allows you to specify
+a list of actions that this trigger will call when the camera enters or exits
+the area. The trigger starts in the first action, and will switch to each
+consecutive action when the users enters/leaves. The <em>X</em>, <em>Y</em> and
+<em>Z</em> parameters specify the 3D box that defines the trigger area. Y is
+relative of the floor's base. Leave the <em>sound</em> field blank for no sound
+to be played.</p>
+
+<p align="left"><strong></strong></p>
+
+<p align="left"><strong><font size="+1"><a name="Elevator"></a>6. The
+<em>Elevator</em> Section</font></strong></p>
+
+<p align="left">The <em>Elevator</em> section allows you to create elevators
+for your building. Elevators are numbered, starting with 1. Parameters that
+have defaults listed are optional.</p>
+
+<p align="left">The section headers and footers are similar to the ones in the
+Floor section.<br>
+To specify a single elevator, you would type something like:<br>
+<font face="Courier New, Courier, mono" size="2">&lt;Elevator 1&gt;</font><br>
+and end it with:<br>
+<font face="Courier New, Courier, mono" size="2">&lt;EndElevator&gt;</font><br>
+<br>
+For a range of elevators, you would use something like:<br>
+<font face="Courier New, Courier, mono" size="2">&lt;Elevators 2 to
+10&gt;</font><br>
+and end with:<br>
+<font face="Courier New, Courier, mono" size="2">&lt;EndElevators&gt;</font></p>
+
+<p align="left"><strong>Variables:</strong></p>
+
+<p align="left"><font face="Courier New, Courier, mono"
+size="2"><strong>%elevator%</strong></font> - number of the current elevator</p>
+
+<p align="left"><strong>Parameters</strong>:</p>
+
+<p align="left"><strong>1. Name</strong> - sets the name of the elevator<br>
+Example: <font face="Courier New, Courier, mono" size="2">Name = Service
+Elevator</font></p>
+
+<p align="left"><strong>2. Speed</strong> - maximum speed of the elevator, in
+feet per second<br>
+Example: <font face="Courier New, Courier, mono" size="2">Speed = 20</font></p>
+
+<p align="left"><strong>3. Acceleration</strong> - acceleration speed of the
+elevator, in feet per second<br>
+Example: <font face="Courier New, Courier, mono" size="2">Acceleration =
+0.015</font></p>
+
+<p align="left"><strong>4. Deceleration</strong> - deceleration speed of the
+elevator, in feet per second<br>
+Example: <font face="Courier New, Courier, mono" size="2">Deceleration =
+0.0075</font></p>
+
+<p align="left"><strong>5. OpenSpeed</strong> - open/close speed of the
+elevator doors. This must be specified after the CreateElevator command.<br>
+Syntax: <font face="Courier New, Courier, mono" size="2">OpenSpeed
+<em>doornumber</em> = <em>value</em></font><br>
+Example: <font face="Courier New, Courier, mono" size="2">OpenSpeed 1 =
+0.2</font></p>
+
+<p align="left"><strong>6. SlowSpeed</strong> - open/close speed multiplier of
+the elevator doors used for slow movement, usually nudge mode. The default is
+0.5, which ends up being half of the door's speed value. This must be specified
+after the CreateElevator command.<br>
+Syntax: <font face="Courier New, Courier, mono" size="2">SlowSpeed
+<em>doornumber</em> = <em>value</em></font><br>
+Example: <font face="Courier New, Courier, mono" size="2">SlowSpeed 1 =
+0.2</font></p>
+
+<p align="left"><strong>7. ManualSpeed</strong> - open/close speed multiplier
+of the elevator doors used for manual movement. The default is 0.2. This must
+be specified after the CreateElevator command.<br>
+Syntax: <font face="Courier New, Courier, mono" size="2">ManualSpeed
+<em>doornumber</em> = <em>value</em></font><br>
+Example: <font face="Courier New, Courier, mono" size="2">ManualSpeed 1 =
+0.2</font></p>
+
+<p align="left"><strong>8. ServicedFloors</strong> - a comma-separated list of
+floors this elevator services. Ranges can also be specified by putting a "-"
+between the numbers<br>
+Example: <font face="Courier New, Courier, mono" size="2">ServicedFloors = 0,
+5, 6, 7-30, 31</font></p>
+
+<p align="left"><strong>9. AssignedShaft</strong> - the shaft number this
+elevator is in<br>
+Example: <font face="Courier New, Courier, mono" size="2">AssignedShaft =
+1</font></p>
+
+<p align="left"><strong>10. DoorTimer</strong> - the length of time (in
+milliseconds) that the elevator doors should stay open before automatically
+closing. Specify 0 to disable. The default is 5000, or 5 seconds. This must be
+specified after the CreateElevator command.<br>
+Syntax: <font face="Courier New, Courier, mono" size="2">DoorTimer
+<em>doornumber</em> = <em>value</em></font><br>
+Example: <font face="Courier New, Courier, mono" size="2">DoorTimer 1 =
+10000</font></p>
+
+<p align="left"><strong>11. QuickClose</strong> - the length of time (in
+milliseconds) that the elevator doors should stay open before automatically
+closing, in quick-close mode. Specify 0 to disable. The default is 3000, or 3
+seconds. This must be specified after the CreateElevator command.<br>
+Syntax: <font face="Courier New, Courier, mono" size="2">QuickClose
+<em>doornumber</em> = <em>value</em></font><br>
+Example: <font face="Courier New, Courier, mono" size="2">QuickClose 1 =
+10000</font></p>
+
+<p align="left"><strong>12. NudgeTimer</strong> - the length of time (in
+seconds) that the doors have to remain open before the elevator activates nudge
+mode for the related door. Specify 0 to disable. The default is 30 seconds.
+This must be specified after the CreateElevator command.<br>
+Syntax: <font face="Courier New, Courier, mono" size="2">NudgeTimer
+<em>doornumber</em> = <em>value</em></font><br>
+Example: <font face="Courier New, Courier, mono" size="2">NudgeTimer 1 =
+10</font></p>
+
+<p align="left"><strong>13. OpenSound</strong> - the sound file to play when
+the elevator doors open. Default is <em>elevatoropen.wav</em>. Leave the
+filename field blank for no sound. This must be specified after the
+CreateElevator command.<br>
+Syntax: <font face="Courier New, Courier, mono" size="2">OpenSound
+<em>doornumber</em> = <em>filename</em></font><br>
+Example: <font face="Courier New, Courier, mono" size="2">OpenSound 1 =
+open.wav</font></p>
+
+<p align="left"><strong>14. CloseSound</strong> - the sound file to play when
+the elevator doors close. Default is <em>elevatorclose.wav</em>. Leave the
+filename field blank for no sound. This must be specified after the
+CreateElevator command.<br>
+Syntax: <font face="Courier New, Courier, mono" size="2">CloseSound
+<em>doornumber</em> = <em>filename</em></font><br>
+Example: <font face="Courier New, Courier, mono" size="2">CloseSound 1 =
+close.wav</font></p>
+
+<p align="left"><strong>15. CarStartSound, CarUpStartSound,
+CarDownStartSound</strong> - the sound file to play when the elevator starts
+moving/speeds up. Leave the filename field blank for no sound. By default no
+sound is played. The first command specifies both up and down sounds, while the
+others are for either upwards movement or downwards movement.<br>
+Example: <font face="Courier New, Courier, mono" size="2">CarStartSound =
+start.wav</font></p>
+
+<p align="left"><strong>16. CarMoveSound, CarUpMoveSound,
+CarDownMoveSound</strong> - the sound file to play while the elevator is
+moving. This file is automatically looped by the simulator. By default no sound
+is played. Leave the filename field blank for no sound. The first command
+specifies both up and down sounds, while the others are for either upwards
+movement or downwards movement.<br>
+Example: <font face="Courier New, Courier, mono" size="2">CarMoveSound =
+move.wav</font></p>
+
+<p align="left"><strong>17. CarStopSound, CarUpStopSound,
+CarDownStopSound</strong> - the sound file to play when the elevator slows down
+and stops. By default no sound is played. Leave the filename field blank for no
+sound. The first command specifies both up and down sounds, while the others
+are for either upwards movement or downwards movement.<br>
+Example: <font face="Courier New, Courier, mono" size="2">CarStopSound =
+stop.wav</font></p>
+
+<p align="left"><strong>18. CarIdleSound</strong> - the sound file to play when
+the elevator is idle (generally the fan sound). Default is
+<em>elevidle.wav</em>. Leave the filename field blank for no sound. <br>
+Example: <font face="Courier New, Courier, mono" size="2">CarIdleSound =
+idle.wav</font></p>
+
+<p align="left"><strong>19. MotorStartSound, MotorUpStartSound,
+MotorDownStartSound</strong> - the sound file to play when the elevator motor
+starts moving/speeds up (sets both directions). Default is
+<em>elevstart.wav</em>. Leave the filename field blank for no sound. The first
+command specifies both up and down sounds, while the others are for either
+upwards movement or downwards movement.<br>
+Example: <font face="Courier New, Courier, mono" size="2">MotorStartSound =
+start.wav</font></p>
+
+<p align="left"><strong>20. MotorRunSound, MotorUpRunSound,
+MotorDownRunSound</strong> - the sound file to play while the elevator motor is
+running (sets both directions). This file is automatically looped by the
+simulator. Default is <em>elevmove.wav</em>. Leave the filename field blank for
+no sound. The first command specifies both up and down sounds, while the others
+are for either upwards movement or downwards movement.<br>
+Example: <font face="Courier New, Courier, mono" size="2">MotorRunSound =
+run.wav</font></p>
+
+<p align="left"><strong>21. MotorStopSound, MotorUpStopSound,
+MotorDownStopSound</strong> - the sound file to play when the elevator motor
+slows down and stops (sets both directions). Default is <em>elevstop.wav</em>.
+Leave the filename field blank for no sound. The first command specifies both
+up and down sounds, while the others are for either upwards movement or
+downwards movement.<br>
+Example: <font face="Courier New, Courier, mono" size="2">MotorStopSound =
+stop.wav</font></p>
+
+<p align="left"><strong>22. MotorIdleSound</strong> - the sound file to play
+when the elevator motor is idling. There is no default yet. Leave the filename
+field blank for no sound. <br>
+Example: <font face="Courier New, Courier, mono" size="2">MotorIdleSound =
+idle.wav</font></p>
+
+<p align="left"><strong>23. ChimeSound</strong> - the sound file to play when
+the elevator arrives at a floor. Default is <em>chime1.wav</em>. This must be
+specified after the CreateElevator command. This is used for both up and down
+chimes. Leave the filename field blank for no sound. <br>
+Syntax: <font face="Courier New, Courier, mono" size="2">ChimeSound
+<em>doornumber</em> = <em>filename</em></font><br>
+Example: <font face="Courier New, Courier, mono" size="2">ChimeSound 1 =
+chime.wav</font></p>
+
+<p align="left"><strong>24. UpChimeSound</strong> - the sound file to play when
+the elevator arrives at a floor and it's direction is up. Default is
+<em>chime1.wav</em>. Leave the filename field blank for no sound. This must be
+specified after the CreateElevator command.<br>
+Syntax: <font face="Courier New, Courier, mono" size="2">UpChimeSound
+<em>doornumber</em> = <em>filename</em></font><br>
+Example: <font face="Courier New, Courier, mono" size="2">UpChimeSound 1 =
+chime.wav</font></p>
+
+<p align="left"><strong>25. DownChimeSound</strong> - the sound file to play
+when the elevator arrives at a floor and it's direction is down. Default is
+<em>chime1.wav</em>. Leave the filename field blank for no sound. This must be
+specified after the CreateElevator command.<br>
+Syntax: <font face="Courier New, Courier, mono" size="2">DownChimeSound
+<em>doornumber</em> = <em>filename</em></font><br>
+Example: <font face="Courier New, Courier, mono" size="2">DownChimeSound 1 =
+chime.wav</font></p>
+
+<p align="left"><strong>26. AlarmSound</strong> - the sound file to play when
+the elevator alarm button is pressed. Default is <em>bell1.wav</em>. Leave the
+filename field blank for no sound. <br>
+Example: <font face="Courier New, Courier, mono" size="2">AlarmSound =
+bell2.wav</font></p>
+
+<p align="left"><strong>27. AlarmSoundStop</strong> - the sound file to play
+when the elevator alarm button is released. Leave the filename field blank for
+no sound. Default is <em>bell1-stop.wav</em>.<br>
+Example: <font face="Courier New, Courier, mono" size="2">AlarmSoundStop =
+bell2-stop.wav</font></p>
+
+<p align="left"><strong>28. BeepSound</strong> - the sound file to play when
+the elevator reaches a new floor. There is no default; if this is set, the
+beeps will be automatically enabled. If an asterisk (*) is specified, it is
+replaced with the current floor number.<br>
+Example: <font face="Courier New, Courier, mono" size="2">BeepSound =
+beep.wav</font></p>
+
+<p align="left"><strong>29. FloorSound</strong> - the sound file(s) to play
+when the elevator arrives at a floor; normally this is used for files that
+speak the floor number. There is no default; if this is set, the sounds will be
+automatically enabled. If an asterisk (*) is specified, it is replaced with the
+current floor number.<br>
+Example: <font face="Courier New, Courier, mono" size="2">FloorSound =
+floor*.wav</font></p>
+
+<p align="left"><strong>30. UpMessage</strong> - the notification sound file(s)
+to play after the elevator arrives at a floor and the doors open - this tells
+the passengers that the elevator is going up. There is no default; if this is
+set, the sound will be automatically enabled. If an asterisk (*) is specified,
+it is replaced with the current floor number.<br>
+Example: <font face="Courier New, Courier, mono" size="2">UpMessage =
+goingup.wav</font></p>
+
+<p align="left"><strong>31. DownMessage</strong> - the notification sound
+file(s) to play after the elevator arrives at a floor and the doors open - this
+tells the passengers that the elevator is going down. There is no default; if
+this is set, the sound will be automatically enabled. If an asterisk (*) is
+specified, it is replaced with the current floor number.<br>
+Example: <font face="Courier New, Courier, mono" size="2">DownMessage =
+goingdown.wav</font></p>
+
+<p align="left"><strong>32. OpenMessage</strong> - the notification sound
+file(s) to play when the elevator doors begin opening - this tells the
+passengers that the doors are opening. There is no default; if this is set, the
+sound will be automatically enabled. If an asterisk (*) is specified, it is
+replaced with the current floor number.<br>
+Example: <font face="Courier New, Courier, mono" size="2">OpenMessage =
+doorsopening.wav</font></p>
+
+<p align="left"><strong>33. CloseMessage</strong> - the notification sound
+file(s) to play when the elevator doors begin closing - this tells the
+passengers that the doors are closing. There is no default; if this is set, the
+sound will be automatically enabled. If an asterisk (*) is specified, it is
+replaced with the current floor number.<br>
+Example: <font face="Courier New, Courier, mono" size="2">CloseMessage =
+doorsclosing.wav</font></p>
+
+<p align="left"><strong>34. Music</strong> - the sound file to play for the
+elevator music - the sound is automatically looped. There is no default; if
+this is set, the sound will be automatically enabled. <br>
+Example: <font face="Courier New, Courier, mono" size="2">Music =
+musicfile.wav</font></p>
+
+<p align="left"><strong>35. NudgeSound</strong> - the sound file to play while
+in nudge mode. Default is <em>buzz.wav</em>. Leave the filename field blank for
+no sound. This must be specified after the CreateElevator command.<br>
+Syntax: <font face="Courier New, Courier, mono" size="2">NudgeSound
+<em>doornumber</em> = <em>filename</em></font><br>
+Example: <font face="Courier New, Courier, mono" size="2">NudgeSound 1 =
+buzz.wav</font></p>
+
+<p align="left"><strong>36. FloorSkipText</strong> - sets the text that will be
+shown in the floor indicator when passing non-serviced floors. The texture for
+this must be loaded for it to show (and will start with the related indicator's
+texture prefix) - of you set this to EX for example, and the indicator's
+texture prefix is "Button", the texture it'll load will be ButtonEX.jpg. Common
+values for this are EZ, X, and EX (which stand for Express Zone).<br>
+Example: <font face="Courier New, Courier, mono" size="2">FloorSkipText = EZ
+</font></p>
+
+<p align="left"><strong>37. RecallFloor</strong> - sets the floor the elevator
+will recall to during fire service phase 1 mode. Default is the lowest serviced
+floor. <br>
+Example: <font face="Courier New, Courier, mono" size="2">RecallFloor =
+5</font></p>
+
+<p align="left"><strong>38. AlternateRecallFloor</strong> - sets the alternate
+floor the elevator will recall to during fire service phase 1 mode. Default is
+the highest serviced floor. <br>
+Example: <font face="Courier New, Courier, mono" size="2">AlternateRecallFloor
+= 6</font></p>
+
+<p align="left"><strong>39. ACP</strong> - enables ACP (Anti-Crime Protection)
+mode<br>
+Example: <font face="Courier New, Courier, mono" size="2">ACP = true</font></p>
+
+<p align="left"><strong>40. ACPFloor</strong> - sets the floor the elevator
+will stop at while in ACP mode. Default is the lowest serviced floor. <br>
+Example: <font face="Courier New, Courier, mono" size="2">ACPFloor =
+5</font></p>
+
+<p align="left"><strong>41. Doors</strong> - sets the number of doors the
+elevator will have. The default is 1. Set to 0 in order to have a doorless
+elevator.<br>
+Example: <font face="Courier New, Courier, mono" size="2">Doors = 2</font></p>
+
+<p align="left"><strong>42. MotorPosition</strong> - sets the position of the
+motor sound emitter; if this command is not specified, it'll be placed at the
+base (altitude + interfloor) of the highest floor in the corresponding shaft.
+The X and Z values are relative of the elevator center.<br>
+Syntax: <font face="Courier New, Courier, mono" size="2">MotorPosition = <em>x,
+y, z</em><br>
+</font>Example: <font face="Courier New, Courier, mono" size="2">MotorPosition
+= 0, 100, 0</font></p>
+
+<p align="left"><strong>43. QueueResets</strong> - set this to true if you want
+the elevator to reset the related queue (up or down) after it reaches the last
+valid entry. If the elevator is moving up for example with this setting on, and
+you press buttons for floors below you, the elevator will remove those entries
+after it reaches the highest selected floor. The elevator will only be
+available for hall calls in the active queue direction.<br>
+Example: <font face="Courier New, Courier, mono" size="2">QueueResets =
+true</font></p>
+
+<p align="left"><strong>44. LimitQueue</strong> - set this to true to only
+allow floor selections in the same direction as the active elevator queue
+direction to be placed. For example, if the elevator is moving up, and a button
+is pressed for a lower floor, this will prevent that from being queued. The
+elevator will only be available for hall calls in the active queue
+direction.<br>
+Example: <font face="Courier New, Courier, mono" size="2">LimitQueue =
+true</font></p>
+
+<p align="left"><strong>45. UpPeak</strong> - enables up peak mode for this
+elevator.<br>
+Example: <font face="Courier New, Courier, mono" size="2">UpPeak =
+true</font></p>
+
+<p align="left"><strong>46. DownPeak</strong> - enables down peak mode for this
+elevator.<br>
+Example: <font face="Courier New, Courier, mono" size="2">DownPeak =
+true</font></p>
+
+<p align="left"><strong>47. IndependentService</strong> - enables independent
+service mode for this elevator.<br>
+Example: <font face="Courier New, Courier, mono" size="2">IndependentService =
+true</font></p>
+
+<p align="left"><strong>48. InspectionService</strong> - enables inspection
+service mode for this elevator.<br>
+Example: <font face="Courier New, Courier, mono" size="2">InspectionService =
+true</font></p>
+
+<p style="text-align:left;margin-left:0;margin-right:auto;"><strong>49.
+InspectionSpeed</strong> - speed multiplier for inspection service (if set to
+0.6, would be 60% of elevator speed)<br>
+Syntax: <font face="Courier New, Courier, mono" size="2">InspectionSpeed =
+<em>multiplier</em></font></p>
+
+<p style="text-align:left;margin-left:0;margin-right:auto;"><strong>50.
+Parking</strong> - enables automatic elevator parking. If this option is used,
+the elevator will automatically send itself to the specified parking floor
+after the number of seconds specified in <em>delay</em>. <br>
+Syntax: <font face="Courier New, Courier, mono" size="2">Parking = <em>floor,
+delay</em></font></p>
+
+<p align="left"><strong>51. LevelingSpeed</strong> - elevator's leveling speed.
+Default is 0.2<br>
+Syntax: <font face="Courier New, Courier, mono" size="2">LevelingSpeed =
+<em>speed</em></font></p>
+
+<p align="left"><strong>52. LevelingOffset</strong> - distance in feet from the
+destination floor that the elevator will switch into leveling mode. Default is
+0.5<br>
+Syntax: <font face="Courier New, Courier, mono" size="2">LevelingOffset =
+<em>distance</em></font></p>
+
+<p align="left"><strong>53. LevelingOpen</strong> - distance in feet from the
+destination floor that the elevator will open the doors. Default is 0.<br>
+Syntax: <font face="Courier New, Courier, mono" size="2">LevelingOpen =
+<em>distance</em></font></p>
+
+<p align="left"><strong>54. NotifyEarly</strong> - changes behavior of arrival
+notifications (chime, lighting of directional indicator, and floor announcement
+sound). 0 is the default and notifies when the elevator stops on the floor. 1
+notifies when the elevator starts the leveling process, and 2 notifies when the
+elevator starts decelerating.<br>
+Syntax: <font face="Courier New, Courier, mono" size="2">NotifyEarly =
+<em>value</em></font></p>
+
+<p align="left"><strong>55. MusicPosition</strong> - sets the position of the
+music sound emitter relative of the elevator's position. If this command is not
+specified, it'll be placed in the center of the elevator on the ceiling.<br>
+Syntax: <font face="Courier New, Courier, mono" size="2">MusicPosition = <em>x,
+y, z</em><br>
+</font>Example: <font face="Courier New, Courier, mono" size="2">MusicPosition
+= 0, 8, 0</font></p>
+
+<p align="left"><strong>56. DepartureDelay</strong> - sets the time in seconds
+that the elevator waits before proceeding to the next floor. Default is 0.<br>
+Syntax: <font face="Courier New, Courier, mono" size="2">DepartureDelay =
+<em>1</em> </font></p>
+
+<p align="left"><strong>57. ArrivalDelay</strong> - sets the time in seconds
+that the elevator waits before opening the doors after arriving at a floor. The
+default is 0. Note that a value greater than 0 will switch off the LevelingOpen
+setting.<br>
+Syntax: <font face="Courier New, Courier, mono" size="2">ArrivalDelay =
+<em>0.5</em></font></p>
+
+<p align="left"><strong>58. DisplayFloors</strong> - sets the floors that will
+be displayed by the elevator's indicators. This command uses the same syntax as
+the ServicedFloors command.<br>
+Syntax: <font face="Courier New, Courier, mono" size="2">DisplayFloors = <em>0,
+9, 19, 29</em></font></p>
+
+<p align="left"><strong>59. FireService1</strong> - sets the fire service phase
+1 mode that the elevator will start with. Default is 0. Values are 0 for off, 1
+for on, 2 for bypass.<br>
+Syntax: <font face="Courier New, Courier, mono" size="2">FireService1 =
+2</font></p>
+
+<p align="left"><strong>60. FireService2</strong> - sets the fire service phase
+2 mode that the elevator will start with. Default is 0. Values are 0 for off, 1
+for on, 2 for hold.<br>
+Syntax: <font face="Courier New, Courier, mono" size="2">FireService2 =
+1</font></p>
+
+<p align="left"><strong>61. MusicOn</strong> - Enables or disables music on
+start. Default is true.<br>
+Syntax: <font face="Courier New, Courier, mono" size="2">MusicOn =
+false</font></p>
+
+<p align="left"><strong>62. MusicOnMove</strong> - Determines if music should
+only be played while elevator is moving or not. Default is false.<br>
+Syntax: <font face="Courier New, Courier, mono" size="2">MusicOnMove =
+true</font></p>
+
+<p style="text-align:left;margin-left:0;margin-right:auto;"><strong>63.
+AutoEnable</strong> - Determines if interior objects should automatically be
+enabled or disabled when the user enters/exits the elevator (set to false for
+glass elevators).<br>
+Syntax: <font face="Courier New, Courier, mono" size="2">AutoEnable =
+false</font></p>
+
+<p style="text-align:left;margin-left:0;margin-right:auto;"><strong>64.
+ReOpen</strong> - if this is set to true, if the elevator is idle, the doors
+will reopen if the same floor is selected. The default is true.<br>
+Syntax: <font face="Courier New, Courier, mono" size="2">ReOpen =
+false</font></p>
+
+<p style="text-align:left;margin-left:0;margin-right:auto;"><strong>65.
+AutoDoors</strong> - if this is set to true, the elevator doors will
+automatically open if instructed (for example, when arriving at a floor), and
+will refuse to open if between floors. Set to false for manual elevators. The
+default is true.<br>
+Syntax: <font face="Courier New, Courier, mono" size="2">AutoDoors =
+false</font></p>
+
+<p style="text-align:left;margin-left:0;margin-right:auto;"><strong>66.
+OpenOnStart</strong> - if this is set to true, the elevator doors will
+automatically open on startup. The default is false.<br>
+Syntax: <font face="Courier New, Courier, mono" size="2">OpenOnStart =
+false</font></p>
+
+<p style="text-align:left;margin-left:0;margin-right:auto;"><strong>67.
+Interlocks</strong> - if this is set to true, the elevator doors will remain
+locked while the elevator is moving, will refuse to open unless the elevator is
+within a landing zone, and the elevator will not move unless the doors are
+closed. The default is true.<br>
+Syntax: <font face="Courier New, Courier, mono" size="2">Interlocks =
+false</font></p>
+
+<p style="text-align:left;margin-left:0;margin-right:auto;"><strong>68.
+FloorHold</strong> - if this is set to true, the user must hold down the floor
+button in order to move to the desired floor. When the button is released, the
+elevator will immediately stop. This is used to mimic a modern manual elevator
+(platform lift). The default is false.<br>
+Syntax: <font face="Courier New, Courier, mono" size="2">FloorHold =
+true</font></p>
+
+<p align="left"><strong>69. DoorSensor</strong> - enable or disable the door
+sensor (electric eye), which is a trigger object placed in the elevator door
+area. Default is enabled for automatic doors. A second parameter specifies the
+sound file to play when switching between on and off - this is normally used
+for a relay switch sound effect. Only specify the first parameter for no sound.
+This must be specified after the CreateElevator command.<br>
+Syntax: <font face="Courier New, Courier, mono" size="2">DoorSensor
+<em>doornumber</em> = <em>enable[, filename]</em></font><br>
+Example: <font face="Courier New, Courier, mono" size="2">DoorSensor 1 = true,
+click.wav</font><br>
+<br>
+To have the sensor play a continuous beep while it's on (obstructed), create a
+sound inside the elevator with the AddSound command using the filename of the
+beep sound you want, and then create an action with the elevator's "sensor"
+command name. So for elevator 1, you would create an action named "Elevator
+1:sensor", and the action would do a "playsound" command on the sound you
+created.<br>
+</p>
+
+<p></p>
+
+<p align="left"><strong>Commands:</strong></p>
+
+<p align="left"><strong>1. CreateElevator</strong> - creates an elevator at the
+specified location<br>
+Syntax: <font face="Courier New, Courier, mono" size="2">CreateElevator
+<em>relative, x</em>, <em>z</em>, <em>floor<br>
+</em></font>Example:<font face="Courier New, Courier, mono" size="2"><em></em>
+CreateElevator false, 0, 10, 0</font></p>
+
+<p align="left"><em>Relative </em>determines if the coordinates are relative to
+the shaft center, or if they're absolute, <em>X</em> and <em>Z </em>are the
+coordinates to place the center of the elevator at, and <em>Floor</em> is the
+floor to place the elevator on.</p>
+
+<p align="left"><strong>2. AddFloor</strong> - adds a textured floor with the
+specified dimensions for the elevator<br>
+Syntax: <font face="Courier New, Courier, mono" size="2">AddFloor <em>name,
+texturename</em>, <em>thickness, x1</em>, <em>z1</em>, <em>x2</em>,
+<em>z2</em>, <em>voffset1</em>, <em>voffset2, reverse_axis, texture_direction,
+tw</em>, <em>th</em></font><br>
+Example: <font face="Courier New, Courier, mono" size="2">AddFloor Floor1,
+Wood2, 0.5, -3.5, -3, 3.5, 3, 0, 0, false, false, 0, 0</font></p>
+
+<p align="left"><strong>3. AddWall</strong> - adds a textured wall for the
+elevator<br>
+Syntax: <font face="Courier New, Courier, mono" size="2">AddWall <em>name,
+texturename</em>, <em>thickness, x1</em>, <em>z1</em>, <em>x2</em>, z2,
+<em>height1</em>, <em>height2</em>, <em>voffset1</em>, <em>voffset2,
+</em><em>tw</em>, <em>th</em></font><br>
+Example: <font face="Courier New, Courier, mono" size="2">AddWall Wall1, Wood1,
+0.5, -3.5, 3, 3.5, 3, 8, 8, 0, 0, 2, 2</font></p>
+
+<p align="left">The elevator's AddWall command is similar to the other AddWall
+commands.</p>
+
+<p align="left"><strong>4. AddDoors</strong> - creates elevator doors<br>
+Syntax: <font face="Courier New, Courier, mono" size="2">AddDoors <em>number,
+lefttexture, righttexture</em>, <em>thickness, CenterX, CenterZ, width, height,
+direction, tw, th</em></font></p>
+
+<p align="left">The AddDoors command creates working elevator doors at the
+central location specified by <em>CenterX</em> and <em>CenterZ</em>, with
+<em>width</em> and <em>height</em> specifiying the width and height of each
+door, and <em>Direction</em> specifying the direction that the doors face
+(currently there are only 2: <em>false</em> if the doors are on the left or
+right sides, and <em>true</em> if the doors are on the front or back sides).
+<em>Number</em> specifies the number of the door to create (related to the
+<em>Doors</em> command) - if the elevator only has one door, or if the Doors
+command was not used, specify 1 here.</p>
+
+<p align="left"><strong>5. AddShaftDoors</strong> - creates shaft elevator
+doors<br>
+Syntax: <font face="Courier New, Courier, mono" size="2">AddShaftDoors
+<em>number, lefttexture, righttexture</em>, <em>thickness, CenterX, CenterZ,
+voffset, tw, th</em></font></p>
+
+<p align="left">The AddShaftDoors command creates working shaft elevator doors
+at the central location specified by <em>CenterX</em> and <em>CenterZ</em>.
+Other parameters such as width, height, and direction are taken from the
+AddDoors command (so the regular elevator doors need to be created first). The
+<em>voffset</em> parameter allows you to create shaft doors at a different
+vertical position than the base of the floor, and the elevator will
+automatically stop according to the shaft door's voffset for that floor. These
+doors should be moved slightly away from the elevator doors (to separate them
+both). Also, this command creates doors at all the floors specified in the
+ServicedFloors value, and cuts any shaft walls that are within the door area
+(and so this must be called after the shaft walls are created). <em>Number</em>
+specifies the number of the door to create (related to the <em>Doors</em>
+command) - if the elevator only has one door, or if the Doors command was not
+used, specify 1 here.</p>
+
+<p align="left"><strong>6. CreatePanel</strong> - creates a button panel<br>
+Syntax: <font face="Courier New, Courier, mono" size="2">CreatePanel
+<em>texturename</em>, <em>rows, columns, direction, CenterX, CenterZ,
+buttonwidth, buttonheight, spacingX, spacingY, voffset, tw, th<br>
+</em></font> Example<font face="Courier New, Courier, mono" size="2"><em>:
+</em><font face="Courier New, Courier, mono" size="2">CreatePanel Wall1, 5, 5,
+right, -3, -3, 0.15, 0.15, 0.3, 0.45, 4.5, 0, 0</font></font></p>
+
+<p align="left">The CreatePanel command creates a button panel at a position
+relative to the elevator's center position (origin). <em>Rows</em> and
+<em>Columns</em> define the grid size of the panel. <em>Direction</em> is
+either "front", "back", "left" or "right", defining which direction the panel
+faces. <em>SpacingX</em> is the space (percent of a button's width)
+horizontally between each button, and <em>spacingY</em> is the space (percent
+of a button's height) vertically between each button. Not all positions need to
+be used; this is simply to provide a grid layout for the panel. This command
+also determines the width and height of the panel based on the spacing and
+button sizes. A simple formula for determining panel width or height is this -
+for width, it's (columns * buttonwidth) + (spacingX * (columns + 1)); for
+height, just swap columns with rows and spacingX with spacingY.</p>
+
+<p align="left"><strong>7. AddButton</strong> - creates a standard button on
+the panel<br>
+Syntax: <font face="Courier New, Courier, mono" size="2">AddButton
+<em>panel_number, sound, texture_unlit</em>, <em>texture_lit, row, column,
+floor/type, width, height[, hoffset, voffset]</em></font><br>
+Example 1: <font face="Courier New, Courier, mono" size="2">AddButton 1,
+switch.wav, Button5, ButtonLit5, 7, 3, 4, 1, 1</font><br>
+Example 2: <font face="Courier New, Courier, mono" size="2">AddButton 1, ,
+Button5, ButtonLit5, 7, 3, 4, 1, 1, 0.1, -0.1</font></p>
+
+<p align="left">The AddButton command creates a button on the button panel
+created with CreatePanel. <em>Panel_number</em> specifies the number of the
+panel to add the button to. <em>Row</em> and <em>Column</em> specify the
+position on the grid where the button should be. <em>Floor/Type</em> specifies
+either the floor number that this button calls, or the action name such as
+"Open" (see the AddControl command for more info). <em>Width</em> and
+<em>Height</em> specify the width and height of the button, as a percentage of
+a single grid unit size (1 being 100%, 0.5 being 50%). If both values are 0,
+the default of 1 is used for both values. If only one of the values is 0, then
+the exact size other is used; for example, if <em>width</em> is 0 and
+<em>height</em> is 1 (or any other number), then the width will end up being
+the same size as the height. <em>Hoffset</em> and <em>Voffset</em> are optional
+parameters, and are used to position the button outside the normal grid, and
+are in grid units (buttonwidth and buttonheight parameters of the CreatePanel
+function). In the second example, the button is positioned 0.1 grid units to
+the right, and 0.1 grid units down. Notice that no sound is specified in the
+2nd example - this means that a sound won't be played.</p>
+
+<p align="left"><strong>8. AddControl</strong> - advanced command for creating
+buttons, switches and knobs on the panel<br>
+Syntax: <font face="Courier New, Courier, mono" size="2">AddControl
+<em>panel_number, sound, row, column, width, height, hoffset, voffset,
+command_name(s), texture_name(s)<br>
+</em></font>Example 1: <font face="Courier New, Courier, mono"
+size="2">AddControl 1, switch.wav, 7, 3, 1, 1, 0, 0, open, ButtonOpen</font><br>
+Example 2: <font face="Courier New, Courier, mono" size="2">AddControl 1,
+switch.wav, 7, 3, 1, 1, 0, 0, FanOff, FanOn, SwitchFanOff,
+SwitchFanOn</font><br>
+Example 3: <font face="Courier New, Courier, mono" size="2">AddControl 1,
+switch.wav, 7, 3, 1, 1, 0, 0, Off, 4, Button5, ButtonLit5</font><br>
+Example 4: <font face="Courier New, Courier, mono" size="2">AddControl 1,
+switch.wav, 7, 3, 1, 1, 0, 0, Fire2Off, Fire2On, Fire2Hold, FireKnob1,
+FireKnob2, FireKnob3</font></p>
+
+<p align="left">The AddControl command creates an advanced control on the
+specified button panel (created with CreatePanel). Most of the parameters are
+the same as the AddButton command, but the <em>command_name(s)</em> and
+<em>texture_name(s)</em> parameters allow you to specify a list of commands,
+and a list of textures to go along with those commands. A texture needs to be
+specified for every command; if you specify 3 commands and only 2 textures, you
+will get an error. The first example shows a door open button being created,
+with the command "open" and the texture "ButtonOpen". The 2nd example shows a
+fan switch being created, with the first command being "FanOff" with the
+"SwitchFanOff" texture being used for that, and "FanOn" for the second command
+with the "SwitchFanOn" texture being used for that. Example 3 shows a standard
+floor button being created (which is what the AddButton command does) and
+example 4 shows a fire service mode knob being created with 3 positions. Leave
+the sound field blank for no sound to be played.</p>
+
+<p align="left">Available command names for elevators:</p>
+
+<p align="left"><em>Off</em> (no action)<br>
+[floor number]<br>
+<em>Open</em> (open doors)<br>
+<em>Close</em> (close doors)<br>
+<em>OpenInt</em> (open interior/car doors)<br>
+<em>CloseInt</em> (close interior/car doors)<br>
+<em>OpenExt</em> (open exterior/shaft doors)<br>
+<em>CloseExt</em> (close exterior/shaft doors)<br>
+<em>OpenManual</em> (open doors manually)<br>
+<em>CloseManual</em> (close doors manually)<br>
+<em>OpenIntManual</em> (open interior/car doors manually)<br>
+<em>CloseIntManual</em> (close interior/car doors manually)<br>
+<em>Cancel</em> (call cancel)<br>
+<em>Run</em> (put elevator in run state)<br>
+<em>Stop</em> (put elevator in stop state)<br>
+<em>EStop</em> (emergency stop)<br>
+<em>Alarm</em><br>
+<em>Fire1Off</em> (fire service phase 1 off for all elevators in same bank,
+which means all served by first call button on recall floor)<br>
+<em>Fire1On</em> (fire service phase 1 on for all elevators in same bank)<br>
+<em>Fire1Bypass</em> (fire service phase 1 bypass for all elevators in same
+bank)<br>
+<em>Fire2Off</em> (fire service phase 2 off)<br>
+<em>Fire2On</em> (fire service phase 2 on)<br>
+<em>Fire2Hold</em> (fire service phase 2 hold)<br>
+<em>UpPeakOn</em> (enable up peak)<br>
+<em>UpPeakOff</em> (disable up peak)<br>
+<em>DownPeakOn</em> (enable down peak)<br>
+<em>DownPeakOff</em> (disable down peak)<br>
+<em>IndOn</em> (enable independent service mode)<br>
+<em>IndOff</em> (disable independent service)<br>
+<em>InsOn</em> (enable inspection service mode)<br>
+<em>InsOff</em> (disable inspection service)<br>
+<em>AcpOn</em> (enable ACP mode)<br>
+<em>AcpOff</em> (disable ACP mode)<br>
+<em>FanOn</em> (enable fan/idle sound)<br>
+<em>FanOff</em> (disable fan/idle sound)<br>
+<em>Hold</em> (hold door)<br>
+<em>MusicOn</em><br>
+<em>MusicOff</em><br>
+<em>UpOn</em> (inspection mode up on)<br>
+<em>UpOff</em> (inspection mode up off)<br>
+<em>DownOn</em> (inspection mode down on)<br>
+<em>DownOff</em> (inspection mode down off)<br>
+<em>GoOn</em> (inspection mode go on)<br>
+<em>GoOff</em> (inspection mode go off)<br>
+<em>Return</em> (return to nearest serviced floor after stop)<br>
+<em>Up</em> (move up for manual elevator)<br>
+<em>Down</em> (move down for manual elevator)<br>
+<em>InterlocksOn</em> (enable interlocks)<br>
+<em>InterlocksOff</em> (disable interlocks)<br>
+<em>Sensor</em> (open and hold doors, used by door sensor)<br>
+<em>Reset</em> (reset door timer which turns off hold, also used by door
+sensor)</p>
+
+<p align="left">In the above list, <em>Open</em>, <em>Close</em>, related
+commands such as <em>OpenInt</em> and <em>OpenManual</em>, <em>Hold</em>,
+<em>Sensor</em>, and <em>Reset</em> can have the door number after the name -
+for example, <em>Open2</em> will open door 2, while <em>Open</em> will open all
+doors.<br>
+<br>
+When this command is used, actions are created using the specified commands.
+The resulting names of the actions are the elevator name, followed by a colon
+and the command name, in order to be unique to each elevator. So the "Open"
+command for Elevator 1 is created as an action named "Elevator 1:open", and you
+can specify more actions with that name to run multiple actions when the
+elevator opens it's doors.<br>
+<br>
+<strong>9. AddFloorIndicator</strong> - creates a floor indicator<br>
+Syntax: <font face="Courier New, Courier, mono"
+size="2">AddFloorIndicator<em> texture_prefix, direction, CenterX, CenterZ,
+width, height, voffset</em></font> </p>
+
+<p align="left">The AddFloorIndicator command creates a floor indicator at the
+position (relative to the elevator) specified by <em>CenterX</em> and
+<em>CenterZ</em>. <em>Direction</em> is the direction the indicator faces, and
+can be either "left", "right", "front" or "back". This command can be given
+multiple times to create multiple indicators. <em>Texture_prefix</em> is the
+base name of the texture to load when displaying a floor ID; for example if the
+elevator is on floor 3, and you specify a prefix of "Button", it'll load the
+"Button3" texture.</p>
+
+<p align="left"><strong>10. AddDirectionalIndicator</strong> - creates an
+internal directional indicator/lantern<br>
+Syntax: <font face="Courier New, Courier, mono"
+size="2">AddDirectionalIndicator<em> ActiveDirection, Single, Vertical,
+BackTexture</em>, <em>UpTexture</em>, <em>UpTextureLit, DownTexture,
+DownTextureLit, CenterX, CenterZ, voffset, direction, BackWidth, BackHeight,
+ShowBack, tw, th<br>
+</em></font>Example: <font face="Courier New, Courier, mono"
+size="2"><em>AddDirectionalIndicator false, false, true, Metal, UpLight,
+UpLightOn, DownLight, DownLightOn, -3, -4.162, 6, front, 0.5, 1, true, 0,
+0</em></font></p>
+
+<p align="left">This command will create a directional indicator inside the
+elevator, and the positioning is relative of the elevator's center.</p>
+
+<p align="left"><em>ActiveDirection</em> determines if the indicator should
+continuously display the active elevator direction (true), or if it should show
+the elevator's direction for the current call (false, default)</p>
+
+<p align="left"><em>Single</em> determines if a single indicator light should
+be created instead of two. If this is true, the unlit texture is specified in
+<em>UpLight</em>, and the <em>DownLight</em> value is ignored.</p>
+
+<p align="left"><em>Vertical</em> determines if the two lights should be
+vertically separated (true), or horizontally separated (false)</p>
+
+<p align="left"><em>BackTexture</em> is the texture of the wall plate behind
+the lights</p>
+
+<p align="left"><em>UpTexture</em> and <em>DownTexture</em> are the textures
+used for the lights themselves, and the "Lit" texures are the ones to show when
+the light is on. <em>DownTexture</em> is ignored if <em>Single</em> is true.</p>
+
+<p align="left"><em>CenterX</em> and <em>CenterZ</em> are the central location
+of the indicators</p>
+
+<p align="left"><em>voffset</em> is the altitude offset that the object is
+above each floor</p>
+
+<p align="left"><em>direction </em>determines the direction the indicators
+face:<br>
+'front' means they face towards the front of the building<br>
+'back' means they face towards the back of the building<br>
+'left' means they face left<br>
+'right' means they face right</p>
+
+<p align="left"><em>BackWidth</em> and <em>BackHeight</em> are the width and
+height of the wall plate</p>
+
+<p align="left"><em>ShowBack</em> determines if the wall plate should be shown,
+and is either true or false</p>
+
+<p align="left"><em>tw</em> and <em>th</em> are the texture scaling for the
+wall plate.</p>
+
+<p align="left"><strong></strong><strong>11. AddDirectionalIndicators</strong>
+- creates the elevator's exterior directional indicator/lanterns (similar to
+the CreateCallButtons command) <br>
+Syntax: <font face="Courier New, Courier, mono"
+size="2">AddDirectionalIndicators<em> Relative, ActiveDirection, Single,
+Vertical, BackTexture</em>, <em>UpTexture</em>, <em>UpTextureLit, DownTexture,
+DownTextureLit, CenterX, CenterZ, voffset, direction, BackWidth, BackHeight,
+ShowBack, tw, th<br>
+</em></font>Example:<font face="Courier New, Courier, mono"
+size="2"><em> AddDirectionalIndicators true, false, false, true, Metal,
+UpLight, UpLightOn, DownLight, DownLightOn, -3, -4.162, 6, front, 0.5, 1, true,
+0, 0</em></font></p>
+
+<p align="left">This command will create directional indicators on all floors
+the elevator serves. It'll also automatically create the up and down lights
+depending on the floor. To create indicators on a per-floor basis, use the
+AddDirectionalIndicator command in the Floor section.</p>
+
+<p align="left"><em>Relative</em> determines if the X and Z coordinates are
+relative to the elevator's origin (center) or not.</p>
+
+<p align="left"><em>ActiveDirection</em> determines if the indicator should
+continuously display the active elevator direction (true), or if it should show
+the elevator's direction for the current call (false, default)</p>
+
+<p align="left"><em>Single</em> determines if a single indicator light should
+be created instead of two. If this is true, the unlit texture is specified in
+<em>UpLight</em>, and the <em>DownLight</em> value is ignored.</p>
+
+<p align="left"><em>Vertical</em> determines if the two lights should be
+vertically separated (true), or horizontally separated (false)</p>
+
+<p align="left"><em>BackTexture</em> is the texture of the wall plate behind
+the lights</p>
+
+<p align="left"><em>UpTexture</em> and <em>DownTexture</em> are the textures
+used for the lights themselves, and the "Lit" texures are the ones to show when
+the light is on. <em>DownTexture</em> is ignored if <em>Single</em> is true.</p>
+
+<p align="left"><em>CenterX</em> and <em>CenterZ</em> are the central location
+of the indicators</p>
+
+<p align="left"><em>voffset</em> is the altitude offset that the object is
+above each floor</p>
+
+<p align="left"><em>direction </em>determines the direction the indicators
+face:<br>
+'front' means they face towards the front of the building<br>
+'back' means they face towards the back of the building<br>
+'left' means they face left<br>
+'right' means they face right</p>
+
+<p align="left"><em>BackWidth</em> and <em>BackHeight</em> are the width and
+height of the wall plate</p>
+
+<p align="left"><em>ShowBack</em> determines if the wall plate should be shown,
+and is either true or false</p>
+
+<p align="left"><em>tw</em> and <em>th</em> are the texture scaling for the
+wall plate.</p>
+
+<p align="left"><strong>12. SetShaftDoors</strong> - (deprecated) sets
+positioning and thickness of shaft doors which will be created with the
+<em>older AddShaftDoor</em> command. Please use the newer AddShaftDoor syntax
+instead.<br>
+Syntax: <font face="Courier New, Courier, mono"
+size="2">SetShaftDoors<em> number</em>, <em>thickness, CenterX,
+CenterZ</em></font> </p>
+
+<p align="left">This command must be used before calling <em>the older
+AddShaftDoor</em> command. This specifies the thickness and X/Z positioning for
+the shaft doors that will be created. <em>Number</em> specifies the door number
+this is associated with (use 1 if only one door).</p>
+
+<p align="left"><strong>13. AddFloorSigns</strong> - creates floor signs on all
+floors serviced by the elevator<br>
+Syntax: <font face="Courier New, Courier, mono"
+size="2">AddFloorSigns<em> door_number, relative, texture_prefix, direction,
+CenterX, CenterZ, width, height, voffset</em></font> </p>
+
+<p align="left">The AddFloorSigns command creates floor signs (similar to floor
+indicators) on all the floors serviced by the current elevator.
+<em>Direction</em> is the direction the signs face, and can be either "left",
+"right", "front" or "back". <em>Texture_prefix</em> is the base name of the
+texture to load when displaying a floor ID; for example if the sign is on floor
+3, and you specify a prefix of "Button", it'll load the "Button3" texture.
+<em>Door_number</em> specifies the door number to check against, meaning if
+shaft doors don't exist on a certain floor for the specified door, the sign
+won't be created on that floor. This can be bypassed by setting
+<em>door_number</em> to 0.</p>
+
+<p align="left"><strong>14. AddSound</strong> - creates a user-defined sound at
+the specified position<br>
+Syntax: <font face="Courier New, Courier, mono" size="2">AddSound <em>name,
+filename, x, y, z, loop[, volume, speed, min_distance, max_distance,
+doppler_level, cone_inside_angle, cone_outside_angle, cone_outside_volume,
+direction_x, direction_y, direction_z]</em></font><br>
+Example 1: <font face="Courier New, Courier, mono" size="2">AddSound MySound,
+sound.wav, 10, 100, 5, true<br>
+</font>Example 2: <font face="Courier New, Courier, mono" size="2">AddSound
+MySound, ambient.ogg, 10, 100, 5, true, 1, 100, 1, -1, 0, 360, 360, 1, 0, 0,
+0</font></p>
+
+<p align="left">For information on the parameters, see the AddSound command in
+the Globals section. The only difference here is that the X, Y and Z position
+values are relative of the elevator's center/origin. <em>Loop</em> specifies if
+the sound should loop and play on startup.</p>
+
+<p align="left"><strong>15. AddDoorComponent</strong> - creates a single
+elevator door component, used for creating custom door styles<br>
+Syntax: <font face="Courier New, Courier, mono" size="2">AddDoorComponent
+<em>number, name, texture, sidetexture, thickness, direction, openspeed,
+closespeed, x1, z1, x2, z2, height, voffset, tw, th, side_tw,
+side_th</em></font></p>
+
+<p align="left">Example: <font face="Courier New, Courier, mono"
+size="2">AddDoorComponent 1, Left, ElevDoors, Black, 0.2, left, 0.3, 0.3,
+-1.75, 0, 0, 0, 8, 0, 0, 0, 0, 0</font></p>
+
+<p align="left">The AddDoorComponent command allows you to create your own
+custom door styles. It creates a single door component within a set - for
+example, the standard center-open doors have 2 door components: left and right.
+With this command you specify the positioning of a component similar to wall
+creation, specify it's textures, tell it which direction it's going to travel
+during opening, and what it's speed will be. <em>Number</em> specifies the
+number of the door to create (related to the <em>Doors</em> command) - if the
+elevator only has one door, or if the Doors command was not used, specify 1
+here. <em>Texture</em> refers to the texture used on the main (front and back)
+sides of the door. <em>SideTexture</em> refers to the texture used on the sides
+(and top/bottom) of the door. <em>Direction</em> is either Up, Down, Left (or
+Front; is the same), or Right (or Back; is also the same). <em>Side_tw</em> and
+<em>side_th</em> specify the texture tiling for the sides. Use the FinishDoors
+command after creating the components. The above example creates the left door
+component for the standard center-open doors, and uses default speed values.
+This command replaces the AddDoors command.</p>
+
+<p align="left"><strong>16. AddShaftDoorsComponent</strong> - creates a single
+shaft door component for all serviced floors - used for creating custom door
+styles<br>
+Syntax: <font face="Courier New, Courier, mono" size="2">AddShaftDoorsComponent
+<em>number, name, texture, sidetexture, thickness, direction, openspeed,
+closespeed, x1, z1, x2, z2, height, voffset, tw, th, side_tw,
+side_th</em></font></p>
+
+<p align="left">This command is almost identical to the AddDoorComponent
+command, except that it creates shaft doors. Use the FinishShaftDoors command
+after creating the components. This command replaces the AddShaftDoors command.
+To create shaft doors on a per-floor basis, use the AddShaftDoorComponent
+command in the Floors section.</p>
+
+<p align="left"><strong>17. FinishDoors</strong> - finishes elevator door
+creation - use this after all related AddDoorComponent commands are used.<br>
+Syntax: <font face="Courier New, Courier, mono" size="2">FinishDoors
+<em>number[, create_walls]</em></font></p>
+
+<p align="left">This command completes the elevator door creation by storing
+the central location and shift factor, cutting walls for the door, creating
+side connection pieces for the cut, etc. The optional <em>create_walls</em>
+option specifies if the command should create the side and top/bottom
+connection/filler walls.</p>
+
+<p align="left"><strong>18. FinishShaftDoors</strong> - finishes shaft door
+creation for all serviced floors - use this after all related
+AddShaftDoorsComponent commands are used, or specify it without the
+AddShaftDoorComponent commands if you're creating a manual shaft door.<br>
+Syntax: <font face="Courier New, Courier, mono" size="2">FinishShaftDoors
+<em>number[, create_walls]</em></font></p>
+
+<p align="left">This command is almost identical to the FinishDoors command
+except that it's used for finishing shaft doors on all serviced floors.</p>
+
+<p align="left"><strong>19. AddDoor</strong> - adds a textured door in the
+specified location, which moves with the elevator<br>
+Syntax: <font face="Courier New, Courier, mono" size="2">AddDoor <em>opensound,
+closesound, texturename, open, thickness</em>, <em>direction, speed,
+CenterX</em>, <em>CenterZ</em>, <em>width</em>, <em>height</em>,
+<em>voffset</em>, <em>tw</em>, <em>th</em></font></p>
+
+<p align="left">See the AddDoor command in the floor section for information on
+the parameters. <em>CenterX</em> and <em>CenterZ</em> are relative of the
+elevator's center.</p>
+
+<p align="left"><strong>20. AddModel</strong> - adds a 3D model to the floor.
+The model's textures/materials must be defined in a separate ".material" file,
+and a separate collider mesh ".collider" will be loaded. If a collider mesh
+isn't available, a simple box collider will be created.<br>
+Syntax: <font face="Courier New, Courier, mono" size="2">AddModel<em> name,
+filename, center, CenterX, CenterY, CenterZ, RotationX, RotationY, RotationZ,
+MaxRenderDistance, ScaleMultiplier, EnablePhysics, Restitution, Friction,
+Mass</em><em><br>
+</em></font>Example:<font face="Courier New, Courier, mono" size="2"> AddModel
+MyModel, cube.mesh, true, 0, 0, 0, 0, 0, 0, 0, 1, false, 0, 0, 0</font></p>
+
+<p align="left">The <em>Center</em> value is either true or false, and
+determines if the loaded model should be automatically centered, otherwise the
+exact mesh positioning in the model file will be used. The <em>CenterY</em>
+value is relative to the current floor's base. <em>MaxRenderDistance</em>
+determines the maximum distance in feet that the object will be shown (0 means
+unlimited). <em>ScaleMultiplier</em> allows you to change the size of the
+object during the load - for example, set to 2 to double the size. Models are
+in the OGRE native mesh format. In the example, the material/texture file is
+cube.material, and the optional collider mesh file is cube.collider.
+<em>EnablePhysics</em> enables Bullet physics on the object, and
+<em>Restitution</em>, <em>Friction</em> and <em>Mass</em> determine the
+physical properties of the object.</p>
+
+<p style="text-align:left;margin-left:0;margin-right:auto;"><strong>21.
+AddActionControl</strong> - creates a custom control that uses a specific
+action defined by AddAction.<br>
+Syntax: <font face="Courier New, Courier, mono" size="2">AddActionControl
+<em>name, sound, direction, centerx, centerz, width, height, voffset,
+action_name(s), texture_name(s)<br>
+</em></font>Example: <font face="Courier New, Courier, mono"
+size="2">AddActionControl MyControl, switch.wav, front, -10, 10, 1.5, 1.5, 4,
+UndoMyAction, MyAction, Touch, TouchLit<br>
+</font><br>
+AddActionControl command creates an advanced control similar to elevator button
+panel controls, but assigned to an action created with the AddAction command.
+The <em>action_name(s)</em> and <em>texture_name(s)</em> parameters allow you
+to specify a list of actions, and a list of textures to go along with those
+actions. There needs to be a texture for every action; if you specify 3 actions
+and only 2 textures, you will get an error. The control starts up in the first
+action, and switches to the next actions in sequence when it's clicked.
+<em>Direction</em> is the direction the control itself will face in 3D space
+(front, left, right, back). <em>Voffset</em> is relative of the elevator's
+base. Leave the sound field blank for no sound to be
+played.<strong></strong></p>
+
+<p style="text-align:left;margin-left:0;margin-right:auto;"><strong>22.
+AddTrigger</strong> - creates a trigger that is used to signal an action when
+the user's camera enters or leaves the defined area.<br>
+Syntax:<font face="Courier New, Courier, mono" size="2"> AddTrigger <em>name,
+sound, start_x, start_y, start_z, end_x, end_y, end_z, action_names(s)<br>
+</em></font>Example:<font face="Courier New, Courier, mono"
+size="2"> AddTrigger MyTrigger, switch.wav, -30, 0, -30, -20, 10, -20,
+UndoMyAction, MyAction</font><br>
+<br>
+AddTrigger creates a trigger similar to action controls (AddActionControl) and
+elevator controls. The <em>action_names(s)</em> parameter allows you to specify
+a list of actions that this trigger will call when the camera enters or exits
+the area. The trigger starts in the first action, and will switch to each
+consecutive action when the users enters/leaves. The <em>X</em>, <em>Y</em> and
+<em>Z</em> parameters specify the 3D box that defines the trigger area, and are
+relative of the elevator's location. Leave the <em>sound</em> field blank for
+no sound to be played.</p>
+
+<p align="left"> </p>
+
+<p align="left"><strong><font size="+1"><a name="GlobalCommands"
+id="GlobalCommands"></a>8. Global Commands/Functions</font></strong></p>
+
+<p align="left">These commands and functions can be used anywhere in the
+script. In this section, <em>Destobject</em> refers to the destination object
+to create other objects in. It can be either <em>floor </em>(only available
+within a Floor section)<em>, elevator </em>(only available within an Elevator
+section), <em>external</em>, <em>landscape</em>, or <em>buildings</em> (more
+will come soon). When the command is used inside a <em>Floor</em> section, and
+<em>Destobject</em> is not <em>floor</em>, the altitude of the current floor
+will be used, and altitude/y values specified in these commands will be offsets
+of that altitude.</p>
+
+<p align="left"><br>
+<strong>a. AddTriangleWall</strong> - adds a textured triangular wall. If
+specified in a floor section, the Y values are then relative to the floor
+base.<br>
+Syntax: <font face="Courier New, Courier, mono" size="2">AddTriangleWall
+<em>destobject, name, texturename</em>, <em>x1</em>, <em>y1</em>, <em>z1</em>,
+<em>x2</em>, <em>y2</em>, <em>z2</em>, <em>x3</em>, <em>y3</em>, <em>z3</em>,
+<em>tw</em>, <em>th</em></font><br>
+Example: <font face="Courier New, Courier, mono" size="2">AddTrianglewall
+external, My Triangle, brick, 0, 0, 0, 0, 10, 0, 0, 0, 10, 0, 0</font></p>
+
+<p align="left"><strong>b. AddWall</strong> - adds a textured wall<br>
+Syntax: <font face="Courier New, Courier, mono" size="2">AddWall
+<em>destobject, name, texturename</em>, <em>thickness, x1</em>, <em>z1</em>,
+<em>x2</em>, z2, <em>height1</em>, <em>height2</em>, <em>altitude1</em>,
+<em>altitude2</em>, <em>tw</em>, <em>th</em></font><br>
+Example: <font face="Courier New, Courier, mono" size="2">AddWall buildings,
+Wall1, brick, 0.5, -10, -10, 10, 10, 15, 15, Floor(2).Altitude,
+Floor(2).Altitude, 0, 0</font></p>
+
+<p align="left">The command's parameters are the same as the Floor section's
+AddWall command.</p>
+
+<p align="left"><strong>c. AddFloor</strong> - adds a textured floor<br>
+Syntax: <font face="Courier New, Courier, mono" size="2">AddFloor
+<em>destobject, name, texturename</em>, <em>thickness, x1</em>, <em>z1</em>,
+<em>x2</em>, <em>z2</em>, <em>altitude1</em>, <em>altitude2</em>, reverse_axis,
+texture_direction, <em>tw</em>, <em>th</em></font></p>
+
+<p align="left">The command's parameters are the same as the Floor section's
+AddFloor command.</p>
+
+<p align="left"><strong>d. AddGround</strong> - adds a tile-based ground<br>
+Syntax: <font face="Courier New, Courier, mono" size="2">AddGround <em>name,
+texturename</em>, <em>x1</em>, <em>z1</em>, <em>x2</em>, <em>z2</em>,
+<em>altitude</em>, <em>tile_x</em>, <em>tile_y<br>
+</em></font>Example: <font face="Courier New, Courier, mono" size="2">AddGround
+AddGround Ground, Downtown, -158400, -158400, 158400, 158400, 0, 7920,
+7920</font></p>
+
+<p align="left">This command is mainly for creating large ground sections,
+since using the AddFloor function with a large amount of texture tiling causes
+interference problems. The <em>X</em> and <em>Z</em> values specify the total
+size of the ground, and the <em>tile_x</em> and <em>tile_y</em> specify the
+size of each tile square to create. For example, if the ground is 10,000 feet
+wide, and tile_x and tile_y are both 1000, then 100 total tiles will be
+created; 10 wide and 10 deep. In the example above 7920 is 1/40 of the total
+width (316800 which is 158400 * 2), so the tile grid will be 40x40 tiles.</p>
+
+<p align="left"><strong>e. CreateWallBox</strong> - creates 4 walls (box) at
+the specified coordinate locations<br>
+Syntax: <font face="Courier New, Courier, mono" size="2">CreateWallBox
+<em>destobject</em>, <em>name, texturename</em>, <em>x1</em>, <em>x2</em>,
+<em>z1</em>, <em>z2</em>, <em>height</em>, <em>voffset</em>, <em>tw</em>,
+<em>th, inside, outside, top, bottom </em></font><br>
+Example: <font face="Courier New, Courier, mono" size="2">CreateWallBox
+external, My Box, brick, -10, 10, -10, 10, 15, 0, 0, 0, true, true, true,
+true</font></p>
+
+<p align="left">The parameters in this command are very similar to the ones in
+the AddWall command shown below in the Floor section, except that a box is
+created instead of a single wall. <em>Inside</em> and <em>outside</em>
+determine if the wall should be visible from the inside/outside, and
+<em>top</em> and <em>bottom</em> determine if the top and bottom walls should
+be drawn.</p>
+
+<p align="left"><strong>f. CreateWallBox2</strong> - creates 4 walls (box) at a
+specified central location<br>
+Syntax: <font face="Courier New, Courier, mono" size="2">CreateWallBox2
+<em>destobject</em>, <em>name, texturename</em>, <em>centerx</em>,
+<em>centerz</em>, <em>widthx</em>, <em>lengthz</em>, <em>height</em>,
+<em>voffset</em>, <em>tw</em>, <em>th</em></font><font
+face="Courier New, Courier, mono" size="2"><em>, inside, outside, top, bottom
+</em></font><br>
+Example: <font face="Courier New, Courier, mono" size="2">CreateWallBox2
+external, My Box, brick, 0, 0, 10, 10, 15, 0, 0, 0, false, true, false,
+false</font></p>
+
+<p align="left">The parameters are the same as the above command, except that
+<em>centerx</em> and <em>centerz</em> define the center of the box, and
+<em>widthx</em> and <em>lengthz</em> specify the width and length off of the
+center.<br>
+<br>
+<strong>g. AddCustomWall</strong> - creates a custom polygon (wall, floor, etc)
+with any number of vertex points. For example, a triangular wall has 3 vertex
+points, and a standard wall has 4. This function allows at least 3 vertices.<br>
+Syntax: <font face="Courier New, Courier, mono" size="2">AddCustomWall
+<em>destobject, name, texturename, x1, y1, z1, x2, y2, z2, x3, y3, z3, ..., tw,
+th</em></font><br>
+Example: <font face="Courier New, Courier, mono" size="2">AddCustomWall
+external, My Wall, brick, 0, 0, 0, 0, 10, 0, 10, 10, 0, 10, 0, 10, 0,
+0</font></p>
+
+<p align="left"><strong>h. AddCustomFloor</strong> - the same as AddCustomWall,
+but with only one vertical parameter. If specified while in a floor section,
+the altitude is relative to the current floor's base.<br>
+Syntax: <font face="Courier New, Courier, mono" size="2">AddCustomFloor
+<em>destobject, name, texturename, x1, z1, x2, z2, x3, z3, ..., altitude, tw,
+th</em></font><br>
+Example: <font face="Courier New, Courier, mono" size="2">AddCustomFloor
+external, My Wall, brick, 0, 0, 0, 10, 10, 10, 10, 0, 0, 0, 0</font></p>
+
+<p align="left"><strong>i. AddShaft</strong> - creates a shaft at a specified
+location and floor range<br>
+Syntax: <font face="Courier New, Courier, mono" size="2">AddShaft <em>number,
+centerx, centerz, startfloor, endfloor</em></font><br>
+Example: <font face="Courier New, Courier, mono" size="2">AddShaft 1, 10, 10,
+0, 9</font></p>
+
+<p align="left">The <em>number</em> parameter specifies the shaft number to
+create. This command just tells the simulator the area that the shaft will take
+up, and does not create the actual shaft walls. Later on when you create the
+walls/floors for the shaft, make sure that you make a floor at the very bottom
+and very top of the shaft (they can extend beyond the walls).</p>
+
+<p align="left"><strong>j. CreateStairwell</strong> - creates a stairwell at a
+specified location and floor range<br>
+Syntax: <font face="Courier New, Courier, mono" size="2">CreateStairwell
+<em>number, centerx, centerz, startfloor, endfloor</em></font><br>
+Example: <font face="Courier New, Courier, mono" size="2">CreateStairwell 1,
+10, 10, 0, 9</font></p>
+
+<p align="left">The <em>number</em> parameter specifies the stairwell number to
+create. This command just tells the simulator the area that the stairwell will
+take up, and does not create the actual walls.</p>
+
+<p align="left"><strong>k. WallOrientation</strong> - changes the internal wall
+orientation parameter, which is used for determining the wall thickness
+boundaries in relation to their coordinates.<br>
+Syntax:<font face="Courier New, Courier, mono" size="2"> WallOrientation =
+<em>direction</em></font><br>
+Example: <font face="Courier New, Courier, mono" size="2">WallOrientation =
+left</font></p>
+
+<p align="left">The <em>direction</em> parameter can either be left, center, or
+right. Center is default. For example, if center is used, than half of the
+wall's thickness is to the right (positive) of it's x1/x2 or z1/z2 coordinates,
+and half is to the left (negative) of the coordinates. If left is used, than
+the coordinates define the wall's left (negative) edge, and the full thickness
+is to the right (positive) of those. If right is used, then again the
+coordinates define the wall's right (positive) edge, and the full thickness is
+to the left (negative) of those. See this graphic for a good example:</p>
+
+<p align="left"><img src="guide/wall_info.jpg"></p>
+
+<p align="left">In the graphic above, the large box at the top shows what the X
+and Z coordinates correspond to. The lower examples show the wall orientation
+as left or right, and if either the difference in x values or z values is
+larger.</p>
+
+<p align="left"><strong>l. FloorOrientation</strong> - changes the internal
+floor orientation parameter, which is used for determining the floor thickness
+boundaries in relation to their coordinates.<br>
+Syntax:<font face="Courier New, Courier, mono" size="2"> FloorOrientation =
+<em>direction</em></font><br>
+Example: <font face="Courier New, Courier, mono" size="2">FloorOrientation =
+bottom</font></p>
+
+<p align="left">The <em>direction</em> parameter can either be bottom, center,
+or top. Top is default. For example, if center is used, than half of the
+floor's thickness is above (positive) it's x1/x2 or z1/z2 coordinates, and half
+is below (negative) the coordinates. If bottom is used, than the coordinates
+define the floor's bottom edge, and the full thickness is the top (positive).
+If top is used, then again the coordinates define the floor's top edge, and the
+full thickness is the bottom (negative).</p>
+
+<p align="left"><strong>m. DrawWalls</strong> - specifies which parts of a wall
+or floor should be drawn.<br>
+Syntax:<font face="Courier New, Courier, mono" size="2"> DrawWalls =
+<em>MainNegative, MainPositive, SideNegative, SidePositive, Top,
+Bottom</em></font><br>
+Example: <font face="Courier New, Courier, mono" size="2">DrawWalls = true,
+true, false, false, false, false</font></p>
+
+<p align="left">The example shown is the default setting. <em>MainNegative</em>
+is the main (that makes up the front of a wall lengthwise, or the top area of a
+floor) face on the negative side, <em>MainPositive</em> is the main face on the
+positive side (back of a wall, or the bottom area of a floor),
+<em>SideNegative</em> is the side (the part that is along the thickness) face
+on the negative side, <em>SidePositive</em> is the side face on the positive
+side; <em>Top</em> refers to either the top side if a wall, or to the front
+face if a floor; <em>Bottom</em> refers to either the bottom side if a wall, or
+the back face if a floor. The following graphic explains the sides in detail:
+</p>
+
+<p align="left"><img src="guide/sides.jpg"></p>
+
+<p align="left"><strong>n. SetPlanarMapping</strong> - sets the planar texture
+mapper's parameters.<br>
+Syntax: <font face="Courier New, Courier, mono" size="2">SetPlanarMapping
+<em>Flat, FlipX, FlipY, FlipZ, Rotate</em></font><br>
+Example: <font face="Courier New, Courier, mono" size="2">SetPlanarMapping
+false, false, false, true, false</font></p>
+
+<p align="left"><em>FlipX</em>, <em>FlipY</em> and <em>FlipZ</em> reverse the
+texture mapping per axis, and <em>Flat</em> has it ignore depth., Skyscraper by
+default uses a simple planar texture mapper, which in simple terms draws the
+texture in a box around the object. With a basic wall, the top-left of the
+texture image is mapped to the top left of the wall, the top-right is mapped to
+the top-right of the wall, etc. If you want the top-right of the texture mapped
+to the top-left of the wall for example (to flip or change alignment), you'd
+set <em>FlipX</em> to false. This command is mainly used to change alignment -
+since the top-left of the texture is mapped to the top-left of the object, that
+means that textures have a left/top alignment by default. If you change
+<em>FlipX</em> to true, it'll be right-aligned. If you change <em>FlipY</em> to
+true, it'll be bottom-aligned. <em>Rotate</em> has it rotate the texture
+mapping 90 degrees counterclockwise, so instead of the texture being mapped
+from the top left to bottom right, if <em>Rotate</em> is true, it'll be mapped
+from the bottom left to top right. See this picture for an example:</p>
+
+<p align="left"><img src="guide/extents.jpg"></p>
+
+<p align="left">In the above picture, I tiled a texture (a black box with
+yellow around it) 2.5 times on width and height. The bottom floor shows the
+default texture mapping (ReverseExtents false, false, false, false, false);
+you'll notice that it's aligned to the top-left. In the middle one, I set the
+<em>FlipX</em> value to true (ReverseExtents false, true, false, false, false).
+In the top one, I set the <em>FlipY</em> value to true (ReverseExtents false,
+false, true, false, false).</p>
+
+<p align="left"><strong>o. SetTextureMapping</strong> - manually sets UV
+texture mapping for all polygons generated after this command;
+ResetTextureMapping restores the values to the defaults or previous<br>
+Syntax:<font face="Courier New, Courier, mono" size="2"> SetTextureMapping
+<em>vertex1, u1, v1, vertex2, u2, v2, vertex3, u3, v3</em></font><br>
+Example: <font face="Courier New, Courier, mono" size="2">SetTextureMapping 0,
+0, 0, 1, 1, 0, 2, 1, 1</font></p>
+
+<p align="left">The example shown above is the default value used by the
+simulator. This command maps the texture coordinates to the specified 3 vertex
+indices - normally a side of a wall will have 4 vertices/sets of coordinates (0
+to 3), and by default the first three are used (top left, top right and bottom
+right respectively), with the UV coordinates representing the size percentage
+of the texture (with 1 being 100%, 0.5 being 50%, etc; normally this would
+relate to absolute texture coordinates) - so in the example, texture coordinate
+0,0 (top left) is mapped at the first vertex (top left); texture coordinate 1,0
+(really "width, 0") being mapped at the second vertex (top right), and texture
+coordinate 1,1 (really "width, height") being mapped to the bottom right. For a
+standard wall, the valid vertex values are from 0 to 3. If a wall or floor is
+created with AddCustomWall, and if it has for example 7 vertex points, the
+valid values for this command would then be 0 to 6 (but only 3 vertices can be
+used for mapping purposes). One caveat with manual texture mapping is that
+sometimes the simulator will automatically reverse the vertices to keep the
+wall faces oriented properly, so if you set your texture mapping this way and
+notice issues, try reversing the coordinates (u3 would be u1 for a 3-point
+triangular wall, etc) and see if that helps. Textures can also be cropped with
+this command - for example, to map only a central square of a texture, you'd
+use:<br>
+<font face="Courier New, Courier, mono" size="2">SetTextureMapping 0, 0.25,
+0.25, 1, 0.75, 0.25, 2, 0.75, 0.75</font></p>
+
+<p align="left">Here's an easier way to see the example above:</p>
+
+<p align="left"><font face="Courier New, Courier, mono" size="2">0 -&gt; 0,
+0<br>
+1 -&gt; 1, 0<br>
+2 -&gt; 1, 1</font></p>
+
+<p align="left">The following diagram shows the mapping described above.
+Texture location 0,0 is mapped to wall vertex 0, location 1,0 is mapped to
+vertex 1, etc:</p>
+
+<p align="left"><img src="guide/texture_mapping.jpg" width="300"
+height="300"></p>
+
+<p align="left"><strong>p. SetTextureMapping2</strong> - advanced version of
+SetTextureMapping - manually sets UV texture mapping for all polygons generated
+after this command; ResetTextureMapping restores the values to the defaults or
+previous<br>
+Syntax:<font face="Courier New, Courier, mono" size="2"> SetTextureMapping2
+<em>v1x, v1y, v1z, u1, v1, v2x, v2y, v2z, u2, v2, v3x, v3y, v3z, u3,
+v3</em></font><br>
+Example: <font face="Courier New, Courier, mono" size="2">SetTextureMapping2
+x0, y0, z0, 0, 0, x1, y1, z1, 1, 0, x2, y2, z2, 1, 1</font></p>
+
+<p align="left">See the above description of SetTextureMapping for a detailed
+description on texture mapping in general. This command mostly does the same as
+that command, and the example given is the default command (and is equivalent
+to the SetTextureMapping example). Instead of just choosing which vertex
+indices to use like SetTextureMapping, this command lets you create your own
+texture vertices (sets of coordinates) using coordinates of already-existing
+vertices. The vertex values that can be used start with an "x", "y" or "z",
+followed by the vertex index. In the example, the X, Y and Z values of the
+first vertex are mapped to UV coordinate 0,0 - this is because "x0, y0, z0" was
+specified. A specification of "x0, y2, z0" will use the X and Z values from
+vertex 0, but the Y value from vertex 2. This way you can specify coordinates
+outside of the wall/polygon's range. Here's an easier way to see the
+example:</p>
+
+<p align="left"><font face="Courier New, Courier, mono" size="2">x0, y0, z0
+-&gt; 0, 0<br>
+x1, y1, z1 -&gt; 1, 0<br>
+x2, y2, z2 -&gt; 1, 1</font></p>
+
+<p align="left"><strong>q. ResetTextureMapping</strong> - resets the texture
+mapping parameters to either the default or previous values<br>
+Syntax:<font face="Courier New, Courier, mono" size="2"> ResetTextureMapping =
+<em>default</em></font><br>
+Example: <font face="Courier New, Courier, mono" size="2">ResetTextureMapping =
+true </font></p>
+
+<p align="left">If <em>default</em> is true, the texture mapping values are
+reset to the default, which is shown above in the SetTextureMapping's example.
+If <em>default</em> is false, the previous values will be loaded and used.</p>
+
+<p align="left"><strong>r. ReverseAxis</strong> - this command is deprecated,
+and only used for older versions of the AddFloor commands, since the current
+ones have this option built-in. This reverses the axis that the difference in
+altitude/voffset for floors corresponds to. In the AddFloor command, there are
+parameters for specifying two different altitudes. By default, if the altitudes
+are different, the floor will angle upward/downward along the Z axis
+(front/back), but if this is set to true, the floor will angle along the X axis
+(left/right).<br>
+Syntax:<font face="Courier New, Courier, mono" size="2"> ReverseAxis =
+<em>value</em></font></p>
+
+<p align="left"><strong>s. ShaftCut</strong> - used in conjunction with a shaft
+object - performs a vertical box cut on all floor objects (floors, ceilings,
+interfloor, etc) in the specified range.<br>
+Syntax:<font face="Courier New, Courier, mono" size="2"> ShaftCut <em>number,
+startx, startz, endx, endz, start_voffset, end_voffset</em></font><br>
+Example: <font face="Courier New, Courier, mono" size="2">ShaftCut 1, -4, -3.5,
+4, 3.5, 0, 5</font></p>
+
+<p align="left"><em>Number</em> is the number of the shaft object to work with.
+<em>Startx</em>, <em>startz</em>, <em>endx</em>, and <em>endz</em> are two sets
+of coordinates that specify the cut box's start position and end position,
+relative to the shaft's central position. <em>Start_voffset</em> is the
+position above the starting floor's altitude to start the cut at, and
+<em>end_voffset</em> is the position above the ending floor's altitude to end
+the cut at. The example cuts a box for shaft 1, with a width from -4 to 4, and
+a length from -3.5 to 3.5, starting at the starting floor's altitude, and
+ending at 5 feet above the ending floor's altitude.</p>
+
+<p align="left"><strong>t. CutStairwell</strong> - used in conjunction with a
+stairwell object - performs a vertical box cut on all floor objects (floors,
+ceilings, interfloor, etc) in the specified range. For the parameters, see the
+ShaftCut command.<strong><br>
+</strong>Syntax: <font face="Courier New, Courier, mono" size="2">CutStairwell
+<em>number, startx, startz, endx, endz, start_voffset,
+end_voffset</em></font><br>
+Example: <font face="Courier New, Courier, mono" size="2">CutStairwell 1, -4,
+-3.5, 4, 3.5, 0, 5</font></p>
+
+<p align="left"><strong>u. Isect</strong> - the Isect function calculates the
+position that a line intersects with a certain object, such as a floor. Since
+this is a function, it can be used in-line anywhere.<br>
+Syntax:<font face="Courier New, Courier, mono" size="2"> isect(<em>destobject,
+objectname, startx, starty, startz, endx, endy, endz</em>)</font><br>
+Example: <font face="Courier New, Courier, mono" size="2">isect(external,
+wall1, 10, 10, 0, -10, 10, 0)</font></p>
+
+<p align="left"><em>Destobject</em> is the destination object to get the object
+from (floor, external, landscape, or buildings). <em>Startx</em>,
+<em>starty</em>, and <em>startz</em> make up the position of the starting
+position, and <em>endx</em>, <em>endy</em> and <em>endz</em> make up the ending
+position. The first intersection of the named object is the return value, in
+"X, Y, Z" format (for example, "10, 1, 3").</p>
+
+<p align="left"><strong>v. SetAutoSize</strong> - enables or disables texture
+autosizing<br>
+Syntax:<font face="Courier New, Courier, mono" size="2"> SetAutoSize =
+<em>AutoWidth, AutoHeight </em></font><br>
+Example: <font face="Courier New, Courier, mono" size="2">SetAutoSize = true,
+true</font></p>
+
+<p align="left">This command will determine if the simulator should
+automatically size texture appropriately when applied to an object, such as a
+wall or floor. By default, both are enabled. The <em>AutoWidth</em> and
+<em>AutoHeight</em> parameters correspond to the "<em>tw</em>" and
+"<em>th</em>" parameters of the <em>AddWall</em>, <em>AddFloor</em>, etc
+commands. If any are false, then the parameters specified in the
+<em>AddWall</em> etc commands multiply the texture values stored with with the
+<em>Load</em> or <em>LoadRange</em> commands (see below); those values relate
+to the number of times a texture is tiled; so if <em>AutoHeight</em> is set to
+False, "2" is specified in the "<em>th</em>" value of <em>AddWall</em>, and the
+texture's stored "th" value is 1, then the texture will be tiled twice
+vertically. If either are true, the specified value will me multiplied by the
+related stored texture value and then autoadjusted.</p>
+
+<p align="left"><strong>w. TextureOverride</strong> - overrides textures for
+the next command. Currently only works with the different AddWall, AddFloor and
+AddInterFloor commands.<br>
+Syntax:<font face="Courier New, Courier, mono" size="2"> TextureOverride
+<em>MainNegativeTex, MainPositiveTex, SideNegativeTex, SidePositiveTex, TopTex,
+Bottom</em></font><font face="Courier New, Courier, mono"
+size="2"><em>Tex</em></font><br>
+Example: <font face="Courier New, Courier, mono" size="2">TextureOverride
+Metal1, ElevFloor, Metal1, Metal1, Metal1, Metal1</font></p>
+
+<p align="left">This command will allow you to specify multiple textures for a
+single command such as AddWall. It will only work on the command immediately
+after this one. In the above example, the Main Positive side of the object will
+have the texture "ElevFloor", but all other sides will use "Metal1".</p>
+
+<p align="left"><strong>x. ShaftShowFloors</strong> - allows a range of floors
+to be shown either while inside the specified shaft or while inside an elevator
+in the shaft - primarily for glass elevators.<br>
+Syntax:<font face="Courier New, Courier, mono" size="2"> ShaftShowFloors
+<em>ShaftNumber</em> = <em>range/list</em></font><br>
+Example: <font face="Courier New, Courier, mono" size="2">ShaftShowFloors 1 = 1
+- 10</font></p>
+
+<p align="left">In the above example, let's say the user is in an elevator in
+shaft 1, and is moving upwards from the 2nd floor. In this situation, the 2nd
+floor will be visible/enabled while they're in the elevator (since it was in
+the range specified with this command), but when they reach the 11th floor,
+that floor will be invisible/disabled.</p>
+
+<p align="left"><strong>y. ShaftShowOutside</strong> - allows objects outside
+the building (sky, landscape, etc) to be enabled while the user is both inside
+the specified shaft and on one of the specified floors - primarily for glass
+elevators.<br>
+Syntax:<font face="Courier New, Courier, mono" size="2"> ShowShaftOutside
+<em>ShaftNumber</em> = <em>range/list</em></font><br>
+Example: <font face="Courier New, Courier, mono" size="2">ShowShaftOutside 1 =
+1 - 10</font></p>
+
+<p align="left">In the above example, if a user is riding an elevator in shaft
+1, the outside (sky, landscape, etc) will be enabled while the elevator is on
+any of the floors from 1 to 10. Once the elevator reaches the 11th floor, the
+outside will be disabled. This command can be mixed with
+<em>ShaftShowFloors</em> for mixed atrium/external glass elevators such as the
+ones in the Glass Tower, where the elevator moves upwards through an indoor
+atrium, and eventually outside above the atrium. In that situation, the floors
+that comprise the lower (atrium) section would be specified using
+<em>ShaftShowFloors</em> (such as 1-10), while the upper (outdoor) floors would
+be specified using <em>ShaftShowOutside</em> (such as 11-20).</p>
+
+<p align="left"><strong>z. ShowFullShaft</strong> - determines if an entire
+shaft should always be shown, such as a glass elevator track.<br>
+Syntax:<font face="Courier New, Courier, mono" size="2"> ShowFullShaft
+<em>ShaftNumber</em> = <em>value</em></font><br>
+Example: <font face="Courier New, Courier, mono" size="2">ShowFullShaft 1 =
+true</font></p>
+
+<p style="text-align:left;margin-left:0;margin-right:auto;"><strong>aa.
+StairsShowFloors</strong> - allows a range of floors to be shown while inside
+the specified stairwell.<br>
+Syntax:<font face="Courier New, Courier, mono" size="2"> StairsShowFloors
+<em>StairwellNumber</em> = <em>range/list</em></font><br>
+Example: <font face="Courier New, Courier, mono" size="2">StairsShowFloors 1 =
+1 - 10</font><br>
+In the above example, let's say the user is in stairwell 1, and is walking
+upwards from the 2nd floor. In this situation, the 2nd floor will be
+visible/enabled while they're walking up (since it was in the range specified
+with this command), but when they reach the 11th floor, that floor will be
+invisible/disabled.</p>
+
+<p style="text-align:left;margin-left:0;margin-right:auto;"><strong>ab.
+ShowFullStairs</strong> - determines if an entire stairwell should be shown
+while the user is inside - useful for stairwells that have a gap in the center
+between the actual stairs.<br>
+Syntax:<font face="Courier New, Courier, mono" size="2"> ShowFullStairs
+<em>StairwellNumber</em> = <em>value</em></font><br>
+Example: ShowFullStairs 1 = true</p>
+
+<p align="left"><strong>ac. TextureFlip</strong> - flips specified textures for
+the next command.. Currently only works with the different AddWall, AddFloor
+and AddInterFloor commands. The values available are 0 for no flipping, 1 for
+horizontal flip, 2 for vertical flip, and 3 for both horizontal and
+vertical.<br>
+Syntax:<font face="Courier New, Courier, mono" size="2"> TextureFlip
+<em>MainNegative, MainPositive, SideNegative, SidePositive, Top,
+Bottom</em></font><br>
+Example: <font face="Courier New, Courier, mono" size="2">TextureFlip 1, 1, 0,
+0, 0, 0</font></p>
+
+<p align="left">This command will allow you to flip textures on specific parts
+of a wall or floor created with a command such as AddWall. It will only work on
+the command immediately after this one. In the above example, the Main Positive
+and Main Negative sides of the object will have their textures flipped
+horizontally.</p>
+
+<p align="left"><strong>ad. Cut</strong> - performs a manual box cut on an
+object<br>
+Syntax: <font face="Courier New, Courier, mono" size="2">Cut <em>destobject,
+x1, y1, z1, x2, y2, z2, cutwalls, cutfloors</em><br>
+</font>Example: <font face="Courier New, Courier, mono" size="2">Cut external,
+-5, -5, -5, 5, 5, 5, false, true</font></p>
+
+<p align="left">The <em>x</em>, <em>y</em> and <em>z</em> values specify the
+start and end coordinates of the box cut. If <em>cutwalls</em> is true, the
+function will cut walls; if <em>cutfloors</em> is true, it'll cut floors.</p>
+
+<p align="left"><strong>ae. Mount</strong> - mounts a zip file in the data
+directory into a virtual path.<br>
+Syntax: <font face="Courier New, Courier, mono" size="2">Mount
+<em>filename</em>, <em>path</em></font><br>
+Example: <font face="Courier New, Courier, mono" size="2">Mount myfile.zip,
+mydirectory</font></p>
+
+<p align="left">In this example, the file myfile.zip located in Skyscraper's
+data directory will be mounted as "mydirectory", and so a file such as test.jpg
+inside that zip file will appear as "mydirectory/test.jpg".</p>
+
+<p align="left"><strong>af. AddFloorAutoArea</strong> - defines an area that
+will automatically enable and disable floors when the user moves within it,
+similar to a stairwell<br>
+Syntax: <font face="Courier New, Courier, mono" size="2">AddFloorAutoArea
+<em>x1, y1, z1, x2, y2, z2</em></font><br>
+Example: <font face="Courier New, Courier, mono" size="2">AddFloorAutoArea
+-100, 0, -100, 100, 100, 100</font></p>
+
+<p align="left"><strong>ag. AddSound</strong> - creates a user-defined sound at
+the specified position<br>
+Syntax: <font face="Courier New, Courier, mono" size="2">AddSound <em>name,
+filename, x, y, z, loop[, volume, speed, min_distance, max_distance,
+doppler_level, cone_inside_angle, cone_outside_angle, cone_outside_volume,
+direction_x, direction_y, direction_z]</em></font><br>
+Example 1: <font face="Courier New, Courier, mono" size="2">AddSound MySound,
+sound.wav, 10, 100, 5, true<br>
+</font>Example 2: <font face="Courier New, Courier, mono" size="2">AddSound
+MySound, ambient.ogg, 10, 100, 5, true, 1, 100, 1, -1, 0, 360, 360, 1, 0, 0,
+0</font></p>
+
+<p align="left">This command creates a custom sound in the specified position,
+and has a number of optional parameters - the defaults for the optional
+parameters are shown in Example 2. <em>Loop</em> specifies if the sound should
+loop and play on startup. If you're going to use any of the optional
+parameters, you must specify them all. <em>X</em>, <em>Y</em> and <em>Z</em>
+specify the location in 3D space that the sound will be at, <em>volume</em>
+specifies the volume percentage (with 1.0 being 100%) of the sound,
+<em>speed</em> determines the playback speed of the sound in percent,
+<em>min_distance</em> and <em>max_distance</em> set the minimum and maximum
+distances that the sound can be heard at full volume - by default, minimum is 1
+and maximum is -1. <em>Doppler_level </em>specifies the doppler scale for the
+sound (0 means off, the default, 1 is normal, 5 is max).
+<em>Cone_inside_angle</em> is the angle within which the sound is at it's
+normal volume (default 360), <em>cone_outside_angle</em> is the outside angle
+that the sound is at it's normal volume (default 360, shouldn't be less than
+the inside angle), and <em>cone_outside_volume</em> is the volume level of the
+sound outside (0.0 to 1.0, default 1.0)<em>. Direction_x</em>,
+<em>direction_y</em> and <em>direction_z</em> specify the direction of the
+sound cone.</p>
+
+<p align="left"><strong>ah. GetWallExtents</strong> - the GetWallExtents
+command returns the X and Z extents (minimum and maximum values) of a wall, at
+the specified altitude. The command will return the results in the MinX, MinZ,
+MaxX and MaxZ variables.<br>
+Syntax:<font face="Courier New, Courier, mono" size="2"> GetWallExtents
+<em>destobject, wallname, altitude</em></font><br>
+Example: <font face="Courier New, Courier, mono" size="2">GetWallExtents
+external, wall1:front, 10</font></p>
+
+<p align="left">Then to use the values:<br>
+Example: <font face="Courier New, Courier, mono" size="2">Set 2 =
+%minz%</font></p>
+
+<p align="left"><em>Destobject</em> is the destination object to get the object
+from (floor, external, landscape, or buildings). <em>Wallname </em>specifies
+the name of the wall to get the extents from. Generally this should be in the
+form of "name:side", but if you leave out the "side" parameter, it'll choose
+one of the sides from a pre-defined search list. Sides of walls made from any
+AddWall command generally have "front", "back", "left" and "right" sides. Walls
+made using AddCustomWall and AddTriangleWall have sides of "0" (front) and "1"
+(back), so with those you'd specify "name:0" for the front. <em>Altitude</em>
+specifies the altitude to use for the check - basically it makes a copy of the
+wall, cuts it down to a line at that altitude, and returns the coordinates of
+the endpoints. The command will store the results in the MinX, MinZ, MaxX and
+MaxZ variables, which can be used anywhere in the script - to get the minimum X
+result, you'd use %minx%.</p>
+
+<p style="text-align:left;margin-left:0;margin-right:auto;"><strong>ai.
+AddAction</strong> - defines an action, to be used by custom controls and
+triggers.<br>
+Syntax:<font face="Courier New, Courier, mono" size="2"> AddAction <em>name,
+parent_object, command[, parameters</em></font><em>]<br>
+</em>Example:<font face="Courier New, Courier, mono" size="2"> AddAction
+MyAction, Floor 2, ChangeTexture, OldTexture, NewTexture</font><br>
+Example:<font face="Courier New, Courier, mono" size="2"> AddAction
+MySoundAction, Floor 2, PlaySound, Sound1, false</font><br>
+</p>
+
+<p style="text-align:left;margin-left:0;margin-right:auto;">This command
+creates a global action, to be used with commands such as
+<em>AddActionControl</em> and <em>AddTrigger</em>. <em>Name</em> must be a
+globally-unique name. If the same name is used for multiple actions, all of
+those actions will be run when an object uses that name. <em>Parent_object</em>
+is the object to use to perform the action on. Currently includes "Global",
+floors such as "Floor 2", elevators such as "Elevator 1", shafts like "Shaft 1"
+stairwells like "Stairwell 2", and can also be specified as a range of objects,
+such as "Floors 3 to 8".</p>
+
+<p style="text-align:left;margin-left:0;margin-right:auto;">Commands and
+parameters:</p>
+
+<p style="text-align:left;margin-left:0;margin-right:auto;">(General)<br>
+<em>ChangeTexture</em>: oldtexture, newtexture<br>
+<em>PlaySound</em>: name, loop true/false<br>
+<em>OpenShaftDoor</em>: door number (0 for all), floor number (parent needs to
+be the elevator object)<br>
+<em>CloseShaftDoor</em>: door number (0 for all), floor number (parent needs to
+be the elevator object)<br>
+<em>OpenShaftDoorManual</em>: door number (0 for all), floor number (parent
+needs to be elevator object)<br>
+<em>CloseShaftDoorManual</em>: door number (0 for all), floor number (parent
+needs to be elevator object)<br>
+(for other elevator commands, see the AddControl command in the elevator
+section)</p>
+
+<p style="text-align:left;margin-left:0;margin-right:auto;">The
+<em>PlaySound</em> command plays sounds created with the AddSound command. With
+this command, if multiple sounds have the same name, all of those sounds will
+be played simultaneously when the related action is run.</p>
+
+<p style="text-align:left;margin-left:0;margin-right:auto;">OpenShaftDoor
+example, to open elevator 1's shaft doors on floor 2:</p>
+
+<p style="text-align:left;margin-left:0;margin-right:auto;"><font
+face="Courier New, Courier, mono" size="2">AddAction MyDoorOpen, Elevator 1,
+OpenShaftDoor, 0, 2</font></p>
+
+<p style="text-align:left;margin-left:0;margin-right:auto;">PlaySound example,
+to play sound FireAlarm created using the AddSound command on Floor 1:</p>
+
+<p style="text-align:left;margin-left:0;margin-right:auto;"><font
+face="Courier New, Courier, mono" size="2">AddAction MySound, Floor 1,
+FireAlarm, true</font></p>
+
+<p style="text-align:left;margin-left:0;margin-right:auto;"><strong>aj.
+AddActionControl</strong> - creates a custom control that uses a specific
+action defined by AddAction.<br>
+Syntax: <font face="Courier New, Courier, mono" size="2">AddActionControl
+<em>name, sound, direction, centerx, centerz, width, height, voffset,
+action_name(s), texture_name(s)<br>
+</em></font>Example: <font face="Courier New, Courier, mono"
+size="2">AddActionControl MyControl, switch.wav, front, -10, 10, 1.5, 1.5, 4,
+UndoMyAction, MyAction, Touch, TouchLit<br>
+</font><br>
+AddActionControl command creates an advanced control similar to elevator button
+panel controls, but assigned to an action created with the AddAction command.
+The <em>action_name(s)</em> and <em>texture_name(s)</em> parameters allow you
+to specify a list of actions, and a list of textures to go along with those
+actions. There needs to be a texture for every action; if you specify 3 actions
+and only 2 textures, you will get an error. The control starts up in the first
+action, and switches to the next actions in sequence when it's clicked.
+<em>Direction</em> is the direction the control itself will face in 3D space
+(front, left, right, back). Leave the sound field blank for no sound to be
+played.</p>
+
+<p style="text-align:left;margin-left:0;margin-right:auto;"><strong>ak.
+AddTrigger</strong> - creates a trigger that is used to signal an action when
+the user's camera enters or leaves the defined area.<br>
+Syntax:<font face="Courier New, Courier, mono" size="2"> AddTrigger <em>name,
+sound, start_x, start_y, start_z, end_x, end_y, end_z, action_names(s)<br>
+</em></font>Example:<font face="Courier New, Courier, mono"
+size="2"> AddTrigger MyTrigger, switch.wav, -30, 0, -30, -20, 10, -20,
+UndoMyAction, MyAction</font><br>
+<br>
+AddTrigger creates a trigger similar to action controls (AddActionControl) and
+elevator controls. The <em>action_names(s)</em> parameter allows you to specify
+a list of actions that this trigger will call when the camera enters or exits
+the area. The trigger starts in the first action, and will switch to each
+consecutive action when the users enters/leaves. The <em>X</em>, <em>Y</em> and
+<em>Z</em> parameters specify the 3D box that defines the trigger area. Leave
+the <em>sound</em> field blank for no sound to be played.</p>
+
+<p style="text-align:left;margin-left:0;margin-right:auto;"><strong>al.
+SetKey</strong> - specifies that the next created model will be a key. The
+model will be tagged with a specific key ID number, and when clicked, the key
+ID will be added to the user's keyring and the model will be deleted. The value
+must be greater than 0.<br>
+Syntax:<font face="Courier New, Courier, mono" size="2"> SetKey
+<em>keyid</em></font><br>
+Example: SetKey 1</p>
+
+<p style="text-align:left;margin-left:0;margin-right:auto;"><strong>am.
+SetLock</strong> - sets the lock and key parameters for subsequent doors,
+controls/buttons, and call buttons that are created.<br>
+Syntax:<font face="Courier New, Courier, mono" size="2"> SetLock
+<em>locked</em>, <em>keyid</em></font><br>
+Example: SetLock 1, 3</p>
+
+<p style="text-align:left;margin-left:0;margin-right:auto;">For doors,
+<em>locked</em> specifies which sides (directions) are locked. Values are:<br>
+0 - unlocked<br>
+1 - negative-facing (left/front) side locked<br>
+2 - positive-facing (right/back) side locked<br>
+3 - both sides locked</p>
+
+<p style="text-align:left;margin-left:0;margin-right:auto;">For
+controls/buttons and call buttons, the <em>locked</em> values are:<br>
+0 - unlocked<br>
+1 - locked</p>
+
+<p style="text-align:left;margin-left:0;margin-right:auto;">Locked objects can
+only be unlocked if the person has the key number specified as <em>keyid</em>.
+If <em>keyid</em> is 0, no key is needed to lock or unlock. To reset to the
+defaults, use 0 for the <em>locked</em> setting and 0 for <em>keyid</em>.<br>
+</p>
+
+<p style="text-align:left;margin-left:0;margin-right:auto;"><strong>an.
+Print</strong> - prints the contents of a line to the console. This command
+will still convert variables and even math expressions, and output the
+results.<br>
+Syntax: <font face="Courier New, Courier, mono" size="2">Print
+<em>text</em></font><br>
+Example: <font face="Courier New, Courier, mono" size="2">Print 1+1</font></p>
+
+<p style="text-align:left;margin-left:0;margin-right:auto;"></p>
+
+<p style="text-align:left;margin-left:0;margin-right:auto;"><strong>ao.
+Delete</strong> - deletes an object. This command is normally used after a
+building has loaded.<br>
+Syntax: <font face="Courier New, Courier, mono" size="2">Delete
+<em>object_number</em></font><br>
+Example: <font face="Courier New, Courier, mono" size="2">Delete 12</font></p>
+
+<p style="text-align:left;margin-left:0;margin-right:auto;"></p>
+
+<p style="text-align:left;margin-left:0;margin-right:auto;"><strong>ap.
+RunAction</strong> - runs an action by name. This command is normally used
+after a building has loaded.<br>
+Syntax: <font face="Courier New, Courier, mono" size="2">RunAction
+<em>name</em></font><br>
+Example: <font face="Courier New, Courier, mono" size="2">RunAction
+myaction</font></p>
+
+<p style="text-align:left;margin-left:0;margin-right:auto;"></p>
+
+<p style="text-align:left;margin-left:0;margin-right:auto;"><strong>aq.
+AddActionParent</strong> - adds a parent object to an existing action. See the
+AddAction command for details on parent objects<br>
+Syntax: <font face="Courier New, Courier, mono" size="2">AddActionParent
+<em>name, object</em></font><br>
+Example: <font face="Courier New, Courier, mono" size="2">AddActionParent
+myaction, Elevator 2</font><br>
+Example: <font face="Courier New, Courier, mono" size="2">AddActionParent
+myaction, Floors 2 to 5</font></p>
+
+<p style="text-align:left;margin-left:0;margin-right:auto;"></p>
+
+<p style="text-align:left;margin-left:0;margin-right:auto;"><strong>ar.
+RemoveActionParent</strong> - removes a parent object from an existing action.
+See the AddAction command for details on parent objects. This command is
+normally used after a building has loaded.<br>
+Syntax: <font face="Courier New, Courier, mono" size="2">RemoveActionParent
+<em>name, object</em></font><br>
+Example: <font face="Courier New, Courier, mono" size="2">RemoveActionParent
+myaction, Elevator 2</font><br>
+Example: <font face="Courier New, Courier, mono" size="2">RemoveActionParent
+myaction, Floors 2 to 5</font></p>
+
+<p style="text-align:left;margin-left:0;margin-right:auto;"></p>
+
+<p style="text-align:left;margin-left:0;margin-right:auto;"><strong>as.
+GotoFloor</strong> - jumps the user to the specified floor. This command is
+normally used after a building has loaded.<br>
+Syntax: <font face="Courier New, Courier, mono" size="2">GotoFloor
+<em>floor</em></font><br>
+Example: <font face="Courier New, Courier, mono" size="2">GotoFloor 3</font></p>
+
+<p style="text-align:left;margin-left:0;margin-right:auto;"></p>
+
+<p align="left"><strong>at. EndPoint</strong> - the EndPoint function
+calculates endpoint coordinates given a starting point, direction (angle in
+degrees), and distance.<br>
+Syntax:<font face="Courier New, Courier, mono" size="2"> endpoint(<em>startx,
+starty, angle, distance</em>)</font><br>
+Example: <font face="Courier New, Courier, mono" size="2">endpoint(-150, 150,
+180, 20)</font><br>
+Result: <font face="Courier New, Courier, mono" size="2">-150, 130</font></p>
+
+<p style="text-align:left;margin-left:0;margin-right:auto;"></p>
+
+<p></p>
+
+<p align="left"> </p>
+
+<p align="left"><strong>8. END command</strong></p>
+
+<p align="left">The End command tells the software to stop processing the
+current script and start the simulation. This is optional.<br>
+Example: <font face="Courier New, Courier, mono" size="2">&lt;end&gt;</font></p>
+
+<p align="left"><br>
+<strong>9. BREAK command</strong></p>
+
+<p align="left">The Break command triggers a break section in the script
+processor, and is used when running a debug build of the simulator, with a
+debugger attached. A breakpoint can be set on the associated line in
+fileio.cpp, and when this command is called, the debugger will hit the
+breakpoint.<br>
+Example: <font face="Courier New, Courier, mono"
+size="2">&lt;break&gt;</font></p>
+
+<p align="left"> </p>
+
+<p align="left"><strong><font size="+1"><a name="Functions"
+id="Functions"></a>9. Predefined Functions</font></strong></p>
+
+<p align="left">There are a number of script functions provided by the
+simulator. Currently there's only a single script for elevator doors - see the
+Simple building (noted at the bottom of this page) for an example. These
+functions can be used by putting this line in your script:</p>
+
+<p align="left"><font face="Courier New, Courier, mono" size="2">&lt;Include
+data/scripts/elevator_doors.txt&gt;</font></p>
+
+<p align="left">You'll then be able to use some predefined door functions:</p>
+
+<p align="left"><strong>1. elevdoor_single</strong> - creates a single-slide
+elevator door.<br>
+Syntax: <font face="Courier New, Courier, mono"
+size="2">elevdoor_single(<em>door_number, texture, side_texture, thickness,
+CenterX, CenterZ, width, height, door_direction, movement_direction, speed,
+is_shaft_door</em>)</font></p>
+
+<p align="left"><em>Door_Direction</em> is either "left", "right", "front" or
+"back" and is the direction the doors face (torwards the outside of the
+elevator). <em>Movement_direction</em> is the direction the door should
+move.</p>
+
+<p align="left"><strong>2. elevdoor_center</strong> - creates a center-open
+elevator door.<br>
+Syntax: <font face="Courier New, Courier, mono"
+size="2">elevdoor_center(<em>door_number, texture, side_texture, thickness,
+CenterX, CenterZ, width, height, door_direction, speed,
+is_shaft_door</em>)</font></p>
+
+<p align="left"><strong>3. elevdoor_center_classic</strong> - creates a
+center-open elevator door with a partially open interior door.<br>
+Syntax: <font face="Courier New, Courier, mono"
+size="2">elevdoor_center_classic(<em>door_number, texture, side_texture,
+thickness, CenterX, CenterZ, width, height, door_direction, speed,
+is_shaft_door</em>)</font></p>
+
+<p align="left"><strong>4. elevdoor_dualspeed_left</strong> - creates a
+dual-speed door that opens to the left<br>
+Syntax: <font face="Courier New, Courier, mono"
+size="2">elevdoor_dualspeed_left(<em>door_number, texture, side_texture,
+thickness, CenterX, CenterZ, width, height, door_direction, speed,
+is_shaft_door</em>)</font></p>
+
+<p align="left"><strong>5. </strong><strong>elevdoor_dualspeed_right</strong> -
+creates a dual-speed door that opens to the right<br>
+Syntax: <font face="Courier New, Courier, mono"
+size="2">elevdoor_dualspeed_right(<em>door_number, texture, side_texture,
+thickness, CenterX, CenterZ, width, height, door_direction, speed,
+is_shaft_door</em>)</font></p>
+
+<p align="left"><strong>6. </strong><strong>elevdoor_center_dualspeed</strong>
+- creates a dual-speed center-open door<br>
+Syntax: <font face="Courier New, Courier, mono"
+size="2">elevdoor_center_dualspeed(<em>door_number, texture, side_texture,
+thickness, CenterX, CenterZ, width, height, door_direction, speed,
+is_shaft_door</em>)</font></p>
+
+<p align="left"> </p>
+
+<p align="left"><strong><font size="+1"><a name="Example"></a>10. Small Example
+Building</font></strong></p>
+
+<p align="left">To see an example of a small simplistic building in code, look
+at the Simple.bld file in Skyscraper's buildings directory. It's also available
+online <a
+href="http://cvs.tliquest.net/viewvc/*checkout*/skyscraper/buildings/Simple.bld">here</a>.</p>
+
+<p align="left"> </p>
 </div>
 </body>
 </html>