<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Scripting on StompyMUX Documentation</title><link>https://gtaylor.github.io/stompymux/docs/scripting/</link><description>Recent content in Scripting on StompyMUX Documentation</description><generator>Hugo</generator><language>en</language><atom:link href="https://gtaylor.github.io/stompymux/docs/scripting/index.xml" rel="self" type="application/rss+xml"/><item><title>Overview</title><link>https://gtaylor.github.io/stompymux/docs/scripting/overview/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://gtaylor.github.io/stompymux/docs/scripting/overview/</guid><description>&lt;p&gt;LuaJIT modules live under &lt;code&gt;game/lua&lt;/code&gt; in three separate roots:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;lua/
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; object_logic/ # @lua/parent modules and their private helpers
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; global_logic/ # globally matched command and scheduled modules
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; packages/ # shared require-only helpers
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="object-and-global-logic"&gt;Object and global logic&lt;/h2&gt;
&lt;p&gt;Attach a module to an object with the wizard-only &lt;code&gt;@lua/parent &amp;lt;object&amp;gt;=&amp;lt;path&amp;gt;.lua&lt;/code&gt;; the path is relative to &lt;code&gt;object_logic&lt;/code&gt;, and omitting it
clears the attachment. Each object uses only its own direct attachment. See
&lt;a href="https://gtaylor.github.io/stompymux/docs/scripting/scripting-objects/"&gt;Object scripting&lt;/a&gt; for the
full module contract, the native event catalog, and how load errors are
handled.&lt;/p&gt;</description></item><item><title>Object scripting</title><link>https://gtaylor.github.io/stompymux/docs/scripting/scripting-objects/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://gtaylor.github.io/stompymux/docs/scripting/scripting-objects/</guid><description>&lt;p&gt;Object Lua modules live under &lt;code&gt;game/lua/object_logic&lt;/code&gt;. Attach one to an
object with the wizard-only command:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;@lua/parent &amp;lt;object&amp;gt;=&amp;lt;path&amp;gt;.lua
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;The path is relative to &lt;code&gt;object_logic&lt;/code&gt;; for example,
&lt;code&gt;@lua/parent #123=hello.lua&lt;/code&gt; selects
&lt;code&gt;game/lua/object_logic/hello.lua&lt;/code&gt;. Paths must be relative &lt;code&gt;.lua&lt;/code&gt; files and
cannot escape into &lt;code&gt;global_logic&lt;/code&gt; or &lt;code&gt;packages&lt;/code&gt;. Omit the path to clear an
attachment.&lt;/p&gt;
&lt;p&gt;The &lt;code&gt;[mux]&lt;/code&gt; settings &lt;code&gt;default_thing_lua_parent&lt;/code&gt;, &lt;code&gt;default_room_lua_parent&lt;/code&gt;,
&lt;code&gt;default_exit_lua_parent&lt;/code&gt;, and &lt;code&gt;default_player_lua_parent&lt;/code&gt; assign direct Lua
parents to newly created objects of each type. Paths use the same
&lt;code&gt;object_logic&lt;/code&gt;-relative format as &lt;code&gt;@lua/parent&lt;/code&gt;. Changing a default does not
update existing objects. Clones preserve the source object&amp;rsquo;s Lua parent (or
its lack of one) rather than receiving the type default.&lt;/p&gt;</description></item><item><title>Object Flags</title><link>https://gtaylor.github.io/stompymux/docs/scripting/flags/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://gtaylor.github.io/stompymux/docs/scripting/flags/</guid><description>&lt;p&gt;Object flags are independent boolean properties on database objects. Native
code stores each flag in a &lt;code&gt;has_&amp;lt;name&amp;gt;_flag&lt;/code&gt; field and in a matching SQLite
column. There is no packed flag word and no reserved legacy bits.&lt;/p&gt;
&lt;p&gt;Flags are displayed after the object type as compact letters. A script or
administrator should use the full flag name when issuing a command because
&lt;code&gt;ANSI&lt;/code&gt; and &lt;code&gt;XCODE&lt;/code&gt; both use &lt;code&gt;X&lt;/code&gt;:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;@set &amp;lt;object&amp;gt;=&amp;lt;flag&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;@set &amp;lt;object&amp;gt;=!&amp;lt;flag&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;The &lt;code&gt;mux&lt;/code&gt; Lua package does not currently expose direct flag getter or setter
functions. Lua logic can invoke an appropriate native command with
&lt;code&gt;mux.command&lt;/code&gt;; queued commands run as God after the current callback finishes.&lt;/p&gt;</description></item><item><title>Object Powers</title><link>https://gtaylor.github.io/stompymux/docs/scripting/powers/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://gtaylor.github.io/stompymux/docs/scripting/powers/</guid><description>&lt;p&gt;Object powers are independent boolean privileges stored on database objects.
They are separate from &lt;a href="../flags/"&gt;object flags&lt;/a&gt;: flags describe object state
and presentation, while powers grant an exception to normal server behavior.
Native code stores each power in a &lt;code&gt;has_&amp;lt;name&amp;gt;_power&lt;/code&gt; field and in a matching
SQLite column.&lt;/p&gt;
&lt;p&gt;&lt;code&gt;IDLE&lt;/code&gt; is the complete set of powers currently registered by the MUX server.
Historical MUX and BattleTech power names are not accepted.&lt;/p&gt;
&lt;h2 id="power-summary"&gt;Power summary&lt;/h2&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;Power&lt;/th&gt;
 &lt;th&gt;Stored field and column&lt;/th&gt;
 &lt;th&gt;Native purpose&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;IDLE&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;has_idle_power&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;Exempts a connected player from the inactivity timeout.&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 id="idle"&gt;IDLE&lt;/h2&gt;
