1
0
Fork 0
mirror of https://github.com/ganelson/inform.git synced 2024-07-08 18:14:21 +03:00
inform7/docs/standard_rules/S-at2.html

230 lines
12 KiB
HTML

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<title>S/at</title>
<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>
<!--Weave of 'S/at2' generated by 7-->
<ul class="crumbs"><li><a href="../webs.html">&#9733;</a></li><li><a href="index.html">standard_rules Template Library</a></li><li><b>Activities Template</b></li></ul><p class="purpose">To run the necessary rulebooks to carry out an activity.</p>
<ul class="toc"><li><a href="#SP1">&#167;1. The Activities Stack</a></li><li><a href="#SP2">&#167;2. Rule Debugging Inhibition</a></li><li><a href="#SP3">&#167;3. Testing Activities</a></li><li><a href="#SP4">&#167;4. Emptiness</a></li><li><a href="#SP5">&#167;5. Process Activity Rulebook</a></li><li><a href="#SP6">&#167;6. Carrying Out Activities</a></li><li><a href="#SP7">&#167;7. Begin</a></li><li><a href="#SP8">&#167;8. For</a></li><li><a href="#SP9">&#167;9. End</a></li><li><a href="#SP10">&#167;10. Abandon</a></li></ul><hr class="tocbar">
<p class="inwebparagraph"><a id="SP1"></a><b>&#167;1. The Activities Stack. </b>Activities are more like nested function calls than independent processes;
they finish in reverse order of starting, and are placed on a stack. This
needs only very limited size in practice: 20 might seem a bit low, but making
it much higher simply means that oddball bugs in the user's code &mdash; where
activities recursively cause themselves ad infinitum &mdash; will be caught less
efficiently.
</p>
<pre class="display">
<span class="plain">Constant MAX_NESTED_ACTIVITIES = 20;</span>
<span class="plain">Global activities_sp = 0;</span>
<span class="plain">Array activities_stack --&gt; MAX_NESTED_ACTIVITIES;</span>
<span class="plain">Array activity_parameters_stack --&gt; MAX_NESTED_ACTIVITIES;</span>
</pre>
<p class="inwebparagraph"></p>
<p class="inwebparagraph"><a id="SP2"></a><b>&#167;2. Rule Debugging Inhibition. </b>The output from RULES or RULES ALL becomes totally illegible if it is applied
even to the activities printing names of objects, so this is inhibited when
any such activity is running. <code class="display"><span class="extract">FixInhibitFlag</span></code> is called each time the stack
changes and ensures that <code class="display"><span class="extract">inhibit_flag</span></code> has exactly this meaning.
</p>
<pre class="display">
<span class="plain">Global inhibit_flag = 0;</span>
<span class="plain">Global saved_debug_rules = 0;</span>
<span class="plain">[ FixInhibitFlag n act inhibit_rule_debugging;</span>
<span class="plain">for (n=0:n&lt;activities_sp:n++) {</span>
<span class="plain">act = activities_stack--&gt;n;</span>
<span class="plain">if (act == PRINTING_THE_NAME_ACT or PRINTING_THE_PLURAL_NAME_ACT or</span>
<span class="plain">PRINTING_ROOM_DESC_DETAILS_ACT or PRINTING_INVENTORY_DETAILS_ACT or</span>
<span class="plain">LISTING_CONTENTS_ACT or GROUPING_TOGETHER_ACT or PRINTING_RESPONSE_ACT)</span>
<span class="plain">inhibit_rule_debugging = true;</span>
<span class="plain">}</span>
<span class="plain">if ((inhibit_flag == false) &amp;&amp; (inhibit_rule_debugging)) {</span>
<span class="plain">saved_debug_rules = debug_rules;</span>
<span class="plain">debug_rules = 0;</span>
<span class="plain">}</span>
<span class="plain">if ((inhibit_flag) &amp;&amp; (inhibit_rule_debugging == false)) {</span>
<span class="plain">debug_rules = saved_debug_rules;</span>
<span class="plain">}</span>
<span class="plain">inhibit_flag = inhibit_rule_debugging;</span>
<span class="plain">];</span>
</pre>
<p class="inwebparagraph"></p>
<p class="inwebparagraph"><a id="SP3"></a><b>&#167;3. Testing Activities. </b>The following tests whether a given activity <code class="display"><span class="extract">A</span></code> is currently running
whose parameter-object matches description <code class="display"><span class="extract">desc</span></code>, where as usual the
description is represented by a routine testing membership, and where
zero <code class="display"><span class="extract">desc</span></code> means that any parameter is valid. Alternatively, we can
require a specific parameter value of <code class="display"><span class="extract">val</span></code>.
</p>
<pre class="display">
<span class="plain">[ TestActivity A desc val i;</span>
<span class="plain">for (i=0:i&lt;activities_sp:i++)</span>
<span class="plain">if (activities_stack--&gt;i == A) {</span>
<span class="plain">if (desc) {</span>
<span class="plain">if ((desc)(activity_parameters_stack--&gt;i)) rtrue;</span>
<span class="plain">} else if (val) {</span>
<span class="plain">if (val == activity_parameters_stack--&gt;i) rtrue;</span>
<span class="plain">} else rtrue;</span>
<span class="plain">}</span>
<span class="plain">rfalse;</span>
<span class="plain">];</span>
</pre>
<p class="inwebparagraph"></p>
<p class="inwebparagraph"><a id="SP4"></a><b>&#167;4. Emptiness. </b>An activity is defined by its three rulebooks: it is empty if they are all
empty.
</p>
<pre class="display">
<span class="plain">[ ActivityEmpty A x;</span>
<span class="plain">x = Activity_before_rulebooks--&gt;A;</span>
<span class="plain">if (rulebooks_array--&gt;x ~= EMPTY_RULEBOOK) rfalse;</span>
<span class="plain">x = Activity_for_rulebooks--&gt;A;</span>
<span class="plain">if (rulebooks_array--&gt;x ~= EMPTY_RULEBOOK) rfalse;</span>
<span class="plain">x = Activity_after_rulebooks--&gt;A;</span>
<span class="plain">if (rulebooks_array--&gt;x ~= EMPTY_RULEBOOK) rfalse;</span>
<span class="plain">rtrue;</span>
<span class="plain">];</span>
<span class="plain">[ RulebookEmpty rb;</span>
<span class="plain">if (rulebooks_array--&gt;rb ~= EMPTY_RULEBOOK) rfalse;</span>
<span class="plain">rtrue;</span>
<span class="plain">];</span>
</pre>
<p class="inwebparagraph"></p>
<p class="inwebparagraph"><a id="SP5"></a><b>&#167;5. Process Activity Rulebook. </b>This is really much like processing any rulebook, except that <code class="display"><span class="extract">self</span></code> is
temporarily set to the parameter, and is preserved by the process.
</p>
<pre class="display">
<span class="plain">[ ProcessActivityRulebook rulebook parameter rv;</span>
<span class="plain">@push self;</span>
<span class="plain">if (parameter) self = parameter;</span>
<span class="plain">rv = FollowRulebook(rulebook, parameter, true);</span>
<span class="plain">@pull self;</span>
<span class="plain">if (rv) rtrue;</span>
<span class="plain">rfalse;</span>
<span class="plain">];</span>
</pre>
<p class="inwebparagraph"></p>
<p class="inwebparagraph"><a id="SP6"></a><b>&#167;6. Carrying Out Activities. </b>This is a three-stage process; most activities are run by calling the following
simple routine, but some are run by calling the three subroutines independently.
</p>
<pre class="display">
<span class="plain">[ CarryOutActivity A o rv;</span>
<span class="plain">BeginActivity(A, o);</span>
<span class="plain">rv = ForActivity(A, o);</span>
<span class="plain">EndActivity(A, o);</span>
<span class="plain">return rv;</span>
<span class="plain">];</span>
</pre>
<p class="inwebparagraph"></p>
<p class="inwebparagraph"><a id="SP7"></a><b>&#167;7. Begin. </b>Note that when an activity based on the conjectural "future action" is
being run &mdash; in a few parser-related cases, that is &mdash; the identity of this
action is put temporarily into <code class="display"><span class="extract">action</span></code>, and the current value saved while
this takes place. That allows rules in the activity rulebooks to have
preambles based on the current action, and yet be tested against what is not
yet the current action.
</p>
<pre class="display">
<span class="plain">[ BeginActivity A o x;</span>
<span class="plain">if (activities_sp == MAX_NESTED_ACTIVITIES) return RunTimeProblem(RTP_TOOMANYACTS);</span>
<span class="plain">activity_parameters_stack--&gt;activities_sp = o;</span>
<span class="plain">activities_stack--&gt;(activities_sp++) = A;</span>
<span class="plain">FixInhibitFlag();</span>
<span class="plain">MStack_CreateAVVars(A);</span>
<span class="plain">if (Activity_atb_rulebooks-&gt;A) { x = action; action = action_to_be; }</span>
<span class="plain">o = ProcessActivityRulebook(Activity_before_rulebooks--&gt;A, o);</span>
<span class="plain">if (Activity_atb_rulebooks-&gt;A) action = x;</span>
<span class="plain">return o;</span>
<span class="plain">];</span>
</pre>
<p class="inwebparagraph"></p>
<p class="inwebparagraph"><a id="SP8"></a><b>&#167;8. For. </b></p>
<pre class="display">
<span class="plain">[ ForActivity A o x;</span>
<span class="plain">if (Activity_atb_rulebooks-&gt;A) { x = action; action = action_to_be; }</span>
<span class="plain">o = ProcessActivityRulebook(Activity_for_rulebooks--&gt;A, o);</span>
<span class="plain">if (Activity_atb_rulebooks-&gt;A) action = x;</span>
<span class="plain">return o;</span>
<span class="plain">];</span>
</pre>
<p class="inwebparagraph"></p>
<p class="inwebparagraph"><a id="SP9"></a><b>&#167;9. End. </b></p>
<pre class="display">
<span class="plain">[ EndActivity A o rv x;</span>
<span class="plain">if ((activities_sp &gt; 0) &amp;&amp; (activities_stack--&gt;(activities_sp-1) == A)) {</span>
<span class="plain">if (Activity_atb_rulebooks-&gt;A) { x = action; action = action_to_be; }</span>
<span class="plain">rv = ProcessActivityRulebook(Activity_after_rulebooks--&gt;A, o);</span>
<span class="plain">if (Activity_atb_rulebooks-&gt;A) action = x;</span>
<span class="plain">activities_sp--; FixInhibitFlag();</span>
<span class="plain">MStack_DestroyAVVars(A);</span>
<span class="plain">return rv;</span>
<span class="plain">}</span>
<span class="plain">return RunTimeProblem(RTP_CANTABANDON);</span>
<span class="plain">];</span>
</pre>
<p class="inwebparagraph"></p>
<p class="inwebparagraph"><a id="SP10"></a><b>&#167;10. Abandon. </b>For (very) rare cases where an activity must be abandoned midway; such an
activity must be being run by calling the three stages individually, and
<code class="display"><span class="extract">EndActivity</span></code> must not have been called yet.
</p>
<pre class="display">
<span class="plain">[ AbandonActivity A o;</span>
<span class="plain">if ((activities_sp &gt; 0) &amp;&amp; (activities_stack--&gt;(activities_sp-1) == A)) {</span>
<span class="plain">activities_sp--; FixInhibitFlag();</span>
<span class="plain">MStack_DestroyAVVars(A);</span>
<span class="plain">return;</span>
<span class="plain">}</span>
<span class="plain">return RunTimeProblem(RTP_CANTEND);</span>
<span class="plain">];</span>
</pre>
<p class="inwebparagraph"></p>
<hr class="tocbar">
<ul class="toc"><li><a href="S-at.html">Back to 'Actions Template'</a></li><li><a href="S-ct.html">Continue with 'Chronology Template'</a></li></ul><hr class="tocbar">
<!--End of weave-->
</body>
</html>