1), 0 0 8px rgba(82, 168, 236, 0.6);
  box-shadow: inset 0 1px 3px rgba(0, 0, 0, 0.1), 0 0 8px rgba(82, 168, 236, 0.6);
}

/* buttons */
button {
  display: inline-block;
  padding: 4px 14px;
  font-family: "Helvetica Neue", Helvetica, Arial, sans-serif;
  font-size: 13px;
  line-height: 18px;
  -webkit-border-radius: 4px;
  -moz-border-radius: 4px;
  border-radius: 4px;
  -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05);
  -moz-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05);
  box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05);
  background-color: #0064cd;
  background-repeat: repeat-x;
  background-image: -khtml-gradient(linear, left top, left bottom, from(#049cdb), to(#0064cd));
  background-image: -moz-linear-gradient(top, #049cdb, #0064cd);
  background-image: -ms-linear-gradient(top, #049cdb, #0064cd);
  background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #049cdb), color-stop(100%, #0064cd));
  background-image: -webkit-linear-gradient(top, #049cdb, #0064cd);
  background-image: -o-linear-gradient(top, #049cdb, #0064cd);
  background-image: linear-gradient(top, #049cdb, #0064cd);
  color: #fff;
  text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25);
  border: 1px solid #004b9a;
  border-bottom-color: #003f81;
  -webkit-transition: 0.1s linear all;
  -moz-transition: 0.1s linear all;
  transition: 0.1s linear all;
  border-color: #0064cd #0064cd #003f81;
  border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);
}
button:hover {
  color: #fff;
  background-position: 0 -15px;
  text-decoration: none;
}
button:active {
  -webkit-box-shadow: inset 0 3px 7px rgba(0, 0, 0, 0.15), 0 1px 2px rgba(0, 0, 0, 0.05);
  -moz-box-shadow: inset 0 3px 7px rgba(0, 0, 0, 0.15), 0 1px 2px rgba(0, 0, 0, 0.05);
  box-shadow: inset 0 3px 7px rgba(0, 0, 0, 0.15), 0 1px 2px rgba(0, 0, 0, 0.05);
}
button::-moz-focus-inner {
  padding: 0;
  border: 0;
}

/* CSS stylesheet is based on Kevin Burke's Markdown.css project (http://kevinburke.bitbucket.org/markdowncss) */
</style>
</head>
<body>
<h1>Scripting</h1>

<p><em>Patterns and levels must be scripted using LUA. LUA is a versatile scripting language that allows the user to create any kind of pattern.</em></p>

<p><a href="http://www.lua.org/manual/5.1/manual.html" title="LUA manual">http://www.lua.org/manual/5.1/manual.html</a></p>

<p>There are many LUA editors that can check your syntax and make you avoid typos: I use <a href="http://sourceforge.net/projects/luaedit/">http://sourceforge.net/projects/luaedit/</a></p>

<hr />

<h2>Hardcoded LUA commands</h2>

<p><em>These commands can be called like any other function. They are hardcoded because they directly communicate with the C++ engine.</em></p>

<p><code>log(mLog)</code> </br>
Sends a log message to the console. Very useful for debugging!</p>

<p><code>getSides()</code> </br>
Returns the current number of sides.</p>

<p><code>getSpeedMult()</code> </br>
Returns the current speed multiplier.</p>

<p><code>getDelayMult()</code> </br>
Returns the current delay multiplier.</p>

<p><code>execScript(mFilename)</code> </br>
Executes another LUA file. Can both be used to include useful functions, and to execute a series of commands.
Example: <code>execFile("test.lua")</code></p>

<p><code>wait(mDuration)</code> </br>
Makes the pattern timeline wait <code>mDuration</code> frames. This will halt pattern spawning. If the timeline has no more commands, the <code>"lua_file"</code> of the level is executed again from the beginning.</p>

<p><code>wall(mSide, mThickness)</code> </br>
Creates a wall with default speed, at side <code>mSide</code>, with thickness <code>mThickness</code>. Useful wall creation functions are commonly defined in <code>common.lua</code> and <code>commonpatterns.lua</code>. </p>

<p><code>wallAdj(mSide, mThickness, mSpeedAdj)</code> </br>
Creates a wall with default speed multiplied by <code>mSpeedAdj</code>, at side <code>mSide</code>, with thickness <code>mThickness</code>.</p>

<p><code>execEvent(mId)</code> </br>
Executes an event file with id <code>mId</code> immediately. Similar to event command <code>"event_exec"</code>.</p>

<p><code>enqueueEvent(mId)</code> </br>
Enqueues an event file with id <code>mId</code>. Similar to event command <code>"event_enqueue"</code>.</p>

<p><code>getLevelValueInt(mValueName)</code> </br>
<code>getLevelValueFloat(mValueName)</code> </br> 
<code>getLevelValueString(mValueName)</code> </br> 
<code>getLevelValueBool(mValueName)</code> </br> 
<code>setLevelValueInt(mValueName, mValue)</code> </br>
<code>setLevelValueFloat(mValueName, mValue)</code></br> 
<code>setLevelValueString(mValueName, mValue)</code> </br> 
<code>setLevelValueBool(mValueName, mValue)</code> </br> 
Manipulate the current level values. This allows you to change any value that is present in the level.json file. You can also create new values and use them as 'global variables' for your LUA scripts. Nothing will be saved to the actual.json file, it only works in memory.</p>

<p><code>getStyleValueInt(mValueName)</code> </br>
<code>getStyleValueFloat(mValueName)</code> </br> 
<code>getStyleValueString(mValueName)</code> </br> 
<code>getStyleValueBool(mValueName)</code> </br> 
<code>setStyleValueInt(mValueName, mValue)</code> </br>
<code>setStyleValueFloat(mValueName, mValue)</code></br> 
<code>setStyleValueString(mValueName, mValue)</code> </br> 
<code>setStyleValueBool(mValueName, mValue)</code> </br> 
Manipulate the current style values. This allows you to change any value that is present in the style.json file. You can also create new values and use