&lt;p&gt;The &lt;code&gt;IDLE&lt;/code&gt; power prevents the maintenance timer from disconnecting a connected
player when the descriptor&amp;rsquo;s inactivity timeout expires. It is meaningful only
on a player with an active connection; setting it on another object type has no
native effect.&lt;/p&gt;</description></item><item><title>Commands</title><link>https://gtaylor.github.io/stompymux/docs/scripting/commands/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://gtaylor.github.io/stompymux/docs/scripting/commands/</guid><description>&lt;p&gt;Lua command modules return a &lt;code&gt;commands&lt;/code&gt; array. Each entry has a native Lua
&lt;code&gt;pattern&lt;/code&gt;, a &lt;code&gt;handler&lt;/code&gt; function, and an optional &lt;code&gt;access&lt;/code&gt; level:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-lua" data-lang="lua"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; commands &lt;span style="color:#f92672"&gt;=&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; pattern &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;^say%s+(.+)$&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; access &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;wizard&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; handler &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;function&lt;/span&gt;(ctx, message)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; mux.notify(ctx.enactor, &lt;span style="color:#e6db74"&gt;&amp;#34;You said: &amp;#34;&lt;/span&gt; &lt;span style="color:#f92672"&gt;..&lt;/span&gt; message)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;end&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; },
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; },
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Omit &lt;code&gt;access&lt;/code&gt;, or set it to &lt;code&gt;&amp;quot;public&amp;quot;&lt;/code&gt;, to allow everyone. Set it to
&lt;code&gt;&amp;quot;wizard&amp;quot;&lt;/code&gt; to allow Wizards and God, or &lt;code&gt;&amp;quot;god&amp;quot;&lt;/code&gt; to allow only God. Values are
case-sensitive. Invalid values cause module validation and reload to fail.&lt;/p&gt;</description></item><item><title>Global logic</title><link>https://gtaylor.github.io/stompymux/docs/scripting/global-commands/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://gtaylor.github.io/stompymux/docs/scripting/global-commands/</guid><description>&lt;p&gt;Global Lua logic modules live under &lt;code&gt;game/lua/global_logic&lt;/code&gt;. Every
&lt;code&gt;.lua&lt;/code&gt; file in that tree is discovered recursively during startup and
&lt;code&gt;@lua/reload&lt;/code&gt;. Files are loaded in lexical relative-path order, so use
domain-oriented paths such as &lt;code&gt;player/help.lua&lt;/code&gt;, &lt;code&gt;world/travel.lua&lt;/code&gt;, and
&lt;code&gt;wizard/maintenance.lua&lt;/code&gt;. Use numeric prefixes only when deliberate
cross-domain priority is necessary.
Use &lt;a href="https://gtaylor.github.io/stompymux/docs/scripting/validating-and-reloading/"&gt;&lt;code&gt;@lua/check&lt;/code&gt;&lt;/a&gt; to validate every Lua module before reloading.&lt;/p&gt;
&lt;p&gt;Each global module returns a table containing &lt;code&gt;commands&lt;/code&gt;:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-lua" data-lang="lua"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; commands &lt;span style="color:#f92672"&gt;=&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; pattern &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;^global%-hello$&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; handler &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;function&lt;/span&gt;(ctx)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; mux.notify(ctx.enactor, &lt;span style="color:#e6db74"&gt;&amp;#34;Hello, world, from a global Lua command!&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;end&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; },
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; },
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Global handlers run after local and zone Lua command matching declines the
command. Master-room exits and other non-command behavior are unchanged.
Matching stops at the first global handler that returns &lt;code&gt;true&lt;/code&gt;; &lt;code&gt;false&lt;/code&gt; or
&lt;code&gt;nil&lt;/code&gt; allows the next handler to try.&lt;/p&gt;</description></item><item><title>Interactive flows</title><link>https://gtaylor.github.io/stompymux/docs/scripting/flows/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://gtaylor.github.io/stompymux/docs/scripting/flows/</guid><description>&lt;p&gt;Softcode has no interactive-input primitive; Lua does, through &lt;code&gt;mux.flow_start&lt;/code&gt;
and a module&amp;rsquo;s &lt;code&gt;flows&lt;/code&gt; table. A flow drives a connected player&amp;rsquo;s own
descriptor through a menu, a confirmation, or a multi-step form, one line of
input at a time, without the player prefixing every line with a command.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-lua" data-lang="lua"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; commands &lt;span style="color:#f92672"&gt;=&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; pattern &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;^delete%-character$&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; handler &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;function&lt;/span&gt;(ctx)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; mux.flow_start(ctx.descriptor, &lt;span style="color:#e6db74"&gt;&amp;#34;confirm_delete.lua&amp;#34;&lt;/span&gt;, &lt;span style="color:#e6db74"&gt;&amp;#34;confirm&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;end&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; },
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; },
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; flows &lt;span style="color:#f92672"&gt;=&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; confirm &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;function&lt;/span&gt;(ctx)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; ctx.input &lt;span style="color:#f92672"&gt;==&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;nil&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;then&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; { action &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;repeat&amp;#34;&lt;/span&gt;, prompt &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;Delete this? (y/n) &amp;#34;&lt;/span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;end&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; ctx.input:match(&lt;span style="color:#e6db74"&gt;&amp;#34;^[Yy]&amp;#34;&lt;/span&gt;) &lt;span style="color:#66d9ef"&gt;then&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; { action &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;done&amp;#34;&lt;/span&gt;, message &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;Deleted.&amp;#34;&lt;/span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;end&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; { action &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;cancel&amp;#34;&lt;/span&gt;, message &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;Cancelled.&amp;#34;&lt;/span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;end&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; },
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="starting-a-flow"&gt;Starting a flow&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;mux.flow_start(descriptor, module, first_step)&lt;/code&gt; attaches a flow to the given
descriptor and immediately shows its first prompt. &lt;code&gt;descriptor&lt;/code&gt; is
&lt;code&gt;ctx.descriptor&lt;/code&gt; from the command or event that is starting the flow -
flows are always driven from a live connection, never from a queued or
scheduled context, so &lt;code&gt;ctx.descriptor&lt;/code&gt; is only present when one exists (see
&lt;a href="https://gtaylor.github.io/stompymux/docs/scripting/commands/"&gt;Commands&lt;/a&gt;). &lt;code&gt;module&lt;/code&gt; is resolved the same way &lt;code&gt;require&lt;/code&gt; resolves
a name: relative to the calling module&amp;rsquo;s own root, without repeating the root
name. Raises a Lua error if the descriptor doesn&amp;rsquo;t exist, already has a flow
running, or the module has no such flow step.&lt;/p&gt;</description></item><item><title>Validating and Reloading</title><link>https://gtaylor.github.io/stompymux/docs/scripting/validating-and-reloading/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://gtaylor.github.io/stompymux/docs/scripting/validating-and-reloading/</guid><description>&lt;p&gt;You can validate and reload your game&amp;rsquo;s Lua files from within the game without a full restart.&lt;/p&gt;
&lt;h2 id="validating-lua"&gt;Validating Lua&lt;/h2&gt;
&lt;p&gt;To check your Lua scripts for validity, run the following from in-game with a Wizard character:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;@lua/check
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;code&gt;@lua/check&lt;/code&gt; recursively verifies every &lt;code&gt;.lua&lt;/code&gt; file below
&lt;code&gt;game/lua/object_logic&lt;/code&gt;, &lt;code&gt;game/lua/global_logic&lt;/code&gt;, and
&lt;code&gt;game/lua/packages&lt;/code&gt;. It checks module syntax, top-level imports, and the
module return contract, including cron schedules. Global logic modules must
export a nonempty &lt;code&gt;commands&lt;/code&gt; or &lt;code&gt;schedules&lt;/code&gt; table. It also checks every
configured &lt;code&gt;Luaparent&lt;/code&gt; path. Missing or unreadable paths
are reported once per path with the number of objects that use that value, so a
single deleted file does not produce one error for every affected object.&lt;/p&gt;</description></item></channel></rss>