mirror of
https://github.com/ganelson/inform.git
synced 2024-07-09 02:24:21 +03:00
487 lines
68 KiB
HTML
487 lines
68 KiB
HTML
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
|
|
<html>
|
|
<head>
|
|
<title>S/ct</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/st' 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>StoredAction Template</b></li></ul><p class="purpose">Code to support the stored action kind of value.</p>
|
|
|
|
<ul class="toc"><li><a href="#SP1">§1. Block Format</a></li><li><a href="#SP2">§2. KOV Support</a></li><li><a href="#SP3">§3. Creation</a></li><li><a href="#SP4">§4. Setting Up</a></li><li><a href="#SP5">§5. Destruction</a></li><li><a href="#SP6">§6. Copying</a></li><li><a href="#SP7">§7. Comparison</a></li><li><a href="#SP8">§8. Hashing</a></li><li><a href="#SP9">§9. Printing</a></li><li><a href="#SP10">§10. Involvement</a></li><li><a href="#SP11">§11. Nouns</a></li><li><a href="#SP12">§12. Pattern Matching</a></li><li><a href="#SP13">§13. Current Action</a></li><li><a href="#SP14">§14. Trying</a></li></ul><hr class="tocbar">
|
|
|
|
<p class="inwebparagraph"><a id="SP1"></a><b>§1. Block Format. </b>The short block of a stored action is simply a pointer to a long block. The
|
|
long block always has a length of 6 words.
|
|
</p>
|
|
|
|
<p class="inwebparagraph">An action which involves a topic — such as the one produced by the command
|
|
LOOK UP JIM MCDIVITT IN ENCYCLOPAEDIA — cannot be tried without the text
|
|
of that topic (JIM MCDIVITT) being available. That's no problem if the action
|
|
is tried in the same turn in which it is generated, because the text will
|
|
still be in the command buffer. But once we store actions up for future
|
|
use it becomes an issue. So when we store an action involving a topic,
|
|
we record the actual text typed at the time when it is stored, and this
|
|
goes into array entry 5 of the block. Because that in turn is text,
|
|
and therefore a block value on the heap in its own right, we have to be a
|
|
little more careful about destroying and copying stored actions than we
|
|
otherwise would be.
|
|
</p>
|
|
|
|
<p class="inwebparagraph">Note that entries 1 and 2 are values whose kind depends on the action in
|
|
entry 0: but they are never block values, because actions are not allowed
|
|
to apply to block values. This simplifies matters considerably.
|
|
</p>
|
|
|
|
|
|
<pre class="display">
|
|
<span class="reserved">Constant</span><span class="plain"> </span><span class="identifier">STORA_ACTION_F</span><span class="plain"> = </span><span class="constant">0</span><span class="plain">;</span>
|
|
<span class="reserved">Constant</span><span class="plain"> </span><span class="identifier">STORA_NOUN_F</span><span class="plain"> = </span><span class="constant">1</span><span class="plain">;</span>
|
|
<span class="reserved">Constant</span><span class="plain"> </span><span class="identifier">STORA_SECOND_F</span><span class="plain"> = </span><span class="constant">2</span><span class="plain">;</span>
|
|
<span class="reserved">Constant</span><span class="plain"> </span><span class="identifier">STORA_ACTOR_F</span><span class="plain"> = </span><span class="constant">3</span><span class="plain">;</span>
|
|
<span class="reserved">Constant</span><span class="plain"> </span><span class="identifier">STORA_REQUEST_F</span><span class="plain"> = </span><span class="constant">4</span><span class="plain">;</span>
|
|
<span class="reserved">Constant</span><span class="plain"> </span><span class="identifier">STORA_COMMAND_TEXT_F</span><span class="plain"> = </span><span class="constant">5</span><span class="plain">;</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="inwebparagraph"><a id="SP2"></a><b>§2. KOV Support. </b>See the "BlockValues.i6t" segment for the specification of the following
|
|
routines.
|
|
</p>
|
|
|
|
|
|
<pre class="display">
|
|
<span class="plain">[ </span><span class="identifier">STORED_ACTION_TY_Support</span><span class="plain"> </span><span class="identifier">task</span><span class="plain"> </span><span class="identifier">arg1</span><span class="plain"> </span><span class="identifier">arg2</span><span class="plain"> </span><span class="identifier">arg3</span><span class="plain">;</span>
|
|
<span class="reserved">switch</span><span class="plain">(</span><span class="identifier">task</span><span class="plain">) {</span>
|
|
<span class="identifier">CREATE_KOVS</span><span class="plain">: </span><span class="reserved">return</span><span class="plain"> </span><span class="identifier">STORED_ACTION_TY_Create</span><span class="plain">(</span><span class="identifier">arg2</span><span class="plain">);</span>
|
|
<span class="identifier">DESTROY_KOVS</span><span class="plain">: </span><span class="identifier">STORED_ACTION_TY_Destroy</span><span class="plain">(</span><span class="identifier">arg1</span><span class="plain">);</span>
|
|
<span class="identifier">MAKEMUTABLE_KOVS</span><span class="plain">: </span><span class="reserved">return</span><span class="plain"> </span><span class="constant">1</span><span class="plain">;</span>
|
|
<span class="identifier">COPYQUICK_KOVS</span><span class="plain">: </span><span class="reserved">rtrue</span><span class="plain">;</span>
|
|
<span class="identifier">COPYSB_KOVS</span><span class="plain">: </span><span class="identifier">BlkValueCopySB1</span><span class="plain">(</span><span class="identifier">arg1</span><span class="plain">, </span><span class="identifier">arg2</span><span class="plain">);</span>
|
|
<span class="identifier">KINDDATA_KOVS</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="identifier">EXTENT_KOVS</span><span class="plain">: </span><span class="reserved">return</span><span class="plain"> </span><span class="constant">6</span><span class="plain">;</span>
|
|
<span class="identifier">COPY_KOVS</span><span class="plain">: </span><span class="identifier">STORED_ACTION_TY_Copy</span><span class="plain">(</span><span class="identifier">arg1</span><span class="plain">, </span><span class="identifier">arg2</span><span class="plain">);</span>
|
|
<span class="identifier">COMPARE_KOVS</span><span class="plain">: </span><span class="reserved">return</span><span class="plain"> </span><span class="identifier">STORED_ACTION_TY_Compare</span><span class="plain">(</span><span class="identifier">arg1</span><span class="plain">, </span><span class="identifier">arg2</span><span class="plain">);</span>
|
|
<span class="identifier">HASH_KOVS</span><span class="plain">: </span><span class="reserved">return</span><span class="plain"> </span><span class="identifier">STORED_ACTION_TY_Hash</span><span class="plain">(</span><span class="identifier">arg1</span><span class="plain">);</span>
|
|
<span class="identifier">DEBUG_KOVS</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">STORED_ACTION_TY_Say</span><span class="plain">) </span><span class="identifier">arg1</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
<span class="comment">! We choose not to respond to: CAST_KOVS, COPYKIND_KOVS, READ_FILE_KOVS, WRITE_FILE_KOVS</span>
|
|
<span class="reserved">rfalse</span><span class="plain">;</span>
|
|
<span class="plain">];</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="inwebparagraph"><a id="SP3"></a><b>§3. Creation. </b>A stored action block has fixed size, so this is a single-block KOV: its
|
|
data consists of six words, laid out as shown in the following routine.
|
|
Note that it initialises to the default value for this KOV, an action
|
|
in which the player waits.
|
|
</p>
|
|
|
|
|
|
<pre class="display">
|
|
<span class="plain">[ </span><span class="identifier">STORED_ACTION_TY_Create</span><span class="plain"> </span><span class="identifier">sb</span><span class="plain"> </span><span class="identifier">stora</span><span class="plain">;</span>
|
|
<span class="identifier">stora</span><span class="plain"> = </span><span class="identifier">FlexAllocate</span><span class="plain">(6*</span><span class="identifier">WORDSIZE</span><span class="plain">, </span><span class="identifier">STORED_ACTION_TY</span><span class="plain">, </span><span class="identifier">BLK_FLAG_WORD</span><span class="plain">);</span>
|
|
<span class="identifier">BlkValueWrite</span><span class="plain">(</span><span class="identifier">stora</span><span class="plain">, </span><span class="identifier">STORA_ACTION_F</span><span class="plain">, ##</span><span class="identifier">Wait</span><span class="plain">, </span><span class="reserved">true</span><span class="plain">); </span><span class="comment">! action</span>
|
|
<span class="identifier">BlkValueWrite</span><span class="plain">(</span><span class="identifier">stora</span><span class="plain">, </span><span class="identifier">STORA_NOUN_F</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="comment">! noun</span>
|
|
<span class="identifier">BlkValueWrite</span><span class="plain">(</span><span class="identifier">stora</span><span class="plain">, </span><span class="identifier">STORA_SECOND_F</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="comment">! second</span>
|
|
<span class="identifier">BlkValueWrite</span><span class="plain">(</span><span class="identifier">stora</span><span class="plain">, </span><span class="identifier">STORA_ACTOR_F</span><span class="plain">, </span><span class="identifier">player</span><span class="plain">, </span><span class="reserved">true</span><span class="plain">); </span><span class="comment">! actor</span>
|
|
<span class="identifier">BlkValueWrite</span><span class="plain">(</span><span class="identifier">stora</span><span class="plain">, </span><span class="identifier">STORA_REQUEST_F</span><span class="plain">, </span><span class="reserved">false</span><span class="plain">, </span><span class="reserved">true</span><span class="plain">); </span><span class="comment">! whether a request</span>
|
|
<span class="identifier">BlkValueWrite</span><span class="plain">(</span><span class="identifier">stora</span><span class="plain">, </span><span class="identifier">STORA_COMMAND_TEXT_F</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="comment">! text of command if necessary, 0 if not</span>
|
|
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">BlkValueCreateSB1</span><span class="plain">(</span><span class="identifier">sb</span><span class="plain">, </span><span class="identifier">stora</span><span class="plain">);</span>
|
|
<span class="plain">];</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="inwebparagraph"><a id="SP4"></a><b>§4. Setting Up. </b>In practice it's convenient for NI to have a routine which creates a stored
|
|
action with a given slate of action variables, rather than have to set them
|
|
all one at a time, so the following is provided as a shorthand form.
|
|
</p>
|
|
|
|
|
|
<pre class="display">
|
|
<span class="plain">[ </span><span class="identifier">STORED_ACTION_TY_New</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">ac</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="reserved">if</span><span class="plain"> (</span><span class="identifier">stora</span><span class="plain"> == </span><span class="constant">0</span><span class="plain">) </span><span class="identifier">stora</span><span class="plain"> = </span><span class="identifier">BlkValueCreate</span><span class="plain">(</span><span class="identifier">STORED_ACTION_TY</span><span class="plain">);</span>
|
|
<span class="identifier">BlkValueWrite</span><span class="plain">(</span><span class="identifier">stora</span><span class="plain">, </span><span class="identifier">STORA_ACTION_F</span><span class="plain">, </span><span class="identifier">a</span><span class="plain">);</span>
|
|
<span class="identifier">BlkValueWrite</span><span class="plain">(</span><span class="identifier">stora</span><span class="plain">, </span><span class="identifier">STORA_NOUN_F</span><span class="plain">, </span><span class="identifier">n</span><span class="plain">);</span>
|
|
<span class="identifier">BlkValueWrite</span><span class="plain">(</span><span class="identifier">stora</span><span class="plain">, </span><span class="identifier">STORA_SECOND_F</span><span class="plain">, </span><span class="identifier">s</span><span class="plain">);</span>
|
|
<span class="identifier">BlkValueWrite</span><span class="plain">(</span><span class="identifier">stora</span><span class="plain">, </span><span class="identifier">STORA_ACTOR_F</span><span class="plain">, </span><span class="identifier">ac</span><span class="plain">);</span>
|
|
<span class="identifier">BlkValueWrite</span><span class="plain">(</span><span class="identifier">stora</span><span class="plain">, </span><span class="identifier">STORA_REQUEST_F</span><span class="plain">, </span><span class="identifier">req</span><span class="plain">);</span>
|
|
<span class="identifier">BlkValueWrite</span><span class="plain">(</span><span class="identifier">stora</span><span class="plain">, </span><span class="identifier">STORA_COMMAND_TEXT_F</span><span class="plain">, </span><span class="constant">0</span><span class="plain">);</span>
|
|
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">stora</span><span class="plain">;</span>
|
|
<span class="plain">];</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="inwebparagraph"><a id="SP5"></a><b>§5. Destruction. </b>Entries 0 to 4 are forgettable non-block values: only the optional text
|
|
requires destruction.
|
|
</p>
|
|
|
|
|
|
<pre class="display">
|
|
<span class="plain">[ </span><span class="identifier">STORED_ACTION_TY_Destroy</span><span class="plain"> </span><span class="identifier">stora</span><span class="plain"> </span><span class="identifier">toc</span><span class="plain">;</span>
|
|
<span class="identifier">toc</span><span class="plain"> = </span><span class="identifier">BlkValueRead</span><span class="plain">(</span><span class="identifier">stora</span><span class="plain">, </span><span class="identifier">STORA_COMMAND_TEXT_F</span><span class="plain">);</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">toc</span><span class="plain">) </span><span class="identifier">BlkValueFree</span><span class="plain">(</span><span class="identifier">toc</span><span class="plain">);</span>
|
|
<span class="plain">];</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="inwebparagraph"><a id="SP6"></a><b>§6. Copying. </b>The only entry needing attention is, again, entry 5: if this is non-zero in
|
|
the source, then we need to create a new text block to hold a duplicate
|
|
copy of the text.
|
|
</p>
|
|
|
|
|
|
<pre class="display">
|
|
<span class="plain">[ </span><span class="identifier">STORED_ACTION_TY_Copy</span><span class="plain"> </span><span class="identifier">storato</span><span class="plain"> </span><span class="identifier">storafrom</span><span class="plain"> </span><span class="identifier">tocfrom</span><span class="plain"> </span><span class="identifier">tocto</span><span class="plain">;</span>
|
|
<span class="identifier">tocfrom</span><span class="plain"> = </span><span class="identifier">BlkValueRead</span><span class="plain">(</span><span class="identifier">storafrom</span><span class="plain">, </span><span class="identifier">STORA_COMMAND_TEXT_F</span><span class="plain">);</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">tocfrom</span><span class="plain"> == </span><span class="constant">0</span><span class="plain">) </span><span class="reserved">return</span><span class="plain">;</span>
|
|
<span class="identifier">tocto</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">tocto</span><span class="plain">, </span><span class="identifier">tocfrom</span><span class="plain">);</span>
|
|
<span class="identifier">BlkValueWrite</span><span class="plain">(</span><span class="identifier">storato</span><span class="plain">, </span><span class="identifier">STORA_COMMAND_TEXT_F</span><span class="plain">, </span><span class="identifier">tocto</span><span class="plain">);</span>
|
|
<span class="plain">];</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="inwebparagraph"><a id="SP7"></a><b>§7. Comparison. </b>There is no very convincing ordering on stored actions, but we need to
|
|
devise a comparison which will exhaustively determine whether two actions
|
|
are or are not different.
|
|
</p>
|
|
|
|
|
|
<pre class="display">
|
|
<span class="plain">[ </span><span class="identifier">STORED_ACTION_TY_Compare</span><span class="plain"> </span><span class="identifier">storaleft</span><span class="plain"> </span><span class="identifier">storaright</span><span class="plain"> </span><span class="identifier">delta</span><span class="plain"> </span><span class="identifier">itleft</span><span class="plain"> </span><span class="identifier">itright</span><span class="plain">;</span>
|
|
<span class="identifier">delta</span><span class="plain"> = </span><span class="identifier">BlkValueRead</span><span class="plain">(</span><span class="identifier">storaleft</span><span class="plain">, </span><span class="identifier">STORA_ACTION_F</span><span class="plain">) </span><span class="constant">-</span><span class="plain"> </span><span class="identifier">BlkValueRead</span><span class="plain">(</span><span class="identifier">storaright</span><span class="plain">, </span><span class="identifier">STORA_ACTION_F</span><span class="plain">);</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">delta</span><span class="plain">) </span><span class="reserved">return</span><span class="plain"> </span><span class="identifier">delta</span><span class="plain">;</span>
|
|
<span class="identifier">delta</span><span class="plain"> = </span><span class="identifier">BlkValueRead</span><span class="plain">(</span><span class="identifier">storaleft</span><span class="plain">, </span><span class="identifier">STORA_NOUN_F</span><span class="plain">) </span><span class="constant">-</span><span class="plain"> </span><span class="identifier">BlkValueRead</span><span class="plain">(</span><span class="identifier">storaright</span><span class="plain">, </span><span class="identifier">STORA_NOUN_F</span><span class="plain">);</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">delta</span><span class="plain">) </span><span class="reserved">return</span><span class="plain"> </span><span class="identifier">delta</span><span class="plain">;</span>
|
|
<span class="identifier">delta</span><span class="plain"> = </span><span class="identifier">BlkValueRead</span><span class="plain">(</span><span class="identifier">storaleft</span><span class="plain">, </span><span class="identifier">STORA_SECOND_F</span><span class="plain">) </span><span class="constant">-</span><span class="plain"> </span><span class="identifier">BlkValueRead</span><span class="plain">(</span><span class="identifier">storaright</span><span class="plain">, </span><span class="identifier">STORA_SECOND_F</span><span class="plain">);</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">delta</span><span class="plain">) </span><span class="reserved">return</span><span class="plain"> </span><span class="identifier">delta</span><span class="plain">;</span>
|
|
<span class="identifier">delta</span><span class="plain"> = </span><span class="identifier">BlkValueRead</span><span class="plain">(</span><span class="identifier">storaleft</span><span class="plain">, </span><span class="identifier">STORA_ACTOR_F</span><span class="plain">) </span><span class="constant">-</span><span class="plain"> </span><span class="identifier">BlkValueRead</span><span class="plain">(</span><span class="identifier">storaright</span><span class="plain">, </span><span class="identifier">STORA_ACTOR_F</span><span class="plain">);</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">delta</span><span class="plain">) </span><span class="reserved">return</span><span class="plain"> </span><span class="identifier">delta</span><span class="plain">;</span>
|
|
<span class="identifier">delta</span><span class="plain"> = </span><span class="identifier">BlkValueRead</span><span class="plain">(</span><span class="identifier">storaleft</span><span class="plain">, </span><span class="identifier">STORA_REQUEST_F</span><span class="plain">) </span><span class="constant">-</span><span class="plain"> </span><span class="identifier">BlkValueRead</span><span class="plain">(</span><span class="identifier">storaright</span><span class="plain">, </span><span class="identifier">STORA_REQUEST_F</span><span class="plain">);</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">delta</span><span class="plain">) </span><span class="reserved">return</span><span class="plain"> </span><span class="identifier">delta</span><span class="plain">;</span>
|
|
<span class="identifier">itleft</span><span class="plain"> = </span><span class="identifier">BlkValueRead</span><span class="plain">(</span><span class="identifier">storaleft</span><span class="plain">, </span><span class="identifier">STORA_COMMAND_TEXT_F</span><span class="plain">);</span>
|
|
<span class="identifier">itright</span><span class="plain"> = </span><span class="identifier">BlkValueRead</span><span class="plain">(</span><span class="identifier">storaright</span><span class="plain">, </span><span class="identifier">STORA_COMMAND_TEXT_F</span><span class="plain">);</span>
|
|
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">itleft</span><span class="plain"> ~= </span><span class="constant">0</span><span class="plain">) && (</span><span class="identifier">itright</span><span class="plain"> ~= </span><span class="constant">0</span><span class="plain">))</span>
|
|
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">TEXT_TY_Support</span><span class="plain">(</span><span class="identifier">COMPARE_KOVS</span><span class="plain">, </span><span class="identifier">itleft</span><span class="plain">, </span><span class="identifier">itright</span><span class="plain">);</span>
|
|
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">itleft</span><span class="plain"> </span><span class="constant">-</span><span class="plain"> </span><span class="identifier">itright</span><span class="plain">;</span>
|
|
<span class="plain">];</span>
|
|
|
|
<span class="plain">[ </span><span class="identifier">STORED_ACTION_TY_Distinguish</span><span class="plain"> </span><span class="identifier">stora1</span><span class="plain"> </span><span class="identifier">stora2</span><span class="plain">;</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">STORED_ACTION_TY_Compare</span><span class="plain">(</span><span class="identifier">stora1</span><span class="plain">, </span><span class="identifier">stora2</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="reserved">rtrue</span><span class="plain">;</span>
|
|
<span class="plain">];</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="inwebparagraph"><a id="SP8"></a><b>§8. Hashing. </b></p>
|
|
|
|
|
|
<pre class="display">
|
|
<span class="plain">[ </span><span class="identifier">STORED_ACTION_TY_Hash</span><span class="plain"> </span><span class="identifier">stora</span><span class="plain"> </span><span class="identifier">rv</span><span class="plain"> </span><span class="identifier">it</span><span class="plain">;</span>
|
|
<span class="identifier">rv</span><span class="plain"> = </span><span class="identifier">BlkValueRead</span><span class="plain">(</span><span class="identifier">stora</span><span class="plain">, </span><span class="identifier">STORA_ACTION_F</span><span class="plain">);</span>
|
|
<span class="identifier">rv</span><span class="plain"> = </span><span class="identifier">rv</span><span class="plain"> * </span><span class="constant">33</span><span class="plain"> + </span><span class="identifier">BlkValueRead</span><span class="plain">(</span><span class="identifier">stora</span><span class="plain">, </span><span class="identifier">STORA_NOUN_F</span><span class="plain">);</span>
|
|
<span class="identifier">rv</span><span class="plain"> = </span><span class="identifier">rv</span><span class="plain"> * </span><span class="constant">33</span><span class="plain"> + </span><span class="identifier">BlkValueRead</span><span class="plain">(</span><span class="identifier">stora</span><span class="plain">, </span><span class="identifier">STORA_SECOND_F</span><span class="plain">);</span>
|
|
<span class="identifier">rv</span><span class="plain"> = </span><span class="identifier">rv</span><span class="plain"> * </span><span class="constant">33</span><span class="plain"> + </span><span class="identifier">BlkValueRead</span><span class="plain">(</span><span class="identifier">stora</span><span class="plain">, </span><span class="identifier">STORA_ACTOR_F</span><span class="plain">);</span>
|
|
<span class="identifier">rv</span><span class="plain"> = </span><span class="identifier">rv</span><span class="plain"> * </span><span class="constant">33</span><span class="plain"> + </span><span class="identifier">BlkValueRead</span><span class="plain">(</span><span class="identifier">stora</span><span class="plain">, </span><span class="identifier">STORA_REQUEST_F</span><span class="plain">);</span>
|
|
<span class="identifier">it</span><span class="plain"> = </span><span class="identifier">BlkValueRead</span><span class="plain">(</span><span class="identifier">stora</span><span class="plain">, </span><span class="identifier">STORA_COMMAND_TEXT_F</span><span class="plain">);</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">it</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">rv</span><span class="plain"> * </span><span class="constant">33</span><span class="plain"> + </span><span class="identifier">TEXT_TY_Support</span><span class="plain">(</span><span class="identifier">HASH_KOVS</span><span class="plain">, </span><span class="identifier">it</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="SP9"></a><b>§9. Printing. </b>We share some code here with the routines originally written for the ACTIONS
|
|
testing command. (The <code class="display"><span class="extract">DB</span></code> in <code class="display"><span class="extract">DB_Action</span></code> stands for "debugging".) When
|
|
printing a topic, it prints the relevant words from the player's command:
|
|
so if our stored action is one which contains an entry 5, then we have to
|
|
temporarily adopt this as the player's command, and restore the old player's
|
|
command once printing is done. To do this, we need to save the old player's
|
|
command, and we do that by creating a text for the duration.
|
|
</p>
|
|
|
|
|
|
<pre class="display">
|
|
<span class="plain">[ </span><span class="identifier">STORED_ACTION_TY_Say</span><span class="plain"> </span><span class="identifier">stora</span><span class="plain"> </span><span class="identifier">text_of_command</span><span class="plain"> </span><span class="identifier">saved_command</span><span class="plain"> </span><span class="identifier">saved_pn</span><span class="plain"> </span><span class="identifier">saved_action</span><span class="plain"> </span><span class="identifier">K1</span><span class="plain"> </span><span class="identifier">K2</span><span class="plain"> </span><span class="identifier">at</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="reserved">if</span><span class="plain"> ((</span><span class="identifier">stora</span><span class="plain">==0) || (</span><span class="identifier">BlkValueWeakKind</span><span class="plain">(</span><span class="identifier">stora</span><span class="plain">) ~= </span><span class="identifier">STORED_ACTION_TY</span><span class="plain">)) </span><span class="reserved">return</span><span class="plain">;</span>
|
|
<span class="identifier">text_of_command</span><span class="plain"> = </span><span class="identifier">BlkValueRead</span><span class="plain">(</span><span class="identifier">stora</span><span class="plain">, </span><span class="identifier">STORA_COMMAND_TEXT_F</span><span class="plain">);</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">text_of_command</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">SetPlayersCommand</span><span class="plain">(</span><span class="identifier">text_of_command</span><span class="plain">);</span>
|
|
<span class="plain">}</span>
|
|
<span class="identifier">saved_pn</span><span class="plain"> = </span><span class="identifier">parsed_number</span><span class="plain">; </span><span class="identifier">saved_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">BlkValueRead</span><span class="plain">(</span><span class="identifier">stora</span><span class="plain">, </span><span class="identifier">STORA_ACTION_F</span><span class="plain">);</span>
|
|
<span class="identifier">cf</span><span class="plain"> = </span><span class="identifier">consult_from</span><span class="plain">; </span><span class="identifier">cw</span><span class="plain"> = </span><span class="identifier">consult_words</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="identifier">K1</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">K2</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="reserved">if</span><span class="plain"> (</span><span class="identifier">K1</span><span class="plain"> ~= </span><span class="identifier">OBJECT_TY</span><span class="plain">) {</span>
|
|
<span class="identifier">parsed_number</span><span class="plain"> = </span><span class="identifier">BlkValueRead</span><span class="plain">(</span><span class="identifier">stora</span><span class="plain">, </span><span class="identifier">STORA_NOUN_F</span><span class="plain">);</span>
|
|
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">K1</span><span class="plain"> == </span><span class="identifier">UNDERSTANDING_TY</span><span class="plain">) && (</span><span class="identifier">text_of_command</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">saved_command</span><span class="plain"> == </span><span class="constant">0</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="identifier">parsed_number</span><span class="plain"> = </span><span class="identifier">players_command</span><span class="plain">;</span>
|
|
<span class="identifier">consult_from</span><span class="plain"> = </span><span class="identifier">parsed_number</span><span class="plain">/100; </span><span class="identifier">consult_words</span><span class="plain"> = </span><span class="identifier">parsed_number</span><span class="plain">%100;</span>
|
|
<span class="plain">}</span>
|
|
<span class="plain">}</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">K2</span><span class="plain"> ~= </span><span class="identifier">OBJECT_TY</span><span class="plain">) {</span>
|
|
<span class="identifier">parsed_number</span><span class="plain"> = </span><span class="identifier">BlkValueRead</span><span class="plain">(</span><span class="identifier">stora</span><span class="plain">, </span><span class="identifier">STORA_SECOND_F</span><span class="plain">);</span>
|
|
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">K2</span><span class="plain"> == </span><span class="identifier">UNDERSTANDING_TY</span><span class="plain">) && (</span><span class="identifier">text_of_command</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">saved_command</span><span class="plain"> == </span><span class="constant">0</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="identifier">parsed_number</span><span class="plain"> = </span><span class="identifier">players_command</span><span class="plain">;</span>
|
|
<span class="identifier">consult_from</span><span class="plain"> = </span><span class="identifier">parsed_number</span><span class="plain">/100; </span><span class="identifier">consult_words</span><span class="plain"> = </span><span class="identifier">parsed_number</span><span class="plain">%100;</span>
|
|
<span class="plain">}</span>
|
|
<span class="plain">}</span>
|
|
<span class="identifier">DB_Action</span><span class="plain">(</span>
|
|
<span class="identifier">BlkValueRead</span><span class="plain">(</span><span class="identifier">stora</span><span class="plain">, </span><span class="identifier">STORA_ACTOR_F</span><span class="plain">),</span>
|
|
<span class="identifier">BlkValueRead</span><span class="plain">(</span><span class="identifier">stora</span><span class="plain">, </span><span class="identifier">STORA_REQUEST_F</span><span class="plain">),</span>
|
|
<span class="identifier">BlkValueRead</span><span class="plain">(</span><span class="identifier">stora</span><span class="plain">, </span><span class="identifier">STORA_ACTION_F</span><span class="plain">),</span>
|
|
<span class="identifier">BlkValueRead</span><span class="plain">(</span><span class="identifier">stora</span><span class="plain">, </span><span class="identifier">STORA_NOUN_F</span><span class="plain">),</span>
|
|
<span class="identifier">BlkValueRead</span><span class="plain">(</span><span class="identifier">stora</span><span class="plain">, </span><span class="identifier">STORA_SECOND_F</span><span class="plain">), </span><span class="reserved">true</span><span class="plain">);</span>
|
|
<span class="identifier">parsed_number</span><span class="plain"> = </span><span class="identifier">saved_pn</span><span class="plain">; </span><span class="identifier">action</span><span class="plain"> = </span><span class="identifier">saved_action</span><span class="plain">;</span>
|
|
<span class="identifier">consult_from</span><span class="plain"> = </span><span class="identifier">cf</span><span class="plain">; </span><span class="identifier">consult_words</span><span class="plain"> = </span><span class="identifier">cw</span><span class="plain">;</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">text_of_command</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="plain">];</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="inwebparagraph"><a id="SP10"></a><b>§10. Involvement. </b>That completes the compulsory services required for this KOV to function:
|
|
from here on, the remaining routines provide definitions of stored action-related
|
|
phrases in the Standard Rules.
|
|
</p>
|
|
|
|
<p class="inwebparagraph">An action "involves" an object if it appears as either the actor or the first
|
|
or second noun.
|
|
</p>
|
|
|
|
|
|
<pre class="display">
|
|
<span class="plain">[ </span><span class="identifier">STORED_ACTION_TY_Involves</span><span class="plain"> </span><span class="identifier">stora</span><span class="plain"> </span><span class="identifier">item</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">(</span><span class="identifier">BlkValueRead</span><span class="plain">(</span><span class="identifier">stora</span><span class="plain">, </span><span class="identifier">STORA_ACTION_F</span><span class="plain">));</span>
|
|
<span class="reserved">if</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">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">OBJECT_TY</span><span class="plain">) &&</span>
|
|
<span class="plain">(</span><span class="identifier">BlkValueRead</span><span class="plain">(</span><span class="identifier">stora</span><span class="plain">, </span><span class="identifier">STORA_NOUN_F</span><span class="plain">) == </span><span class="identifier">item</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">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="identifier">OBJECT_TY</span><span class="plain">) &&</span>
|
|
<span class="plain">(</span><span class="identifier">BlkValueRead</span><span class="plain">(</span><span class="identifier">stora</span><span class="plain">, </span><span class="identifier">STORA_SECOND_F</span><span class="plain">) == </span><span class="identifier">item</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">BlkValueRead</span><span class="plain">(</span><span class="identifier">stora</span><span class="plain">, </span><span class="identifier">STORA_ACTOR_F</span><span class="plain">) == </span><span class="identifier">item</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="SP11"></a><b>§11. Nouns. </b>Extracting the noun or second noun from an action is a delicate business
|
|
because simply returning the values in entries 1 and 2 would not be type-safe;
|
|
it would fail to be an object if the stored action did not apply to objects.
|
|
So the following returns <code class="display"><span class="extract">nothing</span></code> if requested to produce noun or second
|
|
noun for such an action.
|
|
</p>
|
|
|
|
|
|
<pre class="display">
|
|
<span class="plain">[ </span><span class="identifier">STORED_ACTION_TY_Part</span><span class="plain"> </span><span class="identifier">stora</span><span class="plain"> </span><span class="identifier">ind</span><span class="plain"> </span><span class="identifier">at</span><span class="plain"> </span><span class="identifier">ado</span><span class="plain">;</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">ind</span><span class="plain"> == </span><span class="identifier">STORA_NOUN_F</span><span class="plain"> </span><span class="reserved">or</span><span class="plain"> </span><span class="identifier">STORA_SECOND_F</span><span class="plain">) {</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">ind</span><span class="plain"> == </span><span class="identifier">STORA_NOUN_F</span><span class="plain">) </span><span class="identifier">ado</span><span class="plain"> = </span><span class="identifier">AD_NOUN_KOV</span><span class="plain">; </span><span class="reserved">else</span><span class="plain"> </span><span class="identifier">ado</span><span class="plain"> = </span><span class="identifier">AD_SECOND_KOV</span><span class="plain">;</span>
|
|
<span class="identifier">at</span><span class="plain"> = </span><span class="identifier">FindAction</span><span class="plain">(</span><span class="identifier">BlkValueRead</span><span class="plain">(</span><span class="identifier">stora</span><span class="plain">, </span><span class="identifier">STORA_ACTION_F</span><span class="plain">));</span>
|
|
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">at</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">ado</span><span class="plain">) == </span><span class="identifier">OBJECT_TY</span><span class="plain">)) </span><span class="reserved">return</span><span class="plain"> </span><span class="identifier">BlkValueRead</span><span class="plain">(</span><span class="identifier">stora</span><span class="plain">, </span><span class="identifier">ind</span><span class="plain">);</span>
|
|
<span class="reserved">return</span><span class="plain"> </span><span class="reserved">nothing</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">BlkValueRead</span><span class="plain">(</span><span class="identifier">stora</span><span class="plain">, </span><span class="identifier">ind</span><span class="plain">);</span>
|
|
<span class="plain">];</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="inwebparagraph"><a id="SP12"></a><b>§12. Pattern Matching. </b>In order to apply an action pattern such as "doing something with the kazoo"
|
|
to a stored action, it needs to be the current action, because the code which
|
|
compiles conditions like this looks at the <code class="display"><span class="extract">action</span></code>, <code class="display"><span class="extract">noun</span></code>, ..., variables.
|
|
We don't want to do anything as disruptive as temporarily starting the stored
|
|
action and then halting it again, so instead we simply "adopt" it, saving
|
|
the slate of action variables and setting them from the stored action: almost
|
|
immediately after — the moment the condition has been tested — we "unadopt"
|
|
it again, restoring the stored values. Since the action pattern cannot itself
|
|
refer to a stored action, the following code won't be nested, and we don't
|
|
need to worry about stacking up saved copies of the action variables.
|
|
</p>
|
|
|
|
<p class="inwebparagraph"><code class="display"><span class="extract">SAT_Tmp-->0</span></code> stores the outcome of the condition, and is set in code
|
|
compiled by NI.
|
|
</p>
|
|
|
|
|
|
<pre class="display">
|
|
<span class="reserved">Array</span><span class="plain"> </span><span class="identifier">SAT_Tmp</span><span class="plain">-->7;</span>
|
|
<span class="plain">[ </span><span class="identifier">STORED_ACTION_TY_Adopt</span><span class="plain"> </span><span class="identifier">stora</span><span class="plain"> </span><span class="identifier">at</span><span class="plain">;</span>
|
|
<span class="identifier">SAT_Tmp</span><span class="plain">-->1 = </span><span class="identifier">action</span><span class="plain">;</span>
|
|
<span class="identifier">SAT_Tmp</span><span class="plain">-->2 = </span><span class="identifier">noun</span><span class="plain">;</span>
|
|
<span class="identifier">SAT_Tmp</span><span class="plain">-->3 = </span><span class="identifier">second</span><span class="plain">;</span>
|
|
<span class="identifier">SAT_Tmp</span><span class="plain">-->4 = </span><span class="identifier">actor</span><span class="plain">;</span>
|
|
<span class="identifier">SAT_Tmp</span><span class="plain">-->5 = </span><span class="identifier">act_requester</span><span class="plain">;</span>
|
|
<span class="identifier">SAT_Tmp</span><span class="plain">-->6 = </span><span class="identifier">parsed_number</span><span class="plain">;</span>
|
|
<span class="identifier">action</span><span class="plain"> = </span><span class="identifier">BlkValueRead</span><span class="plain">(</span><span class="identifier">stora</span><span class="plain">, </span><span class="identifier">STORA_ACTION_F</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">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">OBJECT_TY</span><span class="plain">)</span>
|
|
<span class="identifier">noun</span><span class="plain"> = </span><span class="identifier">BlkValueRead</span><span class="plain">(</span><span class="identifier">stora</span><span class="plain">, </span><span class="identifier">STORA_NOUN_F</span><span class="plain">);</span>
|
|
<span class="reserved">else</span><span class="plain"> {</span>
|
|
<span class="identifier">parsed_number</span><span class="plain"> = </span><span class="identifier">BlkValueRead</span><span class="plain">(</span><span class="identifier">stora</span><span class="plain">, </span><span class="identifier">STORA_NOUN_F</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="reserved">if</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="identifier">OBJECT_TY</span><span class="plain">)</span>
|
|
<span class="identifier">second</span><span class="plain"> = </span><span class="identifier">BlkValueRead</span><span class="plain">(</span><span class="identifier">stora</span><span class="plain">, </span><span class="identifier">STORA_SECOND_F</span><span class="plain">);</span>
|
|
<span class="reserved">else</span><span class="plain"> {</span>
|
|
<span class="identifier">parsed_number</span><span class="plain"> = </span><span class="identifier">BlkValueRead</span><span class="plain">(</span><span class="identifier">stora</span><span class="plain">, </span><span class="identifier">STORA_SECOND_F</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">actor</span><span class="plain"> = </span><span class="identifier">BlkValueRead</span><span class="plain">(</span><span class="identifier">stora</span><span class="plain">, </span><span class="identifier">STORA_ACTOR_F</span><span class="plain">);</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">BlkValueRead</span><span class="plain">(</span><span class="identifier">stora</span><span class="plain">, </span><span class="identifier">STORA_REQUEST_F</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="reserved">nothing</span><span class="plain">;</span>
|
|
<span class="plain">];</span>
|
|
|
|
<span class="plain">[ </span><span class="identifier">STORED_ACTION_TY_Unadopt</span><span class="plain">;</span>
|
|
<span class="identifier">action</span><span class="plain"> = </span><span class="identifier">SAT_Tmp</span><span class="plain">-->1;</span>
|
|
<span class="identifier">noun</span><span class="plain"> = </span><span class="identifier">SAT_Tmp</span><span class="plain">-->2;</span>
|
|
<span class="identifier">second</span><span class="plain"> = </span><span class="identifier">SAT_Tmp</span><span class="plain">-->3;</span>
|
|
<span class="identifier">actor</span><span class="plain"> = </span><span class="identifier">SAT_Tmp</span><span class="plain">-->4;</span>
|
|
<span class="identifier">act_requester</span><span class="plain"> = </span><span class="identifier">SAT_Tmp</span><span class="plain">-->5;</span>
|
|
<span class="identifier">parsed_number</span><span class="plain"> = </span><span class="identifier">SAT_Tmp</span><span class="plain">-->6;</span>
|
|
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">SAT_Tmp</span><span class="plain">-->0;</span>
|
|
<span class="plain">];</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="inwebparagraph"><a id="SP13"></a><b>§13. Current Action. </b>Although we never cast other values to stored actions, because none of them
|
|
really imply an action (not even an action name, since that gives no help
|
|
as to what the nouns might be), there is of course one action almost always
|
|
present within a story file at run-time, even if it is not a single value
|
|
as such: the action which is currently running. The following routine
|
|
translates that into a stored action — thus allowing us to store it.
|
|
</p>
|
|
|
|
<p class="inwebparagraph">This is the place where we look to see if the action applies to a topic as
|
|
either its noun or second noun, and if it does, we copy the player's
|
|
command into a text block-value in entry 5.
|
|
</p>
|
|
|
|
|
|
<pre class="display">
|
|
<span class="plain">[ </span><span class="identifier">STORED_ACTION_TY_Current</span><span class="plain"> </span><span class="identifier">stora</span><span class="plain"> </span><span class="identifier">at</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">==0) || (</span><span class="identifier">BlkValueWeakKind</span><span class="plain">(</span><span class="identifier">stora</span><span class="plain">) ~= </span><span class="identifier">STORED_ACTION_TY</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="identifier">BlkValueWrite</span><span class="plain">(</span><span class="identifier">stora</span><span class="plain">, </span><span class="identifier">STORA_ACTION_F</span><span class="plain">, </span><span class="identifier">action</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">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">OBJECT_TY</span><span class="plain">)</span>
|
|
<span class="identifier">BlkValueWrite</span><span class="plain">(</span><span class="identifier">stora</span><span class="plain">, </span><span class="identifier">STORA_NOUN_F</span><span class="plain">, </span><span class="identifier">noun</span><span class="plain">);</span>
|
|
<span class="reserved">else</span>
|
|
<span class="identifier">BlkValueWrite</span><span class="plain">(</span><span class="identifier">stora</span><span class="plain">, </span><span class="identifier">STORA_NOUN_F</span><span class="plain">, </span><span class="identifier">parsed_number</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">at</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">BlkValueWrite</span><span class="plain">(</span><span class="identifier">stora</span><span class="plain">, </span><span class="identifier">STORA_SECOND_F</span><span class="plain">, </span><span class="identifier">second</span><span class="plain">);</span>
|
|
<span class="reserved">else</span>
|
|
<span class="identifier">BlkValueWrite</span><span class="plain">(</span><span class="identifier">stora</span><span class="plain">, </span><span class="identifier">STORA_SECOND_F</span><span class="plain">, </span><span class="identifier">parsed_number</span><span class="plain">);</span>
|
|
<span class="identifier">BlkValueWrite</span><span class="plain">(</span><span class="identifier">stora</span><span class="plain">, </span><span class="identifier">STORA_ACTOR_F</span><span class="plain">, </span><span class="identifier">actor</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="identifier">BlkValueWrite</span><span class="plain">(</span><span class="identifier">stora</span><span class="plain">, </span><span class="identifier">STORA_REQUEST_F</span><span class="plain">, </span><span class="reserved">true</span><span class="plain">);</span>
|
|
<span class="reserved">else</span><span class="plain"> </span><span class="identifier">BlkValueWrite</span><span class="plain">(</span><span class="identifier">stora</span><span class="plain">, </span><span class="identifier">STORA_REQUEST_F</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">at</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">UNDERSTANDING_TY</span><span class="plain">) ||</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="identifier">UNDERSTANDING_TY</span><span class="plain">))) {</span>
|
|
<span class="identifier">text_of_command</span><span class="plain"> = </span><span class="identifier">BlkValueRead</span><span class="plain">(</span><span class="identifier">stora</span><span class="plain">, </span><span class="identifier">STORA_COMMAND_TEXT_F</span><span class="plain">);</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">text_of_command</span><span class="plain"> == </span><span class="constant">0</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">BlkValueWrite</span><span class="plain">(</span><span class="identifier">stora</span><span class="plain">, </span><span class="identifier">STORA_COMMAND_TEXT_F</span><span class="plain">, </span><span class="identifier">text_of_command</span><span class="plain">);</span>
|
|
<span class="plain">}</span>
|
|
<span class="identifier">BlkValueCast</span><span class="plain">(</span><span class="identifier">text_of_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="plain">} </span><span class="reserved">else</span><span class="plain"> </span><span class="identifier">BlkValueWrite</span><span class="plain">(</span><span class="identifier">stora</span><span class="plain">, </span><span class="identifier">STORA_COMMAND_TEXT_F</span><span class="plain">, </span><span class="constant">0</span><span class="plain">);</span>
|
|
|
|
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">stora</span><span class="plain">;</span>
|
|
<span class="plain">];</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="inwebparagraph"><a id="SP14"></a><b>§14. Trying. </b>Finally: having stored an action for perhaps many turns, we now let it happen,
|
|
either silently or not.
|
|
</p>
|
|
|
|
|
|
<pre class="display">
|
|
<span class="plain">[ </span><span class="identifier">STORED_ACTION_TY_Try</span><span class="plain"> </span><span class="identifier">stora</span><span class="plain"> </span><span class="identifier">ks</span><span class="plain"> </span><span class="identifier">text_of_command</span><span class="plain"> </span><span class="identifier">saved_command</span><span class="plain">;</span>
|
|
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">stora</span><span class="plain">==0) || (</span><span class="identifier">BlkValueWeakKind</span><span class="plain">(</span><span class="identifier">stora</span><span class="plain">) ~= </span><span class="identifier">STORED_ACTION_TY</span><span class="plain">)) </span><span class="reserved">return</span><span class="plain">;</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">ks</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">=1; }</span>
|
|
<span class="identifier">text_of_command</span><span class="plain"> = </span><span class="identifier">BlkValueRead</span><span class="plain">(</span><span class="identifier">stora</span><span class="plain">, </span><span class="identifier">STORA_COMMAND_TEXT_F</span><span class="plain">);</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">text_of_command</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">SetPlayersCommand</span><span class="plain">(</span><span class="identifier">text_of_command</span><span class="plain">);</span>
|
|
<span class="plain">}</span>
|
|
<span class="identifier">TryAction</span><span class="plain">(</span>
|
|
<span class="identifier">BlkValueRead</span><span class="plain">(</span><span class="identifier">stora</span><span class="plain">, </span><span class="identifier">STORA_REQUEST_F</span><span class="plain">),</span>
|
|
<span class="identifier">BlkValueRead</span><span class="plain">(</span><span class="identifier">stora</span><span class="plain">, </span><span class="identifier">STORA_ACTOR_F</span><span class="plain">),</span>
|
|
<span class="identifier">BlkValueRead</span><span class="plain">(</span><span class="identifier">stora</span><span class="plain">, </span><span class="identifier">STORA_ACTION_F</span><span class="plain">),</span>
|
|
<span class="identifier">BlkValueRead</span><span class="plain">(</span><span class="identifier">stora</span><span class="plain">, </span><span class="identifier">STORA_NOUN_F</span><span class="plain">),</span>
|
|
<span class="identifier">BlkValueRead</span><span class="plain">(</span><span class="identifier">stora</span><span class="plain">, </span><span class="identifier">STORA_SECOND_F</span><span class="plain">));</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">text_of_command</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="reserved">if</span><span class="plain"> (</span><span class="identifier">ks</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="plain">];</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<hr class="tocbar">
|
|
<ul class="toc"><li><a href="S-ct.html">Back to 'Chronology Template'</a></li><li><i>(This section ends Sections.)</i></li></ul><hr class="tocbar">
|
|
<!--End of weave-->
|
|
</main>
|
|
</body>
|
|
</html>
|
|
|