mirror of
https://github.com/ganelson/inform.git
synced 2024-07-09 02:24:21 +03:00
952 lines
128 KiB
HTML
952 lines
128 KiB
HTML
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
|
|
<html>
|
|
<head>
|
|
<title>S/ot2</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</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/at' 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">WorldModelKit</a></li><li><b>Actions Template</b></li></ul><p class="purpose">To try actions by people in the model world, processing the necessary rulebooks.</p>
|
|
|
|
<ul class="toc"><li><a href="#SP1">§1. Summary</a></li><li><a href="#SP2">§2. Action Data</a></li><li><a href="#SP3">§3. Requirements Bitmap</a></li><li><a href="#SP4">§4. Try Action</a></li><li><a href="#SP5">§5. I6 Angle Brackets</a></li><li><a href="#SP6">§6. Conversion</a></li><li><a href="#SP7">§7. Implicit Take</a></li><li><a href="#SP8">§8. Look After Going</a></li><li><a href="#SP9">§9. Abbreviated Room Description</a></li><li><a href="#SP10">§10. Begin Action</a></li><li><a href="#SP11">§11. Action Primitive</a></li><li><a href="#SP12">§12. Internal Rule</a></li><li><a href="#SP13">§13. Type Safety</a></li><li><a href="#SP14">§14. Basic Visibility Rule</a></li><li><a href="#SP15">§15. Basic Accessibility Rule</a></li><li><a href="#SP16">§16. Carrying Requirements Rule</a></li><li><a href="#SP17">§17. Standard Implicit Taking Rule</a></li><li><a href="#SP18">§18. Requested Actions Require Persuasion Rule</a></li><li><a href="#SP19">§19. Carry Out Requested Actions Rule</a></li><li><a href="#SP20">§20. Generic Verb Subroutine</a></li><li><a href="#SP21">§21. Work Out Details Of Specific Action Rule</a></li><li><a href="#SP22">§22. Actions Bitmap</a></li><li><a href="#SP23">§23. Printing Actions</a></li></ul><hr class="tocbar">
|
|
|
|
<p class="inwebparagraph"><a id="SP1"></a><b>§1. Summary. </b>To review: an action is an impulse to do something by a person in the model
|
|
world. Commands such as DROP POTATO are converted into actions ("dropping
|
|
the Idaho potato"); sometimes they succeed, sometimes they fail. While
|
|
they run, the fairly complicated details are stored in a suite of I6
|
|
global variables such as <code class="display"><span class="extract">actor</span></code>, <code class="display"><span class="extract">noun</span></code>, <code class="display"><span class="extract">inp1</span></code>, and so on (see
|
|
"OrderOfPlay.i6t" for details); the running of an action is mainly a
|
|
matter of processing many rulebooks, chief among them they "action processing
|
|
rules".
|
|
</p>
|
|
|
|
<p class="inwebparagraph">In general, actions can come from five different sources:
|
|
</p>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<ul class="items"><li>(i) As a result of parsing the player's command: there are actually two ways
|
|
this can happen, one if the command calls for a single action, and another
|
|
if it calls for a whole run of them (like TAKE ALL). See the rules in
|
|
"OrderOfPlay.i6t".
|
|
</li><li>(ii) From an I7 "try" phrase, in which case <code class="display"><span class="extract">TryAction</span></code> is called.
|
|
</li><li>(iii) From an I6 angle-bracket-notation such as <code class="display"><span class="extract"><Wait></span></code>, though this is a
|
|
syntax which is deprecated now, and is never normally used in I7. The I6
|
|
compiler converts such a syntax into a call to the <code class="display"><span class="extract">R_Process</span></code> below.
|
|
</li><li>(iv) Through conversion of an existing action. For instance, "removing the
|
|
cup from the table" is converted in the Standard Rules to "taking the cup".
|
|
This is done via a routine called <code class="display"><span class="extract">GVS_Convert</span></code>.
|
|
</li><li>(v) When a request is successful, the "carry out requested actions" rule
|
|
turns the original action — a request by the player, such as is produced
|
|
by CHOPIN, PLAY POLONAISE — into an action by the person asked, such as
|
|
"Chopin playing the Polonaise".
|
|
</li></ul>
|
|
<p class="inwebparagraph">Certain exceptional cases can arise for other reasons:
|
|
</p>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<ul class="items"><li>(vi) Implicit taking actions are generated by the "carrying requirements rule"
|
|
when the actor tries something which requires him to be holding an item which
|
|
he can see, but is not currently holding.
|
|
</li><li>(vii) A partial but intentionally incomplete form of the "looking" action is
|
|
generated when describing the new location at the end of a "going" action.
|
|
</li></ul>
|
|
<p class="inwebparagraph">In every case except (vii), the action is carried out by <code class="display"><span class="extract">BeginAction</span></code>, the
|
|
single routine which unifies all of these approaches. Except the last one.
|
|
</p>
|
|
|
|
<p class="inwebparagraph">This segment of the template is divided into two: first, the I6 code needed
|
|
for (i) to (vii), the alternative ways for actions to begin; and secondly
|
|
the common machinery into which all actions eventually pass.
|
|
</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP2"></a><b>§2. Action Data. </b>This is perhaps a good place to document the <code class="display"><span class="extract">ActionData</span></code> array, a convenient
|
|
table of metadata about the actions. Since this is compiled by NI, the
|
|
following structure can't be modified here without making matching changes
|
|
in NI. <code class="display"><span class="extract">ActionData</span></code> is an I6 <code class="display"><span class="extract">table</span></code> containing a series of fixed-length
|
|
records, one on each action.
|
|
</p>
|
|
|
|
<p class="inwebparagraph">The routine <code class="display"><span class="extract">FindAction</span></code> locates the record in this table for a given
|
|
action number, returning its word offset within the table: the argument -1
|
|
means "the current action".
|
|
</p>
|
|
|
|
|
|
<pre class="display">
|
|
<span class="reserved">Constant</span><span class="plain"> </span><span class="identifier">AD_ACTION</span><span class="plain"> = </span><span class="constant">0</span><span class="plain">; </span><span class="comment">! The I6 action number (0 to 4095)</span>
|
|
<span class="reserved">Constant</span><span class="plain"> </span><span class="identifier">AD_REQUIREMENTS</span><span class="plain"> = </span><span class="constant">1</span><span class="plain">; </span><span class="comment">! Such as requiring light; a bitmap, see below</span>
|
|
<span class="reserved">Constant</span><span class="plain"> </span><span class="identifier">AD_NOUN_KOV</span><span class="plain"> = </span><span class="constant">2</span><span class="plain">; </span><span class="comment">! Kind of value of the first noun</span>
|
|
<span class="reserved">Constant</span><span class="plain"> </span><span class="identifier">AD_SECOND_KOV</span><span class="plain"> = </span><span class="constant">3</span><span class="plain">; </span><span class="comment">! Kind of value of the second noun</span>
|
|
<span class="reserved">Constant</span><span class="plain"> </span><span class="identifier">AD_VARIABLES_CREATOR</span><span class="plain"> = </span><span class="constant">4</span><span class="plain">; </span><span class="comment">! Routine to initialise variables owned</span>
|
|
<span class="reserved">Constant</span><span class="plain"> </span><span class="identifier">AD_VARIABLES_ID</span><span class="plain"> = </span><span class="constant">5</span><span class="plain">; </span><span class="comment">! Frame ID for variables owned by action</span>
|
|
|
|
<span class="reserved">Constant</span><span class="plain"> </span><span class="identifier">AD_RECORD_SIZE</span><span class="plain"> = </span><span class="constant">6</span><span class="plain">;</span>
|
|
|
|
<span class="plain">[ </span><span class="identifier">FindAction</span><span class="plain"> </span><span class="identifier">fa</span><span class="plain"> </span><span class="identifier">t</span><span class="plain">;</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">fa</span><span class="plain"> == </span><span class="constant">-1</span><span class="plain">) </span><span class="identifier">fa</span><span class="plain"> = </span><span class="identifier">action</span><span class="plain">;</span>
|
|
<span class="identifier">t</span><span class="plain"> = </span><span class="constant">1</span><span class="plain">;</span>
|
|
<span class="reserved">while</span><span class="plain"> (</span><span class="identifier">t</span><span class="plain"> <= </span><span class="identifier">ActionData</span><span class="plain">-->0) {</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">fa</span><span class="plain"> == </span><span class="identifier">ActionData</span><span class="plain">--></span><span class="identifier">t</span><span class="plain">) </span><span class="reserved">return</span><span class="plain"> </span><span class="identifier">t</span><span class="plain">;</span>
|
|
<span class="identifier">t</span><span class="plain"> = </span><span class="identifier">t</span><span class="plain"> + </span><span class="identifier">AD_RECORD_SIZE</span><span class="plain">;</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">ActionNumberIndexed</span><span class="plain"> </span><span class="identifier">i</span><span class="plain">;</span>
|
|
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">i</span><span class="plain">>=0) && (</span><span class="identifier">i</span><span class="plain"> < </span><span class="identifier">AD_RECORDS</span><span class="plain">)) </span><span class="reserved">return</span><span class="plain"> </span><span class="identifier">ActionData</span><span class="plain">-->(</span><span class="identifier">i</span><span class="plain">*</span><span class="identifier">AD_RECORD_SIZE</span><span class="plain"> + </span><span class="identifier">AD_ACTION</span><span class="plain"> + </span><span class="constant">1</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="SP3"></a><b>§3. Requirements Bitmap. </b>As noted above, the <code class="display"><span class="extract">AD_REQUIREMENTS</span></code> field is a bitmap of flags for
|
|
various possible action requirements:
|
|
</p>
|
|
|
|
|
|
<pre class="display">
|
|
<span class="reserved">Constant</span><span class="plain"> </span><span class="identifier">TOUCH_NOUN_ABIT</span><span class="plain"> = </span><span class="constant">$$00000001</span><span class="plain">;</span>
|
|
<span class="reserved">Constant</span><span class="plain"> </span><span class="identifier">TOUCH_SECOND_ABIT</span><span class="plain"> = </span><span class="constant">$$00000010</span><span class="plain">;</span>
|
|
<span class="reserved">Constant</span><span class="plain"> </span><span class="identifier">LIGHT_ABIT</span><span class="plain"> = </span><span class="constant">$$00000100</span><span class="plain">;</span>
|
|
<span class="reserved">Constant</span><span class="plain"> </span><span class="identifier">NEED_NOUN_ABIT</span><span class="plain"> = </span><span class="constant">$$00001000</span><span class="plain">;</span>
|
|
<span class="reserved">Constant</span><span class="plain"> </span><span class="identifier">NEED_SECOND_ABIT</span><span class="plain"> = </span><span class="constant">$$00010000</span><span class="plain">;</span>
|
|
<span class="reserved">Constant</span><span class="plain"> </span><span class="identifier">OUT_OF_WORLD_ABIT</span><span class="plain"> = </span><span class="constant">$$00100000</span><span class="plain">;</span>
|
|
<span class="reserved">Constant</span><span class="plain"> </span><span class="identifier">CARRY_NOUN_ABIT</span><span class="plain"> = </span><span class="constant">$$01000000</span><span class="plain">;</span>
|
|
<span class="reserved">Constant</span><span class="plain"> </span><span class="identifier">CARRY_SECOND_ABIT</span><span class="plain"> = </span><span class="constant">$$10000000</span><span class="plain">;</span>
|
|
|
|
<span class="plain">[ </span><span class="identifier">NeedToCarryNoun</span><span class="plain">; </span><span class="reserved">return</span><span class="plain"> </span><span class="identifier">TestActionMask</span><span class="plain">(</span><span class="identifier">CARRY_NOUN_ABIT</span><span class="plain">); ];</span>
|
|
<span class="plain">[ </span><span class="identifier">NeedToCarrySecondNoun</span><span class="plain">; </span><span class="reserved">return</span><span class="plain"> </span><span class="identifier">TestActionMask</span><span class="plain">(</span><span class="identifier">CARRY_SECOND_ABIT</span><span class="plain">); ];</span>
|
|
<span class="plain">[ </span><span class="identifier">NeedToTouchNoun</span><span class="plain">; </span><span class="reserved">return</span><span class="plain"> </span><span class="identifier">TestActionMask</span><span class="plain">(</span><span class="identifier">TOUCH_NOUN_ABIT</span><span class="plain">); ];</span>
|
|
<span class="plain">[ </span><span class="identifier">NeedToTouchSecondNoun</span><span class="plain">; </span><span class="reserved">return</span><span class="plain"> </span><span class="identifier">TestActionMask</span><span class="plain">(</span><span class="identifier">TOUCH_SECOND_ABIT</span><span class="plain">); ];</span>
|
|
<span class="plain">[ </span><span class="identifier">NeedLightForAction</span><span class="plain">; </span><span class="reserved">return</span><span class="plain"> </span><span class="identifier">TestActionMask</span><span class="plain">(</span><span class="identifier">LIGHT_ABIT</span><span class="plain">); ];</span>
|
|
|
|
<span class="plain">[ </span><span class="identifier">TestActionMask</span><span class="plain"> </span><span class="identifier">match</span><span class="plain"> </span><span class="identifier">mask</span><span class="plain"> </span><span class="identifier">at</span><span class="plain">;</span>
|
|
<span class="identifier">at</span><span class="plain"> = </span><span class="identifier">FindAction</span><span class="plain">(-1);</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">at</span><span class="plain"> == </span><span class="constant">0</span><span class="plain">) </span><span class="reserved">rfalse</span><span class="plain">;</span>
|
|
<span class="identifier">mask</span><span class="plain"> = </span><span class="identifier">ActionData</span><span class="plain">-->(</span><span class="identifier">at</span><span class="plain">+</span><span class="identifier">AD_REQUIREMENTS</span><span class="plain">);</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">mask</span><span class="plain"> & </span><span class="identifier">match</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>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="inwebparagraph"><a id="SP4"></a><b>§4. Try Action. </b>This is method (ii) in the summary above.
|
|
</p>
|
|
|
|
|
|
<pre class="display">
|
|
<span class="plain">[ </span><span class="identifier">TryAction</span><span class="plain"> </span><span class="identifier">req</span><span class="plain"> </span><span class="identifier">by</span><span class="plain"> </span><span class="identifier">ac</span><span class="plain"> </span><span class="identifier">n</span><span class="plain"> </span><span class="identifier">s</span><span class="plain"> </span><span class="identifier">stora</span><span class="plain"> </span><span class="identifier">smeta</span><span class="plain"> </span><span class="identifier">tbits</span><span class="plain"> </span><span class="identifier">saved_command</span><span class="plain"> </span><span class="identifier">text_of_command</span><span class="plain">;</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">stora</span><span class="plain">) </span><span class="reserved">return</span><span class="plain"> </span><span class="identifier">STORED_ACTION_TY_New</span><span class="plain">(</span><span class="identifier">ac</span><span class="plain">, </span><span class="identifier">n</span><span class="plain">, </span><span class="identifier">s</span><span class="plain">, </span><span class="identifier">by</span><span class="plain">, </span><span class="identifier">req</span><span class="plain">, </span><span class="identifier">stora</span><span class="plain">);</span>
|
|
<span class="identifier">tbits</span><span class="plain"> = </span><span class="identifier">req</span><span class="plain"> & (16+32);</span>
|
|
<span class="identifier">req</span><span class="plain"> = </span><span class="identifier">req</span><span class="plain"> & </span><span class="constant">1</span><span class="plain">;</span>
|
|
<span class="plain">@</span><span class="identifier">push</span><span class="plain"> </span><span class="identifier">actor</span><span class="plain">; @</span><span class="identifier">push</span><span class="plain"> </span><span class="identifier">act_requester</span><span class="plain">; @</span><span class="identifier">push</span><span class="plain"> </span><span class="identifier">inp1</span><span class="plain">; @</span><span class="identifier">push</span><span class="plain"> </span><span class="identifier">inp2</span><span class="plain">;</span>
|
|
<span class="plain">@</span><span class="identifier">push</span><span class="plain"> </span><span class="identifier">parsed_number</span><span class="plain">; </span><span class="identifier">smeta</span><span class="plain"> = </span><span class="identifier">meta</span><span class="plain">;</span>
|
|
<span class="identifier">actor</span><span class="plain"> = </span><span class="identifier">by</span><span class="plain">; </span><span class="reserved">if</span><span class="plain"> (</span><span class="identifier">req</span><span class="plain">) </span><span class="identifier">act_requester</span><span class="plain"> = </span><span class="identifier">player</span><span class="plain">; </span><span class="reserved">else</span><span class="plain"> </span><span class="identifier">act_requester</span><span class="plain"> = </span><span class="constant">0</span><span class="plain">;</span>
|
|
|
|
<span class="identifier">by</span><span class="plain"> = </span><span class="identifier">FindAction</span><span class="plain">(</span><span class="identifier">ac</span><span class="plain">);</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">by</span><span class="plain">) {</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">ActionData</span><span class="plain">-->(</span><span class="identifier">by</span><span class="plain">+</span><span class="identifier">AD_NOUN_KOV</span><span class="plain">) == </span><span class="identifier">OBJECT_TY</span><span class="plain">) </span><span class="identifier">inp1</span><span class="plain"> = </span><span class="identifier">n</span><span class="plain">;</span>
|
|
<span class="reserved">else</span><span class="plain"> { </span><span class="identifier">inp1</span><span class="plain"> = </span><span class="constant">1</span><span class="plain">; </span><span class="identifier">parsed_number</span><span class="plain"> = </span><span class="identifier">n</span><span class="plain">; }</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">ActionData</span><span class="plain">-->(</span><span class="identifier">by</span><span class="plain">+</span><span class="identifier">AD_SECOND_KOV</span><span class="plain">) == </span><span class="identifier">OBJECT_TY</span><span class="plain">) </span><span class="identifier">inp2</span><span class="plain"> = </span><span class="identifier">s</span><span class="plain">;</span>
|
|
<span class="reserved">else</span><span class="plain"> { </span><span class="identifier">inp2</span><span class="plain"> = </span><span class="constant">1</span><span class="plain">; </span><span class="identifier">parsed_number</span><span class="plain"> = </span><span class="identifier">s</span><span class="plain">; }</span>
|
|
<span class="reserved">if</span><span class="plain"> (((</span><span class="identifier">ActionData</span><span class="plain">-->(</span><span class="identifier">by</span><span class="plain">+</span><span class="identifier">AD_NOUN_KOV</span><span class="plain">) == </span><span class="identifier">UNDERSTANDING_TY</span><span class="plain">) ||</span>
|
|
<span class="plain">(</span><span class="identifier">ActionData</span><span class="plain">-->(</span><span class="identifier">by</span><span class="plain">+</span><span class="identifier">AD_SECOND_KOV</span><span class="plain">) == </span><span class="identifier">UNDERSTANDING_TY</span><span class="plain">)) && (</span><span class="identifier">tbits</span><span class="plain">)) {</span>
|
|
<span class="identifier">saved_command</span><span class="plain"> = </span><span class="identifier">BlkValueCreate</span><span class="plain">(</span><span class="identifier">TEXT_TY</span><span class="plain">);</span>
|
|
<span class="identifier">BlkValueCast</span><span class="plain">(</span><span class="identifier">saved_command</span><span class="plain">, </span><span class="identifier">SNIPPET_TY</span><span class="plain">, </span><span class="identifier">players_command</span><span class="plain">);</span>
|
|
<span class="identifier">text_of_command</span><span class="plain"> = </span><span class="identifier">BlkValueCreate</span><span class="plain">(</span><span class="identifier">TEXT_TY</span><span class="plain">);</span>
|
|
<span class="identifier">BlkValueCopy</span><span class="plain">(</span><span class="identifier">text_of_command</span><span class="plain">, </span><span class="identifier">parsed_number</span><span class="plain">);</span>
|
|
<span class="identifier">SetPlayersCommand</span><span class="plain">(</span><span class="identifier">text_of_command</span><span class="plain">);</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">tbits</span><span class="plain"> == </span><span class="constant">16</span><span class="plain">) {</span>
|
|
<span class="identifier">n</span><span class="plain"> = </span><span class="identifier">players_command</span><span class="plain">; </span><span class="identifier">inp1</span><span class="plain"> = </span><span class="constant">1</span><span class="plain">; </span><span class="identifier">parsed_number</span><span class="plain"> = </span><span class="identifier">players_command</span><span class="plain">;</span>
|
|
<span class="plain">} </span><span class="reserved">else</span><span class="plain"> {</span>
|
|
<span class="identifier">s</span><span class="plain"> = </span><span class="identifier">players_command</span><span class="plain">; </span><span class="identifier">inp2</span><span class="plain"> = </span><span class="constant">1</span><span class="plain">; </span><span class="identifier">parsed_number</span><span class="plain"> = </span><span class="identifier">players_command</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
<span class="identifier">BlkValueFree</span><span class="plain">(</span><span class="identifier">text_of_command</span><span class="plain">);</span>
|
|
<span class="plain">@</span><span class="identifier">push</span><span class="plain"> </span><span class="identifier">consult_from</span><span class="plain">; @</span><span class="identifier">push</span><span class="plain"> </span><span class="identifier">consult_words</span><span class="plain">;</span>
|
|
<span class="identifier">consult_from</span><span class="plain"> = </span><span class="constant">1</span><span class="plain">; </span><span class="identifier">consult_words</span><span class="plain"> = </span><span class="identifier">parsed_number</span><span class="plain"> </span><span class="constant">-</span><span class="plain"> </span><span class="constant">100</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
<span class="plain">}</span>
|
|
|
|
<span class="identifier">BeginAction</span><span class="plain">(</span><span class="identifier">ac</span><span class="plain">, </span><span class="identifier">n</span><span class="plain">, </span><span class="identifier">s</span><span class="plain">, </span><span class="constant">0</span><span class="plain">, </span><span class="reserved">true</span><span class="plain">);</span>
|
|
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">saved_command</span><span class="plain">) {</span>
|
|
<span class="plain">@</span><span class="identifier">pull</span><span class="plain"> </span><span class="identifier">consult_words</span><span class="plain">; @</span><span class="identifier">pull</span><span class="plain"> </span><span class="identifier">consult_from</span><span class="plain">;</span>
|
|
<span class="identifier">SetPlayersCommand</span><span class="plain">(</span><span class="identifier">saved_command</span><span class="plain">);</span>
|
|
<span class="identifier">BlkValueFree</span><span class="plain">(</span><span class="identifier">saved_command</span><span class="plain">);</span>
|
|
<span class="plain">}</span>
|
|
|
|
<span class="identifier">meta</span><span class="plain"> = </span><span class="identifier">smeta</span><span class="plain">; @</span><span class="identifier">pull</span><span class="plain"> </span><span class="identifier">parsed_number</span><span class="plain">;</span>
|
|
<span class="plain">@</span><span class="identifier">pull</span><span class="plain"> </span><span class="identifier">inp2</span><span class="plain">; @</span><span class="identifier">pull</span><span class="plain"> </span><span class="identifier">inp1</span><span class="plain">; @</span><span class="identifier">pull</span><span class="plain"> </span><span class="identifier">act_requester</span><span class="plain">; @</span><span class="identifier">pull</span><span class="plain"> </span><span class="identifier">actor</span><span class="plain">;</span>
|
|
<span class="identifier">TrackActions</span><span class="plain">(</span><span class="reserved">true</span><span class="plain">, </span><span class="identifier">smeta</span><span class="plain">);</span>
|
|
<span class="plain">];</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="inwebparagraph"><a id="SP5"></a><b>§5. I6 Angle Brackets. </b>This is method (iii) in the summary above. The routine here has slightly
|
|
odd conventions and a curious name which would take too long to explain:
|
|
neither can be changed without amending the veneer code within the I6
|
|
compiler.
|
|
</p>
|
|
|
|
|
|
<pre class="display">
|
|
<span class="plain">[ </span><span class="identifier">R_Process</span><span class="plain"> </span><span class="identifier">a</span><span class="plain"> </span><span class="identifier">i</span><span class="plain"> </span><span class="identifier">j</span><span class="plain">;</span>
|
|
<span class="plain">@</span><span class="identifier">push</span><span class="plain"> </span><span class="identifier">inp1</span><span class="plain">; @</span><span class="identifier">push</span><span class="plain"> </span><span class="identifier">inp2</span><span class="plain">;</span>
|
|
<span class="identifier">inp1</span><span class="plain"> = </span><span class="identifier">i</span><span class="plain">; </span><span class="identifier">inp2</span><span class="plain"> = </span><span class="identifier">j</span><span class="plain">; </span><span class="identifier">BeginAction</span><span class="plain">(</span><span class="identifier">a</span><span class="plain">, </span><span class="identifier">i</span><span class="plain">, </span><span class="identifier">j</span><span class="plain">);</span>
|
|
<span class="plain">@</span><span class="identifier">pull</span><span class="plain"> </span><span class="identifier">inp2</span><span class="plain">; @</span><span class="identifier">pull</span><span class="plain"> </span><span class="identifier">inp1</span><span class="plain">;</span>
|
|
<span class="plain">];</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="inwebparagraph"><a id="SP6"></a><b>§6. Conversion. </b>This is method (iv) in the summary above.
|
|
</p>
|
|
|
|
|
|
<pre class="display">
|
|
<span class="identifier">Global</span><span class="plain"> </span><span class="identifier">converted_action_outcome</span><span class="plain"> = </span><span class="constant">-1</span><span class="plain">;</span>
|
|
<span class="plain">[ </span><span class="identifier">GVS_Convert</span><span class="plain"> </span><span class="identifier">ac</span><span class="plain"> </span><span class="identifier">n</span><span class="plain"> </span><span class="identifier">s</span><span class="plain">;</span>
|
|
<span class="identifier">converted_action_outcome</span><span class="plain"> = </span><span class="identifier">BeginAction</span><span class="plain">(</span><span class="identifier">ac</span><span class="plain">, </span><span class="identifier">n</span><span class="plain">, </span><span class="identifier">s</span><span class="plain">);</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">converted_action_outcome</span><span class="plain"> == </span><span class="reserved">true</span><span class="plain">) </span><span class="identifier">FollowRulebook</span><span class="plain">(</span><span class="identifier">AFTER_RB</span><span class="plain">, </span><span class="reserved">nothing</span><span class="plain">, </span><span class="reserved">true</span><span class="plain"> );</span>
|
|
<span class="reserved">rtrue</span><span class="plain">;</span>
|
|
<span class="plain">];</span>
|
|
|
|
<span class="plain">[ </span><span class="identifier">ConvertToRequest</span><span class="plain"> </span><span class="identifier">X</span><span class="plain"> </span><span class="identifier">AN</span><span class="plain"> </span><span class="identifier">Y</span><span class="plain"> </span><span class="identifier">Z</span><span class="plain">;</span>
|
|
<span class="identifier">WORK_OUT_DETAILS_OF_SPECIFIC_R</span><span class="plain">();</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">X</span><span class="plain"> == </span><span class="identifier">player</span><span class="plain">) </span><span class="identifier">TryAction</span><span class="plain">(</span><span class="reserved">false</span><span class="plain">, </span><span class="identifier">X</span><span class="plain">, </span><span class="identifier">AN</span><span class="plain">, </span><span class="identifier">Y</span><span class="plain">, </span><span class="identifier">Z</span><span class="plain">);</span>
|
|
<span class="reserved">else</span><span class="plain"> </span><span class="identifier">TryAction</span><span class="plain">(</span><span class="reserved">true</span><span class="plain">, </span><span class="identifier">X</span><span class="plain">, </span><span class="identifier">AN</span><span class="plain">, </span><span class="identifier">Y</span><span class="plain">, </span><span class="identifier">Z</span><span class="plain">);</span>
|
|
<span class="reserved">rtrue</span><span class="plain">;</span>
|
|
<span class="plain">];</span>
|
|
|
|
<span class="plain">[ </span><span class="identifier">ConvertToGoingWithPush</span><span class="plain"> </span><span class="identifier">i</span><span class="plain"> </span><span class="identifier">oldrm</span><span class="plain"> </span><span class="identifier">newrm</span><span class="plain"> </span><span class="identifier">infl</span><span class="plain">;</span>
|
|
<span class="identifier">i</span><span class="plain">=</span><span class="identifier">noun</span><span class="plain">;</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">IndirectlyContains</span><span class="plain">(</span><span class="identifier">noun</span><span class="plain">, </span><span class="identifier">actor</span><span class="plain">) == </span><span class="reserved">false</span><span class="plain">) { </span><span class="reserved">move</span><span class="plain"> </span><span class="identifier">i</span><span class="plain"> </span><span class="reserved">to</span><span class="plain"> </span><span class="identifier">actor</span><span class="plain">; </span><span class="identifier">infl</span><span class="plain"> = </span><span class="reserved">true</span><span class="plain">; }</span>
|
|
<span class="identifier">move_pushing</span><span class="plain"> = </span><span class="identifier">i</span><span class="plain">;</span>
|
|
<span class="identifier">oldrm</span><span class="plain"> = </span><span class="identifier">LocationOf</span><span class="plain">(</span><span class="identifier">noun</span><span class="plain">);</span>
|
|
<span class="identifier">BeginAction</span><span class="plain">(##</span><span class="identifier">Go</span><span class="plain">, </span><span class="identifier">second</span><span class="plain">);</span>
|
|
<span class="identifier">newrm</span><span class="plain"> = </span><span class="identifier">LocationOf</span><span class="plain">(</span><span class="identifier">actor</span><span class="plain">);</span>
|
|
<span class="identifier">move_pushing</span><span class="plain"> = </span><span class="reserved">nothing</span><span class="plain">; </span><span class="reserved">move</span><span class="plain"> </span><span class="identifier">i</span><span class="plain"> </span><span class="reserved">to</span><span class="plain"> </span><span class="identifier">newrm</span><span class="plain">;</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">newrm</span><span class="plain"> ~= </span><span class="identifier">oldrm</span><span class="plain">) {</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">IndirectlyContains</span><span class="plain">(</span><span class="identifier">i</span><span class="plain">, </span><span class="identifier">player</span><span class="plain">)) </span><span class="identifier">TryAction</span><span class="plain">(0, </span><span class="identifier">player</span><span class="plain">, ##</span><span class="identifier">Look</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="identifier">RulebookSucceeds</span><span class="plain">();</span>
|
|
<span class="plain">} </span><span class="reserved">else</span><span class="plain"> </span><span class="identifier">RulebookFails</span><span class="plain">();</span>
|
|
<span class="reserved">rtrue</span><span class="plain">;</span>
|
|
<span class="plain">];</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="inwebparagraph"><a id="SP7"></a><b>§7. Implicit Take. </b>This is method (vi) in the summary above.
|
|
</p>
|
|
|
|
|
|
<pre class="display">
|
|
<span class="plain">[ </span><span class="identifier">ImplicitTake</span><span class="plain"> </span><span class="identifier">obj</span><span class="plain"> </span><span class="identifier">ks</span><span class="plain">;</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">actor</span><span class="plain"> == </span><span class="identifier">player</span><span class="plain">) { </span><span class="identifier">STANDARD_IMPLICIT_TAKING_RM</span><span class="plain">(</span><span class="character">'A'</span><span class="plain">, </span><span class="identifier">obj</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">TestVisibility</span><span class="plain">(</span><span class="identifier">player</span><span class="plain">, </span><span class="identifier">actor</span><span class="plain">))</span>
|
|
<span class="identifier">STANDARD_IMPLICIT_TAKING_RM</span><span class="plain">(</span><span class="character">'B'</span><span class="plain">, </span><span class="identifier">obj</span><span class="plain">, </span><span class="identifier">actor</span><span class="plain">);</span>
|
|
<span class="plain">}</span>
|
|
<span class="identifier">ClearParagraphing</span><span class="plain">(3);</span>
|
|
<span class="plain">@</span><span class="identifier">push</span><span class="plain"> </span><span class="identifier">keep_silent</span><span class="plain">; </span><span class="identifier">keep_silent</span><span class="plain"> = </span><span class="reserved">true</span><span class="plain">;</span>
|
|
<span class="plain">@</span><span class="identifier">push</span><span class="plain"> </span><span class="identifier">say__p</span><span class="plain">; @</span><span class="identifier">push</span><span class="plain"> </span><span class="identifier">say__pc</span><span class="plain">; </span><span class="identifier">ClearParagraphing</span><span class="plain">(4);</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">act_requester</span><span class="plain">) </span><span class="identifier">TryAction</span><span class="plain">(</span><span class="reserved">true</span><span class="plain">, </span><span class="identifier">actor</span><span class="plain">, ##</span><span class="identifier">Take</span><span class="plain">, </span><span class="identifier">obj</span><span class="plain">, </span><span class="reserved">nothing</span><span class="plain">);</span>
|
|
<span class="reserved">else</span><span class="plain"> </span><span class="identifier">TryAction</span><span class="plain">(</span><span class="reserved">false</span><span class="plain">, </span><span class="identifier">actor</span><span class="plain">, ##</span><span class="identifier">Take</span><span class="plain">, </span><span class="identifier">obj</span><span class="plain">, </span><span class="reserved">nothing</span><span class="plain">);</span>
|
|
<span class="identifier">DivideParagraphPoint</span><span class="plain">(); @</span><span class="identifier">pull</span><span class="plain"> </span><span class="identifier">say__pc</span><span class="plain">; @</span><span class="identifier">pull</span><span class="plain"> </span><span class="identifier">say__p</span><span class="plain">; </span><span class="identifier">AdjustParagraphPoint</span><span class="plain">(); @</span><span class="identifier">pull</span><span class="plain"> </span><span class="identifier">keep_silent</span><span class="plain">;</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">obj</span><span class="plain"> </span><span class="reserved">in</span><span class="plain"> </span><span class="identifier">actor</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>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="inwebparagraph"><a id="SP8"></a><b>§8. Look After Going. </b>This is method (vii) in the summary above.
|
|
</p>
|
|
|
|
<p class="inwebparagraph">Fundamentally, room descriptions arise through looking actions, but they
|
|
are also printed after successful going actions, with a special form of
|
|
paragraph break (see "Printing.i6t" for an explanation of this). Room
|
|
descriptions through looking are always given in full, unless we have
|
|
SUPERBRIEF mode set.
|
|
</p>
|
|
|
|
|
|
<pre class="display">
|
|
<span class="plain">[ </span><span class="identifier">LookAfterGoing</span><span class="plain">;</span>
|
|
<span class="identifier">GoingLookBreak</span><span class="plain">();</span>
|
|
<span class="identifier">AbbreviatedRoomDescription</span><span class="plain">();</span>
|
|
<span class="plain">];</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="inwebparagraph"><a id="SP9"></a><b>§9. Abbreviated Room Description. </b>This is used when we want a room description with the same abbreviation
|
|
conventions as after a going action, and we don't quite want a looking
|
|
action fully to take place. We nevertheless want to be sure that the
|
|
action variables for looking exist, and in particular, we want to set the
|
|
"room-describing action" variable to the action which was prevailing
|
|
when the room description was called for. We also set "abbreviated form
|
|
allowed" to "true": when the ordinary looking action is running, this
|
|
is "false".
|
|
</p>
|
|
|
|
<p class="inwebparagraph">The actual description occurs during <code class="display"><span class="extract">LookSub</span></code>, which is the specific
|
|
action processing stage for the "looking" action: thus, we use the
|
|
check, carry out, after and report rules as if we were "looking", but
|
|
are unaffected by before or instead rules.
|
|
</p>
|
|
|
|
<p class="inwebparagraph">Uniquely, this pseudo-action does not use <code class="display"><span class="extract">BeginAction</span></code>: it works only
|
|
through the specific action processing rules, not the main action-processing
|
|
ones, though that is not easy to see from the code below because it is
|
|
hidden in the call to <code class="display"><span class="extract">LookSub</span></code>. The <code class="display"><span class="extract">-Sub</span></code> suffix is an I6 usage identifying
|
|
this as the routine to go along with the action <code class="display"><span class="extract">##Look</span></code>, and so it is,
|
|
but it looks nothing like the <code class="display"><span class="extract">LookSub</span></code> of the old I6 library. NI compiles
|
|
<code class="display"><span class="extract">-Sub</span></code> routines like so:
|
|
</p>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
|
|
<pre class="display">
|
|
<span class="plain">[ LookSub; return GenericVerbSub(153,154,155); ];</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph">(with whatever rulebook numbers are appropriate). <code class="display"><span class="extract">GenericVerbSub</span></code> then
|
|
runs through the specific action processing stage.
|
|
</p>
|
|
|
|
|
|
<pre class="display">
|
|
<span class="plain">[ </span><span class="identifier">AbbreviatedRoomDescription</span><span class="plain"> </span><span class="identifier">prior_action</span><span class="plain"> </span><span class="identifier">pos</span><span class="plain"> </span><span class="identifier">frame_id</span><span class="plain">;</span>
|
|
<span class="identifier">prior_action</span><span class="plain"> = </span><span class="identifier">action</span><span class="plain">;</span>
|
|
|
|
<span class="identifier">action</span><span class="plain"> = ##</span><span class="identifier">Look</span><span class="plain">;</span>
|
|
<span class="identifier">pos</span><span class="plain"> = </span><span class="identifier">FindAction</span><span class="plain">(##</span><span class="identifier">Look</span><span class="plain">);</span>
|
|
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">pos</span><span class="plain">) && (</span><span class="identifier">ActionData</span><span class="plain">-->(</span><span class="identifier">pos</span><span class="plain">+</span><span class="identifier">AD_VARIABLES_CREATOR</span><span class="plain">))) {</span>
|
|
<span class="identifier">frame_id</span><span class="plain"> = </span><span class="identifier">ActionData</span><span class="plain">-->(</span><span class="identifier">pos</span><span class="plain">+</span><span class="identifier">AD_VARIABLES_ID</span><span class="plain">);</span>
|
|
<span class="identifier">Mstack_Create_Frame</span><span class="plain">(</span><span class="identifier">ActionData</span><span class="plain">-->(</span><span class="identifier">pos</span><span class="plain">+</span><span class="identifier">AD_VARIABLES_CREATOR</span><span class="plain">), </span><span class="identifier">frame_id</span><span class="plain">);</span>
|
|
<span class="identifier">FollowRulebook</span><span class="plain">(</span><span class="identifier">SETTING_ACTION_VARIABLES_RB</span><span class="plain">);</span>
|
|
<span class="plain">(</span><span class="identifier">MStack</span><span class="plain">--></span><span class="identifier">MstVO</span><span class="plain">(</span><span class="identifier">frame_id</span><span class="plain">, </span><span class="constant">0</span><span class="plain">)) = </span><span class="identifier">prior_action</span><span class="plain">; </span><span class="comment">! "room-describing action"</span>
|
|
<span class="plain">(</span><span class="identifier">MStack</span><span class="plain">--></span><span class="identifier">MstVO</span><span class="plain">(</span><span class="identifier">frame_id</span><span class="plain">, </span><span class="constant">1</span><span class="plain">)) = </span><span class="reserved">true</span><span class="plain">; </span><span class="comment">! "abbreviated form allowed"</span>
|
|
<span class="plain">}</span>
|
|
<span class="identifier">LookSub</span><span class="plain">(); </span><span class="comment">! The I6 verb routine for "looking"</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">frame_id</span><span class="plain">) </span><span class="identifier">Mstack_Destroy_Frame</span><span class="plain">(</span><span class="identifier">ActionData</span><span class="plain">-->(</span><span class="identifier">pos</span><span class="plain">+</span><span class="identifier">AD_VARIABLES_CREATOR</span><span class="plain">), </span><span class="identifier">frame_id</span><span class="plain">);</span>
|
|
|
|
<span class="identifier">action</span><span class="plain"> = </span><span class="identifier">prior_action</span><span class="plain">;</span>
|
|
<span class="plain">];</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="inwebparagraph"><a id="SP10"></a><b>§10. Begin Action. </b>We now begin the second half of the segment: the machinery which handles
|
|
all actions.
|
|
</p>
|
|
|
|
<p class="inwebparagraph">The significance of 4096 here is that this is how I6 distinguishes genuine
|
|
actions — numbered upwards in order of creation — from what I6 calls
|
|
"fake actions" — numbered upwards from 4096. Fake actions are hardly
|
|
used at all in I7, and certainly shouldn't get here, but it's possible
|
|
nonetheless using I6 angled-brackets, so... In other respects all we do
|
|
is to save details of whatever current action is happening onto the stack,
|
|
and then call <code class="display"><span class="extract">ActionPrimitive</span></code>.
|
|
</p>
|
|
|
|
|
|
<pre class="display">
|
|
<span class="plain">[ </span><span class="identifier">BeginAction</span><span class="plain"> </span><span class="identifier">a</span><span class="plain"> </span><span class="identifier">n</span><span class="plain"> </span><span class="identifier">s</span><span class="plain"> </span><span class="identifier">moi</span><span class="plain"> </span><span class="identifier">notrack</span><span class="plain"> </span><span class="identifier">rv</span><span class="plain">;</span>
|
|
<span class="identifier">ChronologyPoint</span><span class="plain">();</span>
|
|
|
|
<span class="plain">@</span><span class="identifier">push</span><span class="plain"> </span><span class="identifier">action</span><span class="plain">; @</span><span class="identifier">push</span><span class="plain"> </span><span class="identifier">noun</span><span class="plain">; @</span><span class="identifier">push</span><span class="plain"> </span><span class="identifier">second</span><span class="plain">; @</span><span class="identifier">push</span><span class="plain"> </span><span class="identifier">self</span><span class="plain">; @</span><span class="identifier">push</span><span class="plain"> </span><span class="identifier">multiple_object_item</span><span class="plain">;</span>
|
|
|
|
<span class="identifier">action</span><span class="plain"> = </span><span class="identifier">a</span><span class="plain">; </span><span class="identifier">noun</span><span class="plain"> = </span><span class="identifier">n</span><span class="plain">; </span><span class="identifier">second</span><span class="plain"> = </span><span class="identifier">s</span><span class="plain">; </span><span class="identifier">self</span><span class="plain"> = </span><span class="identifier">noun</span><span class="plain">; </span><span class="identifier">multiple_object_item</span><span class="plain"> = </span><span class="identifier">moi</span><span class="plain">;</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">action</span><span class="plain"> < </span><span class="constant">4096</span><span class="plain">) </span><span class="identifier">rv</span><span class="plain"> = </span><span class="identifier">ActionPrimitive</span><span class="plain">();</span>
|
|
|
|
<span class="plain">@</span><span class="identifier">pull</span><span class="plain"> </span><span class="identifier">multiple_object_item</span><span class="plain">; @</span><span class="identifier">pull</span><span class="plain"> </span><span class="identifier">self</span><span class="plain">; @</span><span class="identifier">pull</span><span class="plain"> </span><span class="identifier">second</span><span class="plain">; @</span><span class="identifier">pull</span><span class="plain"> </span><span class="identifier">noun</span><span class="plain">; @</span><span class="identifier">pull</span><span class="plain"> </span><span class="identifier">action</span><span class="plain">;</span>
|
|
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">notrack</span><span class="plain"> == </span><span class="reserved">false</span><span class="plain">) </span><span class="identifier">TrackActions</span><span class="plain">(</span><span class="reserved">true</span><span class="plain">, </span><span class="identifier">meta</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>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="inwebparagraph"><a id="SP11"></a><b>§11. Action Primitive. </b>This is somewhat different from the I6 library counterpart which gives it
|
|
its name, but the idea is the same. It has no arguments at all: everything
|
|
it needs to know is now stored in global variables. The routine looks long,
|
|
but really contains little: it's all just book-keeping, printing debugging
|
|
information if ACTIONS is in force, etc., with all of the actual work
|
|
delegated to the action processing rulebook.
|
|
</p>
|
|
|
|
<p class="inwebparagraph">We use a rather sneaky device to handle out-of-world actions, those for
|
|
which the <code class="display"><span class="extract">meta</span></code> flag is set: we make it look to the system as if the
|
|
"action processing rulebook" is being followed, so that all its variables
|
|
are created and placed in scope, but at the crucial moment we descend to
|
|
the specific action processing rules directly instead of processing the
|
|
main rulebook. This is what short-circuits out of world actions and
|
|
protects them from before and instead rules: see the Standard Rules for
|
|
more discussion of this.
|
|
</p>
|
|
|
|
|
|
<pre class="display">
|
|
<span class="plain">[ </span><span class="identifier">ActionPrimitive</span><span class="plain"> </span><span class="identifier">rv</span><span class="plain"> </span><span class="identifier">p1</span><span class="plain"> </span><span class="identifier">p2</span><span class="plain"> </span><span class="identifier">p3</span><span class="plain"> </span><span class="identifier">p4</span><span class="plain"> </span><span class="identifier">p5</span><span class="plain"> </span><span class="identifier">frame_id</span><span class="plain">;</span>
|
|
<span class="identifier">MStack_CreateRBVars</span><span class="plain">(</span><span class="identifier">ACTION_PROCESSING_RB</span><span class="plain">);</span>
|
|
|
|
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">keep_silent</span><span class="plain"> == </span><span class="reserved">false</span><span class="plain">) && (</span><span class="identifier">multiflag</span><span class="plain"> == </span><span class="reserved">false</span><span class="plain">)) </span><span class="identifier">DivideParagraphPoint</span><span class="plain">();</span>
|
|
<span class="identifier">reason_the_action_failed</span><span class="plain"> = </span><span class="constant">0</span><span class="plain">;</span>
|
|
|
|
<span class="identifier">frame_id</span><span class="plain"> = </span><span class="constant">-1</span><span class="plain">;</span>
|
|
<span class="identifier">p1</span><span class="plain"> = </span><span class="identifier">FindAction</span><span class="plain">(</span><span class="identifier">action</span><span class="plain">);</span>
|
|
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">p1</span><span class="plain">) && (</span><span class="identifier">ActionData</span><span class="plain">-->(</span><span class="identifier">p1</span><span class="plain">+</span><span class="identifier">AD_VARIABLES_CREATOR</span><span class="plain">))) {</span>
|
|
<span class="identifier">frame_id</span><span class="plain"> = </span><span class="identifier">ActionData</span><span class="plain">-->(</span><span class="identifier">p1</span><span class="plain">+</span><span class="identifier">AD_VARIABLES_ID</span><span class="plain">);</span>
|
|
<span class="identifier">Mstack_Create_Frame</span><span class="plain">(</span><span class="identifier">ActionData</span><span class="plain">-->(</span><span class="identifier">p1</span><span class="plain">+</span><span class="identifier">AD_VARIABLES_CREATOR</span><span class="plain">), </span><span class="identifier">frame_id</span><span class="plain">);</span>
|
|
<span class="plain">}</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">ActionVariablesNotTypeSafe</span><span class="plain">()) {</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">actor</span><span class="plain"> ~= </span><span class="identifier">player</span><span class="plain">) { </span><span class="identifier">ACTION_PROCESSING_INTERNAL_RM</span><span class="plain">(</span><span class="character">'K'</span><span class="plain">); </span><span class="reserved">new_line</span><span class="plain">; }</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">frame_id</span><span class="plain"> ~= </span><span class="constant">-1</span><span class="plain">)</span>
|
|
<span class="identifier">Mstack_Destroy_Frame</span><span class="plain">(</span><span class="identifier">ActionData</span><span class="plain">-->(</span><span class="identifier">p1</span><span class="plain">+</span><span class="identifier">AD_VARIABLES_CREATOR</span><span class="plain">), </span><span class="identifier">frame_id</span><span class="plain">);</span>
|
|
<span class="identifier">MStack_DestroyRBVars</span><span class="plain">(</span><span class="identifier">ACTION_PROCESSING_RB</span><span class="plain">);</span>
|
|
<span class="reserved">return</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
|
|
<span class="identifier">FollowRulebook</span><span class="plain">(</span><span class="identifier">SETTING_ACTION_VARIABLES_RB</span><span class="plain">);</span>
|
|
|
|
<span class="plain">#</span><span class="identifier">IFDEF</span><span class="plain"> </span><span class="identifier">DEBUG</span><span class="plain">;</span>
|
|
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">trace_actions</span><span class="plain">) && (</span><span class="identifier">FindAction</span><span class="plain">(-1))) {</span>
|
|
<span class="reserved">print</span><span class="plain"> </span><span class="string">"["</span><span class="plain">; </span><span class="identifier">p1</span><span class="plain">=</span><span class="identifier">actor</span><span class="plain">; </span><span class="identifier">p2</span><span class="plain">=</span><span class="identifier">act_requester</span><span class="plain">; </span><span class="identifier">p3</span><span class="plain">=</span><span class="identifier">action</span><span class="plain">; </span><span class="identifier">p4</span><span class="plain">=</span><span class="identifier">noun</span><span class="plain">; </span><span class="identifier">p5</span><span class="plain">=</span><span class="identifier">second</span><span class="plain">;</span>
|
|
<span class="identifier">DB_Action</span><span class="plain">(</span><span class="identifier">p1</span><span class="plain">,</span><span class="identifier">p2</span><span class="plain">,</span><span class="identifier">p3</span><span class="plain">,</span><span class="identifier">p4</span><span class="plain">,</span><span class="identifier">p5</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">ClearParagraphing</span><span class="plain">(5);</span>
|
|
<span class="plain">}</span>
|
|
<span class="plain">++</span><span class="identifier">debug_rule_nesting</span><span class="plain">;</span>
|
|
<span class="plain">#</span><span class="identifier">ENDIF</span><span class="plain">;</span>
|
|
<span class="identifier">TrackActions</span><span class="plain">(</span><span class="reserved">false</span><span class="plain">, </span><span class="identifier">meta</span><span class="plain">);</span>
|
|
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">meta</span><span class="plain">) && (</span><span class="identifier">actor</span><span class="plain"> ~= </span><span class="identifier">player</span><span class="plain">)) {</span>
|
|
<span class="identifier">ACTION_PROCESSING_INTERNAL_RM</span><span class="plain">(</span><span class="character">'A'</span><span class="plain">, </span><span class="identifier">actor</span><span class="plain">); </span><span class="reserved">new_line</span><span class="plain">; </span><span class="identifier">rv</span><span class="plain"> = </span><span class="identifier">RS_FAILS</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">meta</span><span class="plain">) { </span><span class="identifier">DESCEND_TO_SPECIFIC_ACTION_R</span><span class="plain">(); </span><span class="identifier">rv</span><span class="plain"> = </span><span class="identifier">RulebookOutcome</span><span class="plain">(); }</span>
|
|
<span class="reserved">else</span><span class="plain"> { </span><span class="identifier">FollowRulebook</span><span class="plain">(</span><span class="identifier">ACTION_PROCESSING_RB</span><span class="plain">); </span><span class="identifier">rv</span><span class="plain"> = </span><span class="identifier">RulebookOutcome</span><span class="plain">(); }</span>
|
|
<span class="plain">#</span><span class="identifier">IFDEF</span><span class="plain"> </span><span class="identifier">DEBUG</span><span class="plain">;</span>
|
|
<span class="constant">--</span><span class="identifier">debug_rule_nesting</span><span class="plain">;</span>
|
|
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">trace_actions</span><span class="plain">) && (</span><span class="identifier">FindAction</span><span class="plain">(-1))) {</span>
|
|
<span class="reserved">print</span><span class="plain"> </span><span class="string">"["</span><span class="plain">; </span><span class="identifier">DB_Action</span><span class="plain">(</span><span class="identifier">p1</span><span class="plain">,</span><span class="identifier">p2</span><span class="plain">,</span><span class="identifier">p3</span><span class="plain">,</span><span class="identifier">p4</span><span class="plain">,</span><span class="identifier">p5</span><span class="plain">); </span><span class="reserved">print</span><span class="plain"> </span><span class="string">" - "</span><span class="plain">;</span>
|
|
<span class="reserved">switch</span><span class="plain"> (</span><span class="identifier">rv</span><span class="plain">) {</span>
|
|
<span class="identifier">RS_SUCCEEDS</span><span class="plain">: </span><span class="reserved">print</span><span class="plain"> </span><span class="string">"succeeded"</span><span class="plain">;</span>
|
|
<span class="identifier">RS_FAILS</span><span class="plain">: </span><span class="reserved">print</span><span class="plain"> </span><span class="string">"failed"</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">reason_the_action_failed</span><span class="plain">)</span>
|
|
<span class="reserved">print</span><span class="plain"> </span><span class="string">" the "</span><span class="plain">,</span>
|
|
<span class="plain">(</span><span class="identifier">RulePrintingRule</span><span class="plain">) </span><span class="identifier">reason_the_action_failed</span><span class="plain">;</span>
|
|
<span class="plain">#</span><span class="identifier">ENDIF</span><span class="plain">;</span>
|
|
<span class="reserved">default</span><span class="plain">: </span><span class="reserved">print</span><span class="plain"> </span><span class="string">"ended without result"</span><span class="plain">;</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">say__p</span><span class="plain"> = </span><span class="constant">1</span><span class="plain">;</span>
|
|
<span class="identifier">SetRulebookOutcome</span><span class="plain">(</span><span class="identifier">rv</span><span class="plain">); </span><span class="comment">! In case disturbed by printing activities</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">rv</span><span class="plain"> == </span><span class="identifier">RS_SUCCEEDS</span><span class="plain">) </span><span class="identifier">UpdateActionBitmap</span><span class="plain">();</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">frame_id</span><span class="plain"> ~= </span><span class="constant">-1</span><span class="plain">) {</span>
|
|
<span class="identifier">p1</span><span class="plain"> = </span><span class="identifier">FindAction</span><span class="plain">(</span><span class="identifier">action</span><span class="plain">);</span>
|
|
<span class="identifier">Mstack_Destroy_Frame</span><span class="plain">(</span><span class="identifier">ActionData</span><span class="plain">-->(</span><span class="identifier">p1</span><span class="plain">+</span><span class="identifier">AD_VARIABLES_CREATOR</span><span class="plain">), </span><span class="identifier">frame_id</span><span class="plain">);</span>
|
|
<span class="plain">}</span>
|
|
<span class="identifier">MStack_DestroyRBVars</span><span class="plain">(</span><span class="identifier">ACTION_PROCESSING_RB</span><span class="plain">);</span>
|
|
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">keep_silent</span><span class="plain"> == </span><span class="reserved">false</span><span class="plain">) && (</span><span class="identifier">multiflag</span><span class="plain"> == </span><span class="reserved">false</span><span class="plain">)) </span><span class="identifier">DivideParagraphPoint</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">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>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="inwebparagraph"><a id="SP12"></a><b>§12. Internal Rule. </b>Provided only as a hook on which to hang responses.
|
|
</p>
|
|
|
|
|
|
<pre class="display">
|
|
<span class="plain">[ </span><span class="identifier">ACTION_PROCESSING_INTERNAL_R</span><span class="plain">; ];</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="inwebparagraph"><a id="SP13"></a><b>§13. Type Safety. </b>Some basic action requirements have to be met before we can go any further:
|
|
if they aren't, then it isn't type-safe even to run the action processing
|
|
rulebook.
|
|
</p>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<ul class="items"><li>(i) For an out of world action, we set the <code class="display"><span class="extract">meta</span></code> flag. Otherwise:
|
|
</li><li>(ii) If either the noun or second noun is a topic, then this is an action
|
|
arising from parsing (such actions do not arise through the "try" phrase,
|
|
unless by stored actions in which case this has all happened before and
|
|
doesn't need to be done again) — the parser places details of which words
|
|
make up the topic in the I6 global variables <code class="display"><span class="extract">consult_words</span></code> and <code class="display"><span class="extract">consult_from</span></code>.
|
|
We convert them to a valid I7 snippet value.
|
|
</li><li>(iii) If either the first or second noun is supposed to be an object but
|
|
seems here to be a value, or vice versa, we stop with a parser error. (This
|
|
should be fairly difficult to provoke: NI's type-checking will make it
|
|
difficult to arrange without I6 subterfuges.)
|
|
</li><li>(iv) If either the first or second noun is supposed to be an object and
|
|
required to exist, yet is missing, we use the "supplying a missing noun"
|
|
or "supplying a missing second noun" activities to fill the void.
|
|
</li></ul>
|
|
<p class="inwebparagraph">We return <code class="display"><span class="extract">true</span></code> if type safety is violated, <code class="display"><span class="extract">false</span></code> if all is well.
|
|
</p>
|
|
|
|
|
|
<pre class="display">
|
|
<span class="plain">[ </span><span class="identifier">ActionVariablesNotTypeSafe</span><span class="plain"> </span><span class="identifier">mask</span><span class="plain"> </span><span class="identifier">noun_kova</span><span class="plain"> </span><span class="identifier">second_kova</span><span class="plain"> </span><span class="identifier">at</span><span class="plain">;</span>
|
|
<span class="identifier">at</span><span class="plain"> = </span><span class="identifier">FindAction</span><span class="plain">(-1); </span><span class="reserved">if</span><span class="plain"> (</span><span class="identifier">at</span><span class="plain"> == </span><span class="constant">0</span><span class="plain">) </span><span class="reserved">rfalse</span><span class="plain">; </span><span class="comment">! For any I6-defined actions</span>
|
|
|
|
<span class="identifier">noun_kova</span><span class="plain"> = </span><span class="identifier">ActionData</span><span class="plain">-->(</span><span class="identifier">at</span><span class="plain">+</span><span class="identifier">AD_NOUN_KOV</span><span class="plain">);</span>
|
|
<span class="identifier">second_kova</span><span class="plain"> = </span><span class="identifier">ActionData</span><span class="plain">-->(</span><span class="identifier">at</span><span class="plain">+</span><span class="identifier">AD_SECOND_KOV</span><span class="plain">);</span>
|
|
|
|
<span class="comment">!print "at = ", at, " nst = ", noun_kova, "^";</span>
|
|
<span class="comment">!print "consult_from = ", consult_from, " consult_words = ", consult_from, "^";</span>
|
|
<span class="comment">!print "inp1 = ", inp1, " noun = ", noun, "^";</span>
|
|
<span class="comment">!print "inp2 = ", inp2, " second = ", second, "^";</span>
|
|
<span class="comment">!print "sst = ", second_kova, "^";</span>
|
|
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">noun_kova</span><span class="plain"> == </span><span class="identifier">SNIPPET_TY</span><span class="plain"> </span><span class="reserved">or</span><span class="plain"> </span><span class="identifier">UNDERSTANDING_TY</span><span class="plain">) {</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">inp1</span><span class="plain"> ~= </span><span class="constant">1</span><span class="plain">) { </span><span class="identifier">inp2</span><span class="plain"> = </span><span class="identifier">inp1</span><span class="plain">; </span><span class="identifier">second</span><span class="plain"> = </span><span class="identifier">noun</span><span class="plain">; }</span>
|
|
<span class="identifier">parsed_number</span><span class="plain"> = </span><span class="constant">100</span><span class="plain">*</span><span class="identifier">consult_from</span><span class="plain"> + </span><span class="identifier">consult_words</span><span class="plain">;</span>
|
|
<span class="identifier">inp1</span><span class="plain"> = </span><span class="constant">1</span><span class="plain">; </span><span class="identifier">noun</span><span class="plain"> = </span><span class="reserved">nothing</span><span class="plain">; </span><span class="comment">! noun = parsed_number;</span>
|
|
<span class="plain">}</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">second_kova</span><span class="plain"> == </span><span class="identifier">SNIPPET_TY</span><span class="plain"> </span><span class="reserved">or</span><span class="plain"> </span><span class="identifier">UNDERSTANDING_TY</span><span class="plain">) {</span>
|
|
<span class="identifier">parsed_number</span><span class="plain"> = </span><span class="constant">100</span><span class="plain">*</span><span class="identifier">consult_from</span><span class="plain"> + </span><span class="identifier">consult_words</span><span class="plain">;</span>
|
|
<span class="identifier">inp2</span><span class="plain"> = </span><span class="constant">1</span><span class="plain">; </span><span class="identifier">second</span><span class="plain"> = </span><span class="reserved">nothing</span><span class="plain">; </span><span class="comment">! second = parsed_number;</span>
|
|
<span class="plain">}</span>
|
|
|
|
<span class="identifier">mask</span><span class="plain"> = </span><span class="identifier">ActionData</span><span class="plain">-->(</span><span class="identifier">at</span><span class="plain">+</span><span class="identifier">AD_REQUIREMENTS</span><span class="plain">);</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">mask</span><span class="plain"> & </span><span class="identifier">OUT_OF_WORLD_ABIT</span><span class="plain">) { </span><span class="identifier">meta</span><span class="plain"> = </span><span class="constant">1</span><span class="plain">; </span><span class="reserved">rfalse</span><span class="plain">; }</span>
|
|
<span class="identifier">meta</span><span class="plain"> = </span><span class="constant">0</span><span class="plain">;</span>
|
|
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">inp1</span><span class="plain"> == </span><span class="constant">1</span><span class="plain">) {</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">noun_kova</span><span class="plain"> == </span><span class="identifier">OBJECT_TY</span><span class="plain">) {</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">actor</span><span class="plain"> == </span><span class="identifier">player</span><span class="plain">) { </span><span class="identifier">ACTION_PROCESSING_INTERNAL_RM</span><span class="plain">(</span><span class="character">'B'</span><span class="plain">); </span><span class="reserved">new_line</span><span class="plain">; }</span>
|
|
<span class="reserved">rtrue</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">noun_kova</span><span class="plain"> ~= </span><span class="identifier">OBJECT_TY</span><span class="plain">) {</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">actor</span><span class="plain"> == </span><span class="identifier">player</span><span class="plain">) { </span><span class="identifier">ACTION_PROCESSING_INTERNAL_RM</span><span class="plain">(</span><span class="character">'C'</span><span class="plain">); </span><span class="reserved">new_line</span><span class="plain">; }</span>
|
|
<span class="reserved">rtrue</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">mask</span><span class="plain"> & </span><span class="identifier">NEED_NOUN_ABIT</span><span class="plain">) && (</span><span class="identifier">noun</span><span class="plain"> == </span><span class="reserved">nothing</span><span class="plain">)) {</span>
|
|
<span class="plain">@</span><span class="identifier">push</span><span class="plain"> </span><span class="identifier">act_requester</span><span class="plain">; </span><span class="identifier">act_requester</span><span class="plain"> = </span><span class="reserved">nothing</span><span class="plain">;</span>
|
|
<span class="identifier">CarryOutActivity</span><span class="plain">(</span><span class="identifier">SUPPLYING_A_MISSING_NOUN_ACT</span><span class="plain">);</span>
|
|
<span class="plain">@</span><span class="identifier">pull</span><span class="plain"> </span><span class="identifier">act_requester</span><span class="plain">;</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">noun</span><span class="plain"> == </span><span class="reserved">nothing</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="reserved">rtrue</span><span class="plain">;</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">actor</span><span class="plain"> == </span><span class="identifier">player</span><span class="plain">) { </span><span class="identifier">ACTION_PROCESSING_INTERNAL_RM</span><span class="plain">(</span><span class="character">'D'</span><span class="plain">); </span><span class="reserved">new_line</span><span class="plain">; }</span>
|
|
<span class="reserved">rtrue</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
<span class="plain">}</span>
|
|
<span class="reserved">if</span><span class="plain"> (((</span><span class="identifier">mask</span><span class="plain"> & </span><span class="identifier">NEED_NOUN_ABIT</span><span class="plain">) == </span><span class="constant">0</span><span class="plain">) && (</span><span class="identifier">noun</span><span class="plain"> ~= </span><span class="reserved">nothing</span><span class="plain">)) {</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">actor</span><span class="plain"> == </span><span class="identifier">player</span><span class="plain">) { </span><span class="identifier">ACTION_PROCESSING_INTERNAL_RM</span><span class="plain">(</span><span class="character">'E'</span><span class="plain">); </span><span class="reserved">new_line</span><span class="plain">; }</span>
|
|
<span class="reserved">rtrue</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
<span class="plain">}</span>
|
|
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">inp2</span><span class="plain"> == </span><span class="constant">1</span><span class="plain">) {</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">second_kova</span><span class="plain"> == </span><span class="identifier">OBJECT_TY</span><span class="plain">) {</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">actor</span><span class="plain"> == </span><span class="identifier">player</span><span class="plain">) { </span><span class="identifier">ACTION_PROCESSING_INTERNAL_RM</span><span class="plain">(</span><span class="character">'F'</span><span class="plain">); </span><span class="reserved">new_line</span><span class="plain">; }</span>
|
|
<span class="reserved">rtrue</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">second_kova</span><span class="plain"> ~= </span><span class="identifier">OBJECT_TY</span><span class="plain">) {</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">actor</span><span class="plain"> == </span><span class="identifier">player</span><span class="plain">) { </span><span class="identifier">ACTION_PROCESSING_INTERNAL_RM</span><span class="plain">(</span><span class="character">'G'</span><span class="plain">); </span><span class="reserved">new_line</span><span class="plain">; }</span>
|
|
<span class="reserved">rtrue</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">mask</span><span class="plain"> & </span><span class="identifier">NEED_SECOND_ABIT</span><span class="plain">) && (</span><span class="identifier">second</span><span class="plain"> == </span><span class="reserved">nothing</span><span class="plain">)) {</span>
|
|
<span class="plain">@</span><span class="identifier">push</span><span class="plain"> </span><span class="identifier">act_requester</span><span class="plain">; </span><span class="identifier">act_requester</span><span class="plain"> = </span><span class="reserved">nothing</span><span class="plain">;</span>
|
|
<span class="identifier">CarryOutActivity</span><span class="plain">(</span><span class="identifier">SUPPLYING_A_MISSING_SECOND_ACT</span><span class="plain">);</span>
|
|
<span class="plain">@</span><span class="identifier">pull</span><span class="plain"> </span><span class="identifier">act_requester</span><span class="plain">;</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">second</span><span class="plain"> == </span><span class="reserved">nothing</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="reserved">rtrue</span><span class="plain">;</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">actor</span><span class="plain"> == </span><span class="identifier">player</span><span class="plain">) { </span><span class="identifier">ACTION_PROCESSING_INTERNAL_RM</span><span class="plain">(</span><span class="character">'H'</span><span class="plain">); </span><span class="reserved">new_line</span><span class="plain">; }</span>
|
|
<span class="reserved">rtrue</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
<span class="plain">}</span>
|
|
<span class="reserved">if</span><span class="plain"> (((</span><span class="identifier">mask</span><span class="plain"> & </span><span class="identifier">NEED_SECOND_ABIT</span><span class="plain">) == </span><span class="constant">0</span><span class="plain">) && (</span><span class="identifier">second</span><span class="plain"> ~= </span><span class="reserved">nothing</span><span class="plain">)) {</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">actor</span><span class="plain"> == </span><span class="identifier">player</span><span class="plain">) { </span><span class="identifier">ACTION_PROCESSING_INTERNAL_RM</span><span class="plain">(</span><span class="character">'I'</span><span class="plain">); </span><span class="reserved">new_line</span><span class="plain">; }</span>
|
|
<span class="reserved">rtrue</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
<span class="plain">}</span>
|
|
|
|
<span class="reserved">rfalse</span><span class="plain">;</span>
|
|
<span class="plain">];</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="inwebparagraph"><a id="SP14"></a><b>§14. Basic Visibility Rule. </b>This is one of the I6 primitive rules in the action processing rulebook:
|
|
see the account in the Standard Rules for details.
|
|
</p>
|
|
|
|
<p class="inwebparagraph">Note that this rule only blocks the player from acting in darkness: this is
|
|
because light is only reckoned from the player's perspective in any case,
|
|
so that it would be unfair to apply the rule to any other person.
|
|
</p>
|
|
|
|
|
|
<pre class="display">
|
|
<span class="plain">[ </span><span class="identifier">BASIC_VISIBILITY_R</span><span class="plain">;</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">act_requester</span><span class="plain">) </span><span class="reserved">rfalse</span><span class="plain">;</span>
|
|
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">NeedLightForAction</span><span class="plain">()) &&</span>
|
|
<span class="plain">(</span><span class="identifier">actor</span><span class="plain"> == </span><span class="identifier">player</span><span class="plain">) &&</span>
|
|
<span class="plain">(</span><span class="identifier">FollowRulebook</span><span class="plain">(</span><span class="identifier">VISIBLE_RB</span><span class="plain">)) &&</span>
|
|
<span class="plain">(</span><span class="identifier">RulebookSucceeded</span><span class="plain">())) {</span>
|
|
<span class="identifier">BeginActivity</span><span class="plain">(</span><span class="identifier">REFUSAL_TO_ACT_IN_DARK_ACT</span><span class="plain">);</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">ForActivity</span><span class="plain">(</span><span class="identifier">REFUSAL_TO_ACT_IN_DARK_ACT</span><span class="plain">)==</span><span class="reserved">false</span><span class="plain">) {</span>
|
|
<span class="identifier">BASIC_VISIBILITY_RM</span><span class="plain">(</span><span class="character">'A'</span><span class="plain">); </span><span class="reserved">new_line</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
<span class="identifier">EndActivity</span><span class="plain">(</span><span class="identifier">REFUSAL_TO_ACT_IN_DARK_ACT</span><span class="plain">);</span>
|
|
<span class="identifier">reason_the_action_failed</span><span class="plain"> = </span><span class="identifier">BASIC_VISIBILITY_R</span><span class="plain">;</span>
|
|
<span class="identifier">RulebookFails</span><span class="plain">();</span>
|
|
<span class="reserved">rtrue</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
<span class="reserved">rfalse</span><span class="plain">;</span>
|
|
<span class="plain">];</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="inwebparagraph"><a id="SP15"></a><b>§15. Basic Accessibility Rule. </b>This is one of the I6 primitive rules in the action processing rulebook:
|
|
see the account in the Standard Rules for details.
|
|
</p>
|
|
|
|
|
|
<pre class="display">
|
|
<span class="plain">[ </span><span class="identifier">BASIC_ACCESSIBILITY_R</span><span class="plain"> </span><span class="identifier">mask</span><span class="plain"> </span><span class="identifier">at</span><span class="plain">;</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">act_requester</span><span class="plain">) </span><span class="reserved">rfalse</span><span class="plain">;</span>
|
|
<span class="identifier">at</span><span class="plain"> = </span><span class="identifier">FindAction</span><span class="plain">(-1);</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">at</span><span class="plain"> == </span><span class="constant">0</span><span class="plain">) </span><span class="reserved">rfalse</span><span class="plain">;</span>
|
|
<span class="identifier">mask</span><span class="plain"> = </span><span class="identifier">ActionData</span><span class="plain">-->(</span><span class="identifier">at</span><span class="plain">+</span><span class="identifier">AD_REQUIREMENTS</span><span class="plain">);</span>
|
|
|
|
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">mask</span><span class="plain"> & </span><span class="identifier">TOUCH_NOUN_ABIT</span><span class="plain">) && </span><span class="identifier">noun</span><span class="plain"> && (</span><span class="identifier">inp1</span><span class="plain"> ~= </span><span class="constant">1</span><span class="plain">)) {</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">noun</span><span class="plain"> </span><span class="reserved">ofclass</span><span class="plain"> </span><span class="identifier">K3_direction</span><span class="plain">) {</span>
|
|
<span class="identifier">RulebookFails</span><span class="plain">();</span>
|
|
<span class="identifier">reason_the_action_failed</span><span class="plain"> = </span><span class="identifier">BASIC_ACCESSIBILITY_R</span><span class="plain">;</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">actor</span><span class="plain">~=</span><span class="identifier">player</span><span class="plain">) </span><span class="reserved">rtrue</span><span class="plain">;</span>
|
|
<span class="identifier">BASIC_ACCESSIBILITY_RM</span><span class="plain">(</span><span class="character">'A'</span><span class="plain">); </span><span class="reserved">new_line</span><span class="plain">;</span>
|
|
<span class="identifier">RulebookFails</span><span class="plain">();</span>
|
|
<span class="identifier">reason_the_action_failed</span><span class="plain"> = </span><span class="identifier">BASIC_ACCESSIBILITY_R</span><span class="plain">;</span>
|
|
<span class="reserved">rtrue</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">ObjectIsUntouchable</span><span class="plain">(</span><span class="identifier">noun</span><span class="plain">, (</span><span class="identifier">actor</span><span class="plain">~=</span><span class="identifier">player</span><span class="plain">), </span><span class="identifier">actor</span><span class="plain">)) {</span>
|
|
<span class="identifier">RulebookFails</span><span class="plain">();</span>
|
|
<span class="identifier">reason_the_action_failed</span><span class="plain"> = </span><span class="identifier">BASIC_ACCESSIBILITY_R</span><span class="plain">;</span>
|
|
<span class="reserved">rtrue</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
<span class="plain">}</span>
|
|
|
|
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">mask</span><span class="plain"> & </span><span class="identifier">TOUCH_SECOND_ABIT</span><span class="plain">) && </span><span class="identifier">second</span><span class="plain"> && (</span><span class="identifier">inp2</span><span class="plain"> ~= </span><span class="constant">1</span><span class="plain">)) {</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">second</span><span class="plain"> </span><span class="reserved">ofclass</span><span class="plain"> </span><span class="identifier">K3_direction</span><span class="plain">) {</span>
|
|
<span class="identifier">RulebookFails</span><span class="plain">();</span>
|
|
<span class="identifier">reason_the_action_failed</span><span class="plain"> = </span><span class="identifier">BASIC_ACCESSIBILITY_R</span><span class="plain">;</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">actor</span><span class="plain">~=</span><span class="identifier">player</span><span class="plain">) </span><span class="reserved">rtrue</span><span class="plain">;</span>
|
|
<span class="identifier">BASIC_ACCESSIBILITY_RM</span><span class="plain">(</span><span class="character">'A'</span><span class="plain">); </span><span class="reserved">new_line</span><span class="plain">;</span>
|
|
<span class="identifier">RulebookFails</span><span class="plain">();</span>
|
|
<span class="identifier">reason_the_action_failed</span><span class="plain"> = </span><span class="identifier">BASIC_ACCESSIBILITY_R</span><span class="plain">;</span>
|
|
<span class="reserved">rtrue</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">ObjectIsUntouchable</span><span class="plain">(</span><span class="identifier">second</span><span class="plain">, (</span><span class="identifier">actor</span><span class="plain">~=</span><span class="identifier">player</span><span class="plain">), </span><span class="identifier">actor</span><span class="plain">)) {</span>
|
|
<span class="identifier">RulebookFails</span><span class="plain">();</span>
|
|
<span class="identifier">reason_the_action_failed</span><span class="plain"> = </span><span class="identifier">BASIC_ACCESSIBILITY_R</span><span class="plain">;</span>
|
|
<span class="reserved">rtrue</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
<span class="plain">}</span>
|
|
<span class="reserved">rfalse</span><span class="plain">;</span>
|
|
<span class="plain">];</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="inwebparagraph"><a id="SP16"></a><b>§16. Carrying Requirements Rule. </b>This is one of the I6 primitive rules in the action processing rulebook:
|
|
see the account in the Standard Rules for details.
|
|
</p>
|
|
|
|
|
|
<pre class="display">
|
|
<span class="plain">[ </span><span class="identifier">CARRYING_REQUIREMENTS_R</span><span class="plain"> </span><span class="identifier">mask</span><span class="plain"> </span><span class="identifier">at</span><span class="plain">;</span>
|
|
|
|
<span class="identifier">at</span><span class="plain"> = </span><span class="identifier">FindAction</span><span class="plain">(-1);</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">at</span><span class="plain"> == </span><span class="constant">0</span><span class="plain">) </span><span class="reserved">rfalse</span><span class="plain">;</span>
|
|
<span class="identifier">mask</span><span class="plain"> = </span><span class="identifier">ActionData</span><span class="plain">-->(</span><span class="identifier">at</span><span class="plain">+</span><span class="identifier">AD_REQUIREMENTS</span><span class="plain">);</span>
|
|
|
|
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">mask</span><span class="plain"> & </span><span class="identifier">TOUCH_NOUN_ABIT</span><span class="plain">) && </span><span class="identifier">noun</span><span class="plain"> && (</span><span class="identifier">inp1</span><span class="plain"> ~= </span><span class="constant">1</span><span class="plain">)) {</span>
|
|
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">mask</span><span class="plain"> & </span><span class="identifier">CARRY_NOUN_ABIT</span><span class="plain">) && (</span><span class="identifier">noun</span><span class="plain"> </span><span class="reserved">notin</span><span class="plain"> </span><span class="identifier">actor</span><span class="plain">)) {</span>
|
|
<span class="identifier">CarryOutActivity</span><span class="plain">(</span><span class="identifier">IMPLICITLY_TAKING_ACT</span><span class="plain">, </span><span class="identifier">noun</span><span class="plain">);</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">noun</span><span class="plain"> </span><span class="reserved">notin</span><span class="plain"> </span><span class="identifier">actor</span><span class="plain">) {</span>
|
|
<span class="identifier">RulebookFails</span><span class="plain">();</span>
|
|
<span class="identifier">reason_the_action_failed</span><span class="plain"> = </span><span class="identifier">CARRYING_REQUIREMENTS_R</span><span class="plain">;</span>
|
|
<span class="reserved">rtrue</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
<span class="plain">}</span>
|
|
<span class="plain">}</span>
|
|
|
|
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">mask</span><span class="plain"> & </span><span class="identifier">TOUCH_SECOND_ABIT</span><span class="plain">) && </span><span class="identifier">second</span><span class="plain"> && (</span><span class="identifier">inp2</span><span class="plain"> ~= </span><span class="constant">1</span><span class="plain">)) {</span>
|
|
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">mask</span><span class="plain"> & </span><span class="identifier">CARRY_SECOND_ABIT</span><span class="plain">) && (</span><span class="identifier">second</span><span class="plain"> </span><span class="reserved">notin</span><span class="plain"> </span><span class="identifier">actor</span><span class="plain">)) {</span>
|
|
<span class="identifier">CarryOutActivity</span><span class="plain">(</span><span class="identifier">IMPLICITLY_TAKING_ACT</span><span class="plain">, </span><span class="identifier">second</span><span class="plain">);</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">second</span><span class="plain"> </span><span class="reserved">notin</span><span class="plain"> </span><span class="identifier">actor</span><span class="plain">) {</span>
|
|
<span class="identifier">RulebookFails</span><span class="plain">();</span>
|
|
<span class="identifier">reason_the_action_failed</span><span class="plain"> = </span><span class="identifier">CARRYING_REQUIREMENTS_R</span><span class="plain">;</span>
|
|
<span class="reserved">rtrue</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
<span class="plain">}</span>
|
|
<span class="plain">}</span>
|
|
<span class="reserved">rfalse</span><span class="plain">;</span>
|
|
<span class="plain">];</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="inwebparagraph"><a id="SP17"></a><b>§17. Standard Implicit Taking Rule. </b></p>
|
|
|
|
|
|
<pre class="display">
|
|
<span class="plain">[ </span><span class="identifier">STANDARD_IMPLICIT_TAKING_R</span><span class="plain">;</span>
|
|
<span class="identifier">ImplicitTake</span><span class="plain">(</span><span class="identifier">parameter_value</span><span class="plain">);</span>
|
|
<span class="reserved">rfalse</span><span class="plain">;</span>
|
|
<span class="plain">];</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="inwebparagraph"><a id="SP18"></a><b>§18. Requested Actions Require Persuasion Rule. </b>This is one of the I6 primitive rules in the action processing rulebook:
|
|
see the account in the Standard Rules for details.
|
|
</p>
|
|
|
|
|
|
<pre class="display">
|
|
<span class="plain">[ </span><span class="identifier">REQUESTED_ACTIONS_REQUIRE_R</span><span class="plain"> </span><span class="identifier">rv</span><span class="plain">;</span>
|
|
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">actor</span><span class="plain"> ~= </span><span class="identifier">player</span><span class="plain">) && (</span><span class="identifier">act_requester</span><span class="plain">)) {</span>
|
|
<span class="plain">@</span><span class="identifier">push</span><span class="plain"> </span><span class="identifier">say__p</span><span class="plain">;</span>
|
|
<span class="identifier">say__p</span><span class="plain"> = </span><span class="constant">0</span><span class="plain">;</span>
|
|
<span class="identifier">rv</span><span class="plain"> = </span><span class="identifier">FollowRulebook</span><span class="plain">(</span><span class="identifier">PERSUADE_RB</span><span class="plain">);</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">RulebookSucceeded</span><span class="plain">() == </span><span class="reserved">false</span><span class="plain">) {</span>
|
|
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">deadflag</span><span class="plain"> == </span><span class="reserved">false</span><span class="plain">) && (</span><span class="identifier">say__p</span><span class="plain"> == </span><span class="reserved">false</span><span class="plain">)) {</span>
|
|
<span class="identifier">REQUESTED_ACTIONS_REQUIRE_RM</span><span class="plain">(</span><span class="character">'A'</span><span class="plain">, </span><span class="identifier">actor</span><span class="plain">);</span>
|
|
<span class="reserved">new_line</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
<span class="identifier">ActRulebookFails</span><span class="plain">(</span><span class="identifier">rv</span><span class="plain">); </span><span class="reserved">rtrue</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
<span class="plain">@</span><span class="identifier">pull</span><span class="plain"> </span><span class="identifier">say__p</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
<span class="reserved">rfalse</span><span class="plain">;</span>
|
|
<span class="plain">];</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="inwebparagraph"><a id="SP19"></a><b>§19. Carry Out Requested Actions Rule. </b>This is one of the I6 primitive rules in the action processing rulebook:
|
|
see the account in the Standard Rules for details.
|
|
</p>
|
|
|
|
|
|
<pre class="display">
|
|
<span class="plain">[ </span><span class="identifier">CARRY_OUT_REQUESTED_ACTIONS_R</span><span class="plain"> </span><span class="identifier">rv</span><span class="plain">;</span>
|
|
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">actor</span><span class="plain"> ~= </span><span class="identifier">player</span><span class="plain">) && (</span><span class="identifier">act_requester</span><span class="plain">)) {</span>
|
|
<span class="plain">@</span><span class="identifier">push</span><span class="plain"> </span><span class="identifier">act_requester</span><span class="plain">; </span><span class="identifier">act_requester</span><span class="plain"> = </span><span class="reserved">nothing</span><span class="plain">;</span>
|
|
<span class="identifier">rv</span><span class="plain"> = </span><span class="identifier">BeginAction</span><span class="plain">(</span><span class="identifier">action</span><span class="plain">, </span><span class="identifier">noun</span><span class="plain">, </span><span class="identifier">second</span><span class="plain">);</span>
|
|
<span class="reserved">if</span><span class="plain"> (((</span><span class="identifier">meta</span><span class="plain">) || (</span><span class="identifier">rv</span><span class="plain"> == </span><span class="reserved">false</span><span class="plain">)) && (</span><span class="identifier">deadflag</span><span class="plain"> == </span><span class="reserved">false</span><span class="plain">)) {</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">FollowRulebook</span><span class="plain">(</span><span class="identifier">UNSUCCESSFUL_ATTEMPT_RB</span><span class="plain">) == </span><span class="reserved">false</span><span class="plain">) {</span>
|
|
<span class="identifier">CARRY_OUT_REQUESTED_ACTIONS_RM</span><span class="plain">(</span><span class="character">'A'</span><span class="plain">, </span><span class="identifier">actor</span><span class="plain">); </span><span class="reserved">new_line</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
<span class="plain">}</span>
|
|
<span class="plain">@</span><span class="identifier">pull</span><span class="plain"> </span><span class="identifier">act_requester</span><span class="plain">;</span>
|
|
<span class="identifier">FollowRulebook</span><span class="plain">(</span><span class="identifier">AFTER_RB</span><span class="plain">);</span>
|
|
<span class="identifier">ActRulebookSucceeds</span><span class="plain">();</span>
|
|
<span class="reserved">rtrue</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
<span class="reserved">rfalse</span><span class="plain">;</span>
|
|
<span class="plain">];</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="inwebparagraph"><a id="SP20"></a><b>§20. Generic Verb Subroutine. </b>In I6, actions are carried out by routines with names like <code class="display"><span class="extract">TakeSub</span></code>,
|
|
consisting of <code class="display"><span class="extract">-Sub</span></code> tacked on to the action name <code class="display"><span class="extract">Take</span></code>. <code class="display"><span class="extract">Sub</span></code> stands for
|
|
"subroutine": this is all a convention going back to Inform 1, which was
|
|
in 1993 practically an assembler. In the I6 code generated by I7, every
|
|
<code class="display"><span class="extract">-Sub</span></code> routine corresponding to an I7 action consists only of a call to
|
|
<code class="display"><span class="extract">GenericVerbSub</span></code> which specifies the three rulebooks it owns: its check,
|
|
carry out and report rulebooks.
|
|
</p>
|
|
|
|
|
|
<pre class="display">
|
|
<span class="reserved">Array</span><span class="plain"> </span><span class="identifier">Details_of_Specific_Action</span><span class="plain">-->5;</span>
|
|
|
|
<span class="plain">[ </span><span class="identifier">GenericVerbSub</span><span class="plain"> </span><span class="identifier">ch</span><span class="plain"> </span><span class="identifier">co</span><span class="plain"> </span><span class="identifier">re</span><span class="plain"> </span><span class="identifier">vis</span><span class="plain"> </span><span class="identifier">rv</span><span class="plain">;</span>
|
|
<span class="plain">@</span><span class="identifier">push</span><span class="plain"> </span><span class="identifier">converted_action_outcome</span><span class="plain">;</span>
|
|
<span class="identifier">converted_action_outcome</span><span class="plain"> = </span><span class="constant">-1</span><span class="plain">;</span>
|
|
|
|
<span class="identifier">Details_of_Specific_Action</span><span class="plain">-->0 = </span><span class="reserved">true</span><span class="plain">;</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">meta</span><span class="plain">) </span><span class="identifier">Details_of_Specific_Action</span><span class="plain">-->0 = </span><span class="reserved">false</span><span class="plain">;</span>
|
|
<span class="identifier">Details_of_Specific_Action</span><span class="plain">-->1 = </span><span class="identifier">keep_silent</span><span class="plain">;</span>
|
|
<span class="identifier">Details_of_Specific_Action</span><span class="plain">-->2 = </span><span class="identifier">ch</span><span class="plain">; </span><span class="comment">! Check rules for the action</span>
|
|
<span class="identifier">Details_of_Specific_Action</span><span class="plain">-->3 = </span><span class="identifier">co</span><span class="plain">; </span><span class="comment">! Carry out rules for the action</span>
|
|
<span class="identifier">Details_of_Specific_Action</span><span class="plain">-->4 = </span><span class="identifier">re</span><span class="plain">; </span><span class="comment">! Report rules for the action</span>
|
|
|
|
<span class="identifier">FollowRulebook</span><span class="plain">(</span><span class="identifier">SPECIFIC_ACTION_PROCESSING_RB</span><span class="plain">, </span><span class="constant">0</span><span class="plain">, </span><span class="reserved">true</span><span class="plain">);</span>
|
|
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">RulebookFailed</span><span class="plain">()) && (</span><span class="identifier">converted_action_outcome</span><span class="plain"> == </span><span class="constant">1</span><span class="plain">)) </span><span class="identifier">ActRulebookSucceeds</span><span class="plain">();</span>
|
|
|
|
<span class="plain">@</span><span class="identifier">pull</span><span class="plain"> </span><span class="identifier">converted_action_outcome</span><span class="plain">;</span>
|
|
<span class="reserved">rtrue</span><span class="plain">;</span>
|
|
<span class="plain">];</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="inwebparagraph"><a id="SP21"></a><b>§21. Work Out Details Of Specific Action Rule. </b>This is one of the I6 primitive rules in the specific action processing
|
|
rulebook, and it's basically a trick to allow information known to the
|
|
<code class="display"><span class="extract">GenericVerbSub</span></code> routine to be passed down as rulebook variables for the
|
|
specific action-processing rules — in effect allowing us to pass not
|
|
one but five parameters to the rulebook: the out-of-world and silence
|
|
flags, plus the three specific rulebooks needed to process the action.
|
|
</p>
|
|
|
|
|
|
<pre class="display">
|
|
<span class="plain">[ </span><span class="identifier">WORK_OUT_DETAILS_OF_SPECIFIC_R</span><span class="plain">;</span>
|
|
<span class="identifier">MStack</span><span class="plain">--></span><span class="identifier">MstVO</span><span class="plain">(</span><span class="identifier">SPECIFIC_ACTION_PROCESSING_RB</span><span class="plain">, </span><span class="constant">0</span><span class="plain">) = </span><span class="identifier">Details_of_Specific_Action</span><span class="plain">-->0;</span>
|
|
<span class="identifier">MStack</span><span class="plain">--></span><span class="identifier">MstVO</span><span class="plain">(</span><span class="identifier">SPECIFIC_ACTION_PROCESSING_RB</span><span class="plain">, </span><span class="constant">1</span><span class="plain">) = </span><span class="identifier">Details_of_Specific_Action</span><span class="plain">-->1;</span>
|
|
<span class="identifier">MStack</span><span class="plain">--></span><span class="identifier">MstVO</span><span class="plain">(</span><span class="identifier">SPECIFIC_ACTION_PROCESSING_RB</span><span class="plain">, </span><span class="constant">2</span><span class="plain">) = </span><span class="identifier">Details_of_Specific_Action</span><span class="plain">-->2;</span>
|
|
<span class="identifier">MStack</span><span class="plain">--></span><span class="identifier">MstVO</span><span class="plain">(</span><span class="identifier">SPECIFIC_ACTION_PROCESSING_RB</span><span class="plain">, </span><span class="constant">3</span><span class="plain">) = </span><span class="identifier">Details_of_Specific_Action</span><span class="plain">-->3;</span>
|
|
<span class="identifier">MStack</span><span class="plain">--></span><span class="identifier">MstVO</span><span class="plain">(</span><span class="identifier">SPECIFIC_ACTION_PROCESSING_RB</span><span class="plain">, </span><span class="constant">4</span><span class="plain">) = </span><span class="identifier">Details_of_Specific_Action</span><span class="plain">-->4;</span>
|
|
<span class="reserved">rfalse</span><span class="plain">;</span>
|
|
<span class="plain">];</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="inwebparagraph"><a id="SP22"></a><b>§22. Actions Bitmap. </b>This is a fairly large bitmap recording which actions have succeeded thus
|
|
far on which nouns. It was to some extent an early attempt at implementing
|
|
a past-tense system; I'm not at all sure it was successful, since it is
|
|
hindered by certain restrictions — it only records action/noun combinations,
|
|
for instance, and the notion of "success" is a vexed one for actions
|
|
anyway. There is a clearly defined meaning, but it doesn't always correspond
|
|
to what the user might expect, which is unfortunate.
|
|
</p>
|
|
|
|
|
|
<pre class="display">
|
|
<span class="plain">[ </span><span class="identifier">TestActionBitmap</span><span class="plain"> </span><span class="identifier">obj</span><span class="plain"> </span><span class="identifier">act</span><span class="plain"> </span><span class="identifier">i</span><span class="plain"> </span><span class="identifier">j</span><span class="plain"> </span><span class="identifier">k</span><span class="plain"> </span><span class="identifier">bitmap</span><span class="plain">;</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">obj</span><span class="plain"> == </span><span class="reserved">nothing</span><span class="plain">) </span><span class="identifier">bitmap</span><span class="plain"> = </span><span class="identifier">ActionHappened</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">obj</span><span class="plain"> </span><span class="reserved">provides</span><span class="plain"> </span><span class="identifier">action_bitmap</span><span class="plain">)) </span><span class="reserved">rfalse</span><span class="plain">;</span>
|
|
<span class="identifier">bitmap</span><span class="plain"> = </span><span class="identifier">obj</span><span class="plain">.&</span><span class="identifier">action_bitmap</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">act</span><span class="plain"> == </span><span class="constant">-1</span><span class="plain">) </span><span class="reserved">return</span><span class="plain"> (((</span><span class="identifier">bitmap</span><span class="plain">->0) & </span><span class="constant">1</span><span class="plain">) ~= </span><span class="constant">0</span><span class="plain">);</span>
|
|
<span class="reserved">for</span><span class="plain"> (</span><span class="identifier">i</span><span class="plain">=0, </span><span class="identifier">k</span><span class="plain">=2: </span><span class="identifier">i</span><span class="plain"><</span><span class="identifier">ActionCount</span><span class="plain">: </span><span class="identifier">i</span><span class="plain">++) {</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">act</span><span class="plain"> == </span><span class="identifier">ActionCoding</span><span class="plain">--></span><span class="identifier">i</span><span class="plain">) {</span>
|
|
<span class="reserved">return</span><span class="plain"> (((</span><span class="identifier">bitmap</span><span class="plain">-></span><span class="identifier">j</span><span class="plain">) & </span><span class="identifier">k</span><span class="plain">) ~= </span><span class="constant">0</span><span class="plain">);</span>
|
|
<span class="plain">}</span>
|
|
<span class="identifier">k</span><span class="plain"> = </span><span class="identifier">k</span><span class="plain">*2; </span><span class="reserved">if</span><span class="plain"> (</span><span class="identifier">k</span><span class="plain"> == </span><span class="constant">256</span><span class="plain">) { </span><span class="identifier">k</span><span class="plain"> = </span><span class="constant">1</span><span class="plain">; </span><span class="identifier">j</span><span class="plain">++; }</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">UpdateActionBitmap</span><span class="plain">;</span>
|
|
<span class="identifier">SetActionBitmap</span><span class="plain">(</span><span class="identifier">noun</span><span class="plain">, </span><span class="identifier">action</span><span class="plain">);</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">action</span><span class="plain"> == ##</span><span class="identifier">Go</span><span class="plain">) </span><span class="identifier">SetActionBitmap</span><span class="plain">(</span><span class="identifier">location</span><span class="plain">, ##</span><span class="identifier">Enter</span><span class="plain">);</span>
|
|
<span class="plain">];</span>
|
|
|
|
<span class="plain">[ </span><span class="identifier">SetActionBitmap</span><span class="plain"> </span><span class="identifier">obj</span><span class="plain"> </span><span class="identifier">act</span><span class="plain"> </span><span class="identifier">i</span><span class="plain"> </span><span class="identifier">j</span><span class="plain"> </span><span class="identifier">k</span><span class="plain"> </span><span class="identifier">bitmap</span><span class="plain">;</span>
|
|
<span class="reserved">for</span><span class="plain"> (</span><span class="identifier">i</span><span class="plain">=0, </span><span class="identifier">k</span><span class="plain">=2: </span><span class="identifier">i</span><span class="plain"><</span><span class="identifier">ActionCount</span><span class="plain">: </span><span class="identifier">i</span><span class="plain">++) {</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">act</span><span class="plain"> == </span><span class="identifier">ActionCoding</span><span class="plain">--></span><span class="identifier">i</span><span class="plain">) {</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">obj</span><span class="plain"> </span><span class="reserved">provides</span><span class="plain"> </span><span class="identifier">action_bitmap</span><span class="plain">) {</span>
|
|
<span class="identifier">bitmap</span><span class="plain"> = </span><span class="identifier">obj</span><span class="plain">.&</span><span class="identifier">action_bitmap</span><span class="plain">;</span>
|
|
<span class="identifier">bitmap</span><span class="plain">->0 = (</span><span class="identifier">bitmap</span><span class="plain">->0) | </span><span class="constant">1</span><span class="plain">;</span>
|
|
<span class="identifier">bitmap</span><span class="plain">-></span><span class="identifier">j</span><span class="plain"> = (</span><span class="identifier">bitmap</span><span class="plain">-></span><span class="identifier">j</span><span class="plain">) | </span><span class="identifier">k</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
<span class="identifier">ActionHappened</span><span class="plain">->0 = (</span><span class="identifier">ActionHappened</span><span class="plain">->0) | </span><span class="constant">1</span><span class="plain">;</span>
|
|
<span class="identifier">ActionHappened</span><span class="plain">-></span><span class="identifier">j</span><span class="plain"> = (</span><span class="identifier">ActionHappened</span><span class="plain">-></span><span class="identifier">j</span><span class="plain">) | </span><span class="identifier">k</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
<span class="identifier">k</span><span class="plain"> = </span><span class="identifier">k</span><span class="plain">*2; </span><span class="reserved">if</span><span class="plain"> (</span><span class="identifier">k</span><span class="plain"> == </span><span class="constant">256</span><span class="plain">) { </span><span class="identifier">k</span><span class="plain"> = </span><span class="constant">1</span><span class="plain">; </span><span class="identifier">j</span><span class="plain">++; }</span>
|
|
<span class="plain">}</span>
|
|
<span class="plain">];</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="inwebparagraph"><a id="SP23"></a><b>§23. Printing Actions. </b>This is really for debugging purposes, but also provides us with a way to
|
|
print a stored action, for instance, or to print an action name value.
|
|
(For instance, printing an action name might result in "taking"; printing
|
|
a whole action might produce "Henry taking the grapefruit".)
|
|
</p>
|
|
|
|
|
|
<pre class="display">
|
|
<span class="plain">[ </span><span class="identifier">SayActionName</span><span class="plain"> </span><span class="identifier">act</span><span class="plain">; </span><span class="identifier">DB_Action</span><span class="plain">(0, </span><span class="constant">0</span><span class="plain">, </span><span class="identifier">act</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="constant">2</span><span class="plain">); ];</span>
|
|
|
|
<span class="plain">[ </span><span class="identifier">DA_Name</span><span class="plain"> </span><span class="identifier">n</span><span class="plain">; </span><span class="reserved">if</span><span class="plain"> (</span><span class="identifier">n</span><span class="plain"> </span><span class="reserved">ofclass</span><span class="plain"> </span><span class="identifier">K3_direction</span><span class="plain">) </span><span class="reserved">print</span><span class="plain"> (</span><span class="identifier">name</span><span class="plain">) </span><span class="identifier">n</span><span class="plain">; </span><span class="reserved">else</span><span class="plain"> </span><span class="reserved">print</span><span class="plain"> (</span><span class="identifier">the</span><span class="plain">) </span><span class="identifier">n</span><span class="plain">; ];</span>
|
|
<span class="plain">[ </span><span class="identifier">DA_Topic</span><span class="plain"> </span><span class="identifier">x</span><span class="plain"> </span><span class="identifier">a</span><span class="plain"> </span><span class="identifier">b</span><span class="plain"> </span><span class="identifier">c</span><span class="plain"> </span><span class="identifier">d</span><span class="plain"> </span><span class="identifier">i</span><span class="plain"> </span><span class="identifier">cf</span><span class="plain"> </span><span class="identifier">cw</span><span class="plain">;</span>
|
|
<span class="identifier">cw</span><span class="plain"> = </span><span class="identifier">x</span><span class="plain">%100; </span><span class="identifier">cf</span><span class="plain"> = </span><span class="identifier">x</span><span class="plain">/100;</span>
|
|
<span class="reserved">print</span><span class="plain"> </span><span class="string">"~"</span><span class="plain">;</span>
|
|
<span class="reserved">for</span><span class="plain"> (</span><span class="identifier">a</span><span class="plain">=</span><span class="identifier">cf</span><span class="plain">:</span><span class="identifier">d</span><span class="plain"><</span><span class="identifier">cw</span><span class="plain">:</span><span class="identifier">d</span><span class="plain">++,</span><span class="identifier">a</span><span class="plain">++) {</span>
|
|
<span class="identifier">wn</span><span class="plain"> = </span><span class="identifier">a</span><span class="plain">; </span><span class="identifier">b</span><span class="plain"> = </span><span class="identifier">WordAddress</span><span class="plain">(</span><span class="identifier">a</span><span class="plain">); </span><span class="identifier">c</span><span class="plain"> = </span><span class="identifier">WordLength</span><span class="plain">(</span><span class="identifier">a</span><span class="plain">);</span>
|
|
<span class="reserved">for</span><span class="plain"> (</span><span class="identifier">i</span><span class="plain">=</span><span class="identifier">b</span><span class="plain">:</span><span class="identifier">i</span><span class="plain"><</span><span class="identifier">b</span><span class="plain">+</span><span class="identifier">c</span><span class="plain">:</span><span class="identifier">i</span><span class="plain">++) {</span>
|
|
<span class="reserved">print</span><span class="plain"> (</span><span class="identifier">char</span><span class="plain">) </span><span class="constant">0-</span><span class="plain">></span><span class="identifier">i</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">d</span><span class="plain"><</span><span class="identifier">cw</span><span class="plain">-1) </span><span class="reserved">print</span><span class="plain"> </span><span class="string">" "</span><span class="plain">;</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_Action</span><span class="plain"> </span><span class="identifier">ac</span><span class="plain"> </span><span class="identifier">acr</span><span class="plain"> </span><span class="identifier">act</span><span class="plain"> </span><span class="identifier">n</span><span class="plain"> </span><span class="identifier">s</span><span class="plain"> </span><span class="identifier">for_say</span><span class="plain"> </span><span class="identifier">t</span><span class="plain"> </span><span class="identifier">at</span><span class="plain"> </span><span class="identifier">l</span><span class="plain"> </span><span class="identifier">j</span><span class="plain"> </span><span class="identifier">v</span><span class="plain"> </span><span class="identifier">c</span><span class="plain"> </span><span class="identifier">clc</span><span class="plain">;</span>
|
|
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">for_say</span><span class="plain"> == </span><span class="constant">0</span><span class="plain">) && (</span><span class="identifier">debug_rule_nesting</span><span class="plain"> > </span><span class="constant">0</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">debug_rule_nesting</span><span class="plain">, </span><span class="string">") "</span><span class="plain">;</span>
|
|
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">ac</span><span class="plain"> ~= </span><span class="identifier">player</span><span class="plain">) && (</span><span class="identifier">for_say</span><span class="plain"> ~= </span><span class="constant">2</span><span class="plain">)) {</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">acr</span><span class="plain">) </span><span class="reserved">print</span><span class="plain"> </span><span class="string">"asking "</span><span class="plain">, (</span><span class="identifier">the</span><span class="plain">) </span><span class="identifier">ac</span><span class="plain">, </span><span class="string">" to try "</span><span class="plain">;</span>
|
|
<span class="reserved">else</span><span class="plain"> </span><span class="reserved">print</span><span class="plain"> (</span><span class="identifier">the</span><span class="plain">) </span><span class="identifier">ac</span><span class="plain">, </span><span class="string">" "</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
<span class="identifier">DB_Action_Details</span><span class="plain">(</span><span class="identifier">act</span><span class="plain">, </span><span class="identifier">n</span><span class="plain">, </span><span class="identifier">s</span><span class="plain">, </span><span class="identifier">for_say</span><span class="plain">);</span>
|
|
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">keep_silent</span><span class="plain">) && (</span><span class="identifier">for_say</span><span class="plain"> == </span><span class="constant">0</span><span class="plain">)) </span><span class="reserved">print</span><span class="plain"> </span><span class="string">" - silently"</span><span class="plain">;</span>
|
|
<span class="plain">];</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<hr class="tocbar">
|
|
<ul class="toc"><li><a href="S-ot2.html">Back to 'OrderOfPlay Template'</a></li><li><a href="S-at2.html">Continue with 'Activities Template'</a></li></ul><hr class="tocbar">
|
|
<!--End of weave-->
|
|
</main>
|
|
</body>
|
|
</html>
|
|
|