1
0
Fork 0
mirror of https://github.com/ganelson/inform.git synced 2024-07-16 22:14:23 +03:00
inform7/docs/basic_inform/S-ut2.html

335 lines
46 KiB
HTML
Raw Normal View History

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<title>S/ut</title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<meta http-equiv="Content-Language" content="en-gb">
<link href="inweb.css" rel="stylesheet" rev="stylesheet" type="text/css">
</head>
<body>
<!--Weave of 'S/ut2' generated by 7-->
<ul class="crumbs"><li><a href="../webs.html">&#9733;</a></li><li><a href="index.html">basic_inform Template Library</a></li><li><b>Utilities Template</b></li></ul><p class="purpose">Miscellaneous utility routines for some fundamental I6 needs.</p>
2020-01-26 01:42:42 +02:00
<ul class="toc"><li><a href="#SP1">&#167;1. Saying Phrases</a></li><li><a href="#SP2">&#167;2. Kinds</a></li><li><a href="#SP3">&#167;3. GenerateRandomNumber</a></li><li><a href="#SP4">&#167;4. PrintSpaces</a></li><li><a href="#SP5">&#167;5. SwapWorkflags</a></li><li><a href="#SP6">&#167;6. TestUseOption</a></li><li><a href="#SP7">&#167;7. ZRegion</a></li><li><a href="#SP8">&#167;8. Memcpy</a></li><li><a href="#SP9">&#167;9. Arrcpy</a></li><li><a href="#SP10">&#167;10. Verbs as Values</a></li><li><a href="#SP11">&#167;11. Seed Random Number Generator Rule</a></li><li><a href="#SP12">&#167;12. Extracting Verb Numbers</a></li><li><a href="#SP13">&#167;13. Say One Of</a></li><li><a href="#SP14">&#167;14. Rounding</a></li></ul><hr class="tocbar">
<p class="inwebparagraph"><a id="SP1"></a><b>&#167;1. Saying Phrases. </b></p>
<pre class="display">
2020-01-12 02:35:36 +02:00
<span class="plain">[ </span><span class="identifier">SayPhraseName</span><span class="plain"> </span><span class="identifier">closure</span><span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">closure</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">"nothing"</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="reserved">string</span><span class="plain">) </span><span class="identifier">closure</span><span class="plain">--&gt;2;</span>
<span class="plain">];</span>
</pre>
<p class="inwebparagraph"></p>
<p class="inwebparagraph"><a id="SP2"></a><b>&#167;2. Kinds. </b></p>
<pre class="display">
2020-01-12 02:35:36 +02:00
<span class="plain">[ </span><span class="identifier">KindAtomic</span><span class="plain"> </span><span class="identifier">kind</span><span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">kind</span><span class="plain"> &gt;= </span><span class="constant">0</span><span class="plain">) &amp;&amp; (</span><span class="identifier">kind</span><span class="plain"> &lt; </span><span class="identifier">BASE_KIND_HWM</span><span class="plain">)) </span><span class="reserved">return</span><span class="plain"> </span><span class="identifier">kind</span><span class="plain">;</span>
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">kind</span><span class="plain">--&gt;0;</span>
<span class="plain">];</span>
2020-01-12 02:35:36 +02:00
<span class="plain">[ </span><span class="identifier">KindBaseArity</span><span class="plain"> </span><span class="identifier">kind</span><span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">kind</span><span class="plain"> &gt;= </span><span class="constant">0</span><span class="plain">) &amp;&amp; (</span><span class="identifier">kind</span><span class="plain"> &lt; </span><span class="identifier">BASE_KIND_HWM</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="reserved">return</span><span class="plain"> </span><span class="identifier">kind</span><span class="plain">--&gt;1;</span>
<span class="plain">];</span>
2020-01-12 02:35:36 +02:00
<span class="plain">[ </span><span class="identifier">KindBaseTerm</span><span class="plain"> </span><span class="identifier">kind</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">kind</span><span class="plain"> &gt;= </span><span class="constant">0</span><span class="plain">) &amp;&amp; (</span><span class="identifier">kind</span><span class="plain"> &lt; </span><span class="identifier">BASE_KIND_HWM</span><span class="plain">)) </span><span class="reserved">return</span><span class="plain"> </span><span class="identifier">UNKNOWN_TY</span><span class="plain">;</span>
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">kind</span><span class="plain">--&gt;(2+</span><span class="identifier">n</span><span class="plain">);</span>
<span class="plain">];</span>
</pre>
<p class="inwebparagraph"></p>
<p class="inwebparagraph"><a id="SP3"></a><b>&#167;3. GenerateRandomNumber. </b>The following uses the virtual machine's RNG (via the I6 built-in function
<code class="display"><span class="extract">random</span></code>) to produce a uniformly random integer in the range n to m
inclusive, where n and m are allowed to be either way around; so that
a random number between 17 and 4 is the same thing as a random number
between 4 and 17, and there is therefore no pair of n and m corresponding
to an empty range of values.
</p>
<pre class="display">
2020-01-12 02:35:36 +02:00
<span class="plain">[ </span><span class="identifier">GenerateRandomNumber</span><span class="plain"> </span><span class="identifier">n</span><span class="plain"> </span><span class="identifier">m</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">n</span><span class="plain">==</span><span class="identifier">m</span><span class="plain">) </span><span class="reserved">return</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">&gt;</span><span class="identifier">m</span><span class="plain">) { </span><span class="identifier">s</span><span class="plain"> = </span><span class="identifier">n</span><span class="plain">; </span><span class="identifier">n</span><span class="plain"> = </span><span class="identifier">m</span><span class="plain">; </span><span class="identifier">m</span><span class="plain"> = </span><span class="identifier">s</span><span class="plain">; }</span>
<span class="identifier">n</span><span class="plain">--;</span>
<span class="reserved">return</span><span class="plain"> </span><span class="reserved">random</span><span class="plain">(</span><span class="identifier">m</span><span class="plain">-</span><span class="identifier">n</span><span class="plain">) + </span><span class="identifier">n</span><span class="plain">;</span>
<span class="plain">];</span>
2020-01-12 02:35:36 +02:00
<span class="reserved">Constant</span><span class="plain"> </span><span class="identifier">R_DecimalNumber</span><span class="plain"> = </span><span class="identifier">GenerateRandomNumber</span><span class="plain">;</span>
<span class="reserved">Constant</span><span class="plain"> </span><span class="identifier">R_PrintTimeOfDay</span><span class="plain"> = </span><span class="identifier">GenerateRandomNumber</span><span class="plain">;</span>
</pre>
<p class="inwebparagraph"></p>
<p class="inwebparagraph"><a id="SP4"></a><b>&#167;4. PrintSpaces. </b>Which prints a row of n spaces, for n&gt;= 0.
</p>
<pre class="display">
2020-01-12 02:35:36 +02:00
<span class="plain">[ </span><span class="identifier">PrintSpaces</span><span class="plain"> </span><span class="identifier">n</span><span class="plain">;</span>
<span class="reserved">while</span><span class="plain"> (</span><span class="identifier">n</span><span class="plain"> &gt; </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">n</span><span class="plain"> = </span><span class="identifier">n</span><span class="plain"> </span><span class="constant">-</span><span class="plain"> </span><span class="constant">1</span><span class="plain">;</span>
<span class="plain">}</span>
<span class="plain">];</span>
</pre>
<p class="inwebparagraph"></p>
<p class="inwebparagraph"><a id="SP5"></a><b>&#167;5. SwapWorkflags. </b>Recall that we have two general-purpose temporary attributes for each object:
<code class="display"><span class="extract">workflag</span></code> and <code class="display"><span class="extract">workflag2</span></code>. The following swaps their values over for every
object at once.
</p>
<pre class="display">
2020-01-12 02:35:36 +02:00
<span class="plain">[ </span><span class="identifier">SwapWorkflags</span><span class="plain"> </span><span class="identifier">obj</span><span class="plain"> </span><span class="identifier">lst</span><span class="plain">;</span>
<span class="reserved">objectloop</span><span class="plain"> (</span><span class="identifier">obj</span><span class="plain"> </span><span class="reserved">ofclass</span><span class="plain"> </span><span class="identifier">Object</span><span class="plain">) {</span>
<span class="identifier">lst</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">obj</span><span class="plain"> </span><span class="reserved">has</span><span class="plain"> </span><span class="identifier">workflag2</span><span class="plain">) </span><span class="identifier">lst</span><span class="plain"> = </span><span class="reserved">true</span><span class="plain">;</span>
<span class="reserved">give</span><span class="plain"> </span><span class="identifier">obj</span><span class="plain"> ~</span><span class="identifier">workflag2</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">has</span><span class="plain"> </span><span class="identifier">workflag</span><span class="plain">) </span><span class="reserved">give</span><span class="plain"> </span><span class="identifier">obj</span><span class="plain"> </span><span class="identifier">workflag2</span><span class="plain">;</span>
<span class="reserved">give</span><span class="plain"> </span><span class="identifier">obj</span><span class="plain"> ~</span><span class="identifier">workflag</span><span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">lst</span><span class="plain">) </span><span class="reserved">give</span><span class="plain"> </span><span class="identifier">obj</span><span class="plain"> </span><span class="identifier">workflag</span><span class="plain">;</span>
<span class="plain">}</span>
<span class="plain">];</span>
</pre>
<p class="inwebparagraph"></p>
<p class="inwebparagraph"><a id="SP6"></a><b>&#167;6. TestUseOption. </b>This routine, compiled by NI, returns <code class="display"><span class="extract">true</span></code> if the supplied argument is the
number of a use option in force for the current run of NI, and <code class="display"><span class="extract">false</span></code>
otherwise.
</p>
<p class="inwebparagraph"><a id="SP7"></a><b>&#167;7. ZRegion. </b>I7 contains many relics from I6, but here's a relic from I5: a routine which
used to determine the metaclass of a value, before that concept was given a
name. In I6 code, it can be implemented simply using <code class="display"><span class="extract">metaclass</span></code>, as the
following shows. (The name is from "region of the Z-machine".)
</p>
<pre class="display">
2020-01-12 02:35:36 +02:00
<span class="plain">[ </span><span class="identifier">ZRegion</span><span class="plain"> </span><span class="identifier">addr</span><span class="plain">;</span>
<span class="reserved">switch</span><span class="plain"> (</span><span class="reserved">metaclass</span><span class="plain">(</span><span class="identifier">addr</span><span class="plain">)) {</span>
<span class="reserved">nothing</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">Object</span><span class="plain">, </span><span class="identifier">Class</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">Routine</span><span class="plain">: </span><span class="reserved">return</span><span class="plain"> </span><span class="constant">2</span><span class="plain">;</span>
<span class="identifier">String</span><span class="plain">: </span><span class="reserved">return</span><span class="plain"> </span><span class="constant">3</span><span class="plain">;</span>
<span class="plain">}</span>
<span class="plain">];</span>
</pre>
<p class="inwebparagraph"></p>
<p class="inwebparagraph"><a id="SP8"></a><b>&#167;8. Memcpy. </b>This is equivalent to C's memcpy function, in good ways and bad.
</p>
<pre class="display">
2020-01-12 02:35:36 +02:00
<span class="plain">[ </span><span class="identifier">Memcpy</span><span class="plain"> </span><span class="identifier">to_addr</span><span class="plain"> </span><span class="identifier">from_addr</span><span class="plain"> </span><span class="identifier">size</span><span class="plain"> </span><span class="identifier">n</span><span class="plain">;</span>
<span class="plain">#</span><span class="identifier">Ifdef</span><span class="plain"> </span><span class="identifier">TARGET_ZCODE</span><span class="plain">;</span>
<span class="reserved">for</span><span class="plain"> (</span><span class="identifier">n</span><span class="plain"> = </span><span class="identifier">size</span><span class="plain">/</span><span class="identifier">WORDSIZE</span><span class="plain">: (</span><span class="identifier">n</span><span class="plain">--) &gt; </span><span class="constant">0</span><span class="plain">: ) </span><span class="identifier">to_addr</span><span class="plain">--&gt;</span><span class="identifier">n</span><span class="plain"> = </span><span class="identifier">from_addr</span><span class="plain">--&gt;</span><span class="identifier">n</span><span class="plain">;</span>
<span class="reserved">for</span><span class="plain"> (</span><span class="identifier">n</span><span class="plain"> = </span><span class="identifier">size</span><span class="plain">: ((</span><span class="identifier">n</span><span class="plain">--) % </span><span class="identifier">WORDSIZE</span><span class="plain"> ~= </span><span class="constant">0</span><span class="plain">): ) </span><span class="identifier">to_addr</span><span class="plain">-&gt;</span><span class="identifier">n</span><span class="plain"> = </span><span class="identifier">from_addr</span><span class="plain">-&gt;</span><span class="identifier">n</span><span class="plain">;</span>
<span class="plain">#</span><span class="identifier">Ifnot</span><span class="plain">; </span><span class="comment">! TARGET_GLULX</span>
<span class="plain">@</span><span class="identifier">mcopy</span><span class="plain"> </span><span class="identifier">size</span><span class="plain"> </span><span class="identifier">from_addr</span><span class="plain"> </span><span class="identifier">to_addr</span><span class="plain">;</span>
<span class="plain">#</span><span class="identifier">Endif</span><span class="plain">; </span><span class="comment">! TARGET_</span>
<span class="plain">];</span>
</pre>
<p class="inwebparagraph"></p>
<p class="inwebparagraph"><a id="SP9"></a><b>&#167;9. Arrcpy. </b>This is not quite so efficient, but not terrible.
</p>
<pre class="display">
2020-01-12 02:35:36 +02:00
<span class="plain">[ </span><span class="identifier">Arrcpy</span><span class="plain"> </span><span class="identifier">to_array</span><span class="plain"> </span><span class="identifier">to_entry_size</span><span class="plain"> </span><span class="identifier">from_array</span><span class="plain"> </span><span class="identifier">from_entry_size</span><span class="plain"> </span><span class="identifier">no_entries</span><span class="plain"> </span><span class="identifier">n</span><span class="plain"> </span><span class="identifier">val</span><span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">to_entry_size</span><span class="plain"> == </span><span class="identifier">from_entry_size</span><span class="plain">)</span>
<span class="identifier">Memcpy</span><span class="plain">(</span><span class="identifier">to_array</span><span class="plain">, </span><span class="identifier">from_array</span><span class="plain">, </span><span class="identifier">to_entry_size</span><span class="plain">*</span><span class="identifier">no_entries</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">to_entry_size</span><span class="plain"> == </span><span class="constant">2</span><span class="plain">) &amp;&amp; (</span><span class="identifier">from_entry_size</span><span class="plain"> == </span><span class="constant">4</span><span class="plain">)) {</span>
<span class="reserved">for</span><span class="plain"> (</span><span class="identifier">n</span><span class="plain"> = </span><span class="constant">0</span><span class="plain">: </span><span class="identifier">n</span><span class="plain">&lt;</span><span class="identifier">no_entries</span><span class="plain">: </span><span class="identifier">n</span><span class="plain">++) {</span>
<span class="identifier">val</span><span class="plain"> = </span><span class="identifier">from_array</span><span class="plain">--&gt;</span><span class="identifier">n</span><span class="plain">;</span>
<span class="identifier">to_array</span><span class="plain">-&gt;0 = (</span><span class="identifier">val</span><span class="plain">/256)%256; </span><span class="identifier">to_array</span><span class="plain">-&gt;1 = </span><span class="identifier">val</span><span class="plain">%256;</span>
<span class="identifier">to_array</span><span class="plain"> = </span><span class="identifier">to_array</span><span class="plain"> + </span><span class="constant">2</span><span class="plain">;</span>
<span class="plain">}</span>
2020-01-12 02:35:36 +02:00
<span class="plain">} </span><span class="reserved">else</span><span class="plain"> </span><span class="string">"*** Arrcpy doesn't support this ***"</span><span class="plain">;</span>
<span class="plain">];</span>
</pre>
<p class="inwebparagraph"></p>
<p class="inwebparagraph"><a id="SP10"></a><b>&#167;10. Verbs as Values. </b></p>
<pre class="display">
2020-01-12 02:35:36 +02:00
<span class="plain">[ </span><span class="identifier">PrintVerbAsValue</span><span class="plain"> </span><span class="identifier">vb</span><span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">vb</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">"(no verb)"</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="string">"verb "</span><span class="plain">; </span><span class="identifier">vb</span><span class="plain">(1); }</span>
<span class="plain">];</span>
2020-01-12 02:35:36 +02:00
<span class="plain">[ </span><span class="identifier">VerbIsMeaningful</span><span class="plain"> </span><span class="identifier">vb</span><span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">vb</span><span class="plain">) &amp;&amp; (</span><span class="identifier">BlkValueCompare</span><span class="plain">(</span><span class="identifier">vb</span><span class="plain">(</span><span class="identifier">CV_MEANING</span><span class="plain">), </span><span class="identifier">MEANINGLESS_RR</span><span class="plain">) ~= </span><span class="constant">0</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>
2020-01-12 02:35:36 +02:00
<span class="plain">[ </span><span class="identifier">VerbIsModal</span><span class="plain"> </span><span class="identifier">vb</span><span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">vb</span><span class="plain">) &amp;&amp; (</span><span class="identifier">vb</span><span class="plain">(</span><span class="identifier">CV_MODAL</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>&#167;11. Seed Random Number Generator Rule. </b>Unless a seed is provided by NI, and it won't be for released story files,
the VM's interpreter is supposed to start up with a good seed in its random
number generator: something usually derived from, say, the milliseconds part
of the current time of day, which is unlikely to repeat or show any pattern
in real-world use. However, early Z-machine interpreters often did this quite
badly, starting with poor seed values which meant that the first few random
numbers always had something in common (being fairly small in their range,
for instance). To obviate this we extract and throw away 100 random numbers
to get the generator going, shaking out more obvious early patterns, but
that cannot really help much if the VM interpreter's RNG is badly written.
"Anyone who considers arithmetical methods of producing random digits is,
of course, in a state of sin" (von Neumann).
</p>
<pre class="display">
2020-01-12 02:35:36 +02:00
<span class="plain">[ </span><span class="identifier">SEED_RANDOM_NUMBER_GENERATOR_R</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">RNG_SEED_AT_START_OF_PLAY</span><span class="plain">) </span><span class="identifier">VM_Seed_RNG</span><span class="plain">(</span><span class="identifier">RNG_SEED_AT_START_OF_PLAY</span><span class="plain">);</span>
<span class="reserved">for</span><span class="plain"> (</span><span class="identifier">i</span><span class="plain">=1: </span><span class="identifier">i</span><span class="plain">&lt;=100: </span><span class="identifier">i</span><span class="plain">++) </span><span class="reserved">random</span><span class="plain">(</span><span class="identifier">i</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>&#167;12. Extracting Verb Numbers. </b>A long tale of woe lies behind the following. Infocom games stored verb numbers
in a single byte in dictionary entries, but they did so counting downwards, so
that verb number 0 was stored as 255, 1 as 254, and so on. Inform followed
suit so that debugging of Inform 1 could be aided by using the then-available
tools for dumping dictionaries from Infocom story files; by using the Infocom
format for dictionary tables, Inform's life was easier.
</p>
<p class="inwebparagraph">But there was an implicit restriction there of 255 distinct verbs (not 256
since not all words were verbs). When Glulx raised almost all of the Z-machine
limits, it made space for 65535 verbs instead of 255, but it appears that
nobody remembered to implement this in I6-for-Glulx and the Glulx form of
the I6 library. This was only put right in March 2009, and the following
routine was added to concentrate lookups of this field in one place.
</p>
<pre class="display">
2020-01-12 02:35:36 +02:00
<span class="plain">[ </span><span class="identifier">DictionaryWordToVerbNum</span><span class="plain"> </span><span class="identifier">dword</span><span class="plain"> </span><span class="identifier">verbnum</span><span class="plain">;</span>
<span class="plain">#</span><span class="identifier">Ifdef</span><span class="plain"> </span><span class="identifier">TARGET_ZCODE</span><span class="plain">;</span>
<span class="identifier">verbnum</span><span class="plain"> = </span><span class="constant">$ff-</span><span class="plain">(</span><span class="identifier">dword</span><span class="plain">-&gt;#</span><span class="identifier">dict_par2</span><span class="plain">);</span>
<span class="plain">#</span><span class="identifier">Ifnot</span><span class="plain">; </span><span class="comment">! GLULX</span>
<span class="identifier">dword</span><span class="plain"> = </span><span class="identifier">dword</span><span class="plain"> + #</span><span class="identifier">dict_par2</span><span class="plain"> </span><span class="constant">-</span><span class="plain"> </span><span class="constant">1</span><span class="plain">;</span>
<span class="plain">@</span><span class="identifier">aloads</span><span class="plain"> </span><span class="identifier">dword</span><span class="plain"> </span><span class="constant">0</span><span class="plain"> </span><span class="identifier">verbnum</span><span class="plain">;</span>
<span class="identifier">verbnum</span><span class="plain"> = </span><span class="constant">$ffff-</span><span class="identifier">verbnum</span><span class="plain">;</span>
<span class="plain">#</span><span class="identifier">Endif</span><span class="plain">;</span>
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">verbnum</span><span class="plain">;</span>
<span class="plain">];</span>
2020-01-13 13:02:57 +02:00
<span class="plain">[ </span><span class="identifier">RegardingSingleObject</span><span class="plain"> </span><span class="identifier">obj</span><span class="plain">;</span>
<span class="identifier">prior_named_list</span><span class="plain"> = </span><span class="constant">1</span><span class="plain">;</span>
<span class="identifier">prior_named_list_gender</span><span class="plain"> = </span><span class="constant">-1</span><span class="plain">;</span>
<span class="identifier">prior_named_noun</span><span class="plain"> = </span><span class="identifier">obj</span><span class="plain">;</span>
<span class="plain">];</span>
<span class="plain">[ </span><span class="identifier">RegardingNumber</span><span class="plain"> </span><span class="identifier">n</span><span class="plain">;</span>
<span class="identifier">prior_named_list</span><span class="plain"> = </span><span class="identifier">n</span><span class="plain">;</span>
<span class="identifier">prior_named_list_gender</span><span class="plain"> = </span><span class="constant">-1</span><span class="plain">;</span>
<span class="identifier">prior_named_noun</span><span class="plain"> = </span><span class="reserved">nothing</span><span class="plain">;</span>
<span class="plain">];</span>
</pre>
<p class="inwebparagraph"></p>
2020-01-26 01:42:42 +02:00
<p class="inwebparagraph"><a id="SP13"></a><b>&#167;13. Say One Of. </b>These routines are described in the Extensions chapter of the Inform
documentation.
</p>
<pre class="display">
<span class="plain">[ </span><span class="identifier">I7_SOO_PAR</span><span class="plain"> </span><span class="identifier">oldval</span><span class="plain"> </span><span class="identifier">count</span><span class="plain">; </span><span class="reserved">if</span><span class="plain"> (</span><span class="identifier">count</span><span class="plain"> &lt;= </span><span class="constant">1</span><span class="plain">) </span><span class="reserved">return</span><span class="plain"> </span><span class="identifier">count</span><span class="plain">; </span><span class="reserved">return</span><span class="plain"> </span><span class="reserved">random</span><span class="plain">(</span><span class="identifier">count</span><span class="plain">); ];</span>
<span class="plain">[ </span><span class="identifier">I7_SOO_RAN</span><span class="plain"> </span><span class="identifier">oldval</span><span class="plain"> </span><span class="identifier">count</span><span class="plain"> </span><span class="identifier">v</span><span class="plain">; </span><span class="reserved">if</span><span class="plain"> (</span><span class="identifier">count</span><span class="plain"> &lt;= </span><span class="constant">1</span><span class="plain">) </span><span class="reserved">return</span><span class="plain"> </span><span class="identifier">count</span><span class="plain">;</span>
<span class="identifier">v</span><span class="plain"> = </span><span class="identifier">oldval</span><span class="plain">; </span><span class="reserved">while</span><span class="plain"> (</span><span class="identifier">v</span><span class="plain"> == </span><span class="identifier">oldval</span><span class="plain">) </span><span class="identifier">v</span><span class="plain"> = </span><span class="reserved">random</span><span class="plain">(</span><span class="identifier">count</span><span class="plain">); </span><span class="reserved">return</span><span class="plain"> </span><span class="identifier">v</span><span class="plain">; ];</span>
<span class="plain">[ </span><span class="identifier">I7_SOO_STI</span><span class="plain"> </span><span class="identifier">oldval</span><span class="plain"> </span><span class="identifier">count</span><span class="plain"> </span><span class="identifier">v</span><span class="plain">; </span><span class="reserved">if</span><span class="plain"> (</span><span class="identifier">oldval</span><span class="plain">) </span><span class="reserved">return</span><span class="plain"> </span><span class="identifier">oldval</span><span class="plain">; </span><span class="reserved">return</span><span class="plain"> </span><span class="identifier">I7_SOO_PAR</span><span class="plain">(</span><span class="identifier">oldval</span><span class="plain">, </span><span class="identifier">count</span><span class="plain">); ];</span>
<span class="plain">[ </span><span class="identifier">I7_SOO_CYC</span><span class="plain"> </span><span class="identifier">oldval</span><span class="plain"> </span><span class="identifier">count</span><span class="plain">; </span><span class="identifier">oldval</span><span class="plain">++; </span><span class="reserved">if</span><span class="plain"> (</span><span class="identifier">oldval</span><span class="plain"> &gt; </span><span class="identifier">count</span><span class="plain">) </span><span class="identifier">oldval</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">oldval</span><span class="plain">; ];</span>
<span class="plain">[ </span><span class="identifier">I7_SOO_STOP</span><span class="plain"> </span><span class="identifier">oldval</span><span class="plain"> </span><span class="identifier">count</span><span class="plain">; </span><span class="identifier">oldval</span><span class="plain">++; </span><span class="reserved">if</span><span class="plain"> (</span><span class="identifier">oldval</span><span class="plain"> &gt; </span><span class="identifier">count</span><span class="plain">) </span><span class="identifier">oldval</span><span class="plain"> = </span><span class="identifier">count</span><span class="plain">; </span><span class="reserved">return</span><span class="plain"> </span><span class="identifier">oldval</span><span class="plain">; ];</span>
<span class="plain">[ </span><span class="identifier">I7_SOO_TAP</span><span class="plain"> </span><span class="identifier">oldval</span><span class="plain"> </span><span class="identifier">count</span><span class="plain"> </span><span class="identifier">tn</span><span class="plain"> </span><span class="identifier">rn</span><span class="plain"> </span><span class="identifier">c</span><span class="plain">; </span><span class="reserved">if</span><span class="plain"> (</span><span class="identifier">count</span><span class="plain"> &lt;= </span><span class="constant">1</span><span class="plain">) </span><span class="reserved">return</span><span class="plain"> </span><span class="identifier">count</span><span class="plain">; </span><span class="identifier">tn</span><span class="plain"> = </span><span class="identifier">count</span><span class="plain">*(</span><span class="identifier">count</span><span class="plain">+1)/2;</span>
<span class="identifier">rn</span><span class="plain"> = </span><span class="reserved">random</span><span class="plain">(</span><span class="identifier">tn</span><span class="plain">); </span><span class="reserved">for</span><span class="plain"> (</span><span class="identifier">c</span><span class="plain">=1:</span><span class="identifier">c</span><span class="plain">&lt;=</span><span class="identifier">count</span><span class="plain">:</span><span class="identifier">c</span><span class="plain">++) { </span><span class="identifier">rn</span><span class="plain"> = </span><span class="identifier">rn</span><span class="plain"> </span><span class="constant">-</span><span class="plain"> </span><span class="identifier">c</span><span class="plain">; </span><span class="reserved">if</span><span class="plain"> (</span><span class="identifier">rn</span><span class="plain">&lt;=0) </span><span class="reserved">return</span><span class="plain"> (</span><span class="identifier">count</span><span class="plain">-</span><span class="identifier">c</span><span class="plain">+1); } ];</span>
<span class="plain">[ </span><span class="identifier">I7_SOO_TRAN</span><span class="plain"> </span><span class="identifier">oldval</span><span class="plain"> </span><span class="identifier">count</span><span class="plain">; </span><span class="reserved">if</span><span class="plain"> (</span><span class="identifier">oldval</span><span class="plain">&lt;</span><span class="identifier">count</span><span class="plain">) </span><span class="reserved">return</span><span class="plain"> </span><span class="identifier">oldval</span><span class="plain">+1;</span>
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">count</span><span class="plain"> + </span><span class="constant">1</span><span class="plain"> + </span><span class="identifier">I7_SOO_RAN</span><span class="plain">(</span><span class="identifier">oldval</span><span class="plain">%(</span><span class="identifier">count</span><span class="plain">+1), </span><span class="identifier">count</span><span class="plain">); ];</span>
<span class="plain">[ </span><span class="identifier">I7_SOO_TPAR</span><span class="plain"> </span><span class="identifier">oldval</span><span class="plain"> </span><span class="identifier">count</span><span class="plain">; </span><span class="reserved">if</span><span class="plain"> (</span><span class="identifier">oldval</span><span class="plain">&lt;</span><span class="identifier">count</span><span class="plain">) </span><span class="reserved">return</span><span class="plain"> </span><span class="identifier">oldval</span><span class="plain">+1;</span>
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">count</span><span class="plain"> + </span><span class="constant">1</span><span class="plain"> + </span><span class="identifier">I7_SOO_PAR</span><span class="plain">(</span><span class="identifier">oldval</span><span class="plain">%(</span><span class="identifier">count</span><span class="plain">+1), </span><span class="identifier">count</span><span class="plain">); ];</span>
<span class="reserved">Array</span><span class="plain"> </span><span class="identifier">I7_SOO_SHUF</span><span class="plain">-&gt;32;</span>
<span class="plain">[ </span><span class="identifier">I7_SOO_SHU</span><span class="plain"> </span><span class="identifier">oldval</span><span class="plain"> </span><span class="identifier">count</span><span class="plain"> </span><span class="identifier">sd</span><span class="plain"> </span><span class="identifier">ct</span><span class="plain"> </span><span class="identifier">v</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">s</span><span class="plain"> </span><span class="identifier">ssd</span><span class="plain"> </span><span class="identifier">scope</span><span class="plain"> </span><span class="identifier">cc</span><span class="plain"> </span><span class="identifier">base</span><span class="plain">;</span>
<span class="identifier">base</span><span class="plain"> = </span><span class="identifier">count</span><span class="plain">+1;</span>
<span class="identifier">v</span><span class="plain"> = </span><span class="identifier">oldval</span><span class="plain">%</span><span class="identifier">base</span><span class="plain">; </span><span class="identifier">oldval</span><span class="plain"> = </span><span class="identifier">oldval</span><span class="plain">/</span><span class="identifier">base</span><span class="plain">; </span><span class="identifier">ct</span><span class="plain"> = </span><span class="identifier">oldval</span><span class="plain">%</span><span class="identifier">base</span><span class="plain">; </span><span class="identifier">sd</span><span class="plain"> = </span><span class="identifier">oldval</span><span class="plain">/</span><span class="identifier">base</span><span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">count</span><span class="plain"> &gt; </span><span class="constant">32</span><span class="plain">) </span><span class="reserved">return</span><span class="plain"> </span><span class="identifier">I7_SOO_PAR</span><span class="plain">(</span><span class="identifier">oldval</span><span class="plain">, </span><span class="identifier">count</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">count</span><span class="plain"> &lt;= </span><span class="constant">1</span><span class="plain">) </span><span class="identifier">v</span><span class="plain"> = </span><span class="identifier">count</span><span class="plain">;</span>
<span class="reserved">else</span><span class="plain"> {</span>
<span class="comment">!print "^In v=", v, " ct=", ct, " sd=", sd, "^";</span>
<span class="identifier">cc</span><span class="plain"> = </span><span class="identifier">base</span><span class="plain">*</span><span class="identifier">base</span><span class="plain">;</span>
<span class="identifier">scope</span><span class="plain"> = (</span><span class="identifier">MAX_POSITIVE_NUMBER</span><span class="plain">-1)/</span><span class="identifier">cc</span><span class="plain">;</span>
<span class="comment">!print "Scope = ", scope, "^";</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">sd</span><span class="plain"> == </span><span class="constant">0</span><span class="plain">) { </span><span class="identifier">sd</span><span class="plain"> = </span><span class="reserved">random</span><span class="plain">(</span><span class="identifier">scope</span><span class="plain">); </span><span class="identifier">ct</span><span class="plain">=0; }</span>
<span class="reserved">for</span><span class="plain"> (</span><span class="identifier">i</span><span class="plain">=0:</span><span class="identifier">i</span><span class="plain">&lt;</span><span class="identifier">count</span><span class="plain">:</span><span class="identifier">i</span><span class="plain">++) </span><span class="identifier">I7_SOO_SHUF</span><span class="plain">-&gt;</span><span class="identifier">i</span><span class="plain"> = </span><span class="identifier">i</span><span class="plain">;</span>
<span class="identifier">ssd</span><span class="plain"> = </span><span class="identifier">sd</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">i</span><span class="plain">&lt;</span><span class="identifier">count</span><span class="plain">-1:</span><span class="identifier">i</span><span class="plain">++) {</span>
<span class="identifier">j</span><span class="plain"> = (</span><span class="identifier">sd</span><span class="plain">)%(</span><span class="identifier">count</span><span class="plain">-</span><span class="identifier">i</span><span class="plain">)+</span><span class="identifier">i</span><span class="plain">; </span><span class="identifier">sd</span><span class="plain"> = (</span><span class="identifier">sd</span><span class="plain">*31973)+17; </span><span class="reserved">if</span><span class="plain"> (</span><span class="identifier">sd</span><span class="plain">&lt;0) </span><span class="identifier">sd</span><span class="plain">=-</span><span class="identifier">sd</span><span class="plain">;</span>
<span class="identifier">s</span><span class="plain"> = </span><span class="identifier">I7_SOO_SHUF</span><span class="plain">-&gt;</span><span class="identifier">j</span><span class="plain">; </span><span class="identifier">I7_SOO_SHUF</span><span class="plain">-&gt;</span><span class="identifier">j</span><span class="plain"> = </span><span class="identifier">I7_SOO_SHUF</span><span class="plain">-&gt;</span><span class="identifier">i</span><span class="plain">; </span><span class="identifier">I7_SOO_SHUF</span><span class="plain">-&gt;</span><span class="identifier">i</span><span class="plain"> = </span><span class="identifier">s</span><span class="plain">;</span>
<span class="plain">}</span>
<span class="comment">!for (i=0:i&lt;count:i++) print I7_SOO_SHUF-&gt;i, " "; print "^";</span>
<span class="identifier">v</span><span class="plain"> = (</span><span class="identifier">I7_SOO_SHUF</span><span class="plain">-&gt;</span><span class="identifier">ct</span><span class="plain">)+1;</span>
<span class="identifier">ct</span><span class="plain">++; </span><span class="reserved">if</span><span class="plain"> (</span><span class="identifier">ct</span><span class="plain"> &gt;= </span><span class="identifier">count</span><span class="plain">) { </span><span class="identifier">ct</span><span class="plain"> = </span><span class="constant">0</span><span class="plain">; </span><span class="identifier">ssd</span><span class="plain"> = </span><span class="constant">0</span><span class="plain">; }</span>
<span class="plain">}</span>
<span class="comment">!print "Out v=", v, " ct=", ct, " ssd=", sd, "^";</span>
<span class="comment">!print "Return ", v + ct*base + ssd*base*base, "^";</span>
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">v</span><span class="plain"> + </span><span class="identifier">ct</span><span class="plain">*</span><span class="identifier">base</span><span class="plain"> + </span><span class="identifier">ssd</span><span class="plain">*</span><span class="identifier">base</span><span class="plain">*</span><span class="identifier">base</span><span class="plain">;</span>
<span class="plain">];</span>
</pre>
<p class="inwebparagraph"></p>
<p class="inwebparagraph"><a id="SP14"></a><b>&#167;14. Rounding. </b>The following rounds a numerical value <code class="display"><span class="extract">t1</span></code> to the nearest unit of <code class="display"><span class="extract">t2</span></code>;
for instance, if <code class="display"><span class="extract">t2</span></code> is 5 then it rounds to the nearest 5. The name is an
anachronism, as it's used for all kinds of value.
</p>
<pre class="display">
<span class="plain">[ </span><span class="identifier">RoundOffValue</span><span class="plain"> </span><span class="identifier">t1</span><span class="plain"> </span><span class="identifier">t2</span><span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">t1</span><span class="plain"> &gt;= </span><span class="constant">0</span><span class="plain">) </span><span class="reserved">return</span><span class="plain"> ((</span><span class="identifier">t1</span><span class="plain">+</span><span class="identifier">t2</span><span class="plain">/2)/</span><span class="identifier">t2</span><span class="plain">)*</span><span class="identifier">t2</span><span class="plain">;</span>
<span class="reserved">return</span><span class="plain"> </span><span class="constant">-</span><span class="plain">((-</span><span class="identifier">t1</span><span class="plain">+</span><span class="identifier">t2</span><span class="plain">/2)/</span><span class="identifier">t2</span><span class="plain">)*</span><span class="identifier">t2</span><span class="plain">;</span>
<span class="plain">];</span>
</pre>
<p class="inwebparagraph"></p>
<hr class="tocbar">
<ul class="toc"><li><a href="S-ut.html">Back to 'UnicodeData Template'</a></li><li><a href="S-zt.html">Continue with 'ZMachine Template'</a></li></ul><hr class="tocbar">
<!--End of weave-->
</body>
</html>