mirror of
https://github.com/ganelson/inform.git
synced 2024-07-08 01:54:21 +03:00
341 lines
36 KiB
HTML
341 lines
36 KiB
HTML
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
|
|
<html>
|
|
<head>
|
|
<title>S/mt2</title>
|
|
<meta name="viewport" content="width=device-width initial-scale=1">
|
|
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
|
|
<meta http-equiv="Content-Language" content="en-gb">
|
|
<link href="../inweb.css" rel="stylesheet" rev="stylesheet" type="text/css">
|
|
</head>
|
|
<body>
|
|
<nav role="navigation">
|
|
<h1><a href="../webs.html">Sources</a></h1>
|
|
<ul>
|
|
<li><a href="../compiler.html">compiler tools</a></li>
|
|
<li><a href="../other.html">other tools</a></li>
|
|
<li><a href="../extensions.html"><b>extensions and kits</b></a></li>
|
|
<li><a href="../units.html">unit test tools</a></li>
|
|
</ul>
|
|
<h2>Extensions</h2>
|
|
<ul>
|
|
<li><a href="../basic_inform/index.html">Basic Inform</a></li>
|
|
<li><a href="../standard_rules/index.html">Standard Rules</a></li>
|
|
</ul>
|
|
<h2>Kits</h2>
|
|
<ul>
|
|
<li><a href="../BasicInformKit/index.html">BasicInformKit</a></li>
|
|
<li><a href="../BasicInformExtrasKit/index.html">BasicInformExtrasKit</a></li>
|
|
<li><a href="../CommandParserKit/index.html">CommandParserKit</a></li>
|
|
<li><a href="../EnglishLanguageKit/index.html">EnglishLanguageKit</a></li>
|
|
<li><a href="../WorldModelKit/index.html">WorldModelKit</a></li>
|
|
</ul>
|
|
|
|
|
|
</nav>
|
|
<main role="main">
|
|
|
|
<!--Weave of 'S/rt' generated by 7-->
|
|
<ul class="crumbs"><li><a href="../webs.html">Source</a></li><li><a href="../extensions.html">Kits</a></li><li><a href="index.html">BasicInformKit</a></li><li><b>Rulebooks Template</b></li></ul><p class="purpose">To work through the rules in a rulebook until a decision is made.</p>
|
|
|
|
<ul class="toc"><li><a href="#SP1">§1. Latest Rule Result</a></li><li><a href="#SP2">§2. Following</a></li><li><a href="#SP3">§3. Specifying Outcomes</a></li><li><a href="#SP4">§4. Discovering Outcomes</a></li><li><a href="#SP5">§5. Printing Rule Names</a></li><li><a href="#SP6">§6. Casting</a></li><li><a href="#SP7">§7. Debugging</a></li><li><a href="#SP8">§8. The Default Rule</a></li></ul><hr class="tocbar">
|
|
|
|
<p class="inwebparagraph"><a id="SP1"></a><b>§1. Latest Rule Result. </b>This used to be a large data structure which kept track of the effect of
|
|
procedural rules, but in January 2011 procedurals were abolished. It retains
|
|
only one purpose: as a place to record the result of the most recently
|
|
completed rule. This used to sit on the top of the stack, and is now the
|
|
only thing which ever sits on it. So the "stack" has just one 3-word
|
|
record now. The meanings of these are as follows. The first word is one of
|
|
the following:
|
|
</p>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<ul class="items"><li>(1) <code class="display"><span class="extract">RS_SUCCEEDS</span></code> indicates that the most recent rule or rulebook processed
|
|
ended in success. Word 2 is <code class="display"><span class="extract">false</span></code> if there's no value, or the kind if there
|
|
is, in which case word 3 contains the value itself.
|
|
</li><li>(2) <code class="display"><span class="extract">RS_FAILS</span></code> is similar, but for a failure. Note that failures can also
|
|
return values.
|
|
</li><li>(3) <code class="display"><span class="extract">RS_NEITHER</span></code> is similar except that it cannot return any value, so that
|
|
words 2 and 3 are meaningless.
|
|
</li></ul>
|
|
<pre class="display">
|
|
<span class="reserved">Constant</span><span class="plain"> </span><span class="identifier">RS_NEITHER</span><span class="plain"> = </span><span class="constant">0</span><span class="plain">;</span>
|
|
<span class="reserved">Constant</span><span class="plain"> </span><span class="identifier">RS_SUCCEEDS</span><span class="plain"> = </span><span class="constant">1</span><span class="plain">;</span>
|
|
<span class="reserved">Constant</span><span class="plain"> </span><span class="identifier">RS_FAILS</span><span class="plain"> = </span><span class="constant">2</span><span class="plain">;</span>
|
|
|
|
<span class="reserved">Array</span><span class="plain"> </span><span class="identifier">latest_rule_result</span><span class="plain"> --> </span><span class="constant">3</span><span class="plain">;</span>
|
|
|
|
<span class="plain">[ </span><span class="identifier">RecordRuleOutcome</span><span class="plain"> </span><span class="identifier">usage</span><span class="plain"> </span><span class="identifier">rule1</span><span class="plain"> </span><span class="identifier">rule2</span><span class="plain">;</span>
|
|
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">latest_rule_result</span><span class="plain">-->0 == </span><span class="identifier">RS_SUCCEEDS</span><span class="plain"> </span><span class="reserved">or</span><span class="plain"> </span><span class="identifier">RS_FAILS</span><span class="plain">) &&</span>
|
|
<span class="plain">(</span><span class="identifier">KOVIsBlockValue</span><span class="plain">(</span><span class="identifier">latest_rule_result</span><span class="plain">-->1)))</span>
|
|
<span class="identifier">BlkValueFree</span><span class="plain">(</span><span class="identifier">latest_rule_result</span><span class="plain">-->2);</span>
|
|
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">usage</span><span class="plain"> == </span><span class="identifier">RS_SUCCEEDS</span><span class="plain"> </span><span class="reserved">or</span><span class="plain"> </span><span class="identifier">RS_FAILS</span><span class="plain">) && (</span><span class="identifier">KOVIsBlockValue</span><span class="plain">(</span><span class="identifier">rule1</span><span class="plain">)))</span>
|
|
<span class="identifier">rule2</span><span class="plain"> = </span><span class="identifier">BlkValueCopy</span><span class="plain">(</span><span class="identifier">BlkValueCreate</span><span class="plain">(</span><span class="identifier">rule1</span><span class="plain">), </span><span class="identifier">rule2</span><span class="plain">);</span>
|
|
<span class="identifier">latest_rule_result</span><span class="plain">-->0 = </span><span class="identifier">usage</span><span class="plain">;</span>
|
|
<span class="identifier">latest_rule_result</span><span class="plain">-->1 = </span><span class="identifier">rule1</span><span class="plain">;</span>
|
|
<span class="identifier">latest_rule_result</span><span class="plain">-->2 = </span><span class="identifier">rule2</span><span class="plain">;</span>
|
|
<span class="plain">];</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="inwebparagraph"><a id="SP2"></a><b>§2. Following. </b>Until January 2011, there were two ways to invoke a rulebook: to "follow" it
|
|
or simply "process" it. With the demise of procedural rules, these became
|
|
equivalent.
|
|
</p>
|
|
|
|
<p class="inwebparagraph">In the early days of Inform 7, stack usage became a serious issue since
|
|
some forms of the Frotz Z-machine interpreter provided only 4K of stack
|
|
by default. ("Only" 4K. In the mid-1980s, one of the obstacles facing
|
|
IF authors at Infocom was the need to get the stack usage down to fewer
|
|
than 600 bytes in order that the story file could be run on the smaller
|
|
home computers of the day.) <code class="display"><span class="extract">FollowRulebook</span></code> was the major consumer of
|
|
stack space, on average, because of its frequent recursion. Now that the
|
|
process is simpler, this has become less problematic, since the routine
|
|
now has fewer local variables.
|
|
</p>
|
|
|
|
<p class="inwebparagraph"><code class="display"><span class="extract">FollowRulebook</span></code> takes three arguments, of which only the first is
|
|
compulsory:
|
|
</p>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<ul class="items"><li>(a) The <code class="display"><span class="extract">rulebook</span></code> is an I7 value of kind "rule", which means it can be
|
|
either the ID number of a rulebook — from 0 up to N-1, where N is the
|
|
number of rulebooks compiled by Inform, typically about 600 — or else the
|
|
address of a routine representing an individual rule.
|
|
</li><li>(b) The <code class="display"><span class="extract">parameter</span></code> supplied to the rulebook. Much as arguments can be supplied
|
|
to a function in a conventional language's function call, so a parameter can be
|
|
supplied whenever a rulebook is invoked.
|
|
</li><li>(c) <code class="display"><span class="extract">no_paragraph_skips</span></code> is a flag: if explicitly set <code class="display"><span class="extract">true</span></code>, then the rulebook
|
|
is run with paragraph breaking suppressed. This is the process by which
|
|
paragraph division points are placed between rules, so that if two rules both
|
|
print text then a paragraph break appears between. While that is appropriate
|
|
for rulebooks attached to actions or for "every turn" rules, it is disastrous
|
|
for rulebooks attached to activities such as "printing the name of
|
|
something".
|
|
</li></ul>
|
|
<p class="inwebparagraph"><code class="display"><span class="extract">FollowRulebook</span></code> returns <code class="display"><span class="extract">R</span></code> if rule <code class="display"><span class="extract">R</span></code> in the rulebook (or rule) chose to
|
|
"succeed" or "fail", and <code class="display"><span class="extract">false</span></code> if it made no choice. (To repeat: if
|
|
the rule explicitly fails, then <code class="display"><span class="extract">FollowRulebook</span></code> returns <code class="display"><span class="extract">true</span></code>. It's easy
|
|
to write plausible-looking code which goes wrong because it assumes that the
|
|
return value is success vs. failure.) The outcome of <code class="display"><span class="extract">FollowRulebook</span></code> is
|
|
stored as described above: thus the most recent rule or rulebook succeeded
|
|
or failed if —
|
|
</p>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<pre class="display">
|
|
<span class="plain">(latest_rule_result-->0 == RS_SUCCEEDS)</span>
|
|
<span class="plain">(latest_rule_result-->0 == RS_FAILS)</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph">and otherwise there was no decision.
|
|
</p>
|
|
|
|
<pre class="display">
|
|
<span class="identifier">Global</span><span class="plain"> </span><span class="identifier">process_rulebook_count</span><span class="plain">; </span><span class="comment">Depth of processing recursion</span>
|
|
<span class="identifier">Global</span><span class="plain"> </span><span class="identifier">debugging_rules</span><span class="plain"> = </span><span class="reserved">false</span><span class="plain">; </span><span class="comment">Are we tracing rule invocations?</span>
|
|
|
|
<span class="plain">[ </span><span class="identifier">FollowRulebook</span><span class="plain"> </span><span class="identifier">rulebook</span><span class="plain"> </span><span class="identifier">parameter</span><span class="plain"> </span><span class="identifier">no_paragraph_skips</span>
|
|
<span class="identifier">rv</span><span class="plain"> </span><span class="identifier">ss</span><span class="plain"> </span><span class="identifier">spv</span><span class="plain">;</span>
|
|
<span class="identifier">ss</span><span class="plain"> = </span><span class="identifier">self</span><span class="plain">;</span>
|
|
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">Protect_I7_Arrays</span><span class="plain">-->0 ~= </span><span class="constant">16339</span><span class="plain">) || (</span><span class="identifier">Protect_I7_Arrays</span><span class="plain">-->1 ~= </span><span class="constant">12345</span><span class="plain">)) {</span>
|
|
<span class="reserved">print</span><span class="plain"> </span><span class="string">"^^*** Fatal programming error: I7 arrays corrupted ***^^"</span><span class="plain">;</span>
|
|
<span class="plain">@</span><span class="reserved">quit</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">parameter</span><span class="plain">) { </span><span class="identifier">self</span><span class="plain"> = </span><span class="identifier">parameter</span><span class="plain">; </span><span class="identifier">parameter_object</span><span class="plain"> = </span><span class="identifier">parameter</span><span class="plain">; }</span>
|
|
<span class="identifier">spv</span><span class="plain"> = </span><span class="identifier">parameter_value</span><span class="plain">; </span><span class="identifier">parameter_value</span><span class="plain"> = </span><span class="identifier">parameter</span><span class="plain">;</span>
|
|
<span class="comment">we won't need parameter again, so can reuse it</span>
|
|
<span class="identifier">parameter</span><span class="plain"> = </span><span class="identifier">debugging_rules</span><span class="plain">;</span>
|
|
<span class="plain">#</span><span class="identifier">ifndef</span><span class="plain"> </span><span class="identifier">MEMORY_ECONOMY</span><span class="plain">;</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">debugging_rules</span><span class="plain">) {</span>
|
|
<span class="identifier">DebugRulebooks</span><span class="plain">(</span><span class="identifier">rulebook</span><span class="plain">, </span><span class="identifier">parameter</span><span class="plain">);</span>
|
|
<span class="identifier">process_rulebook_count</span><span class="plain"> = </span><span class="identifier">process_rulebook_count</span><span class="plain"> + </span><span class="identifier">debugging_rules</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
<span class="plain">#</span><span class="identifier">endif</span><span class="plain">;</span>
|
|
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">rulebook</span><span class="plain"> >= </span><span class="constant">0</span><span class="plain">) && (</span><span class="identifier">rulebook</span><span class="plain"> < </span><span class="identifier">NUMBER_RULEBOOKS_CREATED</span><span class="plain">)) {</span>
|
|
<span class="identifier">rv</span><span class="plain"> = </span><span class="identifier">rulebooks_array</span><span class="plain">--></span><span class="identifier">rulebook</span><span class="plain">;</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">rv</span><span class="plain"> ~= </span><span class="identifier">EMPTY_RULEBOOK</span><span class="plain">) {</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">rulebook</span><span class="plain"> ~= </span><span class="identifier">ACTION_PROCESSING_RB</span><span class="plain">) </span><span class="identifier">MStack_CreateRBVars</span><span class="plain">(</span><span class="identifier">rulebook</span><span class="plain">);</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">say__p</span><span class="plain">) </span><span class="identifier">RulebookParBreak</span><span class="plain">(</span><span class="identifier">no_paragraph_skips</span><span class="plain">);</span>
|
|
<span class="identifier">rv</span><span class="plain"> = </span><span class="identifier">rv</span><span class="plain">(</span><span class="identifier">no_paragraph_skips</span><span class="plain">);</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">rulebook</span><span class="plain"> ~= </span><span class="identifier">ACTION_PROCESSING_RB</span><span class="plain">) </span><span class="identifier">MStack_DestroyRBVars</span><span class="plain">(</span><span class="identifier">rulebook</span><span class="plain">);</span>
|
|
<span class="plain">} </span><span class="reserved">else</span><span class="plain"> {</span>
|
|
<span class="identifier">rv</span><span class="plain"> = </span><span class="constant">0</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
<span class="plain">} </span><span class="reserved">else</span><span class="plain"> {</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">say__p</span><span class="plain">) </span><span class="identifier">RulebookParBreak</span><span class="plain">(</span><span class="identifier">no_paragraph_skips</span><span class="plain">);</span>
|
|
<span class="identifier">rv</span><span class="plain"> = </span><span class="reserved">indirect</span><span class="plain">(</span><span class="identifier">rulebook</span><span class="plain">);</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">rv</span><span class="plain"> == </span><span class="constant">2</span><span class="plain">) </span><span class="identifier">rv</span><span class="plain"> = </span><span class="identifier">reason_the_action_failed</span><span class="plain">;</span>
|
|
<span class="reserved">else</span><span class="plain"> </span><span class="reserved">if</span><span class="plain"> (</span><span class="identifier">rv</span><span class="plain">) </span><span class="identifier">rv</span><span class="plain"> = </span><span class="identifier">rulebook</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">rv</span><span class="plain">) {</span>
|
|
<span class="plain">#</span><span class="identifier">ifndef</span><span class="plain"> </span><span class="identifier">MEMORY_ECONOMY</span><span class="plain">;</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">debugging_rules</span><span class="plain">) {</span>
|
|
<span class="identifier">process_rulebook_count</span><span class="plain"> = </span><span class="identifier">process_rulebook_count</span><span class="plain"> - </span><span class="identifier">debugging_rules</span><span class="plain">;</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">process_rulebook_count</span><span class="plain"> < </span><span class="constant">0</span><span class="plain">) </span><span class="identifier">process_rulebook_count</span><span class="plain"> = </span><span class="constant">0</span><span class="plain">;</span>
|
|
<span class="reserved">spaces</span><span class="plain">(2*</span><span class="identifier">process_rulebook_count</span><span class="plain">);</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">latest_rule_result</span><span class="plain">-->0 == </span><span class="identifier">RS_SUCCEEDS</span><span class="plain">) </span><span class="reserved">print</span><span class="plain"> </span><span class="string">"[stopped: success]^"</span><span class="plain">;</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">latest_rule_result</span><span class="plain">-->0 == </span><span class="identifier">RS_FAILS</span><span class="plain">) </span><span class="reserved">print</span><span class="plain"> </span><span class="string">"[stopped: fail]^"</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
<span class="plain">#</span><span class="identifier">endif</span><span class="plain">;</span>
|
|
<span class="plain">} </span><span class="reserved">else</span><span class="plain"> {</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">debugging_rules</span><span class="plain">)</span>
|
|
<span class="identifier">process_rulebook_count</span><span class="plain"> = </span><span class="identifier">process_rulebook_count</span><span class="plain"> - </span><span class="identifier">debugging_rules</span><span class="plain">;</span>
|
|
<span class="identifier">latest_rule_result</span><span class="plain">-->0 = </span><span class="identifier">RS_NEITHER</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
<span class="identifier">debugging_rules</span><span class="plain"> = </span><span class="identifier">parameter</span><span class="plain">;</span>
|
|
<span class="identifier">self</span><span class="plain"> = </span><span class="identifier">ss</span><span class="plain">; </span><span class="identifier">parameter_value</span><span class="plain"> = </span><span class="identifier">spv</span><span class="plain">;</span>
|
|
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">rv</span><span class="plain">;</span>
|
|
<span class="plain">];</span>
|
|
|
|
<span class="plain">[ </span><span class="identifier">RulebookParBreak</span><span class="plain"> </span><span class="identifier">no_paragraph_skips</span><span class="plain">;</span>
|
|
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">no_paragraph_skips</span><span class="plain"> == </span><span class="reserved">false</span><span class="plain">) && (</span><span class="identifier">say__pc</span><span class="plain"> & </span><span class="identifier">PARA_NORULEBOOKBREAKS</span><span class="plain"> == </span><span class="constant">0</span><span class="plain">))</span>
|
|
<span class="identifier">DivideParagraphPoint</span><span class="plain">();</span>
|
|
<span class="plain">];</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="inwebparagraph"><a id="SP3"></a><b>§3. Specifying Outcomes. </b>The following provide ways for rules to succeed, fail or decline to do
|
|
either.
|
|
</p>
|
|
|
|
<p class="inwebparagraph"><code class="display"><span class="extract">SetRulebookOutcome</span></code> is a little different: it changes the outcome state
|
|
of the most recent rule completed, not the current one. (It's used only
|
|
when saving and restoring this in the actions machinery: rules should not
|
|
call it.)
|
|
</p>
|
|
|
|
<pre class="display">
|
|
<span class="plain">[ </span><span class="identifier">ActRulebookSucceeds</span><span class="plain"> </span><span class="identifier">rule_id</span><span class="plain">;</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">rule_id</span><span class="plain">) </span><span class="identifier">reason_the_action_failed</span><span class="plain"> = </span><span class="identifier">rule_id</span><span class="plain">;</span>
|
|
<span class="identifier">RulebookSucceeds</span><span class="plain">();</span>
|
|
<span class="plain">];</span>
|
|
|
|
<span class="plain">[ </span><span class="identifier">ActRulebookFails</span><span class="plain"> </span><span class="identifier">rule_id</span><span class="plain">;</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">rule_id</span><span class="plain">) </span><span class="identifier">reason_the_action_failed</span><span class="plain"> = </span><span class="identifier">rule_id</span><span class="plain">;</span>
|
|
<span class="identifier">RulebookFails</span><span class="plain">();</span>
|
|
<span class="plain">];</span>
|
|
|
|
<span class="plain">[ </span><span class="identifier">RulebookSucceeds</span><span class="plain"> </span><span class="identifier">weak_kind</span><span class="plain"> </span><span class="identifier">value</span><span class="plain">;</span>
|
|
<span class="identifier">RecordRuleOutcome</span><span class="plain">(</span><span class="identifier">RS_SUCCEEDS</span><span class="plain">, </span><span class="identifier">weak_kind</span><span class="plain">, </span><span class="identifier">value</span><span class="plain">);</span>
|
|
<span class="plain">];</span>
|
|
|
|
<span class="plain">[ </span><span class="identifier">RulebookFails</span><span class="plain"> </span><span class="identifier">weak_kind</span><span class="plain"> </span><span class="identifier">value</span><span class="plain">;</span>
|
|
<span class="identifier">RecordRuleOutcome</span><span class="plain">(</span><span class="identifier">RS_FAILS</span><span class="plain">, </span><span class="identifier">weak_kind</span><span class="plain">, </span><span class="identifier">value</span><span class="plain">);</span>
|
|
<span class="plain">];</span>
|
|
|
|
<span class="plain">[ </span><span class="identifier">RuleHasNoOutcome</span><span class="plain">;</span>
|
|
<span class="identifier">RecordRuleOutcome</span><span class="plain">(</span><span class="identifier">RS_NEITHER</span><span class="plain">, </span><span class="constant">0</span><span class="plain">, </span><span class="constant">0</span><span class="plain">);</span>
|
|
<span class="plain">];</span>
|
|
|
|
<span class="plain">[ </span><span class="identifier">SetRulebookOutcome</span><span class="plain"> </span><span class="identifier">a</span><span class="plain">;</span>
|
|
<span class="identifier">latest_rule_result</span><span class="plain">-->0 = </span><span class="identifier">a</span><span class="plain">;</span>
|
|
<span class="plain">];</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="inwebparagraph"><a id="SP4"></a><b>§4. Discovering Outcomes. </b>And here is how to tell what the results were.
|
|
</p>
|
|
|
|
<pre class="display">
|
|
<span class="plain">[ </span><span class="identifier">RulebookOutcome</span><span class="plain"> </span><span class="identifier">a</span><span class="plain">;</span>
|
|
<span class="identifier">a</span><span class="plain"> = </span><span class="identifier">latest_rule_result</span><span class="plain">-->0;</span>
|
|
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">a</span><span class="plain"> == </span><span class="identifier">RS_FAILS</span><span class="plain">) || (</span><span class="identifier">a</span><span class="plain"> == </span><span class="identifier">RS_SUCCEEDS</span><span class="plain">)) </span><span class="reserved">return</span><span class="plain"> </span><span class="identifier">a</span><span class="plain">;</span>
|
|
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">RS_NEITHER</span><span class="plain">;</span>
|
|
<span class="plain">];</span>
|
|
|
|
<span class="plain">[ </span><span class="identifier">RulebookFailed</span><span class="plain">;</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">latest_rule_result</span><span class="plain">-->0 == </span><span class="identifier">RS_FAILS</span><span class="plain">) </span><span class="reserved">rtrue</span><span class="plain">; </span><span class="reserved">rfalse</span><span class="plain">;</span>
|
|
<span class="plain">];</span>
|
|
|
|
<span class="plain">[ </span><span class="identifier">RulebookSucceeded</span><span class="plain">;</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">latest_rule_result</span><span class="plain">-->0 == </span><span class="identifier">RS_SUCCEEDS</span><span class="plain">) </span><span class="reserved">rtrue</span><span class="plain">; </span><span class="reserved">rfalse</span><span class="plain">;</span>
|
|
<span class="plain">];</span>
|
|
|
|
<span class="plain">[ </span><span class="identifier">ResultOfRule</span><span class="plain"> </span><span class="identifier">RB</span><span class="plain"> </span><span class="identifier">V</span><span class="plain"> </span><span class="identifier">F</span><span class="plain"> </span><span class="identifier">K</span><span class="plain"> </span><span class="identifier">a</span><span class="plain">;</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">RB</span><span class="plain">) </span><span class="identifier">FollowRulebook</span><span class="plain">(</span><span class="identifier">RB</span><span class="plain">, </span><span class="identifier">V</span><span class="plain">, </span><span class="identifier">F</span><span class="plain">);</span>
|
|
<span class="identifier">a</span><span class="plain"> = </span><span class="identifier">latest_rule_result</span><span class="plain">-->0;</span>
|
|
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">a</span><span class="plain"> == </span><span class="identifier">RS_FAILS</span><span class="plain">) || (</span><span class="identifier">a</span><span class="plain"> == </span><span class="identifier">RS_SUCCEEDS</span><span class="plain">)) {</span>
|
|
<span class="identifier">a</span><span class="plain"> = </span><span class="identifier">latest_rule_result</span><span class="plain">-->1;</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">a</span><span class="plain">) </span><span class="reserved">return</span><span class="plain"> </span><span class="identifier">latest_rule_result</span><span class="plain">-->2;</span>
|
|
<span class="plain">}</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">K</span><span class="plain">) </span><span class="reserved">return</span><span class="plain"> </span><span class="identifier">DefaultValueOfKOV</span><span class="plain">(</span><span class="identifier">K</span><span class="plain">);</span>
|
|
<span class="reserved">return</span><span class="plain"> </span><span class="constant">0</span><span class="plain">;</span>
|
|
<span class="plain">];</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="inwebparagraph"><a id="SP5"></a><b>§5. Printing Rule Names. </b>This is the I6 printing rule used for a value of kind "rule", which as
|
|
noted above can either be rulebook ID numbers in the range 0 to N-1 or
|
|
are addresses of individual rules.
|
|
</p>
|
|
|
|
<p class="inwebparagraph">Names of rules and rulebooks take up a fair amount of space, and one of the
|
|
main memory economies enforced by the "Use memory economy" option is to
|
|
omit the necessary arrays. (It's not the text which is the problem so
|
|
much as the table of addresses pointing to that text, which has to live in
|
|
precious readable memory on the Z-machine.)
|
|
</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP6"></a><b>§6. Casting. </b>Nothing needs to be done to a rulebook value to make it a rule value.
|
|
</p>
|
|
|
|
<pre class="display">
|
|
<span class="plain">[ </span><span class="identifier">RULEBOOK_TY_to_RULE_TY</span><span class="plain"> </span><span class="identifier">r</span><span class="plain">;</span>
|
|
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">r</span><span class="plain">;</span>
|
|
<span class="plain">];</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="inwebparagraph"><a id="SP7"></a><b>§7. Debugging. </b>Two modest routines to print out the names of rules and rulebooks when they
|
|
occur, in so far as memory economy allows this.
|
|
</p>
|
|
|
|
<pre class="display">
|
|
<span class="plain">[ </span><span class="identifier">DebugRulebooks</span><span class="plain"> </span><span class="identifier">subs</span><span class="plain"> </span><span class="identifier">parameter</span><span class="plain"> </span><span class="identifier">i</span><span class="plain">;</span>
|
|
<span class="reserved">spaces</span><span class="plain">(2*</span><span class="identifier">process_rulebook_count</span><span class="plain">);</span>
|
|
<span class="reserved">print</span><span class="plain"> </span><span class="string">"["</span><span class="plain">, (</span><span class="identifier">RulePrintingRule</span><span class="plain">) </span><span class="identifier">subs</span><span class="plain">;</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">parameter</span><span class="plain">) </span><span class="reserved">print</span><span class="plain"> </span><span class="string">" / on O"</span><span class="plain">, </span><span class="identifier">parameter</span><span class="plain">;</span>
|
|
<span class="reserved">print</span><span class="plain"> </span><span class="string">"]^"</span><span class="plain">;</span>
|
|
<span class="plain">];</span>
|
|
|
|
<span class="plain">[ </span><span class="identifier">DB_Rule</span><span class="plain"> </span><span class="identifier">R</span><span class="plain"> </span><span class="identifier">N</span><span class="plain"> </span><span class="identifier">blocked</span><span class="plain">;</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">R</span><span class="plain">==0) </span><span class="reserved">return</span><span class="plain">;</span>
|
|
<span class="reserved">print</span><span class="plain"> </span><span class="string">"[Rule ~"</span><span class="plain">, (</span><span class="identifier">RulePrintingRule</span><span class="plain">) </span><span class="identifier">R</span><span class="plain">, </span><span class="string">"~ "</span><span class="plain">;</span>
|
|
<span class="plain">#</span><span class="identifier">ifdef</span><span class="plain"> </span><span class="identifier">NUMBERED_RULES</span><span class="plain">; </span><span class="reserved">print</span><span class="plain"> </span><span class="string">"("</span><span class="plain">, </span><span class="identifier">N</span><span class="plain">, </span><span class="string">") "</span><span class="plain">; #</span><span class="identifier">endif</span><span class="plain">;</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">blocked</span><span class="plain"> == </span><span class="reserved">false</span><span class="plain">) </span><span class="string">"applies.]"</span><span class="plain">;</span>
|
|
<span class="reserved">print</span><span class="plain"> </span><span class="string">"does not apply (wrong "</span><span class="plain">;</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">blocked</span><span class="plain"> == </span><span class="constant">1</span><span class="plain">) </span><span class="reserved">print</span><span class="plain"> </span><span class="string">"scene"</span><span class="plain">;</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">blocked</span><span class="plain"> == </span><span class="constant">2</span><span class="plain">) </span><span class="reserved">print</span><span class="plain"> </span><span class="string">"action"</span><span class="plain">;</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">blocked</span><span class="plain"> == </span><span class="constant">3</span><span class="plain">) </span><span class="reserved">print</span><span class="plain"> </span><span class="string">"actor"</span><span class="plain">;</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">blocked</span><span class="plain"> == </span><span class="constant">4</span><span class="plain">) </span><span class="reserved">print</span><span class="plain"> </span><span class="string">"context"</span><span class="plain">;</span>
|
|
<span class="reserved">print</span><span class="plain"> </span><span class="string">").]^"</span><span class="plain">;</span>
|
|
<span class="plain">];</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="inwebparagraph"><a id="SP8"></a><b>§8. The Default Rule. </b></p>
|
|
|
|
<pre class="display">
|
|
<span class="plain">[ </span><span class="identifier">LITTLE_USED_DO_NOTHING_R</span><span class="plain">; </span><span class="reserved">rfalse</span><span class="plain">; ];</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<hr class="tocbar">
|
|
<ul class="toc"><li><a href="S-mt2.html">Back to 'MStack Template'</a></li><li><a href="S-ft2.html">Continue with 'Flex Template'</a></li></ul><hr class="tocbar">
|
|
<!--End of weave-->
|
|
</main>
|
|
</body>
|
|
</html>
|
|
|