1
0
Fork 0
mirror of https://github.com/ganelson/inform.git synced 2024-07-02 23:14:57 +03:00

Removed Glulx- and Zmachine-only sections of BasicInformKit

This commit is contained in:
Graham Nelson 2023-06-10 09:36:17 +01:00
parent e802307073
commit 5a6469c072
56 changed files with 1002 additions and 897 deletions

View file

@ -51,7 +51,7 @@
<ul class="crumbs"><li><a href="../index.html">Home</a></li><li><a href="../extensions.html">Kits</a></li><li><a href="index.html">Architecture16Kit</a></li><li><b>Capabilities Template</b></li></ul></div>
<p class="purpose">Miscellaneous capabilities of the 16-bit architecture.</p>
<ul class="toc"><li><a href="S-cpb.html#SP1">&#167;1. Summary</a></li><li><a href="S-cpb.html#SP2">&#167;2. Header layout</a></li><li><a href="S-cpb.html#SP3">&#167;3. Release Number</a></li><li><a href="S-cpb.html#SP4">&#167;4. RNG</a></li><li><a href="S-cpb.html#SP5">&#167;5. Memory Allocation</a></li><li><a href="S-cpb.html#SP6">&#167;6. Memcpy</a></li><li><a href="S-cpb.html#SP8">&#167;8. Audiovisual Resources</a></li><li><a href="S-cpb.html#SP9">&#167;9. Typography</a></li><li><a href="S-cpb.html#SP10">&#167;10. Undo</a></li></ul><hr class="tocbar">
<ul class="toc"><li><a href="S-cpb.html#SP1">&#167;1. Summary</a></li><li><a href="S-cpb.html#SP2">&#167;2. Header layout</a></li><li><a href="S-cpb.html#SP3">&#167;3. Release Number</a></li><li><a href="S-cpb.html#SP4">&#167;4. RNG</a></li><li><a href="S-cpb.html#SP5">&#167;5. Memory Allocation</a></li><li><a href="S-cpb.html#SP6">&#167;6. Memcpy</a></li><li><a href="S-cpb.html#SP8">&#167;8. Audiovisual Resources</a></li><li><a href="S-cpb.html#SP9">&#167;9. Typography</a></li></ul><hr class="tocbar">
<p class="commentary firstcommentary"><a id="SP1" class="paragraph-anchor"></a><b>&#167;1. Summary. </b>The 16-bit architecture is for very limited virtual machines, and is closely
modelled on Infocom's Z-machine, originally developed between 1979 and 1986,
@ -190,22 +190,8 @@ Glulx are indistinguishable here.
<span class="plain-syntax"> }</span>
<span class="plain-syntax">];</span>
</pre>
<p class="commentary firstcommentary"><a id="SP10" class="paragraph-anchor"></a><b>&#167;10. Undo. </b>These simply wrap the relevant opcodes.
</p>
<pre class="displayed-code all-displayed-code code-font">
<span class="plain-syntax">[ </span><span class="identifier-syntax">VM_Undo</span><span class="plain-syntax"> </span><span class="identifier-syntax">result_code</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> @</span><span class="identifier-syntax">restore_undo</span><span class="plain-syntax"> </span><span class="identifier-syntax">result_code</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">result_code</span><span class="plain-syntax">;</span>
<span class="plain-syntax">];</span>
<span class="plain-syntax">[ </span><span class="identifier-syntax">VM_Save_Undo</span><span class="plain-syntax"> </span><span class="identifier-syntax">result_code</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> @</span><span class="identifier-syntax">save_undo</span><span class="plain-syntax"> </span><span class="identifier-syntax">result_code</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">result_code</span><span class="plain-syntax">;</span>
<span class="plain-syntax">];</span>
</pre>
<nav role="progress"><div class="progresscontainer">
<ul class="progressbar"><li class="progressprevoff">&#10094;</li><li class="progresscurrent">cpb</li><li class="progresssection"><a href="S-str.html">str</a></li><li class="progresssection"><a href="S-mth.html">mth</a></li><li class="progresssection"><a href="S-cs.html">cs</a></li><li class="progresssection"><a href="S-io.html">io</a></li><li class="progresssection"><a href="S-fio.html">fio</a></li><li class="progresssection"><a href="S-vnr.html">vnr</a></li><li class="progressnext"><a href="S-str.html">&#10095;</a></li></ul></div>
<ul class="progressbar"><li class="progressprevoff">&#10094;</li><li class="progresscurrent">cpb</li><li class="progresssection"><a href="S-str.html">str</a></li><li class="progresssection"><a href="S-stt.html">stt</a></li><li class="progresssection"><a href="S-mth.html">mth</a></li><li class="progresssection"><a href="S-cs.html">cs</a></li><li class="progresssection"><a href="S-io.html">io</a></li><li class="progresssection"><a href="S-fio.html">fio</a></li><li class="progresssection"><a href="S-vnr.html">vnr</a></li><li class="progressnext"><a href="S-str.html">&#10095;</a></li></ul></div>
</nav><!--End of weave-->
</main>

View file

@ -212,7 +212,7 @@ expression matching.
<span class="plain-syntax">];</span>
</pre>
<nav role="progress"><div class="progresscontainer">
<ul class="progressbar"><li class="progressprev"><a href="S-mth.html">&#10094;</a></li><li class="progresssection"><a href="S-cpb.html">cpb</a></li><li class="progresssection"><a href="S-str.html">str</a></li><li class="progresssection"><a href="S-mth.html">mth</a></li><li class="progresscurrent">cs</li><li class="progresssection"><a href="S-io.html">io</a></li><li class="progresssection"><a href="S-fio.html">fio</a></li><li class="progresssection"><a href="S-vnr.html">vnr</a></li><li class="progressnext"><a href="S-io.html">&#10095;</a></li></ul></div>
<ul class="progressbar"><li class="progressprev"><a href="S-mth.html">&#10094;</a></li><li class="progresssection"><a href="S-cpb.html">cpb</a></li><li class="progresssection"><a href="S-str.html">str</a></li><li class="progresssection"><a href="S-stt.html">stt</a></li><li class="progresssection"><a href="S-mth.html">mth</a></li><li class="progresscurrent">cs</li><li class="progresssection"><a href="S-io.html">io</a></li><li class="progresssection"><a href="S-fio.html">fio</a></li><li class="progresssection"><a href="S-vnr.html">vnr</a></li><li class="progressnext"><a href="S-io.html">&#10095;</a></li></ul></div>
</nav><!--End of weave-->
</main>

View file

@ -89,7 +89,7 @@ see above.
<span class="plain-syntax">];</span>
</pre>
<nav role="progress"><div class="progresscontainer">
<ul class="progressbar"><li class="progressprev"><a href="S-io.html">&#10094;</a></li><li class="progresssection"><a href="S-cpb.html">cpb</a></li><li class="progresssection"><a href="S-str.html">str</a></li><li class="progresssection"><a href="S-mth.html">mth</a></li><li class="progresssection"><a href="S-cs.html">cs</a></li><li class="progresssection"><a href="S-io.html">io</a></li><li class="progresscurrent">fio</li><li class="progresssection"><a href="S-vnr.html">vnr</a></li><li class="progressnext"><a href="S-vnr.html">&#10095;</a></li></ul></div>
<ul class="progressbar"><li class="progressprev"><a href="S-io.html">&#10094;</a></li><li class="progresssection"><a href="S-cpb.html">cpb</a></li><li class="progresssection"><a href="S-str.html">str</a></li><li class="progresssection"><a href="S-stt.html">stt</a></li><li class="progresssection"><a href="S-mth.html">mth</a></li><li class="progresssection"><a href="S-cs.html">cs</a></li><li class="progresssection"><a href="S-io.html">io</a></li><li class="progresscurrent">fio</li><li class="progresssection"><a href="S-vnr.html">vnr</a></li><li class="progressnext"><a href="S-vnr.html">&#10095;</a></li></ul></div>
</nav><!--End of weave-->
</main>

View file

@ -65,16 +65,41 @@ MathJax = {
<ul class="crumbs"><li><a href="../index.html">Home</a></li><li><a href="../extensions.html">Kits</a></li><li><a href="index.html">Architecture16Kit</a></li><li><b>Input Output Template</b></li></ul></div>
<p class="purpose">Access to the keyboard and to textual windows.</p>
<ul class="toc"><li><a href="S-io.html#SP1">&#167;1. Variables and Arrays</a></li><li><a href="S-io.html#SP2">&#167;2. Dictionary words</a></li><li><a href="S-io.html#SP3">&#167;3. Keyboard Input</a></li><li><a href="S-io.html#SP4">&#167;4. Buffer Functions</a></li><li><a href="S-io.html#SP5">&#167;5. Dictionary Functions</a></li><li><a href="S-io.html#SP6">&#167;6. Command Tables</a></li><li><a href="S-io.html#SP7">&#167;7. Extracting Verb Numbers</a></li><li><a href="S-io.html#SP8">&#167;8. The Screen</a></li><li><a href="S-io.html#SP9">&#167;9. Window Colours</a></li><li><a href="S-io.html#SP10">&#167;10. Main Window</a></li><li><a href="S-io.html#SP11">&#167;11. Status Line</a></li></ul><hr class="tocbar">
<ul class="toc"><li><a href="S-io.html#SP1">&#167;1. Transcript support</a></li><li><a href="S-io.html#SP2">&#167;2. Variables and Arrays</a></li><li><a href="S-io.html#SP3">&#167;3. Dictionary words</a></li><li><a href="S-io.html#SP4">&#167;4. Keyboard Input</a></li><li><a href="S-io.html#SP5">&#167;5. Buffer Functions</a></li><li><a href="S-io.html#SP6">&#167;6. Dictionary Functions</a></li><li><a href="S-io.html#SP7">&#167;7. Command Tables</a></li><li><a href="S-io.html#SP8">&#167;8. Extracting Verb Numbers</a></li><li><a href="S-io.html#SP9">&#167;9. Action functions</a></li><li><a href="S-io.html#SP10">&#167;10. The Screen</a></li><li><a href="S-io.html#SP11">&#167;11. Window Colours</a></li><li><a href="S-io.html#SP12">&#167;12. Main Window</a></li><li><a href="S-io.html#SP13">&#167;13. Status Line</a></li></ul><hr class="tocbar">
<p class="commentary firstcommentary"><a id="SP1" class="paragraph-anchor"></a><b>&#167;1. Variables and Arrays. </b></p>
<p class="commentary firstcommentary"><a id="SP1" class="paragraph-anchor"></a><b>&#167;1. Transcript support. </b>This is a mode in which the transcript of text in the main window is being
written out to an external file.
</p>
<p class="commentary"><span class="extract"><span class="extract-syntax">VM_TranscriptIsOn</span></span> tests whether this mode is on. <span class="extract"><span class="extract-syntax">VM_TranscriptOn</span></span> should
be called only if it is off, and tries to turn it on, returning <span class="extract"><span class="extract-syntax">true</span></span> or <span class="extract"><span class="extract-syntax">false</span></span>
according to whether or not it succeeds. <span class="extract"><span class="extract-syntax">VM_TranscriptOff</span></span> should be called
only if scripting is on.
</p>
<pre class="displayed-code all-displayed-code code-font">
<span class="plain-syntax">[ </span><span class="identifier-syntax">VM_TranscriptIsOn</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> ((</span><span class="identifier-syntax">HDR_GAMEFLAGS</span><span class="plain-syntax">--&gt;0) &amp; </span><span class="constant-syntax">1</span><span class="plain-syntax">);</span>
<span class="plain-syntax">];</span>
<span class="plain-syntax">[ </span><span class="identifier-syntax">VM_TranscriptOn</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> @</span><span class="identifier-syntax">output_stream</span><span class="plain-syntax"> </span><span class="constant-syntax">2</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">VM_TranscriptIsOn</span><span class="plain-syntax">();</span>
<span class="plain-syntax">];</span>
<span class="plain-syntax">[ </span><span class="identifier-syntax">VM_TranscriptOff</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> @</span><span class="identifier-syntax">output_stream</span><span class="plain-syntax"> -2;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">VM_TranscriptIsOn</span><span class="plain-syntax">()) </span><span class="reserved-syntax">rfalse</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">rtrue</span><span class="plain-syntax">;</span>
<span class="plain-syntax">];</span>
</pre>
<p class="commentary firstcommentary"><a id="SP2" class="paragraph-anchor"></a><b>&#167;2. Variables and Arrays. </b></p>
<pre class="displayed-code all-displayed-code code-font">
<span class="reserved-syntax">Constant</span><span class="plain-syntax"> #</span><span class="identifier-syntax">dict_par1</span><span class="plain-syntax"> = </span><span class="constant-syntax">6</span><span class="plain-syntax">;</span>
<span class="reserved-syntax">Constant</span><span class="plain-syntax"> #</span><span class="identifier-syntax">dict_par2</span><span class="plain-syntax"> = </span><span class="constant-syntax">7</span><span class="plain-syntax">;</span>
<span class="identifier-syntax">Global</span><span class="plain-syntax"> </span><span class="identifier-syntax">xcommsdir</span><span class="plain-syntax">; </span><span class="comment-syntax">true if command recording is on</span>
<span class="identifier-syntax">Global</span><span class="plain-syntax"> </span><span class="identifier-syntax">transcript_mode</span><span class="plain-syntax">; </span><span class="comment-syntax">true if game scripting is on</span>
<span class="reserved-syntax">Constant</span><span class="plain-syntax"> </span><span class="identifier-syntax">INPUT_BUFFER_LEN</span><span class="plain-syntax"> = </span><span class="constant-syntax">120</span><span class="plain-syntax">; </span><span class="comment-syntax">Length of buffer array</span>
@ -88,7 +113,7 @@ MathJax = {
<span class="identifier-syntax">Global</span><span class="plain-syntax"> </span><span class="identifier-syntax">dict_entry_size</span><span class="plain-syntax">;</span>
<span class="identifier-syntax">Global</span><span class="plain-syntax"> </span><span class="identifier-syntax">dict_end</span><span class="plain-syntax">;</span>
</pre>
<p class="commentary firstcommentary"><a id="SP2" class="paragraph-anchor"></a><b>&#167;2. Dictionary words. </b>This tests whether an address is probably that of a dictionary word. It's used
<p class="commentary firstcommentary"><a id="SP3" class="paragraph-anchor"></a><b>&#167;3. Dictionary words. </b>This tests whether an address is probably that of a dictionary word. It's used
only for debugging output, so the false positives here (where an address is in
the dictionary table, but mid-word) really do not matter.
</p>
@ -100,7 +125,7 @@ the dictionary table, but mid-word) really do not matter.
<span class="plain-syntax"> </span><span class="reserved-syntax">rfalse</span><span class="plain-syntax">;</span>
<span class="plain-syntax">];</span>
</pre>
<p class="commentary firstcommentary"><a id="SP3" class="paragraph-anchor"></a><b>&#167;3. Keyboard Input. </b>The VM must provide three routines for keyboard input:
<p class="commentary firstcommentary"><a id="SP4" class="paragraph-anchor"></a><b>&#167;4. Keyboard Input. </b>The VM must provide three routines for keyboard input:
</p>
<ul class="items"><li>(a) <span class="extract"><span class="extract-syntax">VM_KeyChar()</span></span> waits for a key to be pressed and then returns the
@ -131,7 +156,7 @@ to document all of that.
<span class="plain-syntax"> </span><span class="reserved-syntax">read</span><span class="plain-syntax"> </span><span class="identifier-syntax">a_buffer</span><span class="plain-syntax"> </span><span class="identifier-syntax">a_table</span><span class="plain-syntax">;</span>
<span class="plain-syntax">];</span>
</pre>
<p class="commentary firstcommentary"><a id="SP4" class="paragraph-anchor"></a><b>&#167;4. Buffer Functions. </b>A "buffer", in this sense, is an array containing a stream of characters
<p class="commentary firstcommentary"><a id="SP5" class="paragraph-anchor"></a><b>&#167;5. Buffer Functions. </b>A "buffer", in this sense, is an array containing a stream of characters
typed from the keyboard; a "parse buffer" is an array which resolves this
into individual words, pointing to the relevant entries in the dictionary
structure. Because each VM has its own format for each of these arrays (not
@ -194,7 +219,7 @@ languages of play.
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">b</span><span class="plain-syntax">-&gt;1 &lt; </span><span class="identifier-syntax">b</span><span class="plain-syntax">-&gt;0) (</span><span class="identifier-syntax">b</span><span class="plain-syntax">-&gt;1)++;</span>
<span class="plain-syntax">];</span>
</pre>
<p class="commentary firstcommentary"><a id="SP5" class="paragraph-anchor"></a><b>&#167;5. Dictionary Functions. </b>Again, the dictionary structure is differently arranged on the different VMs.
<p class="commentary firstcommentary"><a id="SP6" class="paragraph-anchor"></a><b>&#167;6. Dictionary Functions. </b>Again, the dictionary structure is differently arranged on the different VMs.
This is a data structure containing, in compressed form, the text of all the
words to be recognised by tokenisation (above). In I6 for Z, a dictionary word
value is represented at run-time by its record number in the dictionary,
@ -220,7 +245,7 @@ convert between record numbers and dictionary addresses.
<span class="plain-syntax">[ </span><span class="identifier-syntax">VM_DictionaryAddressToNumber</span><span class="plain-syntax"> </span><span class="identifier-syntax">w</span><span class="plain-syntax">; </span><span class="reserved-syntax">return</span><span class="plain-syntax"> (</span><span class="identifier-syntax">w</span><span class="plain-syntax">-(</span><span class="identifier-syntax">HDR_DICTIONARY</span><span class="plain-syntax">--&gt;0 + </span><span class="constant-syntax">7</span><span class="plain-syntax">))/</span><span class="identifier-syntax">DICT_ENTRY_BYTES</span><span class="plain-syntax">; ];</span>
<span class="plain-syntax">[ </span><span class="identifier-syntax">VM_NumberToDictionaryAddress</span><span class="plain-syntax"> </span><span class="identifier-syntax">n</span><span class="plain-syntax">; </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">HDR_DICTIONARY</span><span class="plain-syntax">--&gt;0 + </span><span class="constant-syntax">7</span><span class="plain-syntax"> + </span><span class="identifier-syntax">DICT_ENTRY_BYTES</span><span class="plain-syntax">*</span><span class="identifier-syntax">n</span><span class="plain-syntax">; ];</span>
</pre>
<p class="commentary firstcommentary"><a id="SP6" class="paragraph-anchor"></a><b>&#167;6. Command Tables. </b>The VM is also generated containing a data structure for the grammar
<p class="commentary firstcommentary"><a id="SP7" class="paragraph-anchor"></a><b>&#167;7. Command Tables. </b>The VM is also generated containing a data structure for the grammar
produced by I6's <span class="extract"><span class="extract-syntax">Verb</span></span> and <span class="extract"><span class="extract-syntax">Extend</span></span> directives: this is essentially a
list of command verbs such as DROP or PUSH, together with a list of
synonyms, and then the grammar for the subsequent commands to be
@ -239,7 +264,7 @@ recognised by the parser.
<span class="plain-syntax"> </span><span class="reserved-syntax">print</span><span class="plain-syntax"> </span><span class="string-syntax">"'"</span><span class="plain-syntax">, (</span><span class="identifier-syntax">address</span><span class="plain-syntax">) </span><span class="identifier-syntax">VM_NumberToDictionaryAddress</span><span class="plain-syntax">(</span><span class="identifier-syntax">j</span><span class="plain-syntax">), </span><span class="string-syntax">"' "</span><span class="plain-syntax">;</span>
<span class="plain-syntax">];</span>
</pre>
<p class="commentary firstcommentary"><a id="SP7" class="paragraph-anchor"></a><b>&#167;7. Extracting Verb Numbers. </b>A long tale of woe lies behind the following. Infocom games stored verb numbers
<p class="commentary firstcommentary"><a id="SP8" class="paragraph-anchor"></a><b>&#167;8. 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
@ -260,7 +285,16 @@ routine was added to concentrate lookups of this field in one place.
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="constant-syntax">$ff</span><span class="plain-syntax">-(</span><span class="identifier-syntax">dword</span><span class="plain-syntax">-&gt;#</span><span class="identifier-syntax">dict_par2</span><span class="plain-syntax">);</span>
<span class="plain-syntax">];</span>
</pre>
<p class="commentary firstcommentary"><a id="SP8" class="paragraph-anchor"></a><b>&#167;8. The Screen. </b>Our generic screen model is that the screen is made up of windows: we tend
<p class="commentary firstcommentary"><a id="SP9" class="paragraph-anchor"></a><b>&#167;9. Action functions. </b>This looks up the address of a function like <span class="extract"><span class="extract-syntax">TakeSub</span></span> from the table of
"action subroutines".
</p>
<pre class="displayed-code all-displayed-code code-font">
<span class="plain-syntax">[ </span><span class="identifier-syntax">VM_ActionFunction</span><span class="plain-syntax"> </span><span class="identifier-syntax">act</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> #</span><span class="identifier-syntax">actions_table</span><span class="plain-syntax">--&gt;</span><span class="identifier-syntax">act</span><span class="plain-syntax">;</span>
<span class="plain-syntax">];</span>
</pre>
<p class="commentary firstcommentary"><a id="SP10" class="paragraph-anchor"></a><b>&#167;10. The Screen. </b>Our generic screen model is that the screen is made up of windows: we tend
to refer only to two of these, the main window and the status line, but
others may also exist from time to time. Windows have unique ID numbers:
the special window ID \(-1\) means "all windows" or "the entire screen",
@ -291,7 +325,7 @@ in order to keep it accurate.
<span class="plain-syntax">[ </span><span class="identifier-syntax">VM_ScreenHeight</span><span class="plain-syntax">; </span><span class="reserved-syntax">return</span><span class="plain-syntax"> (</span><span class="identifier-syntax">HDR_SCREENHLINES</span><span class="plain-syntax">-&gt;0); ];</span>
</pre>
<p class="commentary firstcommentary"><a id="SP9" class="paragraph-anchor"></a><b>&#167;9. Window Colours. </b>Each window can have its own foreground and background colours.
<p class="commentary firstcommentary"><a id="SP11" class="paragraph-anchor"></a><b>&#167;11. Window Colours. </b>Each window can have its own foreground and background colours.
</p>
<p class="commentary">The colour of individual letters or words of type is not controllable in
@ -330,7 +364,7 @@ which is greatly superior in this respect).
<span class="plain-syntax"> }</span>
<span class="plain-syntax">];</span>
</pre>
<p class="commentary firstcommentary"><a id="SP10" class="paragraph-anchor"></a><b>&#167;10. Main Window. </b>The part of the screen on which commands and responses are printed, which
<p class="commentary firstcommentary"><a id="SP12" class="paragraph-anchor"></a><b>&#167;12. Main Window. </b>The part of the screen on which commands and responses are printed, which
ordinarily occupies almost all of the screen area.
</p>
@ -349,7 +383,7 @@ emulates the Glulx model of window rather than text colours.
<span class="plain-syntax"> </span><span class="identifier-syntax">statuswin_current</span><span class="plain-syntax"> = </span><span class="reserved-syntax">false</span><span class="plain-syntax">;</span>
<span class="plain-syntax">];</span>
</pre>
<p class="commentary firstcommentary"><a id="SP11" class="paragraph-anchor"></a><b>&#167;11. Status Line. </b>Despite the name, the status line need not be a single line at the top of
<p class="commentary firstcommentary"><a id="SP13" class="paragraph-anchor"></a><b>&#167;13. Status Line. </b>Despite the name, the status line need not be a single line at the top of
the screen: that's only the conventional default arrangement. It can expand
to become the equivalent of an old-fashioned VT220 terminal, with menus
and grids and mazes displayed lovingly in character graphics, or it can
@ -391,7 +425,7 @@ line; line 2 is underneath, and so on; columns are similarly numbered from
<span class="plain-syntax">];</span>
</pre>
<nav role="progress"><div class="progresscontainer">
<ul class="progressbar"><li class="progressprev"><a href="S-cs.html">&#10094;</a></li><li class="progresssection"><a href="S-cpb.html">cpb</a></li><li class="progresssection"><a href="S-str.html">str</a></li><li class="progresssection"><a href="S-mth.html">mth</a></li><li class="progresssection"><a href="S-cs.html">cs</a></li><li class="progresscurrent">io</li><li class="progresssection"><a href="S-fio.html">fio</a></li><li class="progresssection"><a href="S-vnr.html">vnr</a></li><li class="progressnext"><a href="S-fio.html">&#10095;</a></li></ul></div>
<ul class="progressbar"><li class="progressprev"><a href="S-cs.html">&#10094;</a></li><li class="progresssection"><a href="S-cpb.html">cpb</a></li><li class="progresssection"><a href="S-str.html">str</a></li><li class="progresssection"><a href="S-stt.html">stt</a></li><li class="progresssection"><a href="S-mth.html">mth</a></li><li class="progresssection"><a href="S-cs.html">cs</a></li><li class="progresscurrent">io</li><li class="progresssection"><a href="S-fio.html">fio</a></li><li class="progresssection"><a href="S-vnr.html">vnr</a></li><li class="progressnext"><a href="S-fio.html">&#10095;</a></li></ul></div>
</nav><!--End of weave-->
</main>

View file

@ -105,7 +105,7 @@ addresses, we need to compare them with the following routine, which returns
<span class="plain-syntax">[ </span><span class="identifier-syntax">REAL_NUMBER_TY_Compare</span><span class="plain-syntax"> </span><span class="identifier-syntax">r1</span><span class="plain-syntax"> </span><span class="identifier-syntax">r2</span><span class="plain-syntax">; </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">UnsignedCompare</span><span class="plain-syntax">(</span><span class="identifier-syntax">r1</span><span class="plain-syntax">, </span><span class="identifier-syntax">r2</span><span class="plain-syntax">); ];</span>
</pre>
<nav role="progress"><div class="progresscontainer">
<ul class="progressbar"><li class="progressprev"><a href="S-str.html">&#10094;</a></li><li class="progresssection"><a href="S-cpb.html">cpb</a></li><li class="progresssection"><a href="S-str.html">str</a></li><li class="progresscurrent">mth</li><li class="progresssection"><a href="S-cs.html">cs</a></li><li class="progresssection"><a href="S-io.html">io</a></li><li class="progresssection"><a href="S-fio.html">fio</a></li><li class="progresssection"><a href="S-vnr.html">vnr</a></li><li class="progressnext"><a href="S-cs.html">&#10095;</a></li></ul></div>
<ul class="progressbar"><li class="progressprev"><a href="S-stt.html">&#10094;</a></li><li class="progresssection"><a href="S-cpb.html">cpb</a></li><li class="progresssection"><a href="S-str.html">str</a></li><li class="progresssection"><a href="S-stt.html">stt</a></li><li class="progresscurrent">mth</li><li class="progresssection"><a href="S-cs.html">cs</a></li><li class="progresssection"><a href="S-io.html">io</a></li><li class="progresssection"><a href="S-fio.html">fio</a></li><li class="progresssection"><a href="S-vnr.html">vnr</a></li><li class="progressnext"><a href="S-cs.html">&#10095;</a></li></ul></div>
</nav><!--End of weave-->
</main>

View file

@ -61,7 +61,6 @@ activity runs; and then <span class="extract"><span class="extract-syntax">VM_In
<span class="plain-syntax">[ </span><span class="identifier-syntax">VM_Initialise</span><span class="plain-syntax"> </span><span class="identifier-syntax">i</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">standard_interpreter</span><span class="plain-syntax"> = </span><span class="identifier-syntax">HDR_TERPSTANDARD</span><span class="plain-syntax">--&gt;0;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">transcript_mode</span><span class="plain-syntax"> = ((</span><span class="identifier-syntax">HDR_GAMEFLAGS</span><span class="plain-syntax">--&gt;0) &amp; </span><span class="constant-syntax">1</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">dict_start</span><span class="plain-syntax"> = </span><span class="identifier-syntax">HDR_DICTIONARY</span><span class="plain-syntax">--&gt;0;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">dict_entry_size</span><span class="plain-syntax"> = </span><span class="identifier-syntax">dict_start</span><span class="plain-syntax">-&gt;(</span><span class="identifier-syntax">dict_start</span><span class="plain-syntax">-&gt;0 + </span><span class="constant-syntax">1</span><span class="plain-syntax">);</span>
@ -82,7 +81,7 @@ activity runs; and then <span class="extract"><span class="extract-syntax">VM_In
<span class="plain-syntax">];</span>
</pre>
<nav role="progress"><div class="progresscontainer">
<ul class="progressbar"><li class="progressprev"><a href="S-cpb.html">&#10094;</a></li><li class="progresssection"><a href="S-cpb.html">cpb</a></li><li class="progresscurrent">str</li><li class="progresssection"><a href="S-mth.html">mth</a></li><li class="progresssection"><a href="S-cs.html">cs</a></li><li class="progresssection"><a href="S-io.html">io</a></li><li class="progresssection"><a href="S-fio.html">fio</a></li><li class="progresssection"><a href="S-vnr.html">vnr</a></li><li class="progressnext"><a href="S-mth.html">&#10095;</a></li></ul></div>
<ul class="progressbar"><li class="progressprev"><a href="S-cpb.html">&#10094;</a></li><li class="progresssection"><a href="S-cpb.html">cpb</a></li><li class="progresscurrent">str</li><li class="progresssection"><a href="S-stt.html">stt</a></li><li class="progresssection"><a href="S-mth.html">mth</a></li><li class="progresssection"><a href="S-cs.html">cs</a></li><li class="progresssection"><a href="S-io.html">io</a></li><li class="progresssection"><a href="S-fio.html">fio</a></li><li class="progresssection"><a href="S-vnr.html">vnr</a></li><li class="progressnext"><a href="S-stt.html">&#10095;</a></li></ul></div>
</nav><!--End of weave-->
</main>

View file

@ -0,0 +1,138 @@
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<title>State Template</title>
<link href="../docs-assets/Breadcrumbs.css" rel="stylesheet" rev="stylesheet" type="text/css">
<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="../docs-assets/Contents.css" rel="stylesheet" rev="stylesheet" type="text/css">
<link href="../docs-assets/Progress.css" rel="stylesheet" rev="stylesheet" type="text/css">
<link href="../docs-assets/Navigation.css" rel="stylesheet" rev="stylesheet" type="text/css">
<link href="../docs-assets/Fonts.css" rel="stylesheet" rev="stylesheet" type="text/css">
<link href="../docs-assets/Base.css" rel="stylesheet" rev="stylesheet" type="text/css">
<link href="../docs-assets/Colours.css" rel="stylesheet" rev="stylesheet" type="text/css">
</head>
<body class="commentary-font">
<nav role="navigation">
<h1><a href="../index.html">
<img src="../docs-assets/Inform.png" height=72">
</a></h1>
<ul><li><a href="../index.html">home</a></li>
</ul><h2>Compiler</h2><ul>
<li><a href="../structure.html">structure</a></li>
<li><a href="../inbuildn.html">inbuild</a></li>
<li><a href="../inform7n.html">inform7</a></li>
<li><a href="../intern.html">inter</a></li>
<li><a href="../services.html">services</a></li>
<li><a href="../secrets.html">secrets</a></li>
</ul><h2>Other Tools</h2><ul>
<li><a href="../inblorbn.html">inblorb</a></li>
<li><a href="../indocn.html">indoc</a></li>
<li><a href="../inform6.html">inform6</a></li>
<li><a href="../inpolicyn.html">inpolicy</a></li>
<li><a href="../inrtpsn.html">inrtps</a></li>
</ul><h2>Resources</h2><ul>
<li><a href="../extensions.html">extensions</a></li>
<li><a href="../kits.html">kits</a></li>
</ul><h2>Repository</h2><ul>
<li><a href="https://github.com/ganelson/inform"><img src="../docs-assets/github.png" height=18> github</a></li>
</ul><h2>Related Projects</h2><ul>
<li><a href="../../../inweb/index.html">inweb</a></li>
<li><a href="../../../intest/index.html">intest</a></li>
</ul>
</nav>
<main role="main">
<!--Weave of 'State Template' generated by Inweb-->
<div class="breadcrumbs">
<ul class="crumbs"><li><a href="../index.html">Home</a></li><li><a href="../extensions.html">Kits</a></li><li><a href="index.html">Architecture16Kit</a></li><li><b>State Template</b></li></ul></div>
<p class="purpose">Saving, restoring, restarting and verifying the program from within itself.</p>
<ul class="toc"><li><a href="S-stt.html#SP1">&#167;1. Environment</a></li><li><a href="S-stt.html#SP2">&#167;2. Verification</a></li><li><a href="S-stt.html#SP3">&#167;3. Save, restore, restart</a></li><li><a href="S-stt.html#SP4">&#167;4. Undo</a></li></ul><hr class="tocbar">
<p class="commentary firstcommentary"><a id="SP1" class="paragraph-anchor"></a><b>&#167;1. Environment. </b>The language "interpreter" here supposes that the eventual program is
running in a VM which is being interpreted, and that may not be the case,
but it's traditional.
</p>
<pre class="displayed-code all-displayed-code code-font">
<span class="plain-syntax">[ </span><span class="identifier-syntax">VM_ReportOnInterpreter</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">standard_interpreter</span><span class="plain-syntax"> &gt; </span><span class="constant-syntax">0</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">print</span><span class="plain-syntax"> </span><span class="string-syntax">"Standard interpreter "</span><span class="plain-syntax">,</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">standard_interpreter</span><span class="plain-syntax">/256, </span><span class="string-syntax">"."</span><span class="plain-syntax">, </span><span class="identifier-syntax">standard_interpreter</span><span class="plain-syntax">%256,</span>
<span class="plain-syntax"> </span><span class="string-syntax">" ("</span><span class="plain-syntax">, </span><span class="identifier-syntax">HDR_TERPNUMBER</span><span class="plain-syntax">-&gt;0;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">print</span><span class="plain-syntax"> (</span><span class="identifier-syntax">char</span><span class="plain-syntax">) </span><span class="identifier-syntax">HDR_TERPVERSION</span><span class="plain-syntax">-&gt;0;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">print</span><span class="plain-syntax"> </span><span class="string-syntax">")^"</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> } </span><span class="reserved-syntax">else</span><span class="plain-syntax"> {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">print</span><span class="plain-syntax"> </span><span class="string-syntax">"Interpreter "</span><span class="plain-syntax">, </span><span class="identifier-syntax">HDR_TERPNUMBER</span><span class="plain-syntax">-&gt;0, </span><span class="string-syntax">" Version "</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">print</span><span class="plain-syntax"> (</span><span class="identifier-syntax">char</span><span class="plain-syntax">) </span><span class="identifier-syntax">HDR_TERPVERSION</span><span class="plain-syntax">-&gt;0;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">print</span><span class="plain-syntax"> </span><span class="string-syntax">"^"</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> }</span>
<span class="plain-syntax">];</span>
</pre>
<p class="commentary firstcommentary"><a id="SP2" class="paragraph-anchor"></a><b>&#167;2. Verification. </b>This verifies that the current story file is intact.
</p>
<pre class="displayed-code all-displayed-code code-font">
<span class="plain-syntax">[ </span><span class="identifier-syntax">VM_Verify</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> @</span><span class="identifier-syntax">verify</span><span class="plain-syntax"> ?</span><span class="identifier-syntax">Vmaybe</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">rfalse</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> .</span><span class="identifier-syntax">Vmaybe</span><span class="plain-syntax">; </span><span class="reserved-syntax">rtrue</span><span class="plain-syntax">;</span>
<span class="plain-syntax">];</span>
</pre>
<p class="commentary firstcommentary"><a id="SP3" class="paragraph-anchor"></a><b>&#167;3. Save, restore, restart. </b>Restart does what it says: restarts the program as if it had just loaded for
the first time.
</p>
<p class="commentary"><span class="extract"><span class="extract-syntax">VM_Save()</span></span> attempts to save the current state of the program to a file, and
returns 0 if this fails, 1 if this succeeds, or 2 if in fact a restore has
just succeeded. (A successful restoration should resume execution where the
save succeeded, but we want to distinguish those cases.)
</p>
<p class="commentary"><span class="extract"><span class="extract-syntax">VM_Restore()</span></span> pretends to return <span class="extract"><span class="extract-syntax">true</span></span> or <span class="extract"><span class="extract-syntax">false</span></span> according to whether or not
it succeeds, but in fact it can only return <span class="extract"><span class="extract-syntax">false</span></span> to indicate failure, because
a successful restoration means that execution has transferred to <span class="extract"><span class="extract-syntax">VM_Save</span></span>
instead.
</p>
<pre class="displayed-code all-displayed-code code-font">
<span class="plain-syntax">[ </span><span class="identifier-syntax">VM_Restart</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> @</span><span class="identifier-syntax">restart</span><span class="plain-syntax">;</span>
<span class="plain-syntax">];</span>
<span class="plain-syntax">[ </span><span class="identifier-syntax">VM_Restore</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">restore</span><span class="plain-syntax"> </span><span class="identifier-syntax">RMaybe</span><span class="plain-syntax">; </span><span class="reserved-syntax">rfalse</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> .</span><span class="identifier-syntax">RMaybe</span><span class="plain-syntax">; </span><span class="reserved-syntax">rtrue</span><span class="plain-syntax">;</span>
<span class="plain-syntax">];</span>
<span class="plain-syntax">[ </span><span class="identifier-syntax">VM_Save</span><span class="plain-syntax"> </span><span class="identifier-syntax">flag</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> @</span><span class="reserved-syntax">save</span><span class="plain-syntax"> -&gt; </span><span class="identifier-syntax">flag</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">flag</span><span class="plain-syntax">;</span>
<span class="plain-syntax">];</span>
</pre>
<p class="commentary firstcommentary"><a id="SP4" class="paragraph-anchor"></a><b>&#167;4. Undo. </b>These also simply wrap the relevant opcodes.
</p>
<pre class="displayed-code all-displayed-code code-font">
<span class="plain-syntax">[ </span><span class="identifier-syntax">VM_Undo</span><span class="plain-syntax"> </span><span class="identifier-syntax">result_code</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> @</span><span class="identifier-syntax">restore_undo</span><span class="plain-syntax"> </span><span class="identifier-syntax">result_code</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">result_code</span><span class="plain-syntax">;</span>
<span class="plain-syntax">];</span>
<span class="plain-syntax">[ </span><span class="identifier-syntax">VM_Save_Undo</span><span class="plain-syntax"> </span><span class="identifier-syntax">result_code</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> @</span><span class="identifier-syntax">save_undo</span><span class="plain-syntax"> </span><span class="identifier-syntax">result_code</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">result_code</span><span class="plain-syntax">;</span>
<span class="plain-syntax">];</span>
</pre>
<nav role="progress"><div class="progresscontainer">
<ul class="progressbar"><li class="progressprev"><a href="S-str.html">&#10094;</a></li><li class="progresssection"><a href="S-cpb.html">cpb</a></li><li class="progresssection"><a href="S-str.html">str</a></li><li class="progresscurrent">stt</li><li class="progresssection"><a href="S-mth.html">mth</a></li><li class="progresssection"><a href="S-cs.html">cs</a></li><li class="progresssection"><a href="S-io.html">io</a></li><li class="progresssection"><a href="S-fio.html">fio</a></li><li class="progresssection"><a href="S-vnr.html">vnr</a></li><li class="progressnext"><a href="S-mth.html">&#10095;</a></li></ul></div>
</nav><!--End of weave-->
</main>
</body>
</html>

View file

@ -87,7 +87,7 @@ and do no harm.
<span class="plain-syntax">];</span>
</pre>
<nav role="progress"><div class="progresscontainer">
<ul class="progressbar"><li class="progressprev"><a href="S-fio.html">&#10094;</a></li><li class="progresssection"><a href="S-cpb.html">cpb</a></li><li class="progresssection"><a href="S-str.html">str</a></li><li class="progresssection"><a href="S-mth.html">mth</a></li><li class="progresssection"><a href="S-cs.html">cs</a></li><li class="progresssection"><a href="S-io.html">io</a></li><li class="progresssection"><a href="S-fio.html">fio</a></li><li class="progresscurrent">vnr</li><li class="progressnextoff">&#10095;</li></ul></div>
<ul class="progressbar"><li class="progressprev"><a href="S-fio.html">&#10094;</a></li><li class="progresssection"><a href="S-cpb.html">cpb</a></li><li class="progresssection"><a href="S-str.html">str</a></li><li class="progresssection"><a href="S-stt.html">stt</a></li><li class="progresssection"><a href="S-mth.html">mth</a></li><li class="progresssection"><a href="S-cs.html">cs</a></li><li class="progresssection"><a href="S-io.html">io</a></li><li class="progresssection"><a href="S-fio.html">fio</a></li><li class="progresscurrent">vnr</li><li class="progressnextoff">&#10095;</li></ul></div>
</nav><!--End of weave-->
</main>

View file

@ -59,6 +59,11 @@
<spon class="sectiontitle">Startup Template</span></a> -
<span class="sectionpurpose">How programs for this architecture start up the virtual machine.</span></p>
</li>
<li>
<p class="chapterentry"><a href="S-stt.html">
<spon class="sectiontitle">State Template</span></a> -
<span class="sectionpurpose">Saving, restoring, restarting and verifying the program from within itself.</span></p>
</li>
<li>
<p class="chapterentry"><a href="S-mth.html">
<spon class="sectiontitle">Mathematics Template</span></a> -

View file

@ -51,7 +51,7 @@
<ul class="crumbs"><li><a href="../index.html">Home</a></li><li><a href="../extensions.html">Kits</a></li><li><a href="index.html">Architecture32Kit</a></li><li><b>Capabilities Template</b></li></ul></div>
<p class="purpose">Miscellaneous capabilities of the 16-bit architecture.</p>
<ul class="toc"><li><a href="S-cpb.html#SP1">&#167;1. Summary</a></li><li><a href="S-cpb.html#SP2">&#167;2. Header layout</a></li><li><a href="S-cpb.html#SP3">&#167;3. Release Number</a></li><li><a href="S-cpb.html#SP4">&#167;4. Random Number Generator</a></li><li><a href="S-cpb.html#SP5">&#167;5. Memory Allocation</a></li><li><a href="S-cpb.html#SP6">&#167;6. Memcpy</a></li><li><a href="S-cpb.html#SP8">&#167;8. Audiovisual Resources</a></li><li><a href="S-cpb.html#SP9">&#167;9. Typography</a></li><li><a href="S-cpb.html#SP10">&#167;10. Undo</a></li></ul><hr class="tocbar">
<ul class="toc"><li><a href="S-cpb.html#SP1">&#167;1. Summary</a></li><li><a href="S-cpb.html#SP2">&#167;2. Header layout</a></li><li><a href="S-cpb.html#SP3">&#167;3. Release Number</a></li><li><a href="S-cpb.html#SP4">&#167;4. Random Number Generator</a></li><li><a href="S-cpb.html#SP5">&#167;5. Memory Allocation</a></li><li><a href="S-cpb.html#SP6">&#167;6. Memcpy</a></li><li><a href="S-cpb.html#SP8">&#167;8. Audiovisual Resources</a></li><li><a href="S-cpb.html#SP9">&#167;9. Typography</a></li></ul><hr class="tocbar">
<p class="commentary firstcommentary"><a id="SP1" class="paragraph-anchor"></a><b>&#167;1. Summary. </b>The 32-bit architecture is currently the default targeted by Inform, and is
used both for programs compiled via Inform 6 to the Glulx virtual machine, and
@ -193,23 +193,8 @@ not the place to discuss whether that was a wise decision for Glk to take.)
<span class="plain-syntax"> }</span>
<span class="plain-syntax">];</span>
</pre>
<p class="commentary firstcommentary"><a id="SP10" class="paragraph-anchor"></a><b>&#167;10. Undo. </b>These are really emulations of the Z-machine's conventions on UNDO.
</p>
<pre class="displayed-code all-displayed-code code-font">
<span class="plain-syntax">[ </span><span class="identifier-syntax">VM_Undo</span><span class="plain-syntax"> </span><span class="identifier-syntax">result_code</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> @</span><span class="identifier-syntax">restoreundo</span><span class="plain-syntax"> </span><span class="identifier-syntax">result_code</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> (~~</span><span class="identifier-syntax">result_code</span><span class="plain-syntax">);</span>
<span class="plain-syntax">];</span>
<span class="plain-syntax">[ </span><span class="identifier-syntax">VM_Save_Undo</span><span class="plain-syntax"> </span><span class="identifier-syntax">result_code</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> @</span><span class="identifier-syntax">saveundo</span><span class="plain-syntax"> </span><span class="identifier-syntax">result_code</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">result_code</span><span class="plain-syntax"> == -1) { </span><span class="identifier-syntax">GGRecoverObjects</span><span class="plain-syntax">(); </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="constant-syntax">2</span><span class="plain-syntax">; }</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> (~~</span><span class="identifier-syntax">result_code</span><span class="plain-syntax">);</span>
<span class="plain-syntax">];</span>
</pre>
<nav role="progress"><div class="progresscontainer">
<ul class="progressbar"><li class="progressprevoff">&#10094;</li><li class="progresscurrent">cpb</li><li class="progresssection"><a href="S-glk.html">glk</a></li><li class="progresssection"><a href="S-str.html">str</a></li><li class="progresssection"><a href="S-mth.html">mth</a></li><li class="progresssection"><a href="S-cs.html">cs</a></li><li class="progresssection"><a href="S-io.html">io</a></li><li class="progresssection"><a href="S-fio.html">fio</a></li><li class="progresssection"><a href="S-vnr.html">vnr</a></li><li class="progressnext"><a href="S-glk.html">&#10095;</a></li></ul></div>
<ul class="progressbar"><li class="progressprevoff">&#10094;</li><li class="progresscurrent">cpb</li><li class="progresssection"><a href="S-glk.html">glk</a></li><li class="progresssection"><a href="S-str.html">str</a></li><li class="progresssection"><a href="S-stt.html">stt</a></li><li class="progresssection"><a href="S-mth.html">mth</a></li><li class="progresssection"><a href="S-cs.html">cs</a></li><li class="progresssection"><a href="S-io.html">io</a></li><li class="progresssection"><a href="S-fio.html">fio</a></li><li class="progresssection"><a href="S-vnr.html">vnr</a></li><li class="progressnext"><a href="S-glk.html">&#10095;</a></li></ul></div>
</nav><!--End of weave-->
</main>

View file

@ -203,7 +203,7 @@ expression matching.
<span class="plain-syntax">];</span>
</pre>
<nav role="progress"><div class="progresscontainer">
<ul class="progressbar"><li class="progressprev"><a href="S-mth.html">&#10094;</a></li><li class="progresssection"><a href="S-cpb.html">cpb</a></li><li class="progresssection"><a href="S-glk.html">glk</a></li><li class="progresssection"><a href="S-str.html">str</a></li><li class="progresssection"><a href="S-mth.html">mth</a></li><li class="progresscurrent">cs</li><li class="progresssection"><a href="S-io.html">io</a></li><li class="progresssection"><a href="S-fio.html">fio</a></li><li class="progresssection"><a href="S-vnr.html">vnr</a></li><li class="progressnext"><a href="S-io.html">&#10095;</a></li></ul></div>
<ul class="progressbar"><li class="progressprev"><a href="S-mth.html">&#10094;</a></li><li class="progresssection"><a href="S-cpb.html">cpb</a></li><li class="progresssection"><a href="S-glk.html">glk</a></li><li class="progresssection"><a href="S-str.html">str</a></li><li class="progresssection"><a href="S-stt.html">stt</a></li><li class="progresssection"><a href="S-mth.html">mth</a></li><li class="progresscurrent">cs</li><li class="progresssection"><a href="S-io.html">io</a></li><li class="progresssection"><a href="S-fio.html">fio</a></li><li class="progresssection"><a href="S-vnr.html">vnr</a></li><li class="progressnext"><a href="S-io.html">&#10095;</a></li></ul></div>
</nav><!--End of weave-->
</main>

View file

@ -505,7 +505,7 @@ see above.
<span class="plain-syntax">];</span>
</pre>
<nav role="progress"><div class="progresscontainer">
<ul class="progressbar"><li class="progressprev"><a href="S-io.html">&#10094;</a></li><li class="progresssection"><a href="S-cpb.html">cpb</a></li><li class="progresssection"><a href="S-glk.html">glk</a></li><li class="progresssection"><a href="S-str.html">str</a></li><li class="progresssection"><a href="S-mth.html">mth</a></li><li class="progresssection"><a href="S-cs.html">cs</a></li><li class="progresssection"><a href="S-io.html">io</a></li><li class="progresscurrent">fio</li><li class="progresssection"><a href="S-vnr.html">vnr</a></li><li class="progressnext"><a href="S-vnr.html">&#10095;</a></li></ul></div>
<ul class="progressbar"><li class="progressprev"><a href="S-io.html">&#10094;</a></li><li class="progresssection"><a href="S-cpb.html">cpb</a></li><li class="progresssection"><a href="S-glk.html">glk</a></li><li class="progresssection"><a href="S-str.html">str</a></li><li class="progresssection"><a href="S-stt.html">stt</a></li><li class="progresssection"><a href="S-mth.html">mth</a></li><li class="progresssection"><a href="S-cs.html">cs</a></li><li class="progresssection"><a href="S-io.html">io</a></li><li class="progresscurrent">fio</li><li class="progresssection"><a href="S-vnr.html">vnr</a></li><li class="progressnext"><a href="S-vnr.html">&#10095;</a></li></ul></div>
</nav><!--End of weave-->
</main>

View file

@ -978,7 +978,7 @@ put together by John Cater.
<span class="plain-syntax">];</span>
</pre>
<nav role="progress"><div class="progresscontainer">
<ul class="progressbar"><li class="progressprev"><a href="S-cpb.html">&#10094;</a></li><li class="progresssection"><a href="S-cpb.html">cpb</a></li><li class="progresscurrent">glk</li><li class="progresssection"><a href="S-str.html">str</a></li><li class="progresssection"><a href="S-mth.html">mth</a></li><li class="progresssection"><a href="S-cs.html">cs</a></li><li class="progresssection"><a href="S-io.html">io</a></li><li class="progresssection"><a href="S-fio.html">fio</a></li><li class="progresssection"><a href="S-vnr.html">vnr</a></li><li class="progressnext"><a href="S-str.html">&#10095;</a></li></ul></div>
<ul class="progressbar"><li class="progressprev"><a href="S-cpb.html">&#10094;</a></li><li class="progresssection"><a href="S-cpb.html">cpb</a></li><li class="progresscurrent">glk</li><li class="progresssection"><a href="S-str.html">str</a></li><li class="progresssection"><a href="S-stt.html">stt</a></li><li class="progresssection"><a href="S-mth.html">mth</a></li><li class="progresssection"><a href="S-cs.html">cs</a></li><li class="progresssection"><a href="S-io.html">io</a></li><li class="progresssection"><a href="S-fio.html">fio</a></li><li class="progresssection"><a href="S-vnr.html">vnr</a></li><li class="progressnext"><a href="S-str.html">&#10095;</a></li></ul></div>
</nav><!--End of weave-->
</main>

View file

@ -65,9 +65,69 @@ MathJax = {
<ul class="crumbs"><li><a href="../index.html">Home</a></li><li><a href="../extensions.html">Kits</a></li><li><a href="index.html">Architecture32Kit</a></li><li><b>Input Output Template</b></li></ul></div>
<p class="purpose">Access to the keyboard and to textual windows.</p>
<ul class="toc"><li><a href="S-io.html#SP1">&#167;1. Variables and Arrays</a></li><li><a href="S-io.html#SP2">&#167;2. Rocks</a></li><li><a href="S-io.html#SP3">&#167;3. Dictionary words</a></li><li><a href="S-io.html#SP4">&#167;4. Keyboard Input</a></li><li><a href="S-io.html#SP5">&#167;5. Buffer Functions</a></li><li><a href="S-io.html#SP6">&#167;6. Dictionary Functions</a></li><li><a href="S-io.html#SP7">&#167;7. Command Tables</a></li><li><a href="S-io.html#SP8">&#167;8. Extracting Verb Numbers</a></li><li><a href="S-io.html#SP9">&#167;9. Glulx-Only Printing Routines</a></li><li><a href="S-io.html#SP10">&#167;10. The Screen</a></li><li><a href="S-io.html#SP11">&#167;11. Window Colours</a></li><li><a href="S-io.html#SP12">&#167;12. Main Window</a></li><li><a href="S-io.html#SP13">&#167;13. Status Line</a></li><li><a href="S-io.html#SP14">&#167;14. Quotation Boxes</a></li></ul><hr class="tocbar">
<ul class="toc"><li><a href="S-io.html#SP1">&#167;1. Rocks</a></li><li><a href="S-io.html#SP2">&#167;2. Transcript support</a></li><li><a href="S-io.html#SP3">&#167;3. Variables and Arrays</a></li><li><a href="S-io.html#SP4">&#167;4. Dictionary words</a></li><li><a href="S-io.html#SP5">&#167;5. Keyboard Input</a></li><li><a href="S-io.html#SP6">&#167;6. Buffer Functions</a></li><li><a href="S-io.html#SP7">&#167;7. Dictionary Functions</a></li><li><a href="S-io.html#SP8">&#167;8. Command Tables</a></li><li><a href="S-io.html#SP9">&#167;9. Extracting Verb Numbers</a></li><li><a href="S-io.html#SP10">&#167;10. Action functions</a></li><li><a href="S-io.html#SP11">&#167;11. Glulx-Only Printing Routines</a></li><li><a href="S-io.html#SP12">&#167;12. The Screen</a></li><li><a href="S-io.html#SP13">&#167;13. Window Colours</a></li><li><a href="S-io.html#SP14">&#167;14. Main Window</a></li><li><a href="S-io.html#SP15">&#167;15. Status Line</a></li><li><a href="S-io.html#SP16">&#167;16. Quotation Boxes</a></li></ul><hr class="tocbar">
<p class="commentary firstcommentary"><a id="SP1" class="paragraph-anchor"></a><b>&#167;1. Variables and Arrays. </b></p>
<p class="commentary firstcommentary"><a id="SP1" class="paragraph-anchor"></a><b>&#167;1. Rocks. </b>These are unique ID codes used to mark resources; think of them as inedible
cookies.
</p>
<pre class="displayed-code all-displayed-code code-font">
<span class="reserved-syntax">Constant</span><span class="plain-syntax"> </span><span class="identifier-syntax">GG_MAINWIN_ROCK</span><span class="plain-syntax"> </span><span class="constant-syntax">201</span><span class="plain-syntax">;</span>
<span class="reserved-syntax">Constant</span><span class="plain-syntax"> </span><span class="identifier-syntax">GG_STATUSWIN_ROCK</span><span class="plain-syntax"> </span><span class="constant-syntax">202</span><span class="plain-syntax">;</span>
<span class="reserved-syntax">Constant</span><span class="plain-syntax"> </span><span class="identifier-syntax">GG_QUOTEWIN_ROCK</span><span class="plain-syntax"> </span><span class="constant-syntax">203</span><span class="plain-syntax">;</span>
<span class="reserved-syntax">Constant</span><span class="plain-syntax"> </span><span class="identifier-syntax">GG_SAVESTR_ROCK</span><span class="plain-syntax"> </span><span class="constant-syntax">301</span><span class="plain-syntax">;</span>
<span class="reserved-syntax">Constant</span><span class="plain-syntax"> </span><span class="identifier-syntax">GG_SCRIPTSTR_ROCK</span><span class="plain-syntax"> </span><span class="constant-syntax">302</span><span class="plain-syntax">;</span>
<span class="reserved-syntax">Constant</span><span class="plain-syntax"> </span><span class="identifier-syntax">GG_COMMANDWSTR_ROCK</span><span class="plain-syntax"> </span><span class="constant-syntax">303</span><span class="plain-syntax">;</span>
<span class="reserved-syntax">Constant</span><span class="plain-syntax"> </span><span class="identifier-syntax">GG_COMMANDRSTR_ROCK</span><span class="plain-syntax"> </span><span class="constant-syntax">304</span><span class="plain-syntax">;</span>
<span class="reserved-syntax">Constant</span><span class="plain-syntax"> </span><span class="identifier-syntax">GG_SCRIPTFREF_ROCK</span><span class="plain-syntax"> </span><span class="constant-syntax">401</span><span class="plain-syntax">;</span>
<span class="reserved-syntax">Constant</span><span class="plain-syntax"> </span><span class="identifier-syntax">GG_FOREGROUNDCHAN_ROCK</span><span class="plain-syntax"> </span><span class="constant-syntax">410</span><span class="plain-syntax">;</span>
<span class="reserved-syntax">Constant</span><span class="plain-syntax"> </span><span class="identifier-syntax">GG_BACKGROUNDCHAN_ROCK</span><span class="plain-syntax"> </span><span class="constant-syntax">411</span><span class="plain-syntax">;</span>
</pre>
<p class="commentary firstcommentary"><a id="SP2" class="paragraph-anchor"></a><b>&#167;2. Transcript support. </b>This is a mode in which the transcript of text in the main window is being
written out to an external file.
</p>
<p class="commentary"><span class="extract"><span class="extract-syntax">VM_TranscriptIsOn</span></span> tests whether this mode is on. <span class="extract"><span class="extract-syntax">VM_TranscriptOn</span></span> should
be called only if it is off, and tries to turn it on, returning <span class="extract"><span class="extract-syntax">true</span></span> or <span class="extract"><span class="extract-syntax">false</span></span>
according to whether or not it succeeds. <span class="extract"><span class="extract-syntax">VM_TranscriptOff</span></span> should be called
only if scripting is on: this always succeeds.
</p>
<pre class="displayed-code all-displayed-code code-font">
<span class="identifier-syntax">Global</span><span class="plain-syntax"> </span><span class="identifier-syntax">gg_scriptfref</span><span class="plain-syntax"> = </span><span class="constant-syntax">0</span><span class="plain-syntax">;</span>
<span class="identifier-syntax">Global</span><span class="plain-syntax"> </span><span class="identifier-syntax">gg_scriptstr</span><span class="plain-syntax"> = </span><span class="constant-syntax">0</span><span class="plain-syntax">;</span>
<span class="plain-syntax">[ </span><span class="identifier-syntax">VM_TranscriptIsOn</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">gg_scriptstr</span><span class="plain-syntax">) </span><span class="reserved-syntax">rtrue</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">rfalse</span><span class="plain-syntax">;</span>
<span class="plain-syntax">];</span>
<span class="plain-syntax">[ </span><span class="identifier-syntax">VM_TranscriptOn</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">while</span><span class="plain-syntax"> (</span><span class="reserved-syntax">true</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">gg_scriptfref</span><span class="plain-syntax"> == </span><span class="constant-syntax">0</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">gg_scriptfref</span><span class="plain-syntax"> = </span><span class="identifier-syntax">glk_fileref_create_by_prompt</span><span class="plain-syntax">(</span><span class="constant-syntax">$102</span><span class="plain-syntax">, </span><span class="constant-syntax">$05</span><span class="plain-syntax">, </span><span class="identifier-syntax">GG_SCRIPTFREF_ROCK</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">gg_scriptfref</span><span class="plain-syntax"> == </span><span class="constant-syntax">0</span><span class="plain-syntax">) </span><span class="reserved-syntax">rfalse</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> }</span>
<span class="plain-syntax"> </span><span class="comment-syntax">stream_open_file</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">gg_scriptstr</span><span class="plain-syntax"> = </span><span class="identifier-syntax">glk_stream_open_file</span><span class="plain-syntax">(</span><span class="identifier-syntax">gg_scriptfref</span><span class="plain-syntax">, </span><span class="constant-syntax">$05</span><span class="plain-syntax">, </span><span class="identifier-syntax">GG_SCRIPTSTR_ROCK</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">gg_scriptstr</span><span class="plain-syntax"> == </span><span class="constant-syntax">0</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="comment-syntax">Could not open selected file; select again</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">glk_fileref_destroy</span><span class="plain-syntax">(</span><span class="identifier-syntax">gg_scriptfref</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">gg_scriptfref</span><span class="plain-syntax"> = </span><span class="constant-syntax">0</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">continue</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> }</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">glk_window_set_echo_stream</span><span class="plain-syntax">(</span><span class="identifier-syntax">gg_mainwin</span><span class="plain-syntax">, </span><span class="identifier-syntax">gg_scriptstr</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">rtrue</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> }</span>
<span class="plain-syntax">];</span>
<span class="plain-syntax">[ </span><span class="identifier-syntax">VM_TranscriptOff</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">glk_stream_close</span><span class="plain-syntax">(</span><span class="identifier-syntax">gg_scriptstr</span><span class="plain-syntax">, </span><span class="constant-syntax">0</span><span class="plain-syntax">); </span><span class="comment-syntax">stream_close</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">gg_scriptstr</span><span class="plain-syntax"> = </span><span class="constant-syntax">0</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">rtrue</span><span class="plain-syntax">;</span>
<span class="plain-syntax">];</span>
</pre>
<p class="commentary firstcommentary"><a id="SP3" class="paragraph-anchor"></a><b>&#167;3. Variables and Arrays. </b></p>
<pre class="displayed-code all-displayed-code code-font">
<span class="reserved-syntax">Constant</span><span class="plain-syntax"> </span><span class="identifier-syntax">DICT_ENTRY_BYTES</span><span class="plain-syntax"> = </span><span class="constant-syntax">12</span><span class="plain-syntax">+</span><span class="identifier-syntax">DICT_WORD_SIZE</span><span class="plain-syntax">*</span><span class="identifier-syntax">WORDSIZE</span><span class="plain-syntax">;</span>
@ -79,8 +139,6 @@ MathJax = {
<span class="identifier-syntax">Global</span><span class="plain-syntax"> </span><span class="identifier-syntax">gg_mainwin</span><span class="plain-syntax"> = </span><span class="constant-syntax">0</span><span class="plain-syntax">;</span>
<span class="identifier-syntax">Global</span><span class="plain-syntax"> </span><span class="identifier-syntax">gg_statuswin</span><span class="plain-syntax"> = </span><span class="constant-syntax">0</span><span class="plain-syntax">;</span>
<span class="identifier-syntax">Global</span><span class="plain-syntax"> </span><span class="identifier-syntax">gg_quotewin</span><span class="plain-syntax"> = </span><span class="constant-syntax">0</span><span class="plain-syntax">;</span>
<span class="identifier-syntax">Global</span><span class="plain-syntax"> </span><span class="identifier-syntax">gg_scriptfref</span><span class="plain-syntax"> = </span><span class="constant-syntax">0</span><span class="plain-syntax">;</span>
<span class="identifier-syntax">Global</span><span class="plain-syntax"> </span><span class="identifier-syntax">gg_scriptstr</span><span class="plain-syntax"> = </span><span class="constant-syntax">0</span><span class="plain-syntax">;</span>
<span class="identifier-syntax">Global</span><span class="plain-syntax"> </span><span class="identifier-syntax">gg_savestr</span><span class="plain-syntax"> = </span><span class="constant-syntax">0</span><span class="plain-syntax">;</span>
<span class="identifier-syntax">Global</span><span class="plain-syntax"> </span><span class="identifier-syntax">gg_commandstr</span><span class="plain-syntax"> = </span><span class="constant-syntax">0</span><span class="plain-syntax">;</span>
<span class="identifier-syntax">Global</span><span class="plain-syntax"> </span><span class="identifier-syntax">gg_command_reading</span><span class="plain-syntax"> = </span><span class="constant-syntax">0</span><span class="plain-syntax">; </span><span class="comment-syntax">true if gg_commandstr is being replayed</span>
@ -97,23 +155,7 @@ MathJax = {
<span class="reserved-syntax">Array</span><span class="plain-syntax"> </span><span class="identifier-syntax">parse</span><span class="plain-syntax"> --&gt; </span><span class="identifier-syntax">PARSE_BUFFER_LEN</span><span class="plain-syntax">;</span>
<span class="reserved-syntax">Array</span><span class="plain-syntax"> </span><span class="identifier-syntax">parse2</span><span class="plain-syntax"> --&gt; </span><span class="identifier-syntax">PARSE_BUFFER_LEN</span><span class="plain-syntax">;</span>
</pre>
<p class="commentary firstcommentary"><a id="SP2" class="paragraph-anchor"></a><b>&#167;2. Rocks. </b>These are unique ID codes used to mark resources; think of them as inedible
cookies.
</p>
<pre class="displayed-code all-displayed-code code-font">
<span class="reserved-syntax">Constant</span><span class="plain-syntax"> </span><span class="identifier-syntax">GG_MAINWIN_ROCK</span><span class="plain-syntax"> </span><span class="constant-syntax">201</span><span class="plain-syntax">;</span>
<span class="reserved-syntax">Constant</span><span class="plain-syntax"> </span><span class="identifier-syntax">GG_STATUSWIN_ROCK</span><span class="plain-syntax"> </span><span class="constant-syntax">202</span><span class="plain-syntax">;</span>
<span class="reserved-syntax">Constant</span><span class="plain-syntax"> </span><span class="identifier-syntax">GG_QUOTEWIN_ROCK</span><span class="plain-syntax"> </span><span class="constant-syntax">203</span><span class="plain-syntax">;</span>
<span class="reserved-syntax">Constant</span><span class="plain-syntax"> </span><span class="identifier-syntax">GG_SAVESTR_ROCK</span><span class="plain-syntax"> </span><span class="constant-syntax">301</span><span class="plain-syntax">;</span>
<span class="reserved-syntax">Constant</span><span class="plain-syntax"> </span><span class="identifier-syntax">GG_SCRIPTSTR_ROCK</span><span class="plain-syntax"> </span><span class="constant-syntax">302</span><span class="plain-syntax">;</span>
<span class="reserved-syntax">Constant</span><span class="plain-syntax"> </span><span class="identifier-syntax">GG_COMMANDWSTR_ROCK</span><span class="plain-syntax"> </span><span class="constant-syntax">303</span><span class="plain-syntax">;</span>
<span class="reserved-syntax">Constant</span><span class="plain-syntax"> </span><span class="identifier-syntax">GG_COMMANDRSTR_ROCK</span><span class="plain-syntax"> </span><span class="constant-syntax">304</span><span class="plain-syntax">;</span>
<span class="reserved-syntax">Constant</span><span class="plain-syntax"> </span><span class="identifier-syntax">GG_SCRIPTFREF_ROCK</span><span class="plain-syntax"> </span><span class="constant-syntax">401</span><span class="plain-syntax">;</span>
<span class="reserved-syntax">Constant</span><span class="plain-syntax"> </span><span class="identifier-syntax">GG_FOREGROUNDCHAN_ROCK</span><span class="plain-syntax"> </span><span class="constant-syntax">410</span><span class="plain-syntax">;</span>
<span class="reserved-syntax">Constant</span><span class="plain-syntax"> </span><span class="identifier-syntax">GG_BACKGROUNDCHAN_ROCK</span><span class="plain-syntax"> </span><span class="constant-syntax">411</span><span class="plain-syntax">;</span>
</pre>
<p class="commentary firstcommentary"><a id="SP3" class="paragraph-anchor"></a><b>&#167;3. Dictionary words. </b>This tests whether an address is probably that of a dictionary word. It's used
<p class="commentary firstcommentary"><a id="SP4" class="paragraph-anchor"></a><b>&#167;4. Dictionary words. </b>This tests whether an address is probably that of a dictionary word. It's used
only for debugging output, so the false positives here really do not matter.
</p>
@ -123,7 +165,7 @@ only for debugging output, so the false positives here really do not matter.
<span class="plain-syntax"> </span><span class="reserved-syntax">rfalse</span><span class="plain-syntax">;</span>
<span class="plain-syntax">];</span>
</pre>
<p class="commentary firstcommentary"><a id="SP4" class="paragraph-anchor"></a><b>&#167;4. Keyboard Input. </b>The VM must provide three routines for keyboard input:
<p class="commentary firstcommentary"><a id="SP5" class="paragraph-anchor"></a><b>&#167;5. Keyboard Input. </b>The VM must provide three routines for keyboard input:
</p>
<ul class="items"><li>(a) <span class="extract"><span class="extract-syntax">VM_KeyChar()</span></span> waits for a key to be pressed and then returns the
@ -289,7 +331,7 @@ to document all of that.
<span class="character-syntax"> }</span>
<span class="character-syntax">];</span>
</pre>
<p class="commentary firstcommentary"><a id="SP5" class="paragraph-anchor"></a><b>&#167;5. Buffer Functions. </b>A "buffer", in this sense, is an array containing a stream of characters
<p class="commentary firstcommentary"><a id="SP6" class="paragraph-anchor"></a><b>&#167;6. Buffer Functions. </b>A "buffer", in this sense, is an array containing a stream of characters
typed from the keyboard; a "parse buffer" is an array which resolves this
into individual words, pointing to the relevant entries in the dictionary
structure. Because each VM has its own format for each of these arrays (not
@ -422,7 +464,7 @@ languages of play, and is not called in the template.
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">b</span><span class="plain-syntax">--&gt;0 &lt; </span><span class="identifier-syntax">INPUT_BUFFER_LEN</span><span class="plain-syntax">) (</span><span class="identifier-syntax">b</span><span class="plain-syntax">--&gt;0)++;</span>
<span class="plain-syntax">];</span>
</pre>
<p class="commentary firstcommentary"><a id="SP6" class="paragraph-anchor"></a><b>&#167;6. Dictionary Functions. </b>Again, the dictionary structure is differently arranged on the different VMs.
<p class="commentary firstcommentary"><a id="SP7" class="paragraph-anchor"></a><b>&#167;7. Dictionary Functions. </b>Again, the dictionary structure is differently arranged on the different VMs.
This is a data structure containing, in compressed form, the text of all the
words to be recognised by tokenisation (above). In I6 for Glulx, a dictionary
word is represented at run-time by its record's address in the dictionary.
@ -459,7 +501,7 @@ since, on Glulx, they are the same, these are each the identity function.
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="constant-syntax">0</span><span class="plain-syntax">;</span>
<span class="plain-syntax">];</span>
</pre>
<p class="commentary firstcommentary"><a id="SP7" class="paragraph-anchor"></a><b>&#167;7. Command Tables. </b>The VM is also generated containing a data structure for the grammar
<p class="commentary firstcommentary"><a id="SP8" class="paragraph-anchor"></a><b>&#167;8. Command Tables. </b>The VM is also generated containing a data structure for the grammar
produced by I6's <span class="extract"><span class="extract-syntax">Verb</span></span> and <span class="extract"><span class="extract-syntax">Extend</span></span> directives: this is essentially a
list of command verbs such as DROP or PUSH, together with a list of
synonyms, and then the grammar for the subsequent commands to be
@ -481,7 +523,7 @@ recognised by the parser.
<span class="plain-syntax"> }</span>
<span class="plain-syntax">];</span>
</pre>
<p class="commentary firstcommentary"><a id="SP8" class="paragraph-anchor"></a><b>&#167;8. Extracting Verb Numbers. </b>A long tale of woe lies behind the following. Infocom games stored verb numbers
<p class="commentary firstcommentary"><a id="SP9" class="paragraph-anchor"></a><b>&#167;9. 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
@ -505,7 +547,20 @@ routine was added to concentrate lookups of this field in one place.
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">verbnum</span><span class="plain-syntax">;</span>
<span class="plain-syntax">];</span>
</pre>
<p class="commentary firstcommentary"><a id="SP9" class="paragraph-anchor"></a><b>&#167;9. Glulx-Only Printing Routines. </b>Partly because of the smallness of the range of representable values in
<p class="commentary firstcommentary"><a id="SP10" class="paragraph-anchor"></a><b>&#167;10. Action functions. </b>This looks up the address of a function like <span class="extract"><span class="extract-syntax">TakeSub</span></span> from the table of
"action subroutines".
</p>
<p class="commentary">Strangely, Glulx's action routines table is numbered in an off-by-one way
compared to the Z-machine's: hence the <span class="extract"><span class="extract-syntax">+1</span></span> here.
</p>
<pre class="displayed-code all-displayed-code code-font">
<span class="plain-syntax">[ </span><span class="identifier-syntax">VM_ActionFunction</span><span class="plain-syntax"> </span><span class="identifier-syntax">act</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> #</span><span class="identifier-syntax">actions_table</span><span class="plain-syntax">--&gt;(</span><span class="identifier-syntax">act</span><span class="plain-syntax">+1);</span>
<span class="plain-syntax">];</span>
</pre>
<p class="commentary firstcommentary"><a id="SP11" class="paragraph-anchor"></a><b>&#167;11. Glulx-Only Printing Routines. </b>Partly because of the smallness of the range of representable values in
the Z-machine, there is little run-time type-checking that can be done:
for instance a dictionary address cannot be distinguished from a function
address because they are encoded differently, so that a function address
@ -658,7 +713,7 @@ set stored here is once again ZSCII, not Unicode.
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">AnyToStrArr</span><span class="plain-syntax">;</span>
<span class="plain-syntax">];</span>
</pre>
<p class="commentary firstcommentary"><a id="SP10" class="paragraph-anchor"></a><b>&#167;10. The Screen. </b>Our generic screen model is that the screen is made up of windows: we tend
<p class="commentary firstcommentary"><a id="SP12" class="paragraph-anchor"></a><b>&#167;12. The Screen. </b>Our generic screen model is that the screen is made up of windows: we tend
to refer only to two of these, the main window and the status line, but
others may also exist from time to time. Windows have unique ID numbers:
the special window ID \(-1\) means "all windows" or "the entire screen",
@ -695,7 +750,7 @@ make little sense there.
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">gg_arguments</span><span class="plain-syntax">--&gt;0;</span>
<span class="plain-syntax">];</span>
</pre>
<p class="commentary firstcommentary"><a id="SP11" class="paragraph-anchor"></a><b>&#167;11. Window Colours. </b>Our generic screen model is that the screen is made up of windows, each of
<p class="commentary firstcommentary"><a id="SP13" class="paragraph-anchor"></a><b>&#167;13. Window Colours. </b>Our generic screen model is that the screen is made up of windows, each of
which can have its own foreground and background colours.
</p>
@ -763,7 +818,7 @@ which is greatly superior in this respect).
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="constant-syntax">$ff0000</span><span class="plain-syntax">*(</span><span class="identifier-syntax">c</span><span class="plain-syntax">&amp;1) + </span><span class="constant-syntax">$ff00</span><span class="plain-syntax">*(</span><span class="identifier-syntax">c</span><span class="plain-syntax">&amp;2 ~= </span><span class="constant-syntax">0</span><span class="plain-syntax">) + </span><span class="constant-syntax">$ff</span><span class="plain-syntax">*(</span><span class="identifier-syntax">c</span><span class="plain-syntax">&amp;4 ~= </span><span class="constant-syntax">0</span><span class="plain-syntax">);</span>
<span class="plain-syntax">];</span>
</pre>
<p class="commentary firstcommentary"><a id="SP12" class="paragraph-anchor"></a><b>&#167;12. Main Window. </b>The part of the screen on which commands and responses are printed, which
<p class="commentary firstcommentary"><a id="SP14" class="paragraph-anchor"></a><b>&#167;14. Main Window. </b>The part of the screen on which commands and responses are printed, which
ordinarily occupies almost all of the screen area.
</p>
@ -777,7 +832,7 @@ status line, to the main window.
<span class="plain-syntax"> </span><span class="identifier-syntax">statuswin_current</span><span class="plain-syntax">=0;</span>
<span class="plain-syntax">];</span>
</pre>
<p class="commentary firstcommentary"><a id="SP13" class="paragraph-anchor"></a><b>&#167;13. Status Line. </b>Despite the name, the status line need not be a single line at the top of
<p class="commentary firstcommentary"><a id="SP15" class="paragraph-anchor"></a><b>&#167;15. Status Line. </b>Despite the name, the status line need not be a single line at the top of
the screen: that's only the conventional default arrangement. It can expand
to become the equivalent of an old-fashioned VT220 terminal, with menus
and grids and mazes displayed lovingly in character graphics, or it can
@ -813,7 +868,7 @@ line; line 2 is underneath, and so on; columns are similarly numbered from
<span class="plain-syntax"> </span><span class="identifier-syntax">statuswin_current</span><span class="plain-syntax">=1;</span>
<span class="plain-syntax">];</span>
</pre>
<p class="commentary firstcommentary"><a id="SP14" class="paragraph-anchor"></a><b>&#167;14. Quotation Boxes. </b>On the Z-machine, quotation boxes are produced by stretching the status line,
<p class="commentary firstcommentary"><a id="SP16" class="paragraph-anchor"></a><b>&#167;16. Quotation Boxes. </b>On the Z-machine, quotation boxes are produced by stretching the status line,
but on Glulx they usually occupy windows of their own. If it isn't possible
to create such a window, so that <span class="extract"><span class="extract-syntax">gg_quotewin</span></span> is zero below, the quotation
text just appears in the main window.
@ -854,7 +909,7 @@ text just appears in the main window.
<span class="plain-syntax">];</span>
</pre>
<nav role="progress"><div class="progresscontainer">
<ul class="progressbar"><li class="progressprev"><a href="S-cs.html">&#10094;</a></li><li class="progresssection"><a href="S-cpb.html">cpb</a></li><li class="progresssection"><a href="S-glk.html">glk</a></li><li class="progresssection"><a href="S-str.html">str</a></li><li class="progresssection"><a href="S-mth.html">mth</a></li><li class="progresssection"><a href="S-cs.html">cs</a></li><li class="progresscurrent">io</li><li class="progresssection"><a href="S-fio.html">fio</a></li><li class="progresssection"><a href="S-vnr.html">vnr</a></li><li class="progressnext"><a href="S-fio.html">&#10095;</a></li></ul></div>
<ul class="progressbar"><li class="progressprev"><a href="S-cs.html">&#10094;</a></li><li class="progresssection"><a href="S-cpb.html">cpb</a></li><li class="progresssection"><a href="S-glk.html">glk</a></li><li class="progresssection"><a href="S-str.html">str</a></li><li class="progresssection"><a href="S-stt.html">stt</a></li><li class="progresssection"><a href="S-mth.html">mth</a></li><li class="progresssection"><a href="S-cs.html">cs</a></li><li class="progresscurrent">io</li><li class="progresssection"><a href="S-fio.html">fio</a></li><li class="progresssection"><a href="S-vnr.html">vnr</a></li><li class="progressnext"><a href="S-fio.html">&#10095;</a></li></ul></div>
</nav><!--End of weave-->
</main>

View file

@ -677,7 +677,7 @@ cases used to check the floating-point extensions to Glulx.
<span class="plain-syntax">];</span>
</pre>
<nav role="progress"><div class="progresscontainer">
<ul class="progressbar"><li class="progressprev"><a href="S-str.html">&#10094;</a></li><li class="progresssection"><a href="S-cpb.html">cpb</a></li><li class="progresssection"><a href="S-glk.html">glk</a></li><li class="progresssection"><a href="S-str.html">str</a></li><li class="progresscurrent">mth</li><li class="progresssection"><a href="S-cs.html">cs</a></li><li class="progresssection"><a href="S-io.html">io</a></li><li class="progresssection"><a href="S-fio.html">fio</a></li><li class="progresssection"><a href="S-vnr.html">vnr</a></li><li class="progressnext"><a href="S-cs.html">&#10095;</a></li></ul></div>
<ul class="progressbar"><li class="progressprev"><a href="S-stt.html">&#10094;</a></li><li class="progresssection"><a href="S-cpb.html">cpb</a></li><li class="progresssection"><a href="S-glk.html">glk</a></li><li class="progresssection"><a href="S-str.html">str</a></li><li class="progresssection"><a href="S-stt.html">stt</a></li><li class="progresscurrent">mth</li><li class="progresssection"><a href="S-cs.html">cs</a></li><li class="progresssection"><a href="S-io.html">io</a></li><li class="progresssection"><a href="S-fio.html">fio</a></li><li class="progresssection"><a href="S-vnr.html">vnr</a></li><li class="progressnext"><a href="S-cs.html">&#10095;</a></li></ul></div>
</nav><!--End of weave-->
</main>

View file

@ -230,7 +230,7 @@ light to the Dark Room.")
<span class="plain-syntax">];</span>
</pre>
<nav role="progress"><div class="progresscontainer">
<ul class="progressbar"><li class="progressprev"><a href="S-glk.html">&#10094;</a></li><li class="progresssection"><a href="S-cpb.html">cpb</a></li><li class="progresssection"><a href="S-glk.html">glk</a></li><li class="progresscurrent">str</li><li class="progresssection"><a href="S-mth.html">mth</a></li><li class="progresssection"><a href="S-cs.html">cs</a></li><li class="progresssection"><a href="S-io.html">io</a></li><li class="progresssection"><a href="S-fio.html">fio</a></li><li class="progresssection"><a href="S-vnr.html">vnr</a></li><li class="progressnext"><a href="S-mth.html">&#10095;</a></li></ul></div>
<ul class="progressbar"><li class="progressprev"><a href="S-glk.html">&#10094;</a></li><li class="progresssection"><a href="S-cpb.html">cpb</a></li><li class="progresssection"><a href="S-glk.html">glk</a></li><li class="progresscurrent">str</li><li class="progresssection"><a href="S-stt.html">stt</a></li><li class="progresssection"><a href="S-mth.html">mth</a></li><li class="progresssection"><a href="S-cs.html">cs</a></li><li class="progresssection"><a href="S-io.html">io</a></li><li class="progresssection"><a href="S-fio.html">fio</a></li><li class="progresssection"><a href="S-vnr.html">vnr</a></li><li class="progressnext"><a href="S-stt.html">&#10095;</a></li></ul></div>
</nav><!--End of weave-->
</main>

View file

@ -0,0 +1,176 @@
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<title>State Template</title>
<link href="../docs-assets/Breadcrumbs.css" rel="stylesheet" rev="stylesheet" type="text/css">
<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="../docs-assets/Contents.css" rel="stylesheet" rev="stylesheet" type="text/css">
<link href="../docs-assets/Progress.css" rel="stylesheet" rev="stylesheet" type="text/css">
<link href="../docs-assets/Navigation.css" rel="stylesheet" rev="stylesheet" type="text/css">
<link href="../docs-assets/Fonts.css" rel="stylesheet" rev="stylesheet" type="text/css">
<link href="../docs-assets/Base.css" rel="stylesheet" rev="stylesheet" type="text/css">
<link href="../docs-assets/Colours.css" rel="stylesheet" rev="stylesheet" type="text/css">
</head>
<body class="commentary-font">
<nav role="navigation">
<h1><a href="../index.html">
<img src="../docs-assets/Inform.png" height=72">
</a></h1>
<ul><li><a href="../index.html">home</a></li>
</ul><h2>Compiler</h2><ul>
<li><a href="../structure.html">structure</a></li>
<li><a href="../inbuildn.html">inbuild</a></li>
<li><a href="../inform7n.html">inform7</a></li>
<li><a href="../intern.html">inter</a></li>
<li><a href="../services.html">services</a></li>
<li><a href="../secrets.html">secrets</a></li>
</ul><h2>Other Tools</h2><ul>
<li><a href="../inblorbn.html">inblorb</a></li>
<li><a href="../indocn.html">indoc</a></li>
<li><a href="../inform6.html">inform6</a></li>
<li><a href="../inpolicyn.html">inpolicy</a></li>
<li><a href="../inrtpsn.html">inrtps</a></li>
</ul><h2>Resources</h2><ul>
<li><a href="../extensions.html">extensions</a></li>
<li><a href="../kits.html">kits</a></li>
</ul><h2>Repository</h2><ul>
<li><a href="https://github.com/ganelson/inform"><img src="../docs-assets/github.png" height=18> github</a></li>
</ul><h2>Related Projects</h2><ul>
<li><a href="../../../inweb/index.html">inweb</a></li>
<li><a href="../../../intest/index.html">intest</a></li>
</ul>
</nav>
<main role="main">
<!--Weave of 'State Template' generated by Inweb-->
<div class="breadcrumbs">
<ul class="crumbs"><li><a href="../index.html">Home</a></li><li><a href="../extensions.html">Kits</a></li><li><a href="index.html">Architecture32Kit</a></li><li><b>State Template</b></li></ul></div>
<p class="purpose">Saving, restoring, restarting and verifying the program from within itself.</p>
<ul class="toc"><li><a href="S-stt.html#SP1">&#167;1. Environment</a></li><li><a href="S-stt.html#SP2">&#167;2. Verification</a></li><li><a href="S-stt.html#SP3">&#167;3. Save, restore, restart</a></li><li><a href="S-stt.html#SP4">&#167;4. Undo</a></li></ul><hr class="tocbar">
<p class="commentary firstcommentary"><a id="SP1" class="paragraph-anchor"></a><b>&#167;1. Environment. </b>The language "interpreter" here supposes that the eventual program is
running in a VM which is being interpreted, and that may not be the case,
but it's traditional.
</p>
<pre class="displayed-code all-displayed-code code-font">
<span class="plain-syntax">[ </span><span class="identifier-syntax">VM_ReportOnInterpreter</span><span class="plain-syntax"> </span><span class="identifier-syntax">ix</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> @</span><span class="identifier-syntax">gestalt</span><span class="plain-syntax"> </span><span class="constant-syntax">1</span><span class="plain-syntax"> </span><span class="constant-syntax">0</span><span class="plain-syntax"> </span><span class="identifier-syntax">ix</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">print</span><span class="plain-syntax"> </span><span class="string-syntax">"Interpreter version "</span><span class="plain-syntax">, </span><span class="identifier-syntax">ix</span><span class="plain-syntax"> / </span><span class="constant-syntax">$10000</span><span class="plain-syntax">, </span><span class="string-syntax">"."</span><span class="plain-syntax">, (</span><span class="identifier-syntax">ix</span><span class="plain-syntax"> &amp; </span><span class="constant-syntax">$FF00</span><span class="plain-syntax">) / </span><span class="constant-syntax">$100</span><span class="plain-syntax">,</span>
<span class="plain-syntax"> </span><span class="string-syntax">"."</span><span class="plain-syntax">, </span><span class="identifier-syntax">ix</span><span class="plain-syntax"> &amp; </span><span class="constant-syntax">$FF</span><span class="plain-syntax">, </span><span class="string-syntax">" / "</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> @</span><span class="identifier-syntax">gestalt</span><span class="plain-syntax"> </span><span class="constant-syntax">0</span><span class="plain-syntax"> </span><span class="constant-syntax">0</span><span class="plain-syntax"> </span><span class="identifier-syntax">ix</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">print</span><span class="plain-syntax"> </span><span class="string-syntax">"VM "</span><span class="plain-syntax">, </span><span class="identifier-syntax">ix</span><span class="plain-syntax"> / </span><span class="constant-syntax">$10000</span><span class="plain-syntax">, </span><span class="string-syntax">"."</span><span class="plain-syntax">, (</span><span class="identifier-syntax">ix</span><span class="plain-syntax"> &amp; </span><span class="constant-syntax">$FF00</span><span class="plain-syntax">) / </span><span class="constant-syntax">$100</span><span class="plain-syntax">, </span><span class="string-syntax">"."</span><span class="plain-syntax">, </span><span class="identifier-syntax">ix</span><span class="plain-syntax"> &amp; </span><span class="constant-syntax">$FF</span><span class="plain-syntax">, </span><span class="string-syntax">"^"</span><span class="plain-syntax">;</span>
<span class="plain-syntax">];</span>
</pre>
<p class="commentary firstcommentary"><a id="SP2" class="paragraph-anchor"></a><b>&#167;2. Verification. </b>This verifies that the current story file is intact.
</p>
<pre class="displayed-code all-displayed-code code-font">
<span class="plain-syntax">[ </span><span class="identifier-syntax">VM_Verify</span><span class="plain-syntax"> </span><span class="identifier-syntax">res</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> @</span><span class="identifier-syntax">verify</span><span class="plain-syntax"> </span><span class="identifier-syntax">res</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">res</span><span class="plain-syntax">;</span>
<span class="plain-syntax">];</span>
</pre>
<p class="commentary firstcommentary"><a id="SP3" class="paragraph-anchor"></a><b>&#167;3. Save, restore, restart. </b>Restart does what it says: restarts the program as if it had just loaded for
the first time.
</p>
<p class="commentary"><span class="extract"><span class="extract-syntax">VM_Save()</span></span> attempts to save the current state of the program to a file, and
returns 0 if this fails, 1 if this succeeds, or 2 if in fact a restore has
just succeeded. (A successful restoration should resume execution where the
save succeeded, but we want to distinguish those cases.)
</p>
<p class="commentary"><span class="extract"><span class="extract-syntax">VM_Restore()</span></span> pretends to return <span class="extract"><span class="extract-syntax">true</span></span> or <span class="extract"><span class="extract-syntax">false</span></span> according to whether or not
it succeeds, but in fact it can only return <span class="extract"><span class="extract-syntax">false</span></span> to indicate failure, because
a successful restoration means that execution has transferred to <span class="extract"><span class="extract-syntax">VM_Save</span></span>
instead.
</p>
<pre class="displayed-code all-displayed-code code-font">
<span class="plain-syntax">[ </span><span class="identifier-syntax">VM_Restart</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> @</span><span class="identifier-syntax">restart</span><span class="plain-syntax">;</span>
<span class="plain-syntax">];</span>
<span class="plain-syntax">[ </span><span class="identifier-syntax">VM_Restore</span><span class="plain-syntax"> </span><span class="identifier-syntax">res</span><span class="plain-syntax"> </span><span class="identifier-syntax">fref</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">fref</span><span class="plain-syntax"> = </span><span class="identifier-syntax">glk_fileref_create_by_prompt</span><span class="plain-syntax">(</span><span class="constant-syntax">$01</span><span class="plain-syntax">, </span><span class="constant-syntax">$02</span><span class="plain-syntax">, </span><span class="constant-syntax">0</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">fref</span><span class="plain-syntax"> == </span><span class="constant-syntax">0</span><span class="plain-syntax">) </span><span class="reserved-syntax">jump</span><span class="plain-syntax"> </span><span class="identifier-syntax">RFailed</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">gg_savestr</span><span class="plain-syntax"> = </span><span class="identifier-syntax">glk_stream_open_file</span><span class="plain-syntax">(</span><span class="identifier-syntax">fref</span><span class="plain-syntax">, </span><span class="constant-syntax">$02</span><span class="plain-syntax">, </span><span class="identifier-syntax">GG_SAVESTR_ROCK</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">glk_fileref_destroy</span><span class="plain-syntax">(</span><span class="identifier-syntax">fref</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">gg_savestr</span><span class="plain-syntax"> == </span><span class="constant-syntax">0</span><span class="plain-syntax">) </span><span class="reserved-syntax">jump</span><span class="plain-syntax"> </span><span class="identifier-syntax">RFailed</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> @</span><span class="reserved-syntax">restore</span><span class="plain-syntax"> </span><span class="identifier-syntax">gg_savestr</span><span class="plain-syntax"> </span><span class="identifier-syntax">res</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">glk_stream_close</span><span class="plain-syntax">(</span><span class="identifier-syntax">gg_savestr</span><span class="plain-syntax">, </span><span class="constant-syntax">0</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">gg_savestr</span><span class="plain-syntax"> = </span><span class="constant-syntax">0</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> .</span><span class="identifier-syntax">RFailed</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">rfalse</span><span class="plain-syntax">;</span>
<span class="plain-syntax">];</span>
<span class="plain-syntax">[ </span><span class="identifier-syntax">VM_Save</span><span class="plain-syntax"> </span><span class="identifier-syntax">fref</span><span class="plain-syntax"> </span><span class="identifier-syntax">len</span><span class="plain-syntax"> </span><span class="identifier-syntax">res</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">fref</span><span class="plain-syntax"> = </span><span class="identifier-syntax">glk_fileref_create_by_prompt</span><span class="plain-syntax">(</span><span class="identifier-syntax">fileusage_SavedGame</span><span class="plain-syntax">, </span><span class="identifier-syntax">filemode_Write</span><span class="plain-syntax">, </span><span class="constant-syntax">0</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">fref</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">gg_savestr</span><span class="plain-syntax"> = </span><span class="identifier-syntax">glk_stream_open_file</span><span class="plain-syntax">(</span><span class="identifier-syntax">fref</span><span class="plain-syntax">, </span><span class="identifier-syntax">filemode_Write</span><span class="plain-syntax">, </span><span class="identifier-syntax">GG_SAVESTR_ROCK</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">gg_savestr</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> @</span><span class="reserved-syntax">save</span><span class="plain-syntax"> </span><span class="identifier-syntax">gg_savestr</span><span class="plain-syntax"> </span><span class="identifier-syntax">res</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">res</span><span class="plain-syntax"> == -1) {</span>
<span class="plain-syntax"> </span><span class="comment-syntax">The player actually just typed "restore". We first have to recover</span>
<span class="plain-syntax"> </span><span class="comment-syntax">all the Glk objects; the values in our global variables are all wrong.</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">GGRecoverObjects</span><span class="plain-syntax">();</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">glk_stream_close</span><span class="plain-syntax">(</span><span class="identifier-syntax">gg_savestr</span><span class="plain-syntax">, </span><span class="identifier-syntax">GLK_NULL</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">gg_savestr</span><span class="plain-syntax"> = </span><span class="constant-syntax">0</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="constant-syntax">2</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> }</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">glk_stream_close</span><span class="plain-syntax">(</span><span class="identifier-syntax">gg_savestr</span><span class="plain-syntax">, </span><span class="identifier-syntax">GLK_NULL</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">gg_savestr</span><span class="plain-syntax"> = </span><span class="constant-syntax">0</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">res</span><span class="plain-syntax"> == </span><span class="constant-syntax">0</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="comment-syntax">Check that the savefile was actually written - this is mostly to account for browser limits in Parchment</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">glk_fileref_does_file_exist</span><span class="plain-syntax">(</span><span class="identifier-syntax">fref</span><span class="plain-syntax">)) {</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">gg_savestr</span><span class="plain-syntax"> = </span><span class="identifier-syntax">glk_stream_open_file</span><span class="plain-syntax">(</span><span class="identifier-syntax">fref</span><span class="plain-syntax">, </span><span class="identifier-syntax">filemode_Read</span><span class="plain-syntax">, </span><span class="identifier-syntax">GG_SAVESTR_ROCK</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">gg_savestr</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">glk_stream_set_position</span><span class="plain-syntax">(</span><span class="identifier-syntax">gg_savestr</span><span class="plain-syntax">, </span><span class="constant-syntax">0</span><span class="plain-syntax">, </span><span class="identifier-syntax">seekmode_End</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">len</span><span class="plain-syntax"> = </span><span class="identifier-syntax">glk_stream_get_position</span><span class="plain-syntax">(</span><span class="identifier-syntax">gg_savestr</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">glk_stream_close</span><span class="plain-syntax">(</span><span class="identifier-syntax">gg_savestr</span><span class="plain-syntax">, </span><span class="identifier-syntax">GLK_NULL</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">gg_savestr</span><span class="plain-syntax"> = </span><span class="constant-syntax">0</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">len</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="comment-syntax">We've confirmed the file exists and has content, which is about all we can do</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">glk_fileref_destroy</span><span class="plain-syntax">(</span><span class="identifier-syntax">fref</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="constant-syntax">1</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> }</span>
<span class="plain-syntax"> </span><span class="comment-syntax">Cleanup the empty file</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">glk_fileref_delete_file</span><span class="plain-syntax">(</span><span class="identifier-syntax">fref</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> }</span>
<span class="plain-syntax"> }</span>
<span class="plain-syntax"> }</span>
<span class="plain-syntax"> }</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">glk_fileref_destroy</span><span class="plain-syntax">(</span><span class="identifier-syntax">fref</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> }</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="constant-syntax">0</span><span class="plain-syntax">;</span>
<span class="plain-syntax">];</span>
</pre>
<p class="commentary firstcommentary"><a id="SP4" class="paragraph-anchor"></a><b>&#167;4. Undo. </b>These are really emulations of the Z-machine's conventions on UNDO.
</p>
<pre class="displayed-code all-displayed-code code-font">
<span class="plain-syntax">[ </span><span class="identifier-syntax">VM_Undo</span><span class="plain-syntax"> </span><span class="identifier-syntax">result_code</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> @</span><span class="identifier-syntax">restoreundo</span><span class="plain-syntax"> </span><span class="identifier-syntax">result_code</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> (~~</span><span class="identifier-syntax">result_code</span><span class="plain-syntax">);</span>
<span class="plain-syntax">];</span>
<span class="plain-syntax">[ </span><span class="identifier-syntax">VM_Save_Undo</span><span class="plain-syntax"> </span><span class="identifier-syntax">result_code</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> @</span><span class="identifier-syntax">saveundo</span><span class="plain-syntax"> </span><span class="identifier-syntax">result_code</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">result_code</span><span class="plain-syntax"> == -1) { </span><span class="identifier-syntax">GGRecoverObjects</span><span class="plain-syntax">(); </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="constant-syntax">2</span><span class="plain-syntax">; }</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> (~~</span><span class="identifier-syntax">result_code</span><span class="plain-syntax">);</span>
<span class="plain-syntax">];</span>
</pre>
<nav role="progress"><div class="progresscontainer">
<ul class="progressbar"><li class="progressprev"><a href="S-str.html">&#10094;</a></li><li class="progresssection"><a href="S-cpb.html">cpb</a></li><li class="progresssection"><a href="S-glk.html">glk</a></li><li class="progresssection"><a href="S-str.html">str</a></li><li class="progresscurrent">stt</li><li class="progresssection"><a href="S-mth.html">mth</a></li><li class="progresssection"><a href="S-cs.html">cs</a></li><li class="progresssection"><a href="S-io.html">io</a></li><li class="progresssection"><a href="S-fio.html">fio</a></li><li class="progresssection"><a href="S-vnr.html">vnr</a></li><li class="progressnext"><a href="S-mth.html">&#10095;</a></li></ul></div>
</nav><!--End of weave-->
</main>
</body>
</html>

View file

@ -79,7 +79,7 @@ and do no harm.
<span class="plain-syntax">];</span>
</pre>
<nav role="progress"><div class="progresscontainer">
<ul class="progressbar"><li class="progressprev"><a href="S-fio.html">&#10094;</a></li><li class="progresssection"><a href="S-cpb.html">cpb</a></li><li class="progresssection"><a href="S-glk.html">glk</a></li><li class="progresssection"><a href="S-str.html">str</a></li><li class="progresssection"><a href="S-mth.html">mth</a></li><li class="progresssection"><a href="S-cs.html">cs</a></li><li class="progresssection"><a href="S-io.html">io</a></li><li class="progresssection"><a href="S-fio.html">fio</a></li><li class="progresscurrent">vnr</li><li class="progressnextoff">&#10095;</li></ul></div>
<ul class="progressbar"><li class="progressprev"><a href="S-fio.html">&#10094;</a></li><li class="progresssection"><a href="S-cpb.html">cpb</a></li><li class="progresssection"><a href="S-glk.html">glk</a></li><li class="progresssection"><a href="S-str.html">str</a></li><li class="progresssection"><a href="S-stt.html">stt</a></li><li class="progresssection"><a href="S-mth.html">mth</a></li><li class="progresssection"><a href="S-cs.html">cs</a></li><li class="progresssection"><a href="S-io.html">io</a></li><li class="progresssection"><a href="S-fio.html">fio</a></li><li class="progresscurrent">vnr</li><li class="progressnextoff">&#10095;</li></ul></div>
</nav><!--End of weave-->
</main>

View file

@ -64,6 +64,11 @@
<spon class="sectiontitle">Startup Template</span></a> -
<span class="sectionpurpose">How programs for this architecture start up the virtual machine.</span></p>
</li>
<li>
<p class="chapterentry"><a href="S-stt.html">
<spon class="sectiontitle">State Template</span></a> -
<span class="sectionpurpose">Saving, restoring, restarting and verifying the program from within itself.</span></p>
</li>
<li>
<p class="chapterentry"><a href="S-mth.html">
<spon class="sectiontitle">Mathematics Template</span></a> -

View file

@ -159,10 +159,7 @@ buffer and then altering the first character.
<span class="plain-syntax"> </span><span class="reserved-syntax">for</span><span class="plain-syntax"> (</span><span class="identifier-syntax">i</span><span class="plain-syntax">=</span><span class="identifier-syntax">WORDSIZE</span><span class="plain-syntax">: </span><span class="identifier-syntax">i</span><span class="plain-syntax">&lt;</span><span class="identifier-syntax">length</span><span class="plain-syntax">+</span><span class="identifier-syntax">WORDSIZE</span><span class="plain-syntax">: </span><span class="identifier-syntax">i</span><span class="plain-syntax">++) </span><span class="reserved-syntax">print</span><span class="plain-syntax"> (</span><span class="identifier-syntax">char</span><span class="plain-syntax">) </span><span class="identifier-syntax">StorageForShortName</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">i</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> #</span><span class="identifier-syntax">Ifnot</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">length</span><span class="plain-syntax"> &gt; </span><span class="identifier-syntax">SHORT_NAME_BUFFER_LEN</span><span class="plain-syntax">) </span><span class="identifier-syntax">length</span><span class="plain-syntax"> = </span><span class="identifier-syntax">SHORT_NAME_BUFFER_LEN</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="comment-syntax">### length = glk_buffer_to_title_case_uni(StorageForShortName, SHORT_NAME_BUFFER_LEN, length, false);</span>
<span class="plain-syntax"> </span><span class="comment-syntax">### glk_put_buffer_uni(StorageForShortName, length);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">length</span><span class="plain-syntax">)</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">StorageForShortName</span><span class="plain-syntax">--&gt;0 = </span><span class="identifier-syntax">VM_LowerToUpperCase</span><span class="plain-syntax">(</span><span class="identifier-syntax">StorageForShortName</span><span class="plain-syntax">--&gt;0);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">length</span><span class="plain-syntax">) </span><span class="identifier-syntax">StorageForShortName</span><span class="plain-syntax">--&gt;0 = </span><span class="identifier-syntax">VM_LowerToUpperCase</span><span class="plain-syntax">(</span><span class="identifier-syntax">StorageForShortName</span><span class="plain-syntax">--&gt;0);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">glk_put_buffer_uni</span><span class="plain-syntax">(</span><span class="identifier-syntax">StorageForShortName</span><span class="plain-syntax">, </span><span class="identifier-syntax">length</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> #</span><span class="identifier-syntax">Endif</span><span class="plain-syntax">;</span>

View file

@ -65,7 +65,7 @@ MathJax = {
<ul class="crumbs"><li><a href="../index.html">Home</a></li><li><a href="../extensions.html">Kits</a></li><li><a href="index.html">WorldModelKit</a></li><li><b>Actions Template</b></li></ul></div>
<p class="purpose">To try actions by people in the model world, processing the necessary rulebooks.</p>
<ul class="toc"><li><a href="S-act.html#SP1">&#167;1. Summary</a></li><li><a href="S-act.html#SP2">&#167;2. Fake Actions</a></li><li><a href="S-act.html#SP3">&#167;3. Action Data</a></li><li><a href="S-act.html#SP4">&#167;4. Requirements Bitmap</a></li><li><a href="S-act.html#SP5">&#167;5. Try Action</a></li><li><a href="S-act.html#SP6">&#167;6. I6 Angle Brackets</a></li><li><a href="S-act.html#SP7">&#167;7. Conversion</a></li><li><a href="S-act.html#SP8">&#167;8. Implicit Take</a></li><li><a href="S-act.html#SP9">&#167;9. Look After Going</a></li><li><a href="S-act.html#SP10">&#167;10. Abbreviated Room Description</a></li><li><a href="S-act.html#SP11">&#167;11. Begin Action</a></li><li><a href="S-act.html#SP12">&#167;12. Action Primitive</a></li><li><a href="S-act.html#SP13">&#167;13. Internal Rule</a></li><li><a href="S-act.html#SP14">&#167;14. Type Safety</a></li><li><a href="S-act.html#SP15">&#167;15. Basic Visibility Rule</a></li><li><a href="S-act.html#SP16">&#167;16. Basic Accessibility Rule</a></li><li><a href="S-act.html#SP17">&#167;17. Carrying Requirements Rule</a></li><li><a href="S-act.html#SP18">&#167;18. Standard Implicit Taking Rule</a></li><li><a href="S-act.html#SP19">&#167;19. Requested Actions Require Persuasion Rule</a></li><li><a href="S-act.html#SP20">&#167;20. Carry Out Requested Actions Rule</a></li><li><a href="S-act.html#SP21">&#167;21. Generic Verb Subroutine</a></li><li><a href="S-act.html#SP22">&#167;22. Work Out Details Of Specific Action Rule</a></li><li><a href="S-act.html#SP23">&#167;23. Actions Bitmap</a></li><li><a href="S-act.html#SP24">&#167;24. Printing Actions</a></li></ul><hr class="tocbar">
<ul class="toc"><li><a href="S-act.html#SP1">&#167;1. Summary</a></li><li><a href="S-act.html#SP2">&#167;2. Fake Actions</a></li><li><a href="S-act.html#SP3">&#167;3. Action Data</a></li><li><a href="S-act.html#SP4">&#167;4. Requirements Bitmap</a></li><li><a href="S-act.html#SP5">&#167;5. Try Action</a></li><li><a href="S-act.html#SP6">&#167;6. I6 Angle Brackets</a></li><li><a href="S-act.html#SP7">&#167;7. Conversion</a></li><li><a href="S-act.html#SP8">&#167;8. Implicit Take</a></li><li><a href="S-act.html#SP9">&#167;9. Look After Going</a></li><li><a href="S-act.html#SP10">&#167;10. Abbreviated Room Description</a></li><li><a href="S-act.html#SP11">&#167;11. Begin Action</a></li><li><a href="S-act.html#SP12">&#167;12. Action Primitive</a></li><li><a href="S-act.html#SP13">&#167;13. Internal Rule</a></li><li><a href="S-act.html#SP14">&#167;14. Type Safety</a></li><li><a href="S-act.html#SP15">&#167;15. Basic Visibility Rule</a></li><li><a href="S-act.html#SP16">&#167;16. Basic Accessibility Rule</a></li><li><a href="S-act.html#SP17">&#167;17. Carrying Requirements Rule</a></li><li><a href="S-act.html#SP18">&#167;18. Standard Implicit Taking Rule</a></li><li><a href="S-act.html#SP19">&#167;19. Requested Actions Require Persuasion Rule</a></li><li><a href="S-act.html#SP20">&#167;20. Carry Out Requested Actions Rule</a></li><li><a href="S-act.html#SP21">&#167;21. Generic Verb Subroutine</a></li><li><a href="S-act.html#SP22">&#167;22. Descend To Specific Action Rule</a></li><li><a href="S-act.html#SP23">&#167;23. Work Out Details Of Specific Action Rule</a></li><li><a href="S-act.html#SP24">&#167;24. Actions Bitmap</a></li><li><a href="S-act.html#SP25">&#167;25. Printing Actions</a></li></ul><hr class="tocbar">
<p class="commentary firstcommentary"><a id="SP1" class="paragraph-anchor"></a><b>&#167;1. Summary. </b>To review: an action is an impulse to do something by a person in the model
world. Commands such as DROP POTATO are converted into actions ("dropping
@ -794,7 +794,22 @@ carry out and report rulebooks.
<span class="plain-syntax"> </span><span class="reserved-syntax">rtrue</span><span class="plain-syntax">;</span>
<span class="plain-syntax">];</span>
</pre>
<p class="commentary firstcommentary"><a id="SP22" class="paragraph-anchor"></a><b>&#167;22. Work Out Details Of Specific Action Rule. </b>This is one of the I6 primitive rules in the specific action processing
<p class="commentary firstcommentary"><a id="SP22" class="paragraph-anchor"></a><b>&#167;22. Descend To Specific Action Rule. </b>There are 100 or so actions, typically, and this rule is for efficiency's
sake: rather than perform 100 or so comparisons to see which routine to
call, we indirect through a jump table. The routines called are the <span class="extract"><span class="extract-syntax">-Sub</span></span>
routines: thus, for instance, if <span class="extract"><span class="extract-syntax">action</span></span> is <span class="extract"><span class="extract-syntax">##Wait</span></span> then <span class="extract"><span class="extract-syntax">WaitSub</span></span> is
called. It is essential that this routine not be called for fake actions:
in I7 use this is guaranteed, since fake actions are not allowed into the
action machinery at all.
</p>
<pre class="displayed-code all-displayed-code code-font">
<span class="plain-syntax">[ </span><span class="identifier-syntax">DESCEND_TO_SPECIFIC_ACTION_R</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> ( </span><span class="identifier-syntax">VM_ActionFunction</span><span class="plain-syntax">(</span><span class="identifier-syntax">action</span><span class="plain-syntax">) )();</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">rtrue</span><span class="plain-syntax">;</span>
<span class="plain-syntax">];</span>
</pre>
<p class="commentary firstcommentary"><a id="SP23" class="paragraph-anchor"></a><b>&#167;23. Work Out Details Of Specific Action Rule. </b>This is one of the I6 primitive rules in the specific action processing
rulebook, and it's basically a trick to allow information known to the
<span class="extract"><span class="extract-syntax">GenericVerbSub</span></span> routine to be passed down as rulebook variables for the
specific action-processing rules &mdash; in effect allowing us to pass not
@ -812,7 +827,7 @@ flags, plus the three specific rulebooks needed to process the action.
<span class="plain-syntax"> </span><span class="reserved-syntax">rfalse</span><span class="plain-syntax">;</span>
<span class="plain-syntax">];</span>
</pre>
<p class="commentary firstcommentary"><a id="SP23" class="paragraph-anchor"></a><b>&#167;23. Actions Bitmap. </b>This is a fairly large bitmap recording which actions have succeeded thus
<p class="commentary firstcommentary"><a id="SP24" class="paragraph-anchor"></a><b>&#167;24. Actions Bitmap. </b>This is a fairly large bitmap recording which actions have succeeded thus
far on which nouns. It was to some extent an early attempt at implementing
a past-tense system; I'm not at all sure it was successful, since it is
hindered by certain restrictions &mdash; it only records action/noun combinations,
@ -860,7 +875,7 @@ to what the user might expect, which is unfortunate.
<span class="plain-syntax"> }</span>
<span class="plain-syntax">];</span>
</pre>
<p class="commentary firstcommentary"><a id="SP24" class="paragraph-anchor"></a><b>&#167;24. Printing Actions. </b>This is really for debugging purposes, but also provides us with a way to
<p class="commentary firstcommentary"><a id="SP25" class="paragraph-anchor"></a><b>&#167;25. Printing Actions. </b>This is really for debugging purposes, but also provides us with a way to
print a stored action, for instance, or to print an action name value.
(For instance, printing an action name might result in "taking"; printing
a whole action might produce "Henry taking the grapefruit".)
@ -898,7 +913,7 @@ a whole action might produce "Henry taking the grapefruit".)
<span class="plain-syntax">];</span>
</pre>
<nav role="progress"><div class="progresscontainer">
<ul class="progressbar"><li class="progressprev"><a href="S-ord.html">&#10094;</a></li><li class="progresssection"><a href="S-msc.html">msc</a></li><li class="progresssection"><a href="S-gll.html">gll</a></li><li class="progresssection"><a href="S-zmc.html">zmc</a></li><li class="progresssection"><a href="S-lgh.html">lgh</a></li><li class="progresssection"><a href="S-lst.html">lst</a></li><li class="progresssection"><a href="S-ord.html">ord</a></li><li class="progresscurrent">act</li><li class="progresssection"><a href="S-act2.html">act2</a></li><li class="progresssection"><a href="S-fgr.html">fgr</a></li><li class="progresssection"><a href="S-otf.html">otf</a></li><li class="progresssection"><a href="S-prn.html">prn</a></li><li class="progresssection"><a href="S-wrl.html">wrl</a></li><li class="progresssection"><a href="S-mpr.html">mpr</a></li><li class="progresssection"><a href="S-rtp.html">rtp</a></li><li class="progresssection"><a href="S-tm.html">tm</a></li><li class="progresssection"><a href="S-tst.html">tst</a></li><li class="progresssection"><a href="S-chr.html">chr</a></li><li class="progresssection"><a href="S-str.html">str</a></li><li class="progressnext"><a href="S-act2.html">&#10095;</a></li></ul></div>
<ul class="progressbar"><li class="progressprev"><a href="S-ord.html">&#10094;</a></li><li class="progresssection"><a href="S-msc.html">msc</a></li><li class="progresssection"><a href="S-stt.html">stt</a></li><li class="progresssection"><a href="S-lgh.html">lgh</a></li><li class="progresssection"><a href="S-lst.html">lst</a></li><li class="progresssection"><a href="S-ord.html">ord</a></li><li class="progresscurrent">act</li><li class="progresssection"><a href="S-act2.html">act2</a></li><li class="progresssection"><a href="S-fgr.html">fgr</a></li><li class="progresssection"><a href="S-otf.html">otf</a></li><li class="progresssection"><a href="S-prn.html">prn</a></li><li class="progresssection"><a href="S-wrl.html">wrl</a></li><li class="progresssection"><a href="S-mpr.html">mpr</a></li><li class="progresssection"><a href="S-rtp.html">rtp</a></li><li class="progresssection"><a href="S-tm.html">tm</a></li><li class="progresssection"><a href="S-tst.html">tst</a></li><li class="progresssection"><a href="S-chr.html">chr</a></li><li class="progresssection"><a href="S-str.html">str</a></li><li class="progressnext"><a href="S-act2.html">&#10095;</a></li></ul></div>
</nav><!--End of weave-->
</main>

View file

@ -222,7 +222,7 @@ activity must be being run by calling the three stages individually, and
<span class="plain-syntax">];</span>
</pre>
<nav role="progress"><div class="progresscontainer">
<ul class="progressbar"><li class="progressprev"><a href="S-act.html">&#10094;</a></li><li class="progresssection"><a href="S-msc.html">msc</a></li><li class="progresssection"><a href="S-gll.html">gll</a></li><li class="progresssection"><a href="S-zmc.html">zmc</a></li><li class="progresssection"><a href="S-lgh.html">lgh</a></li><li class="progresssection"><a href="S-lst.html">lst</a></li><li class="progresssection"><a href="S-ord.html">ord</a></li><li class="progresssection"><a href="S-act.html">act</a></li><li class="progresscurrent">act2</li><li class="progresssection"><a href="S-fgr.html">fgr</a></li><li class="progresssection"><a href="S-otf.html">otf</a></li><li class="progresssection"><a href="S-prn.html">prn</a></li><li class="progresssection"><a href="S-wrl.html">wrl</a></li><li class="progresssection"><a href="S-mpr.html">mpr</a></li><li class="progresssection"><a href="S-rtp.html">rtp</a></li><li class="progresssection"><a href="S-tm.html">tm</a></li><li class="progresssection"><a href="S-tst.html">tst</a></li><li class="progresssection"><a href="S-chr.html">chr</a></li><li class="progresssection"><a href="S-str.html">str</a></li><li class="progressnext"><a href="S-fgr.html">&#10095;</a></li></ul></div>
<ul class="progressbar"><li class="progressprev"><a href="S-act.html">&#10094;</a></li><li class="progresssection"><a href="S-msc.html">msc</a></li><li class="progresssection"><a href="S-stt.html">stt</a></li><li class="progresssection"><a href="S-lgh.html">lgh</a></li><li class="progresssection"><a href="S-lst.html">lst</a></li><li class="progresssection"><a href="S-ord.html">ord</a></li><li class="progresssection"><a href="S-act.html">act</a></li><li class="progresscurrent">act2</li><li class="progresssection"><a href="S-fgr.html">fgr</a></li><li class="progresssection"><a href="S-otf.html">otf</a></li><li class="progresssection"><a href="S-prn.html">prn</a></li><li class="progresssection"><a href="S-wrl.html">wrl</a></li><li class="progresssection"><a href="S-mpr.html">mpr</a></li><li class="progresssection"><a href="S-rtp.html">rtp</a></li><li class="progresssection"><a href="S-tm.html">tm</a></li><li class="progresssection"><a href="S-tst.html">tst</a></li><li class="progresssection"><a href="S-chr.html">chr</a></li><li class="progresssection"><a href="S-str.html">str</a></li><li class="progressnext"><a href="S-fgr.html">&#10095;</a></li></ul></div>
</nav><!--End of weave-->
</main>

View file

@ -347,7 +347,7 @@ can it zero the turns count for another action.
<span class="reserved-syntax">Array</span><span class="plain-syntax"> </span><span class="identifier-syntax">present_chronological_record</span><span class="plain-syntax">--&gt;(</span><span class="identifier-syntax">NO_PAST_TENSE_CONDS</span><span class="plain-syntax">+1);</span>
</pre>
<nav role="progress"><div class="progresscontainer">
<ul class="progressbar"><li class="progressprev"><a href="S-tst.html">&#10094;</a></li><li class="progresssection"><a href="S-msc.html">msc</a></li><li class="progresssection"><a href="S-gll.html">gll</a></li><li class="progresssection"><a href="S-zmc.html">zmc</a></li><li class="progresssection"><a href="S-lgh.html">lgh</a></li><li class="progresssection"><a href="S-lst.html">lst</a></li><li class="progresssection"><a href="S-ord.html">ord</a></li><li class="progresssection"><a href="S-act.html">act</a></li><li class="progresssection"><a href="S-act2.html">act2</a></li><li class="progresssection"><a href="S-fgr.html">fgr</a></li><li class="progresssection"><a href="S-otf.html">otf</a></li><li class="progresssection"><a href="S-prn.html">prn</a></li><li class="progresssection"><a href="S-wrl.html">wrl</a></li><li class="progresssection"><a href="S-mpr.html">mpr</a></li><li class="progresssection"><a href="S-rtp.html">rtp</a></li><li class="progresssection"><a href="S-tm.html">tm</a></li><li class="progresssection"><a href="S-tst.html">tst</a></li><li class="progresscurrent">chr</li><li class="progresssection"><a href="S-str.html">str</a></li><li class="progressnext"><a href="S-str.html">&#10095;</a></li></ul></div>
<ul class="progressbar"><li class="progressprev"><a href="S-tst.html">&#10094;</a></li><li class="progresssection"><a href="S-msc.html">msc</a></li><li class="progresssection"><a href="S-stt.html">stt</a></li><li class="progresssection"><a href="S-lgh.html">lgh</a></li><li class="progresssection"><a href="S-lst.html">lst</a></li><li class="progresssection"><a href="S-ord.html">ord</a></li><li class="progresssection"><a href="S-act.html">act</a></li><li class="progresssection"><a href="S-act2.html">act2</a></li><li class="progresssection"><a href="S-fgr.html">fgr</a></li><li class="progresssection"><a href="S-otf.html">otf</a></li><li class="progresssection"><a href="S-prn.html">prn</a></li><li class="progresssection"><a href="S-wrl.html">wrl</a></li><li class="progresssection"><a href="S-mpr.html">mpr</a></li><li class="progresssection"><a href="S-rtp.html">rtp</a></li><li class="progresssection"><a href="S-tm.html">tm</a></li><li class="progresssection"><a href="S-tst.html">tst</a></li><li class="progresscurrent">chr</li><li class="progresssection"><a href="S-str.html">str</a></li><li class="progressnext"><a href="S-str.html">&#10095;</a></li></ul></div>
</nav><!--End of weave-->
</main>

View file

@ -90,7 +90,7 @@ value "figure of cover".
<span class="plain-syntax">];</span>
</pre>
<nav role="progress"><div class="progresscontainer">
<ul class="progressbar"><li class="progressprev"><a href="S-act2.html">&#10094;</a></li><li class="progresssection"><a href="S-msc.html">msc</a></li><li class="progresssection"><a href="S-gll.html">gll</a></li><li class="progresssection"><a href="S-zmc.html">zmc</a></li><li class="progresssection"><a href="S-lgh.html">lgh</a></li><li class="progresssection"><a href="S-lst.html">lst</a></li><li class="progresssection"><a href="S-ord.html">ord</a></li><li class="progresssection"><a href="S-act.html">act</a></li><li class="progresssection"><a href="S-act2.html">act2</a></li><li class="progresscurrent">fgr</li><li class="progresssection"><a href="S-otf.html">otf</a></li><li class="progresssection"><a href="S-prn.html">prn</a></li><li class="progresssection"><a href="S-wrl.html">wrl</a></li><li class="progresssection"><a href="S-mpr.html">mpr</a></li><li class="progresssection"><a href="S-rtp.html">rtp</a></li><li class="progresssection"><a href="S-tm.html">tm</a></li><li class="progresssection"><a href="S-tst.html">tst</a></li><li class="progresssection"><a href="S-chr.html">chr</a></li><li class="progresssection"><a href="S-str.html">str</a></li><li class="progressnext"><a href="S-otf.html">&#10095;</a></li></ul></div>
<ul class="progressbar"><li class="progressprev"><a href="S-act2.html">&#10094;</a></li><li class="progresssection"><a href="S-msc.html">msc</a></li><li class="progresssection"><a href="S-stt.html">stt</a></li><li class="progresssection"><a href="S-lgh.html">lgh</a></li><li class="progresssection"><a href="S-lst.html">lst</a></li><li class="progresssection"><a href="S-ord.html">ord</a></li><li class="progresssection"><a href="S-act.html">act</a></li><li class="progresssection"><a href="S-act2.html">act2</a></li><li class="progresscurrent">fgr</li><li class="progresssection"><a href="S-otf.html">otf</a></li><li class="progresssection"><a href="S-prn.html">prn</a></li><li class="progresssection"><a href="S-wrl.html">wrl</a></li><li class="progresssection"><a href="S-mpr.html">mpr</a></li><li class="progresssection"><a href="S-rtp.html">rtp</a></li><li class="progresssection"><a href="S-tm.html">tm</a></li><li class="progresssection"><a href="S-tst.html">tst</a></li><li class="progresssection"><a href="S-chr.html">chr</a></li><li class="progresssection"><a href="S-str.html">str</a></li><li class="progressnext"><a href="S-otf.html">&#10095;</a></li></ul></div>
</nav><!--End of weave-->
</main>

View file

@ -1,272 +0,0 @@
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<title>Glulx Template</title>
<link href="../docs-assets/Breadcrumbs.css" rel="stylesheet" rev="stylesheet" type="text/css">
<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="../docs-assets/Contents.css" rel="stylesheet" rev="stylesheet" type="text/css">
<link href="../docs-assets/Progress.css" rel="stylesheet" rev="stylesheet" type="text/css">
<link href="../docs-assets/Navigation.css" rel="stylesheet" rev="stylesheet" type="text/css">
<link href="../docs-assets/Fonts.css" rel="stylesheet" rev="stylesheet" type="text/css">
<link href="../docs-assets/Base.css" rel="stylesheet" rev="stylesheet" type="text/css">
<link href="../docs-assets/Colours.css" rel="stylesheet" rev="stylesheet" type="text/css">
</head>
<body class="commentary-font">
<nav role="navigation">
<h1><a href="../index.html">
<img src="../docs-assets/Inform.png" height=72">
</a></h1>
<ul><li><a href="../index.html">home</a></li>
</ul><h2>Compiler</h2><ul>
<li><a href="../structure.html">structure</a></li>
<li><a href="../inbuildn.html">inbuild</a></li>
<li><a href="../inform7n.html">inform7</a></li>
<li><a href="../intern.html">inter</a></li>
<li><a href="../services.html">services</a></li>
<li><a href="../secrets.html">secrets</a></li>
</ul><h2>Other Tools</h2><ul>
<li><a href="../inblorbn.html">inblorb</a></li>
<li><a href="../indocn.html">indoc</a></li>
<li><a href="../inform6.html">inform6</a></li>
<li><a href="../inpolicyn.html">inpolicy</a></li>
<li><a href="../inrtpsn.html">inrtps</a></li>
</ul><h2>Resources</h2><ul>
<li><a href="../extensions.html">extensions</a></li>
<li><a href="../kits.html">kits</a></li>
</ul><h2>Repository</h2><ul>
<li><a href="https://github.com/ganelson/inform"><img src="../docs-assets/github.png" height=18> github</a></li>
</ul><h2>Related Projects</h2><ul>
<li><a href="../../../inweb/index.html">inweb</a></li>
<li><a href="../../../intest/index.html">intest</a></li>
</ul>
</nav>
<main role="main">
<!--Weave of 'Glulx Template' generated by Inweb-->
<div class="breadcrumbs">
<ul class="crumbs"><li><a href="../index.html">Home</a></li><li><a href="../extensions.html">Kits</a></li><li><a href="index.html">WorldModelKit</a></li><li><b>Glulx Template</b></li></ul></div>
<p class="purpose">To provide Glulx-specific actions.</p>
<ul class="toc"><li><a href="S-gll.html#SP1">&#167;1. Begin Glulx-only matter</a></li><li><a href="S-gll.html#SP2">&#167;2. GlkList Command</a></li><li><a href="S-gll.html#SP3">&#167;3. Quit The Game Rule</a></li><li><a href="S-gll.html#SP4">&#167;4. Restart The Game Rule</a></li><li><a href="S-gll.html#SP5">&#167;5. Restore The Game Rule</a></li><li><a href="S-gll.html#SP6">&#167;6. Save The Game Rule</a></li><li><a href="S-gll.html#SP7">&#167;7. Verify The Story File Rule</a></li><li><a href="S-gll.html#SP8">&#167;8. Switch Transcript On Rule</a></li><li><a href="S-gll.html#SP9">&#167;9. Switch Transcript Off Rule</a></li><li><a href="S-gll.html#SP10">&#167;10. Announce Story File Version Rule</a></li><li><a href="S-gll.html#SP11">&#167;11. Descend To Specific Action Rule</a></li><li><a href="S-gll.html#SP12">&#167;12. End Glulx-only matter</a></li></ul><hr class="tocbar">
<p class="commentary firstcommentary"><a id="SP1" class="paragraph-anchor"></a><b>&#167;1. Begin Glulx-only matter. </b></p>
<pre class="displayed-code all-displayed-code code-font">
<span class="plain-syntax">#</span><span class="identifier-syntax">Ifdef</span><span class="plain-syntax"> </span><span class="identifier-syntax">TARGET_GLULX</span><span class="plain-syntax">;</span>
</pre>
<p class="commentary firstcommentary"><a id="SP2" class="paragraph-anchor"></a><b>&#167;2. GlkList Command. </b>GLKLIST is a testing command best used by those who understand Glulx and its
ways: it isn't documented in the I7 manual, because it is pretty inscrutable
for "real" users, but it's probably worth keeping just the same.
</p>
<pre class="displayed-code all-displayed-code code-font">
<span class="plain-syntax">#</span><span class="identifier-syntax">Ifdef</span><span class="plain-syntax"> </span><span class="identifier-syntax">DEBUG</span><span class="plain-syntax">;</span>
<span class="plain-syntax">[ </span><span class="identifier-syntax">GlkListSub</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">GlkDebuggingList</span><span class="plain-syntax">();</span>
<span class="plain-syntax">];</span>
<span class="identifier-syntax">Verb</span><span class="plain-syntax"> </span><span class="identifier-syntax">meta</span><span class="plain-syntax"> </span><span class="character-syntax">'glklist'</span>
<span class="plain-syntax"> * -&gt; </span><span class="identifier-syntax">GlkList</span><span class="plain-syntax">;</span>
<span class="plain-syntax">#</span><span class="identifier-syntax">Endif</span><span class="plain-syntax">;</span>
</pre>
<p class="commentary firstcommentary"><a id="SP3" class="paragraph-anchor"></a><b>&#167;3. Quit The Game Rule. </b></p>
<pre class="displayed-code all-displayed-code code-font">
<span class="plain-syntax">[ </span><span class="identifier-syntax">QUIT_THE_GAME_R</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">actor</span><span class="plain-syntax"> ~= </span><span class="identifier-syntax">player</span><span class="plain-syntax">) </span><span class="reserved-syntax">rfalse</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">QUIT_THE_GAME_RM</span><span class="plain-syntax">(</span><span class="character-syntax">'A'</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">YesOrNo</span><span class="plain-syntax">()~=0) </span><span class="reserved-syntax">quit</span><span class="plain-syntax">;</span>
<span class="plain-syntax">];</span>
</pre>
<p class="commentary firstcommentary"><a id="SP4" class="paragraph-anchor"></a><b>&#167;4. Restart The Game Rule. </b></p>
<pre class="displayed-code all-displayed-code code-font">
<span class="plain-syntax">[ </span><span class="identifier-syntax">RESTART_THE_GAME_R</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">actor</span><span class="plain-syntax"> ~= </span><span class="identifier-syntax">player</span><span class="plain-syntax">) </span><span class="reserved-syntax">rfalse</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">RESTART_THE_GAME_RM</span><span class="plain-syntax">(</span><span class="character-syntax">'A'</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">YesOrNo</span><span class="plain-syntax">()~=0) {</span>
<span class="plain-syntax"> @</span><span class="identifier-syntax">restart</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">RESTART_THE_GAME_RM</span><span class="plain-syntax">(</span><span class="character-syntax">'B'</span><span class="plain-syntax">); </span><span class="reserved-syntax">new_line</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> }</span>
<span class="plain-syntax">];</span>
</pre>
<p class="commentary firstcommentary"><a id="SP5" class="paragraph-anchor"></a><b>&#167;5. Restore The Game Rule. </b></p>
<pre class="displayed-code all-displayed-code code-font">
<span class="plain-syntax">[ </span><span class="identifier-syntax">RESTORE_THE_GAME_R</span><span class="plain-syntax"> </span><span class="identifier-syntax">res</span><span class="plain-syntax"> </span><span class="identifier-syntax">fref</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">actor</span><span class="plain-syntax"> ~= </span><span class="identifier-syntax">player</span><span class="plain-syntax">) </span><span class="reserved-syntax">rfalse</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">fref</span><span class="plain-syntax"> = </span><span class="identifier-syntax">glk_fileref_create_by_prompt</span><span class="plain-syntax">(</span><span class="constant-syntax">$01</span><span class="plain-syntax">, </span><span class="constant-syntax">$02</span><span class="plain-syntax">, </span><span class="constant-syntax">0</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">fref</span><span class="plain-syntax"> == </span><span class="constant-syntax">0</span><span class="plain-syntax">) </span><span class="reserved-syntax">jump</span><span class="plain-syntax"> </span><span class="identifier-syntax">RFailed</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">gg_savestr</span><span class="plain-syntax"> = </span><span class="identifier-syntax">glk_stream_open_file</span><span class="plain-syntax">(</span><span class="identifier-syntax">fref</span><span class="plain-syntax">, </span><span class="constant-syntax">$02</span><span class="plain-syntax">, </span><span class="identifier-syntax">GG_SAVESTR_ROCK</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">glk_fileref_destroy</span><span class="plain-syntax">(</span><span class="identifier-syntax">fref</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">gg_savestr</span><span class="plain-syntax"> == </span><span class="constant-syntax">0</span><span class="plain-syntax">) </span><span class="reserved-syntax">jump</span><span class="plain-syntax"> </span><span class="identifier-syntax">RFailed</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> @</span><span class="reserved-syntax">restore</span><span class="plain-syntax"> </span><span class="identifier-syntax">gg_savestr</span><span class="plain-syntax"> </span><span class="identifier-syntax">res</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">glk_stream_close</span><span class="plain-syntax">(</span><span class="identifier-syntax">gg_savestr</span><span class="plain-syntax">, </span><span class="constant-syntax">0</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">gg_savestr</span><span class="plain-syntax"> = </span><span class="constant-syntax">0</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> .</span><span class="identifier-syntax">RFailed</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">RESTORE_THE_GAME_RM</span><span class="plain-syntax">(</span><span class="character-syntax">'A'</span><span class="plain-syntax">); </span><span class="reserved-syntax">new_line</span><span class="plain-syntax">;</span>
<span class="plain-syntax">];</span>
</pre>
<p class="commentary firstcommentary"><a id="SP6" class="paragraph-anchor"></a><b>&#167;6. Save The Game Rule. </b></p>
<pre class="displayed-code all-displayed-code code-font">
<span class="plain-syntax">[ </span><span class="identifier-syntax">SAVE_THE_GAME_R</span><span class="plain-syntax"> </span><span class="identifier-syntax">fref</span><span class="plain-syntax"> </span><span class="identifier-syntax">len</span><span class="plain-syntax"> </span><span class="identifier-syntax">res</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">actor</span><span class="plain-syntax"> ~= </span><span class="identifier-syntax">player</span><span class="plain-syntax">) </span><span class="reserved-syntax">rfalse</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">fref</span><span class="plain-syntax"> = </span><span class="identifier-syntax">glk_fileref_create_by_prompt</span><span class="plain-syntax">(</span><span class="identifier-syntax">fileusage_SavedGame</span><span class="plain-syntax">, </span><span class="identifier-syntax">filemode_Write</span><span class="plain-syntax">, </span><span class="constant-syntax">0</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">fref</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">gg_savestr</span><span class="plain-syntax"> = </span><span class="identifier-syntax">glk_stream_open_file</span><span class="plain-syntax">(</span><span class="identifier-syntax">fref</span><span class="plain-syntax">, </span><span class="identifier-syntax">filemode_Write</span><span class="plain-syntax">, </span><span class="identifier-syntax">GG_SAVESTR_ROCK</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">gg_savestr</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> @</span><span class="reserved-syntax">save</span><span class="plain-syntax"> </span><span class="identifier-syntax">gg_savestr</span><span class="plain-syntax"> </span><span class="identifier-syntax">res</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">res</span><span class="plain-syntax"> == -1) {</span>
<span class="plain-syntax"> </span><span class="comment-syntax">The player actually just typed "restore". We first have to recover</span>
<span class="plain-syntax"> </span><span class="comment-syntax">all the Glk objects; the values in our global variables are all wrong.</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">GGRecoverObjects</span><span class="plain-syntax">();</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">glk_stream_close</span><span class="plain-syntax">(</span><span class="identifier-syntax">gg_savestr</span><span class="plain-syntax">, </span><span class="identifier-syntax">GLK_NULL</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">gg_savestr</span><span class="plain-syntax"> = </span><span class="constant-syntax">0</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">RESTORE_THE_GAME_RM</span><span class="plain-syntax">(</span><span class="character-syntax">'B'</span><span class="plain-syntax">); </span><span class="reserved-syntax">new_line</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">rtrue</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> }</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">glk_stream_close</span><span class="plain-syntax">(</span><span class="identifier-syntax">gg_savestr</span><span class="plain-syntax">, </span><span class="identifier-syntax">GLK_NULL</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">gg_savestr</span><span class="plain-syntax"> = </span><span class="constant-syntax">0</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">res</span><span class="plain-syntax"> == </span><span class="constant-syntax">0</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="comment-syntax">Check that the savefile was actually written - this is mostly to account for browser limits in Parchment</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">glk_fileref_does_file_exist</span><span class="plain-syntax">(</span><span class="identifier-syntax">fref</span><span class="plain-syntax">)) {</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">gg_savestr</span><span class="plain-syntax"> = </span><span class="identifier-syntax">glk_stream_open_file</span><span class="plain-syntax">(</span><span class="identifier-syntax">fref</span><span class="plain-syntax">, </span><span class="identifier-syntax">filemode_Read</span><span class="plain-syntax">, </span><span class="identifier-syntax">GG_SAVESTR_ROCK</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">gg_savestr</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">glk_stream_set_position</span><span class="plain-syntax">(</span><span class="identifier-syntax">gg_savestr</span><span class="plain-syntax">, </span><span class="constant-syntax">0</span><span class="plain-syntax">, </span><span class="identifier-syntax">seekmode_End</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">len</span><span class="plain-syntax"> = </span><span class="identifier-syntax">glk_stream_get_position</span><span class="plain-syntax">(</span><span class="identifier-syntax">gg_savestr</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">glk_stream_close</span><span class="plain-syntax">(</span><span class="identifier-syntax">gg_savestr</span><span class="plain-syntax">, </span><span class="identifier-syntax">GLK_NULL</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">gg_savestr</span><span class="plain-syntax"> = </span><span class="constant-syntax">0</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">len</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="comment-syntax">We've confirmed the file exists and has content, which is about all we can do</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">SAVE_THE_GAME_RM</span><span class="plain-syntax">(</span><span class="character-syntax">'B'</span><span class="plain-syntax">); </span><span class="reserved-syntax">new_line</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">glk_fileref_destroy</span><span class="plain-syntax">(</span><span class="identifier-syntax">fref</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">rtrue</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> }</span>
<span class="plain-syntax"> </span><span class="comment-syntax">Cleanup the empty file</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">glk_fileref_delete_file</span><span class="plain-syntax">(</span><span class="identifier-syntax">fref</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> }</span>
<span class="plain-syntax"> }</span>
<span class="plain-syntax"> }</span>
<span class="plain-syntax"> }</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">glk_fileref_destroy</span><span class="plain-syntax">(</span><span class="identifier-syntax">fref</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> }</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">SAVE_THE_GAME_RM</span><span class="plain-syntax">(</span><span class="character-syntax">'A'</span><span class="plain-syntax">); </span><span class="reserved-syntax">new_line</span><span class="plain-syntax">;</span>
<span class="plain-syntax">];</span>
</pre>
<p class="commentary firstcommentary"><a id="SP7" class="paragraph-anchor"></a><b>&#167;7. Verify The Story File Rule. </b>This is a fossil now, really, but in the days of Infocom, the 110K story
file occupying an entire disc was a huge data set: floppy discs were by no
means a reliable medium, and cheap hardware often used hit-and-miss
components, as on the notorious Commodore 64 disc controller. If somebody
experienced an apparent bug in play, it could easily be that he had a
corrupt disc or was unable to read data of that density. So the VERIFY
command, which took up to ten minutes on some early computers, would chug
through the entire story file and compute a checksum, compare it against a
known result in the header, and determine that the story file could or
could not properly be read. The Z-machine provided this service as an
opcode, and so Glulx followed suit.
</p>
<pre class="displayed-code all-displayed-code code-font">
<span class="plain-syntax">[ </span><span class="identifier-syntax">VERIFY_THE_STORY_FILE_R</span><span class="plain-syntax"> </span><span class="identifier-syntax">res</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">actor</span><span class="plain-syntax"> ~= </span><span class="identifier-syntax">player</span><span class="plain-syntax">) </span><span class="reserved-syntax">rfalse</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> @</span><span class="identifier-syntax">verify</span><span class="plain-syntax"> </span><span class="identifier-syntax">res</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">res</span><span class="plain-syntax"> == </span><span class="constant-syntax">0</span><span class="plain-syntax">) { </span><span class="identifier-syntax">VERIFY_THE_STORY_FILE_RM</span><span class="plain-syntax">(</span><span class="character-syntax">'A'</span><span class="plain-syntax">); </span><span class="reserved-syntax">new_line</span><span class="plain-syntax">; </span><span class="reserved-syntax">rtrue</span><span class="plain-syntax">; }</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">VERIFY_THE_STORY_FILE_RM</span><span class="plain-syntax">(</span><span class="character-syntax">'B'</span><span class="plain-syntax">); </span><span class="reserved-syntax">new_line</span><span class="plain-syntax">;</span>
<span class="plain-syntax">];</span>
</pre>
<p class="commentary firstcommentary"><a id="SP8" class="paragraph-anchor"></a><b>&#167;8. Switch Transcript On Rule. </b></p>
<pre class="displayed-code all-displayed-code code-font">
<span class="plain-syntax">[ </span><span class="identifier-syntax">SWITCH_TRANSCRIPT_ON_R</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">actor</span><span class="plain-syntax"> ~= </span><span class="identifier-syntax">player</span><span class="plain-syntax">) </span><span class="reserved-syntax">rfalse</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">gg_scriptstr</span><span class="plain-syntax"> ~= </span><span class="constant-syntax">0</span><span class="plain-syntax">) { </span><span class="identifier-syntax">SWITCH_TRANSCRIPT_ON_RM</span><span class="plain-syntax">(</span><span class="character-syntax">'A'</span><span class="plain-syntax">); </span><span class="reserved-syntax">new_line</span><span class="plain-syntax">; </span><span class="reserved-syntax">rtrue</span><span class="plain-syntax">; }</span>
<span class="plain-syntax"> .</span><span class="identifier-syntax">S2Failed</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">gg_scriptfref</span><span class="plain-syntax"> == </span><span class="constant-syntax">0</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">gg_scriptfref</span><span class="plain-syntax"> = </span><span class="identifier-syntax">glk_fileref_create_by_prompt</span><span class="plain-syntax">(</span><span class="constant-syntax">$102</span><span class="plain-syntax">, </span><span class="constant-syntax">$05</span><span class="plain-syntax">, </span><span class="identifier-syntax">GG_SCRIPTFREF_ROCK</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">gg_scriptfref</span><span class="plain-syntax"> == </span><span class="constant-syntax">0</span><span class="plain-syntax">) </span><span class="reserved-syntax">jump</span><span class="plain-syntax"> </span><span class="identifier-syntax">S1Failed</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> }</span>
<span class="plain-syntax"> </span><span class="comment-syntax">stream_open_file</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">gg_scriptstr</span><span class="plain-syntax"> = </span><span class="identifier-syntax">glk_stream_open_file</span><span class="plain-syntax">(</span><span class="identifier-syntax">gg_scriptfref</span><span class="plain-syntax">, </span><span class="constant-syntax">$05</span><span class="plain-syntax">, </span><span class="identifier-syntax">GG_SCRIPTSTR_ROCK</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">gg_scriptstr</span><span class="plain-syntax"> == </span><span class="constant-syntax">0</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="comment-syntax">Could not open selected file; select again</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">glk_fileref_destroy</span><span class="plain-syntax">(</span><span class="identifier-syntax">gg_scriptfref</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">gg_scriptfref</span><span class="plain-syntax"> = </span><span class="constant-syntax">0</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">jump</span><span class="plain-syntax"> </span><span class="identifier-syntax">S2Failed</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> }</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">glk_window_set_echo_stream</span><span class="plain-syntax">(</span><span class="identifier-syntax">gg_mainwin</span><span class="plain-syntax">, </span><span class="identifier-syntax">gg_scriptstr</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">SWITCH_TRANSCRIPT_ON_RM</span><span class="plain-syntax">(</span><span class="character-syntax">'B'</span><span class="plain-syntax">); </span><span class="reserved-syntax">new_line</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">VersionSub</span><span class="plain-syntax">();</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> .</span><span class="identifier-syntax">S1Failed</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">SWITCH_TRANSCRIPT_ON_RM</span><span class="plain-syntax">(</span><span class="character-syntax">'C'</span><span class="plain-syntax">); </span><span class="reserved-syntax">new_line</span><span class="plain-syntax">;</span>
<span class="plain-syntax">];</span>
</pre>
<p class="commentary firstcommentary"><a id="SP9" class="paragraph-anchor"></a><b>&#167;9. Switch Transcript Off Rule. </b></p>
<pre class="displayed-code all-displayed-code code-font">
<span class="plain-syntax">[ </span><span class="identifier-syntax">SWITCH_TRANSCRIPT_OFF_R</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">actor</span><span class="plain-syntax"> ~= </span><span class="identifier-syntax">player</span><span class="plain-syntax">) </span><span class="reserved-syntax">rfalse</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">gg_scriptstr</span><span class="plain-syntax"> == </span><span class="constant-syntax">0</span><span class="plain-syntax">) { </span><span class="identifier-syntax">SWITCH_TRANSCRIPT_OFF_RM</span><span class="plain-syntax">(</span><span class="character-syntax">'A'</span><span class="plain-syntax">); </span><span class="reserved-syntax">new_line</span><span class="plain-syntax">; </span><span class="reserved-syntax">rtrue</span><span class="plain-syntax">; }</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">SWITCH_TRANSCRIPT_OFF_RM</span><span class="plain-syntax">(</span><span class="character-syntax">'B'</span><span class="plain-syntax">); </span><span class="reserved-syntax">new_line</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">glk_stream_close</span><span class="plain-syntax">(</span><span class="identifier-syntax">gg_scriptstr</span><span class="plain-syntax">, </span><span class="constant-syntax">0</span><span class="plain-syntax">); </span><span class="comment-syntax">stream_close</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">gg_scriptstr</span><span class="plain-syntax"> = </span><span class="constant-syntax">0</span><span class="plain-syntax">;</span>
<span class="plain-syntax">];</span>
</pre>
<p class="commentary firstcommentary"><a id="SP10" class="paragraph-anchor"></a><b>&#167;10. Announce Story File Version Rule. </b></p>
<pre class="displayed-code all-displayed-code code-font">
<span class="plain-syntax">[ </span><span class="identifier-syntax">ANNOUNCE_STORY_FILE_VERSION_R</span><span class="plain-syntax"> </span><span class="identifier-syntax">ix</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">actor</span><span class="plain-syntax"> ~= </span><span class="identifier-syntax">player</span><span class="plain-syntax">) </span><span class="reserved-syntax">rfalse</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Banner</span><span class="plain-syntax">();</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">print</span><span class="plain-syntax"> </span><span class="string-syntax">"Inform 7 v"</span><span class="plain-syntax">, (</span><span class="identifier-syntax">PrintI6Text</span><span class="plain-syntax">) </span><span class="identifier-syntax">I7_FULL_VERSION_NUMBER</span><span class="plain-syntax">, </span><span class="string-syntax">"^"</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">UUID_ARRAY</span><span class="plain-syntax">-&gt;0 &gt;= </span><span class="constant-syntax">6</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">print</span><span class="plain-syntax"> </span><span class="string-syntax">"Identification number: "</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">for</span><span class="plain-syntax"> (</span><span class="identifier-syntax">ix</span><span class="plain-syntax">=6: </span><span class="identifier-syntax">ix</span><span class="plain-syntax"> &lt;= </span><span class="identifier-syntax">UUID_ARRAY</span><span class="plain-syntax">-&gt;0: </span><span class="identifier-syntax">ix</span><span class="plain-syntax">++) </span><span class="reserved-syntax">print</span><span class="plain-syntax"> (</span><span class="identifier-syntax">char</span><span class="plain-syntax">) </span><span class="identifier-syntax">UUID_ARRAY</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">ix</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">print</span><span class="plain-syntax"> </span><span class="string-syntax">"^"</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> }</span>
<span class="plain-syntax"> @</span><span class="identifier-syntax">gestalt</span><span class="plain-syntax"> </span><span class="constant-syntax">1</span><span class="plain-syntax"> </span><span class="constant-syntax">0</span><span class="plain-syntax"> </span><span class="identifier-syntax">ix</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">print</span><span class="plain-syntax"> </span><span class="string-syntax">"Interpreter version "</span><span class="plain-syntax">, </span><span class="identifier-syntax">ix</span><span class="plain-syntax"> / </span><span class="constant-syntax">$10000</span><span class="plain-syntax">, </span><span class="string-syntax">"."</span><span class="plain-syntax">, (</span><span class="identifier-syntax">ix</span><span class="plain-syntax"> &amp; </span><span class="constant-syntax">$FF00</span><span class="plain-syntax">) / </span><span class="constant-syntax">$100</span><span class="plain-syntax">,</span>
<span class="plain-syntax"> </span><span class="string-syntax">"."</span><span class="plain-syntax">, </span><span class="identifier-syntax">ix</span><span class="plain-syntax"> &amp; </span><span class="constant-syntax">$FF</span><span class="plain-syntax">, </span><span class="string-syntax">" / "</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> @</span><span class="identifier-syntax">gestalt</span><span class="plain-syntax"> </span><span class="constant-syntax">0</span><span class="plain-syntax"> </span><span class="constant-syntax">0</span><span class="plain-syntax"> </span><span class="identifier-syntax">ix</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">print</span><span class="plain-syntax"> </span><span class="string-syntax">"VM "</span><span class="plain-syntax">, </span><span class="identifier-syntax">ix</span><span class="plain-syntax"> / </span><span class="constant-syntax">$10000</span><span class="plain-syntax">, </span><span class="string-syntax">"."</span><span class="plain-syntax">, (</span><span class="identifier-syntax">ix</span><span class="plain-syntax"> &amp; </span><span class="constant-syntax">$FF00</span><span class="plain-syntax">) / </span><span class="constant-syntax">$100</span><span class="plain-syntax">, </span><span class="string-syntax">"."</span><span class="plain-syntax">, </span><span class="identifier-syntax">ix</span><span class="plain-syntax"> &amp; </span><span class="constant-syntax">$FF</span><span class="plain-syntax">, </span><span class="string-syntax">"^"</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">ShowExtensionVersions</span><span class="plain-syntax">();</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">say__p</span><span class="plain-syntax"> = </span><span class="constant-syntax">1</span><span class="plain-syntax">;</span>
<span class="plain-syntax">];</span>
</pre>
<p class="commentary firstcommentary"><a id="SP11" class="paragraph-anchor"></a><b>&#167;11. Descend To Specific Action Rule. </b>There are 100 or so actions, typically, and this rule is for efficiency's
sake: rather than perform 100 or so comparisons to see which routine to
call, we indirect through a jump table. The routines called are the <span class="extract"><span class="extract-syntax">-Sub</span></span>
routines: thus, for instance, if <span class="extract"><span class="extract-syntax">action</span></span> is <span class="extract"><span class="extract-syntax">##Wait</span></span> then <span class="extract"><span class="extract-syntax">WaitSub</span></span> is
called. It is essential that this routine not be called for fake actions:
in I7 use this is guaranteed, since fake actions are not allowed into the
action machinery at all.
</p>
<p class="commentary">Strangely, Glulx's action routines table is numbered in an off-by-one way
compared to the Z-machine's: hence the <span class="extract"><span class="extract-syntax">+1</span></span>.
</p>
<pre class="displayed-code all-displayed-code code-font">
<span class="plain-syntax">[ </span><span class="identifier-syntax">DESCEND_TO_SPECIFIC_ACTION_R</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> ( #</span><span class="identifier-syntax">actions_table</span><span class="plain-syntax">--&gt;(</span><span class="identifier-syntax">action</span><span class="plain-syntax">+1) )();</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">rtrue</span><span class="plain-syntax">;</span>
<span class="plain-syntax">];</span>
</pre>
<p class="commentary firstcommentary"><a id="SP12" class="paragraph-anchor"></a><b>&#167;12. End Glulx-only matter. </b></p>
<pre class="displayed-code all-displayed-code code-font">
<span class="plain-syntax">#</span><span class="identifier-syntax">Endif</span><span class="plain-syntax">;</span>
</pre>
<nav role="progress"><div class="progresscontainer">
<ul class="progressbar"><li class="progressprev"><a href="S-msc.html">&#10094;</a></li><li class="progresssection"><a href="S-msc.html">msc</a></li><li class="progresscurrent">gll</li><li class="progresssection"><a href="S-zmc.html">zmc</a></li><li class="progresssection"><a href="S-lgh.html">lgh</a></li><li class="progresssection"><a href="S-lst.html">lst</a></li><li class="progresssection"><a href="S-ord.html">ord</a></li><li class="progresssection"><a href="S-act.html">act</a></li><li class="progresssection"><a href="S-act2.html">act2</a></li><li class="progresssection"><a href="S-fgr.html">fgr</a></li><li class="progresssection"><a href="S-otf.html">otf</a></li><li class="progresssection"><a href="S-prn.html">prn</a></li><li class="progresssection"><a href="S-wrl.html">wrl</a></li><li class="progresssection"><a href="S-mpr.html">mpr</a></li><li class="progresssection"><a href="S-rtp.html">rtp</a></li><li class="progresssection"><a href="S-tm.html">tm</a></li><li class="progresssection"><a href="S-tst.html">tst</a></li><li class="progresssection"><a href="S-chr.html">chr</a></li><li class="progresssection"><a href="S-str.html">str</a></li><li class="progressnext"><a href="S-zmc.html">&#10095;</a></li></ul></div>
</nav><!--End of weave-->
</main>
</body>
</html>

View file

@ -454,7 +454,7 @@ improbable.
<span class="plain-syntax">];</span>
</pre>
<nav role="progress"><div class="progresscontainer">
<ul class="progressbar"><li class="progressprev"><a href="S-zmc.html">&#10094;</a></li><li class="progresssection"><a href="S-msc.html">msc</a></li><li class="progresssection"><a href="S-gll.html">gll</a></li><li class="progresssection"><a href="S-zmc.html">zmc</a></li><li class="progresscurrent">lgh</li><li class="progresssection"><a href="S-lst.html">lst</a></li><li class="progresssection"><a href="S-ord.html">ord</a></li><li class="progresssection"><a href="S-act.html">act</a></li><li class="progresssection"><a href="S-act2.html">act2</a></li><li class="progresssection"><a href="S-fgr.html">fgr</a></li><li class="progresssection"><a href="S-otf.html">otf</a></li><li class="progresssection"><a href="S-prn.html">prn</a></li><li class="progresssection"><a href="S-wrl.html">wrl</a></li><li class="progresssection"><a href="S-mpr.html">mpr</a></li><li class="progresssection"><a href="S-rtp.html">rtp</a></li><li class="progresssection"><a href="S-tm.html">tm</a></li><li class="progresssection"><a href="S-tst.html">tst</a></li><li class="progresssection"><a href="S-chr.html">chr</a></li><li class="progresssection"><a href="S-str.html">str</a></li><li class="progressnext"><a href="S-lst.html">&#10095;</a></li></ul></div>
<ul class="progressbar"><li class="progressprev"><a href="S-stt.html">&#10094;</a></li><li class="progresssection"><a href="S-msc.html">msc</a></li><li class="progresssection"><a href="S-stt.html">stt</a></li><li class="progresscurrent">lgh</li><li class="progresssection"><a href="S-lst.html">lst</a></li><li class="progresssection"><a href="S-ord.html">ord</a></li><li class="progresssection"><a href="S-act.html">act</a></li><li class="progresssection"><a href="S-act2.html">act2</a></li><li class="progresssection"><a href="S-fgr.html">fgr</a></li><li class="progresssection"><a href="S-otf.html">otf</a></li><li class="progresssection"><a href="S-prn.html">prn</a></li><li class="progresssection"><a href="S-wrl.html">wrl</a></li><li class="progresssection"><a href="S-mpr.html">mpr</a></li><li class="progresssection"><a href="S-rtp.html">rtp</a></li><li class="progresssection"><a href="S-tm.html">tm</a></li><li class="progresssection"><a href="S-tst.html">tst</a></li><li class="progresssection"><a href="S-chr.html">chr</a></li><li class="progresssection"><a href="S-str.html">str</a></li><li class="progressnext"><a href="S-lst.html">&#10095;</a></li></ul></div>
</nav><!--End of weave-->
</main>

View file

@ -1148,7 +1148,7 @@ response texts used by the list-writer.
<span class="plain-syntax">];</span>
</pre>
<nav role="progress"><div class="progresscontainer">
<ul class="progressbar"><li class="progressprev"><a href="S-lgh.html">&#10094;</a></li><li class="progresssection"><a href="S-msc.html">msc</a></li><li class="progresssection"><a href="S-gll.html">gll</a></li><li class="progresssection"><a href="S-zmc.html">zmc</a></li><li class="progresssection"><a href="S-lgh.html">lgh</a></li><li class="progresscurrent">lst</li><li class="progresssection"><a href="S-ord.html">ord</a></li><li class="progresssection"><a href="S-act.html">act</a></li><li class="progresssection"><a href="S-act2.html">act2</a></li><li class="progresssection"><a href="S-fgr.html">fgr</a></li><li class="progresssection"><a href="S-otf.html">otf</a></li><li class="progresssection"><a href="S-prn.html">prn</a></li><li class="progresssection"><a href="S-wrl.html">wrl</a></li><li class="progresssection"><a href="S-mpr.html">mpr</a></li><li class="progresssection"><a href="S-rtp.html">rtp</a></li><li class="progresssection"><a href="S-tm.html">tm</a></li><li class="progresssection"><a href="S-tst.html">tst</a></li><li class="progresssection"><a href="S-chr.html">chr</a></li><li class="progresssection"><a href="S-str.html">str</a></li><li class="progressnext"><a href="S-ord.html">&#10095;</a></li></ul></div>
<ul class="progressbar"><li class="progressprev"><a href="S-lgh.html">&#10094;</a></li><li class="progresssection"><a href="S-msc.html">msc</a></li><li class="progresssection"><a href="S-stt.html">stt</a></li><li class="progresssection"><a href="S-lgh.html">lgh</a></li><li class="progresscurrent">lst</li><li class="progresssection"><a href="S-ord.html">ord</a></li><li class="progresssection"><a href="S-act.html">act</a></li><li class="progresssection"><a href="S-act2.html">act2</a></li><li class="progresssection"><a href="S-fgr.html">fgr</a></li><li class="progresssection"><a href="S-otf.html">otf</a></li><li class="progresssection"><a href="S-prn.html">prn</a></li><li class="progresssection"><a href="S-wrl.html">wrl</a></li><li class="progresssection"><a href="S-mpr.html">mpr</a></li><li class="progresssection"><a href="S-rtp.html">rtp</a></li><li class="progresssection"><a href="S-tm.html">tm</a></li><li class="progresssection"><a href="S-tst.html">tst</a></li><li class="progresssection"><a href="S-chr.html">chr</a></li><li class="progresssection"><a href="S-str.html">str</a></li><li class="progressnext"><a href="S-ord.html">&#10095;</a></li></ul></div>
</nav><!--End of weave-->
</main>

View file

@ -453,7 +453,7 @@ the direction of the shortest path from there to \(R_y\).
<span class="plain-syntax">];</span>
</pre>
<nav role="progress"><div class="progresscontainer">
<ul class="progressbar"><li class="progressprev"><a href="S-wrl.html">&#10094;</a></li><li class="progresssection"><a href="S-msc.html">msc</a></li><li class="progresssection"><a href="S-gll.html">gll</a></li><li class="progresssection"><a href="S-zmc.html">zmc</a></li><li class="progresssection"><a href="S-lgh.html">lgh</a></li><li class="progresssection"><a href="S-lst.html">lst</a></li><li class="progresssection"><a href="S-ord.html">ord</a></li><li class="progresssection"><a href="S-act.html">act</a></li><li class="progresssection"><a href="S-act2.html">act2</a></li><li class="progresssection"><a href="S-fgr.html">fgr</a></li><li class="progresssection"><a href="S-otf.html">otf</a></li><li class="progresssection"><a href="S-prn.html">prn</a></li><li class="progresssection"><a href="S-wrl.html">wrl</a></li><li class="progresscurrent">mpr</li><li class="progresssection"><a href="S-rtp.html">rtp</a></li><li class="progresssection"><a href="S-tm.html">tm</a></li><li class="progresssection"><a href="S-tst.html">tst</a></li><li class="progresssection"><a href="S-chr.html">chr</a></li><li class="progresssection"><a href="S-str.html">str</a></li><li class="progressnext"><a href="S-rtp.html">&#10095;</a></li></ul></div>
<ul class="progressbar"><li class="progressprev"><a href="S-wrl.html">&#10094;</a></li><li class="progresssection"><a href="S-msc.html">msc</a></li><li class="progresssection"><a href="S-stt.html">stt</a></li><li class="progresssection"><a href="S-lgh.html">lgh</a></li><li class="progresssection"><a href="S-lst.html">lst</a></li><li class="progresssection"><a href="S-ord.html">ord</a></li><li class="progresssection"><a href="S-act.html">act</a></li><li class="progresssection"><a href="S-act2.html">act2</a></li><li class="progresssection"><a href="S-fgr.html">fgr</a></li><li class="progresssection"><a href="S-otf.html">otf</a></li><li class="progresssection"><a href="S-prn.html">prn</a></li><li class="progresssection"><a href="S-wrl.html">wrl</a></li><li class="progresscurrent">mpr</li><li class="progresssection"><a href="S-rtp.html">rtp</a></li><li class="progresssection"><a href="S-tm.html">tm</a></li><li class="progresssection"><a href="S-tst.html">tst</a></li><li class="progresssection"><a href="S-chr.html">chr</a></li><li class="progresssection"><a href="S-str.html">str</a></li><li class="progressnext"><a href="S-rtp.html">&#10095;</a></li></ul></div>
</nav><!--End of weave-->
</main>

View file

@ -309,7 +309,7 @@ possibility later.
<span class="plain-syntax">];</span>
</pre>
<nav role="progress"><div class="progresscontainer">
<ul class="progressbar"><li class="progressprevoff">&#10094;</li><li class="progresscurrent">msc</li><li class="progresssection"><a href="S-gll.html">gll</a></li><li class="progresssection"><a href="S-zmc.html">zmc</a></li><li class="progresssection"><a href="S-lgh.html">lgh</a></li><li class="progresssection"><a href="S-lst.html">lst</a></li><li class="progresssection"><a href="S-ord.html">ord</a></li><li class="progresssection"><a href="S-act.html">act</a></li><li class="progresssection"><a href="S-act2.html">act2</a></li><li class="progresssection"><a href="S-fgr.html">fgr</a></li><li class="progresssection"><a href="S-otf.html">otf</a></li><li class="progresssection"><a href="S-prn.html">prn</a></li><li class="progresssection"><a href="S-wrl.html">wrl</a></li><li class="progresssection"><a href="S-mpr.html">mpr</a></li><li class="progresssection"><a href="S-rtp.html">rtp</a></li><li class="progresssection"><a href="S-tm.html">tm</a></li><li class="progresssection"><a href="S-tst.html">tst</a></li><li class="progresssection"><a href="S-chr.html">chr</a></li><li class="progresssection"><a href="S-str.html">str</a></li><li class="progressnext"><a href="S-gll.html">&#10095;</a></li></ul></div>
<ul class="progressbar"><li class="progressprevoff">&#10094;</li><li class="progresscurrent">msc</li><li class="progresssection"><a href="S-stt.html">stt</a></li><li class="progresssection"><a href="S-lgh.html">lgh</a></li><li class="progresssection"><a href="S-lst.html">lst</a></li><li class="progresssection"><a href="S-ord.html">ord</a></li><li class="progresssection"><a href="S-act.html">act</a></li><li class="progresssection"><a href="S-act2.html">act2</a></li><li class="progresssection"><a href="S-fgr.html">fgr</a></li><li class="progresssection"><a href="S-otf.html">otf</a></li><li class="progresssection"><a href="S-prn.html">prn</a></li><li class="progresssection"><a href="S-wrl.html">wrl</a></li><li class="progresssection"><a href="S-mpr.html">mpr</a></li><li class="progresssection"><a href="S-rtp.html">rtp</a></li><li class="progresssection"><a href="S-tm.html">tm</a></li><li class="progresssection"><a href="S-tst.html">tst</a></li><li class="progresssection"><a href="S-chr.html">chr</a></li><li class="progresssection"><a href="S-str.html">str</a></li><li class="progressnext"><a href="S-stt.html">&#10095;</a></li></ul></div>
</nav><!--End of weave-->
</main>

View file

@ -724,7 +724,7 @@ obituary" activity.
<span class="plain-syntax">];</span>
</pre>
<nav role="progress"><div class="progresscontainer">
<ul class="progressbar"><li class="progressprev"><a href="S-lst.html">&#10094;</a></li><li class="progresssection"><a href="S-msc.html">msc</a></li><li class="progresssection"><a href="S-gll.html">gll</a></li><li class="progresssection"><a href="S-zmc.html">zmc</a></li><li class="progresssection"><a href="S-lgh.html">lgh</a></li><li class="progresssection"><a href="S-lst.html">lst</a></li><li class="progresscurrent">ord</li><li class="progresssection"><a href="S-act.html">act</a></li><li class="progresssection"><a href="S-act2.html">act2</a></li><li class="progresssection"><a href="S-fgr.html">fgr</a></li><li class="progresssection"><a href="S-otf.html">otf</a></li><li class="progresssection"><a href="S-prn.html">prn</a></li><li class="progresssection"><a href="S-wrl.html">wrl</a></li><li class="progresssection"><a href="S-mpr.html">mpr</a></li><li class="progresssection"><a href="S-rtp.html">rtp</a></li><li class="progresssection"><a href="S-tm.html">tm</a></li><li class="progresssection"><a href="S-tst.html">tst</a></li><li class="progresssection"><a href="S-chr.html">chr</a></li><li class="progresssection"><a href="S-str.html">str</a></li><li class="progressnext"><a href="S-act.html">&#10095;</a></li></ul></div>
<ul class="progressbar"><li class="progressprev"><a href="S-lst.html">&#10094;</a></li><li class="progresssection"><a href="S-msc.html">msc</a></li><li class="progresssection"><a href="S-stt.html">stt</a></li><li class="progresssection"><a href="S-lgh.html">lgh</a></li><li class="progresssection"><a href="S-lst.html">lst</a></li><li class="progresscurrent">ord</li><li class="progresssection"><a href="S-act.html">act</a></li><li class="progresssection"><a href="S-act2.html">act2</a></li><li class="progresssection"><a href="S-fgr.html">fgr</a></li><li class="progresssection"><a href="S-otf.html">otf</a></li><li class="progresssection"><a href="S-prn.html">prn</a></li><li class="progresssection"><a href="S-wrl.html">wrl</a></li><li class="progresssection"><a href="S-mpr.html">mpr</a></li><li class="progresssection"><a href="S-rtp.html">rtp</a></li><li class="progresssection"><a href="S-tm.html">tm</a></li><li class="progresssection"><a href="S-tst.html">tst</a></li><li class="progresssection"><a href="S-chr.html">chr</a></li><li class="progresssection"><a href="S-str.html">str</a></li><li class="progressnext"><a href="S-act.html">&#10095;</a></li></ul></div>
</nav><!--End of weave-->
</main>

View file

@ -51,22 +51,9 @@
<ul class="crumbs"><li><a href="../index.html">Home</a></li><li><a href="../extensions.html">Kits</a></li><li><a href="index.html">WorldModelKit</a></li><li><b>OutOfWorld Template</b></li></ul></div>
<p class="purpose">To implement some of the out of world actions.</p>
<ul class="toc"><li><a href="S-otf.html#SP1">&#167;1. Perform Undo</a></li><li><a href="S-otf.html#SP2">&#167;2. Announce Score Rule</a></li><li><a href="S-otf.html#SP3">&#167;3. Switch Score Notification On Rule</a></li><li><a href="S-otf.html#SP4">&#167;4. Standard Report Switching Score Notification On Rule</a></li><li><a href="S-otf.html#SP5">&#167;5. Switch Score Notification Off Rule</a></li><li><a href="S-otf.html#SP6">&#167;6. Standard Report Switching Score Notification Off Rule</a></li><li><a href="S-otf.html#SP7">&#167;7. Prefer Sometimes Abbreviated Room Descriptions Rule</a></li><li><a href="S-otf.html#SP8">&#167;8. Standard Report Prefer Sometimes Abbreviated Room Descriptions Rule</a></li><li><a href="S-otf.html#SP9">&#167;9. Prefer Unabbreviated Room Descriptions Rule</a></li><li><a href="S-otf.html#SP10">&#167;10. Standard Report Prefer Unabbreviated Room Descriptions Rule</a></li><li><a href="S-otf.html#SP11">&#167;11. Prefer Abbreviated Room Descriptions Rule</a></li><li><a href="S-otf.html#SP12">&#167;12. Standard Report Prefer Abbreviated Room Descriptions Rule</a></li><li><a href="S-otf.html#SP13">&#167;13. Announce Pronoun Meanings Rule</a></li></ul><hr class="tocbar">
<ul class="toc"><li><a href="S-otf.html#SP1">&#167;1. Announce Score Rule</a></li><li><a href="S-otf.html#SP2">&#167;2. Switch Score Notification On Rule</a></li><li><a href="S-otf.html#SP3">&#167;3. Standard Report Switching Score Notification On Rule</a></li><li><a href="S-otf.html#SP4">&#167;4. Switch Score Notification Off Rule</a></li><li><a href="S-otf.html#SP5">&#167;5. Standard Report Switching Score Notification Off Rule</a></li><li><a href="S-otf.html#SP6">&#167;6. Prefer Sometimes Abbreviated Room Descriptions Rule</a></li><li><a href="S-otf.html#SP7">&#167;7. Standard Report Prefer Sometimes Abbreviated Room Descriptions Rule</a></li><li><a href="S-otf.html#SP8">&#167;8. Prefer Unabbreviated Room Descriptions Rule</a></li><li><a href="S-otf.html#SP9">&#167;9. Standard Report Prefer Unabbreviated Room Descriptions Rule</a></li><li><a href="S-otf.html#SP10">&#167;10. Prefer Abbreviated Room Descriptions Rule</a></li><li><a href="S-otf.html#SP11">&#167;11. Standard Report Prefer Abbreviated Room Descriptions Rule</a></li><li><a href="S-otf.html#SP12">&#167;12. Announce Pronoun Meanings Rule</a></li></ul><hr class="tocbar">
<p class="commentary firstcommentary"><a id="SP1" class="paragraph-anchor"></a><b>&#167;1. Perform Undo. </b></p>
<pre class="displayed-code all-displayed-code code-font">
<span class="plain-syntax">[ </span><span class="identifier-syntax">Perform_Undo</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">CommandParserKit</span><span class="plain-syntax">`</span><span class="identifier-syntax">UNDO_PREVENTION_CFGF</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">IMMEDIATELY_UNDO_RM</span><span class="plain-syntax">(</span><span class="character-syntax">'A'</span><span class="plain-syntax">); </span><span class="reserved-syntax">new_line</span><span class="plain-syntax">; </span><span class="reserved-syntax">return</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> }</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">IterationsOfTurnSequence</span><span class="plain-syntax"> == </span><span class="constant-syntax">0</span><span class="plain-syntax">) { </span><span class="identifier-syntax">IMMEDIATELY_UNDO_RM</span><span class="plain-syntax">(</span><span class="character-syntax">'B'</span><span class="plain-syntax">); </span><span class="reserved-syntax">new_line</span><span class="plain-syntax">; </span><span class="reserved-syntax">return</span><span class="plain-syntax">; }</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">undo_flag</span><span class="plain-syntax"> == </span><span class="constant-syntax">0</span><span class="plain-syntax">) { </span><span class="identifier-syntax">IMMEDIATELY_UNDO_RM</span><span class="plain-syntax">(</span><span class="character-syntax">'C'</span><span class="plain-syntax">); </span><span class="reserved-syntax">new_line</span><span class="plain-syntax">; </span><span class="reserved-syntax">return</span><span class="plain-syntax">; }</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">undo_flag</span><span class="plain-syntax"> == </span><span class="constant-syntax">1</span><span class="plain-syntax">) { </span><span class="identifier-syntax">IMMEDIATELY_UNDO_RM</span><span class="plain-syntax">(</span><span class="character-syntax">'D'</span><span class="plain-syntax">); </span><span class="reserved-syntax">new_line</span><span class="plain-syntax">; </span><span class="reserved-syntax">return</span><span class="plain-syntax">; }</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">VM_Undo</span><span class="plain-syntax">() == </span><span class="constant-syntax">0</span><span class="plain-syntax">) { </span><span class="identifier-syntax">IMMEDIATELY_UNDO_RM</span><span class="plain-syntax">(</span><span class="character-syntax">'F'</span><span class="plain-syntax">); </span><span class="reserved-syntax">new_line</span><span class="plain-syntax">; }</span>
<span class="plain-syntax">];</span>
</pre>
<p class="commentary firstcommentary"><a id="SP2" class="paragraph-anchor"></a><b>&#167;2. Announce Score Rule. </b></p>
<p class="commentary firstcommentary"><a id="SP1" class="paragraph-anchor"></a><b>&#167;1. Announce Score Rule. </b></p>
<pre class="displayed-code all-displayed-code code-font">
<span class="plain-syntax">[ </span><span class="identifier-syntax">ANNOUNCE_SCORE_R</span><span class="plain-syntax">;</span>
@ -78,7 +65,7 @@
<span class="plain-syntax"> }</span>
<span class="plain-syntax">];</span>
</pre>
<p class="commentary firstcommentary"><a id="SP3" class="paragraph-anchor"></a><b>&#167;3. Switch Score Notification On Rule. </b></p>
<p class="commentary firstcommentary"><a id="SP2" class="paragraph-anchor"></a><b>&#167;2. Switch Score Notification On Rule. </b></p>
<pre class="displayed-code all-displayed-code code-font">
<span class="plain-syntax">[ </span><span class="identifier-syntax">SWITCH_SCORE_NOTIFY_ON_R</span><span class="plain-syntax">;</span>
@ -87,7 +74,7 @@
<span class="plain-syntax"> </span><span class="reserved-syntax">else</span><span class="plain-syntax"> </span><span class="identifier-syntax">notify_mode</span><span class="plain-syntax">=1;</span>
<span class="plain-syntax">];</span>
</pre>
<p class="commentary firstcommentary"><a id="SP4" class="paragraph-anchor"></a><b>&#167;4. Standard Report Switching Score Notification On Rule. </b></p>
<p class="commentary firstcommentary"><a id="SP3" class="paragraph-anchor"></a><b>&#167;3. Standard Report Switching Score Notification On Rule. </b></p>
<pre class="displayed-code all-displayed-code code-font">
<span class="plain-syntax">[ </span><span class="identifier-syntax">REP_SWITCH_NOTIFY_ON_R</span><span class="plain-syntax">;</span>
@ -97,7 +84,7 @@
<span class="plain-syntax"> }</span>
<span class="plain-syntax">];</span>
</pre>
<p class="commentary firstcommentary"><a id="SP5" class="paragraph-anchor"></a><b>&#167;5. Switch Score Notification Off Rule. </b></p>
<p class="commentary firstcommentary"><a id="SP4" class="paragraph-anchor"></a><b>&#167;4. Switch Score Notification Off Rule. </b></p>
<pre class="displayed-code all-displayed-code code-font">
<span class="plain-syntax">[ </span><span class="identifier-syntax">SWITCH_SCORE_NOTIFY_OFF_R</span><span class="plain-syntax">;</span>
@ -106,7 +93,7 @@
<span class="plain-syntax"> </span><span class="reserved-syntax">else</span><span class="plain-syntax"> </span><span class="identifier-syntax">notify_mode</span><span class="plain-syntax">=0;</span>
<span class="plain-syntax">];</span>
</pre>
<p class="commentary firstcommentary"><a id="SP6" class="paragraph-anchor"></a><b>&#167;6. Standard Report Switching Score Notification Off Rule. </b></p>
<p class="commentary firstcommentary"><a id="SP5" class="paragraph-anchor"></a><b>&#167;5. Standard Report Switching Score Notification Off Rule. </b></p>
<pre class="displayed-code all-displayed-code code-font">
<span class="plain-syntax">[ </span><span class="identifier-syntax">REP_SWITCH_NOTIFY_OFF_R</span><span class="plain-syntax">;</span>
@ -116,7 +103,7 @@
<span class="plain-syntax"> }</span>
<span class="plain-syntax">];</span>
</pre>
<p class="commentary firstcommentary"><a id="SP7" class="paragraph-anchor"></a><b>&#167;7. Prefer Sometimes Abbreviated Room Descriptions Rule. </b></p>
<p class="commentary firstcommentary"><a id="SP6" class="paragraph-anchor"></a><b>&#167;6. Prefer Sometimes Abbreviated Room Descriptions Rule. </b></p>
<pre class="displayed-code all-displayed-code code-font">
<span class="plain-syntax">[ </span><span class="identifier-syntax">PREFER_SOMETIMES_ABBREVIATED_R</span><span class="plain-syntax">;</span>
@ -124,7 +111,7 @@
<span class="plain-syntax"> </span><span class="identifier-syntax">lookmode</span><span class="plain-syntax">=1;</span>
<span class="plain-syntax">]; </span><span class="comment-syntax">Brief</span>
</pre>
<p class="commentary firstcommentary"><a id="SP8" class="paragraph-anchor"></a><b>&#167;8. Standard Report Prefer Sometimes Abbreviated Room Descriptions Rule. </b></p>
<p class="commentary firstcommentary"><a id="SP7" class="paragraph-anchor"></a><b>&#167;7. Standard Report Prefer Sometimes Abbreviated Room Descriptions Rule. </b></p>
<pre class="displayed-code all-displayed-code code-font">
<span class="plain-syntax">[ </span><span class="identifier-syntax">REP_PREFER_SOMETIMES_ABBR_R</span><span class="plain-syntax">;</span>
@ -132,7 +119,7 @@
<span class="plain-syntax"> </span><span class="reserved-syntax">print</span><span class="plain-syntax"> (</span><span class="identifier-syntax">TEXT_TY_Say</span><span class="plain-syntax">) </span><span class="identifier-syntax">Story</span><span class="plain-syntax">; </span><span class="identifier-syntax">REP_PREFER_SOMETIMES_ABBR_RM</span><span class="plain-syntax">(</span><span class="character-syntax">'A'</span><span class="plain-syntax">); </span><span class="reserved-syntax">new_line</span><span class="plain-syntax">;</span>
<span class="plain-syntax">]; </span><span class="comment-syntax">Brief</span>
</pre>
<p class="commentary firstcommentary"><a id="SP9" class="paragraph-anchor"></a><b>&#167;9. Prefer Unabbreviated Room Descriptions Rule. </b></p>
<p class="commentary firstcommentary"><a id="SP8" class="paragraph-anchor"></a><b>&#167;8. Prefer Unabbreviated Room Descriptions Rule. </b></p>
<pre class="displayed-code all-displayed-code code-font">
<span class="plain-syntax">[ </span><span class="identifier-syntax">PREFER_UNABBREVIATED_R</span><span class="plain-syntax">;</span>
@ -140,7 +127,7 @@
<span class="plain-syntax"> </span><span class="identifier-syntax">lookmode</span><span class="plain-syntax">=2;</span>
<span class="plain-syntax">]; </span><span class="comment-syntax">Verbose</span>
</pre>
<p class="commentary firstcommentary"><a id="SP10" class="paragraph-anchor"></a><b>&#167;10. Standard Report Prefer Unabbreviated Room Descriptions Rule. </b></p>
<p class="commentary firstcommentary"><a id="SP9" class="paragraph-anchor"></a><b>&#167;9. Standard Report Prefer Unabbreviated Room Descriptions Rule. </b></p>
<pre class="displayed-code all-displayed-code code-font">
<span class="plain-syntax">[ </span><span class="identifier-syntax">REP_PREFER_UNABBREVIATED_R</span><span class="plain-syntax">;</span>
@ -148,7 +135,7 @@
<span class="plain-syntax"> </span><span class="reserved-syntax">print</span><span class="plain-syntax"> (</span><span class="identifier-syntax">TEXT_TY_Say</span><span class="plain-syntax">) </span><span class="identifier-syntax">Story</span><span class="plain-syntax">; </span><span class="identifier-syntax">REP_PREFER_UNABBREVIATED_RM</span><span class="plain-syntax">(</span><span class="character-syntax">'A'</span><span class="plain-syntax">); </span><span class="reserved-syntax">new_line</span><span class="plain-syntax">;</span>
<span class="plain-syntax">]; </span><span class="comment-syntax">Verbose</span>
</pre>
<p class="commentary firstcommentary"><a id="SP11" class="paragraph-anchor"></a><b>&#167;11. Prefer Abbreviated Room Descriptions Rule. </b></p>
<p class="commentary firstcommentary"><a id="SP10" class="paragraph-anchor"></a><b>&#167;10. Prefer Abbreviated Room Descriptions Rule. </b></p>
<pre class="displayed-code all-displayed-code code-font">
<span class="plain-syntax">[ </span><span class="identifier-syntax">PREFER_ABBREVIATED_R</span><span class="plain-syntax">;</span>
@ -156,7 +143,7 @@
<span class="plain-syntax"> </span><span class="identifier-syntax">lookmode</span><span class="plain-syntax">=3;</span>
<span class="plain-syntax">]; </span><span class="comment-syntax">Superbrief</span>
</pre>
<p class="commentary firstcommentary"><a id="SP12" class="paragraph-anchor"></a><b>&#167;12. Standard Report Prefer Abbreviated Room Descriptions Rule. </b></p>
<p class="commentary firstcommentary"><a id="SP11" class="paragraph-anchor"></a><b>&#167;11. Standard Report Prefer Abbreviated Room Descriptions Rule. </b></p>
<pre class="displayed-code all-displayed-code code-font">
<span class="plain-syntax">[ </span><span class="identifier-syntax">REP_PREFER_ABBREVIATED_R</span><span class="plain-syntax">;</span>
@ -164,7 +151,7 @@
<span class="plain-syntax"> </span><span class="reserved-syntax">print</span><span class="plain-syntax"> (</span><span class="identifier-syntax">TEXT_TY_Say</span><span class="plain-syntax">) </span><span class="identifier-syntax">Story</span><span class="plain-syntax">; </span><span class="identifier-syntax">REP_PREFER_ABBREVIATED_RM</span><span class="plain-syntax">(</span><span class="character-syntax">'A'</span><span class="plain-syntax">); </span><span class="reserved-syntax">new_line</span><span class="plain-syntax">;</span>
<span class="plain-syntax">]; </span><span class="comment-syntax">Superbrief</span>
</pre>
<p class="commentary firstcommentary"><a id="SP13" class="paragraph-anchor"></a><b>&#167;13. Announce Pronoun Meanings Rule. </b></p>
<p class="commentary firstcommentary"><a id="SP12" class="paragraph-anchor"></a><b>&#167;12. Announce Pronoun Meanings Rule. </b></p>
<pre class="displayed-code all-displayed-code code-font">
<span class="plain-syntax">[ </span><span class="identifier-syntax">ANNOUNCE_PRONOUN_MEANINGS_R</span><span class="plain-syntax"> </span><span class="identifier-syntax">x</span><span class="plain-syntax"> </span><span class="identifier-syntax">y</span><span class="plain-syntax"> </span><span class="identifier-syntax">c</span><span class="plain-syntax"> </span><span class="identifier-syntax">d</span><span class="plain-syntax">;</span>
@ -197,7 +184,7 @@
<span class="plain-syntax">];</span>
</pre>
<nav role="progress"><div class="progresscontainer">
<ul class="progressbar"><li class="progressprev"><a href="S-fgr.html">&#10094;</a></li><li class="progresssection"><a href="S-msc.html">msc</a></li><li class="progresssection"><a href="S-gll.html">gll</a></li><li class="progresssection"><a href="S-zmc.html">zmc</a></li><li class="progresssection"><a href="S-lgh.html">lgh</a></li><li class="progresssection"><a href="S-lst.html">lst</a></li><li class="progresssection"><a href="S-ord.html">ord</a></li><li class="progresssection"><a href="S-act.html">act</a></li><li class="progresssection"><a href="S-act2.html">act2</a></li><li class="progresssection"><a href="S-fgr.html">fgr</a></li><li class="progresscurrent">otf</li><li class="progresssection"><a href="S-prn.html">prn</a></li><li class="progresssection"><a href="S-wrl.html">wrl</a></li><li class="progresssection"><a href="S-mpr.html">mpr</a></li><li class="progresssection"><a href="S-rtp.html">rtp</a></li><li class="progresssection"><a href="S-tm.html">tm</a></li><li class="progresssection"><a href="S-tst.html">tst</a></li><li class="progresssection"><a href="S-chr.html">chr</a></li><li class="progresssection"><a href="S-str.html">str</a></li><li class="progressnext"><a href="S-prn.html">&#10095;</a></li></ul></div>
<ul class="progressbar"><li class="progressprev"><a href="S-fgr.html">&#10094;</a></li><li class="progresssection"><a href="S-msc.html">msc</a></li><li class="progresssection"><a href="S-stt.html">stt</a></li><li class="progresssection"><a href="S-lgh.html">lgh</a></li><li class="progresssection"><a href="S-lst.html">lst</a></li><li class="progresssection"><a href="S-ord.html">ord</a></li><li class="progresssection"><a href="S-act.html">act</a></li><li class="progresssection"><a href="S-act2.html">act2</a></li><li class="progresssection"><a href="S-fgr.html">fgr</a></li><li class="progresscurrent">otf</li><li class="progresssection"><a href="S-prn.html">prn</a></li><li class="progresssection"><a href="S-wrl.html">wrl</a></li><li class="progresssection"><a href="S-mpr.html">mpr</a></li><li class="progresssection"><a href="S-rtp.html">rtp</a></li><li class="progresssection"><a href="S-tm.html">tm</a></li><li class="progresssection"><a href="S-tst.html">tst</a></li><li class="progresssection"><a href="S-chr.html">chr</a></li><li class="progresssection"><a href="S-str.html">str</a></li><li class="progressnext"><a href="S-prn.html">&#10095;</a></li></ul></div>
</nav><!--End of weave-->
</main>

View file

@ -500,7 +500,7 @@ is the default "for" rule for that activity:
<span class="plain-syntax">];</span>
</pre>
<nav role="progress"><div class="progresscontainer">
<ul class="progressbar"><li class="progressprev"><a href="S-otf.html">&#10094;</a></li><li class="progresssection"><a href="S-msc.html">msc</a></li><li class="progresssection"><a href="S-gll.html">gll</a></li><li class="progresssection"><a href="S-zmc.html">zmc</a></li><li class="progresssection"><a href="S-lgh.html">lgh</a></li><li class="progresssection"><a href="S-lst.html">lst</a></li><li class="progresssection"><a href="S-ord.html">ord</a></li><li class="progresssection"><a href="S-act.html">act</a></li><li class="progresssection"><a href="S-act2.html">act2</a></li><li class="progresssection"><a href="S-fgr.html">fgr</a></li><li class="progresssection"><a href="S-otf.html">otf</a></li><li class="progresscurrent">prn</li><li class="progresssection"><a href="S-wrl.html">wrl</a></li><li class="progresssection"><a href="S-mpr.html">mpr</a></li><li class="progresssection"><a href="S-rtp.html">rtp</a></li><li class="progresssection"><a href="S-tm.html">tm</a></li><li class="progresssection"><a href="S-tst.html">tst</a></li><li class="progresssection"><a href="S-chr.html">chr</a></li><li class="progresssection"><a href="S-str.html">str</a></li><li class="progressnext"><a href="S-wrl.html">&#10095;</a></li></ul></div>
<ul class="progressbar"><li class="progressprev"><a href="S-otf.html">&#10094;</a></li><li class="progresssection"><a href="S-msc.html">msc</a></li><li class="progresssection"><a href="S-stt.html">stt</a></li><li class="progresssection"><a href="S-lgh.html">lgh</a></li><li class="progresssection"><a href="S-lst.html">lst</a></li><li class="progresssection"><a href="S-ord.html">ord</a></li><li class="progresssection"><a href="S-act.html">act</a></li><li class="progresssection"><a href="S-act2.html">act2</a></li><li class="progresssection"><a href="S-fgr.html">fgr</a></li><li class="progresssection"><a href="S-otf.html">otf</a></li><li class="progresscurrent">prn</li><li class="progresssection"><a href="S-wrl.html">wrl</a></li><li class="progresssection"><a href="S-mpr.html">mpr</a></li><li class="progresssection"><a href="S-rtp.html">rtp</a></li><li class="progresssection"><a href="S-tm.html">tm</a></li><li class="progresssection"><a href="S-tst.html">tst</a></li><li class="progresssection"><a href="S-chr.html">chr</a></li><li class="progresssection"><a href="S-str.html">str</a></li><li class="progressnext"><a href="S-wrl.html">&#10095;</a></li></ul></div>
</nav><!--End of weave-->
</main>

View file

@ -135,7 +135,7 @@
<span class="plain-syntax">];</span>
</pre>
<nav role="progress"><div class="progresscontainer">
<ul class="progressbar"><li class="progressprev"><a href="S-mpr.html">&#10094;</a></li><li class="progresssection"><a href="S-msc.html">msc</a></li><li class="progresssection"><a href="S-gll.html">gll</a></li><li class="progresssection"><a href="S-zmc.html">zmc</a></li><li class="progresssection"><a href="S-lgh.html">lgh</a></li><li class="progresssection"><a href="S-lst.html">lst</a></li><li class="progresssection"><a href="S-ord.html">ord</a></li><li class="progresssection"><a href="S-act.html">act</a></li><li class="progresssection"><a href="S-act2.html">act2</a></li><li class="progresssection"><a href="S-fgr.html">fgr</a></li><li class="progresssection"><a href="S-otf.html">otf</a></li><li class="progresssection"><a href="S-prn.html">prn</a></li><li class="progresssection"><a href="S-wrl.html">wrl</a></li><li class="progresssection"><a href="S-mpr.html">mpr</a></li><li class="progresscurrent">rtp</li><li class="progresssection"><a href="S-tm.html">tm</a></li><li class="progresssection"><a href="S-tst.html">tst</a></li><li class="progresssection"><a href="S-chr.html">chr</a></li><li class="progresssection"><a href="S-str.html">str</a></li><li class="progressnext"><a href="S-tm.html">&#10095;</a></li></ul></div>
<ul class="progressbar"><li class="progressprev"><a href="S-mpr.html">&#10094;</a></li><li class="progresssection"><a href="S-msc.html">msc</a></li><li class="progresssection"><a href="S-stt.html">stt</a></li><li class="progresssection"><a href="S-lgh.html">lgh</a></li><li class="progresssection"><a href="S-lst.html">lst</a></li><li class="progresssection"><a href="S-ord.html">ord</a></li><li class="progresssection"><a href="S-act.html">act</a></li><li class="progresssection"><a href="S-act2.html">act2</a></li><li class="progresssection"><a href="S-fgr.html">fgr</a></li><li class="progresssection"><a href="S-otf.html">otf</a></li><li class="progresssection"><a href="S-prn.html">prn</a></li><li class="progresssection"><a href="S-wrl.html">wrl</a></li><li class="progresssection"><a href="S-mpr.html">mpr</a></li><li class="progresscurrent">rtp</li><li class="progresssection"><a href="S-tm.html">tm</a></li><li class="progresssection"><a href="S-tst.html">tst</a></li><li class="progresssection"><a href="S-chr.html">chr</a></li><li class="progresssection"><a href="S-str.html">str</a></li><li class="progressnext"><a href="S-tm.html">&#10095;</a></li></ul></div>
</nav><!--End of weave-->
</main>

View file

@ -436,7 +436,7 @@ either silently or not.
<span class="plain-syntax">];</span>
</pre>
<nav role="progress"><div class="progresscontainer">
<ul class="progressbar"><li class="progressprev"><a href="S-chr.html">&#10094;</a></li><li class="progresssection"><a href="S-msc.html">msc</a></li><li class="progresssection"><a href="S-gll.html">gll</a></li><li class="progresssection"><a href="S-zmc.html">zmc</a></li><li class="progresssection"><a href="S-lgh.html">lgh</a></li><li class="progresssection"><a href="S-lst.html">lst</a></li><li class="progresssection"><a href="S-ord.html">ord</a></li><li class="progresssection"><a href="S-act.html">act</a></li><li class="progresssection"><a href="S-act2.html">act2</a></li><li class="progresssection"><a href="S-fgr.html">fgr</a></li><li class="progresssection"><a href="S-otf.html">otf</a></li><li class="progresssection"><a href="S-prn.html">prn</a></li><li class="progresssection"><a href="S-wrl.html">wrl</a></li><li class="progresssection"><a href="S-mpr.html">mpr</a></li><li class="progresssection"><a href="S-rtp.html">rtp</a></li><li class="progresssection"><a href="S-tm.html">tm</a></li><li class="progresssection"><a href="S-tst.html">tst</a></li><li class="progresssection"><a href="S-chr.html">chr</a></li><li class="progresscurrent">str</li><li class="progressnextoff">&#10095;</li></ul></div>
<ul class="progressbar"><li class="progressprev"><a href="S-chr.html">&#10094;</a></li><li class="progresssection"><a href="S-msc.html">msc</a></li><li class="progresssection"><a href="S-stt.html">stt</a></li><li class="progresssection"><a href="S-lgh.html">lgh</a></li><li class="progresssection"><a href="S-lst.html">lst</a></li><li class="progresssection"><a href="S-ord.html">ord</a></li><li class="progresssection"><a href="S-act.html">act</a></li><li class="progresssection"><a href="S-act2.html">act2</a></li><li class="progresssection"><a href="S-fgr.html">fgr</a></li><li class="progresssection"><a href="S-otf.html">otf</a></li><li class="progresssection"><a href="S-prn.html">prn</a></li><li class="progresssection"><a href="S-wrl.html">wrl</a></li><li class="progresssection"><a href="S-mpr.html">mpr</a></li><li class="progresssection"><a href="S-rtp.html">rtp</a></li><li class="progresssection"><a href="S-tm.html">tm</a></li><li class="progresssection"><a href="S-tst.html">tst</a></li><li class="progresssection"><a href="S-chr.html">chr</a></li><li class="progresscurrent">str</li><li class="progressnextoff">&#10095;</li></ul></div>
</nav><!--End of weave-->
</main>

View file

@ -1,7 +1,7 @@
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<title>ZMachine Template</title>
<title>State Template</title>
<link href="../docs-assets/Breadcrumbs.css" rel="stylesheet" rev="stylesheet" type="text/css">
<meta name="viewport" content="width=device-width initial-scale=1">
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
@ -46,19 +46,14 @@
</ul>
</nav>
<main role="main">
<!--Weave of 'ZMachine Template' generated by Inweb-->
<!--Weave of 'State Template' generated by Inweb-->
<div class="breadcrumbs">
<ul class="crumbs"><li><a href="../index.html">Home</a></li><li><a href="../extensions.html">Kits</a></li><li><a href="index.html">WorldModelKit</a></li><li><b>ZMachine Template</b></li></ul></div>
<p class="purpose">To provide Z-specific actions.</p>
<ul class="crumbs"><li><a href="../index.html">Home</a></li><li><a href="../extensions.html">Kits</a></li><li><a href="index.html">WorldModelKit</a></li><li><b>State Template</b></li></ul></div>
<p class="purpose">To implement out of world actions relating to the program state.</p>
<ul class="toc"><li><a href="S-zmc.html#SP1">&#167;1. Begin Z-only matter</a></li><li><a href="S-zmc.html#SP2">&#167;2. Quit The Game Rule</a></li><li><a href="S-zmc.html#SP3">&#167;3. Restart The Game Rule</a></li><li><a href="S-zmc.html#SP4">&#167;4. Restore The Game Rule</a></li><li><a href="S-zmc.html#SP5">&#167;5. Save The Game Rule</a></li><li><a href="S-zmc.html#SP6">&#167;6. Verify The Story File Rule</a></li><li><a href="S-zmc.html#SP7">&#167;7. Switch Transcript On Rule</a></li><li><a href="S-zmc.html#SP8">&#167;8. Switch Transcript Off Rule</a></li><li><a href="S-zmc.html#SP9">&#167;9. Announce Story File Version Rule</a></li><li><a href="S-zmc.html#SP10">&#167;10. Descend To Specific Action Rule</a></li><li><a href="S-zmc.html#SP11">&#167;11. End Z-only matter</a></li></ul><hr class="tocbar">
<ul class="toc"><li><a href="S-stt.html#SP1">&#167;1. Quit The Game Rule</a></li><li><a href="S-stt.html#SP2">&#167;2. Restart The Game Rule</a></li><li><a href="S-stt.html#SP3">&#167;3. Restore The Game Rule</a></li><li><a href="S-stt.html#SP4">&#167;4. Save The Game Rule</a></li><li><a href="S-stt.html#SP5">&#167;5. Perform Undo</a></li><li><a href="S-stt.html#SP6">&#167;6. Verify The Story File Rule</a></li><li><a href="S-stt.html#SP7">&#167;7. Switch Transcript On Rule</a></li><li><a href="S-stt.html#SP8">&#167;8. Switch Transcript Off Rule</a></li><li><a href="S-stt.html#SP9">&#167;9. Announce Story File Version Rule</a></li></ul><hr class="tocbar">
<p class="commentary firstcommentary"><a id="SP1" class="paragraph-anchor"></a><b>&#167;1. Begin Z-only matter. </b></p>
<pre class="displayed-code all-displayed-code code-font">
<span class="plain-syntax">#</span><span class="identifier-syntax">Ifdef</span><span class="plain-syntax"> </span><span class="identifier-syntax">TARGET_ZCODE</span><span class="plain-syntax">;</span>
</pre>
<p class="commentary firstcommentary"><a id="SP2" class="paragraph-anchor"></a><b>&#167;2. Quit The Game Rule. </b></p>
<p class="commentary firstcommentary"><a id="SP1" class="paragraph-anchor"></a><b>&#167;1. Quit The Game Rule. </b></p>
<pre class="displayed-code all-displayed-code code-font">
<span class="plain-syntax">[ </span><span class="identifier-syntax">QUIT_THE_GAME_R</span><span class="plain-syntax">;</span>
@ -67,42 +62,55 @@
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">YesOrNo</span><span class="plain-syntax">()~=0) </span><span class="reserved-syntax">quit</span><span class="plain-syntax">;</span>
<span class="plain-syntax">];</span>
</pre>
<p class="commentary firstcommentary"><a id="SP3" class="paragraph-anchor"></a><b>&#167;3. Restart The Game Rule. </b></p>
<p class="commentary firstcommentary"><a id="SP2" class="paragraph-anchor"></a><b>&#167;2. Restart The Game Rule. </b></p>
<pre class="displayed-code all-displayed-code code-font">
<span class="plain-syntax">[ </span><span class="identifier-syntax">RESTART_THE_GAME_R</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">actor</span><span class="plain-syntax"> ~= </span><span class="identifier-syntax">player</span><span class="plain-syntax">) </span><span class="reserved-syntax">rfalse</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">RESTART_THE_GAME_RM</span><span class="plain-syntax">(</span><span class="character-syntax">'A'</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">YesOrNo</span><span class="plain-syntax">()~=0) {</span>
<span class="plain-syntax"> @</span><span class="identifier-syntax">restart</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">VM_Restart</span><span class="plain-syntax">();</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">RESTART_THE_GAME_RM</span><span class="plain-syntax">(</span><span class="character-syntax">'B'</span><span class="plain-syntax">); </span><span class="reserved-syntax">new_line</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> }</span>
<span class="plain-syntax">];</span>
</pre>
<p class="commentary firstcommentary"><a id="SP4" class="paragraph-anchor"></a><b>&#167;4. Restore The Game Rule. </b></p>
<p class="commentary firstcommentary"><a id="SP3" class="paragraph-anchor"></a><b>&#167;3. Restore The Game Rule. </b></p>
<pre class="displayed-code all-displayed-code code-font">
<span class="plain-syntax">[ </span><span class="identifier-syntax">RESTORE_THE_GAME_R</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">actor</span><span class="plain-syntax"> ~= </span><span class="identifier-syntax">player</span><span class="plain-syntax">) </span><span class="reserved-syntax">rfalse</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">restore</span><span class="plain-syntax"> </span><span class="identifier-syntax">RMaybe</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">RESTORE_THE_GAME_RM</span><span class="plain-syntax">(</span><span class="character-syntax">'A'</span><span class="plain-syntax">); </span><span class="reserved-syntax">new_line</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">rtrue</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> .</span><span class="identifier-syntax">RMaybe</span><span class="plain-syntax">; </span><span class="identifier-syntax">RESTORE_THE_GAME_RM</span><span class="plain-syntax">(</span><span class="character-syntax">'B'</span><span class="plain-syntax">); </span><span class="reserved-syntax">new_line</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">VM_Restore</span><span class="plain-syntax">()) {</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">RESTORE_THE_GAME_RM</span><span class="plain-syntax">(</span><span class="character-syntax">'B'</span><span class="plain-syntax">); </span><span class="reserved-syntax">new_line</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> } </span><span class="reserved-syntax">else</span><span class="plain-syntax"> {</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">RESTORE_THE_GAME_RM</span><span class="plain-syntax">(</span><span class="character-syntax">'A'</span><span class="plain-syntax">); </span><span class="reserved-syntax">new_line</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> }</span>
<span class="plain-syntax">];</span>
</pre>
<p class="commentary firstcommentary"><a id="SP5" class="paragraph-anchor"></a><b>&#167;5. Save The Game Rule. </b></p>
<p class="commentary firstcommentary"><a id="SP4" class="paragraph-anchor"></a><b>&#167;4. Save The Game Rule. </b></p>
<pre class="displayed-code all-displayed-code code-font">
<span class="plain-syntax">[ </span><span class="identifier-syntax">SAVE_THE_GAME_R</span><span class="plain-syntax"> </span><span class="identifier-syntax">flag</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">actor</span><span class="plain-syntax"> ~= </span><span class="identifier-syntax">player</span><span class="plain-syntax">) </span><span class="reserved-syntax">rfalse</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> @</span><span class="reserved-syntax">save</span><span class="plain-syntax"> -&gt; </span><span class="identifier-syntax">flag</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">switch</span><span class="plain-syntax"> (</span><span class="identifier-syntax">flag</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">switch</span><span class="plain-syntax"> (</span><span class="identifier-syntax">VM_Save</span><span class="plain-syntax">()) {</span>
<span class="plain-syntax"> </span><span class="constant-syntax">0</span><span class="plain-syntax">: </span><span class="identifier-syntax">SAVE_THE_GAME_RM</span><span class="plain-syntax">(</span><span class="character-syntax">'A'</span><span class="plain-syntax">); </span><span class="reserved-syntax">new_line</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="constant-syntax">1</span><span class="plain-syntax">: </span><span class="identifier-syntax">SAVE_THE_GAME_RM</span><span class="plain-syntax">(</span><span class="character-syntax">'B'</span><span class="plain-syntax">); </span><span class="reserved-syntax">new_line</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="constant-syntax">2</span><span class="plain-syntax">: </span><span class="identifier-syntax">RESTORE_THE_GAME_RM</span><span class="plain-syntax">(</span><span class="character-syntax">'B'</span><span class="plain-syntax">); </span><span class="reserved-syntax">new_line</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> }</span>
<span class="plain-syntax">];</span>
</pre>
<p class="commentary firstcommentary"><a id="SP5" class="paragraph-anchor"></a><b>&#167;5. Perform Undo. </b></p>
<pre class="displayed-code all-displayed-code code-font">
<span class="plain-syntax">[ </span><span class="identifier-syntax">Perform_Undo</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">CommandParserKit</span><span class="plain-syntax">`</span><span class="identifier-syntax">UNDO_PREVENTION_CFGF</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">IMMEDIATELY_UNDO_RM</span><span class="plain-syntax">(</span><span class="character-syntax">'A'</span><span class="plain-syntax">); </span><span class="reserved-syntax">new_line</span><span class="plain-syntax">; </span><span class="reserved-syntax">return</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> }</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">IterationsOfTurnSequence</span><span class="plain-syntax"> == </span><span class="constant-syntax">0</span><span class="plain-syntax">) { </span><span class="identifier-syntax">IMMEDIATELY_UNDO_RM</span><span class="plain-syntax">(</span><span class="character-syntax">'B'</span><span class="plain-syntax">); </span><span class="reserved-syntax">new_line</span><span class="plain-syntax">; </span><span class="reserved-syntax">return</span><span class="plain-syntax">; }</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">undo_flag</span><span class="plain-syntax"> == </span><span class="constant-syntax">0</span><span class="plain-syntax">) { </span><span class="identifier-syntax">IMMEDIATELY_UNDO_RM</span><span class="plain-syntax">(</span><span class="character-syntax">'C'</span><span class="plain-syntax">); </span><span class="reserved-syntax">new_line</span><span class="plain-syntax">; </span><span class="reserved-syntax">return</span><span class="plain-syntax">; }</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">undo_flag</span><span class="plain-syntax"> == </span><span class="constant-syntax">1</span><span class="plain-syntax">) { </span><span class="identifier-syntax">IMMEDIATELY_UNDO_RM</span><span class="plain-syntax">(</span><span class="character-syntax">'D'</span><span class="plain-syntax">); </span><span class="reserved-syntax">new_line</span><span class="plain-syntax">; </span><span class="reserved-syntax">return</span><span class="plain-syntax">; }</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">VM_Undo</span><span class="plain-syntax">() == </span><span class="constant-syntax">0</span><span class="plain-syntax">) { </span><span class="identifier-syntax">IMMEDIATELY_UNDO_RM</span><span class="plain-syntax">(</span><span class="character-syntax">'F'</span><span class="plain-syntax">); </span><span class="reserved-syntax">new_line</span><span class="plain-syntax">; }</span>
<span class="plain-syntax">];</span>
</pre>
<p class="commentary firstcommentary"><a id="SP6" class="paragraph-anchor"></a><b>&#167;6. Verify The Story File Rule. </b>This is a fossil now, really, but in the days of Infocom, the 110K story
file occupying an entire disc was a huge data set: floppy discs were by no
means a reliable medium, and cheap hardware often used hit-and-miss
@ -112,18 +120,14 @@ corrupt disc or was unable to read data of that density. So the VERIFY
command, which took up to ten minutes on some early computers, would chug
through the entire story file and compute a checksum, compare it against a
known result in the header, and determine that the story file could or
could not properly be read. The Z-machine provided this service as an
opcode, and so Glulx followed suit.
could not properly be read.
</p>
<pre class="displayed-code all-displayed-code code-font">
<span class="plain-syntax">[ </span><span class="identifier-syntax">VERIFY_THE_STORY_FILE_R</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">actor</span><span class="plain-syntax"> ~= </span><span class="identifier-syntax">player</span><span class="plain-syntax">) </span><span class="reserved-syntax">rfalse</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> @</span><span class="identifier-syntax">verify</span><span class="plain-syntax"> ?</span><span class="identifier-syntax">Vmaybe</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">jump</span><span class="plain-syntax"> </span><span class="identifier-syntax">Vwrong</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> .</span><span class="identifier-syntax">Vmaybe</span><span class="plain-syntax">; </span><span class="identifier-syntax">VERIFY_THE_STORY_FILE_RM</span><span class="plain-syntax">(</span><span class="character-syntax">'A'</span><span class="plain-syntax">); </span><span class="reserved-syntax">new_line</span><span class="plain-syntax">; </span><span class="reserved-syntax">rtrue</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> .</span><span class="identifier-syntax">Vwrong</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">VERIFY_THE_STORY_FILE_RM</span><span class="plain-syntax">(</span><span class="character-syntax">'B'</span><span class="plain-syntax">); </span><span class="reserved-syntax">new_line</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">VM_Verify</span><span class="plain-syntax">()) { </span><span class="identifier-syntax">VERIFY_THE_STORY_FILE_RM</span><span class="plain-syntax">(</span><span class="character-syntax">'A'</span><span class="plain-syntax">); </span><span class="reserved-syntax">new_line</span><span class="plain-syntax">; }</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">else</span><span class="plain-syntax"> { </span><span class="identifier-syntax">VERIFY_THE_STORY_FILE_RM</span><span class="plain-syntax">(</span><span class="character-syntax">'B'</span><span class="plain-syntax">); </span><span class="reserved-syntax">new_line</span><span class="plain-syntax">; }</span>
<span class="plain-syntax">];</span>
</pre>
<p class="commentary firstcommentary"><a id="SP7" class="paragraph-anchor"></a><b>&#167;7. Switch Transcript On Rule. </b></p>
@ -131,12 +135,9 @@ opcode, and so Glulx followed suit.
<pre class="displayed-code all-displayed-code code-font">
<span class="plain-syntax">[ </span><span class="identifier-syntax">SWITCH_TRANSCRIPT_ON_R</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">actor</span><span class="plain-syntax"> ~= </span><span class="identifier-syntax">player</span><span class="plain-syntax">) </span><span class="reserved-syntax">rfalse</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">transcript_mode</span><span class="plain-syntax"> = ((0--&gt;8) &amp; </span><span class="constant-syntax">1</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">transcript_mode</span><span class="plain-syntax">) { </span><span class="identifier-syntax">SWITCH_TRANSCRIPT_ON_RM</span><span class="plain-syntax">(</span><span class="character-syntax">'A'</span><span class="plain-syntax">); </span><span class="reserved-syntax">new_line</span><span class="plain-syntax">; </span><span class="reserved-syntax">rtrue</span><span class="plain-syntax">; }</span>
<span class="plain-syntax"> @</span><span class="identifier-syntax">output_stream</span><span class="plain-syntax"> </span><span class="constant-syntax">2</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (((0--&gt;8) &amp; </span><span class="constant-syntax">1</span><span class="plain-syntax">) == </span><span class="constant-syntax">0</span><span class="plain-syntax">) { </span><span class="identifier-syntax">SWITCH_TRANSCRIPT_ON_RM</span><span class="plain-syntax">(</span><span class="character-syntax">'C'</span><span class="plain-syntax">); </span><span class="reserved-syntax">new_line</span><span class="plain-syntax">; </span><span class="reserved-syntax">rtrue</span><span class="plain-syntax">; }</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">VM_TranscriptIsOn</span><span class="plain-syntax">()) { </span><span class="identifier-syntax">SWITCH_TRANSCRIPT_ON_RM</span><span class="plain-syntax">(</span><span class="character-syntax">'A'</span><span class="plain-syntax">); </span><span class="reserved-syntax">new_line</span><span class="plain-syntax">; </span><span class="reserved-syntax">rtrue</span><span class="plain-syntax">; }</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">VM_TranscriptOn</span><span class="plain-syntax">() == </span><span class="reserved-syntax">false</span><span class="plain-syntax">) { </span><span class="identifier-syntax">SWITCH_TRANSCRIPT_ON_RM</span><span class="plain-syntax">(</span><span class="character-syntax">'C'</span><span class="plain-syntax">); </span><span class="reserved-syntax">new_line</span><span class="plain-syntax">; </span><span class="reserved-syntax">rtrue</span><span class="plain-syntax">; }</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">SWITCH_TRANSCRIPT_ON_RM</span><span class="plain-syntax">(</span><span class="character-syntax">'B'</span><span class="plain-syntax">); </span><span class="reserved-syntax">new_line</span><span class="plain-syntax">; </span><span class="identifier-syntax">VersionSub</span><span class="plain-syntax">();</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">transcript_mode</span><span class="plain-syntax"> = </span><span class="reserved-syntax">true</span><span class="plain-syntax">;</span>
<span class="plain-syntax">];</span>
</pre>
<p class="commentary firstcommentary"><a id="SP8" class="paragraph-anchor"></a><b>&#167;8. Switch Transcript Off Rule. </b></p>
@ -144,12 +145,9 @@ opcode, and so Glulx followed suit.
<pre class="displayed-code all-displayed-code code-font">
<span class="plain-syntax">[ </span><span class="identifier-syntax">SWITCH_TRANSCRIPT_OFF_R</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">actor</span><span class="plain-syntax"> ~= </span><span class="identifier-syntax">player</span><span class="plain-syntax">) </span><span class="reserved-syntax">rfalse</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">transcript_mode</span><span class="plain-syntax"> = ((0--&gt;8) &amp; </span><span class="constant-syntax">1</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">transcript_mode</span><span class="plain-syntax"> == </span><span class="reserved-syntax">false</span><span class="plain-syntax">) { </span><span class="identifier-syntax">SWITCH_TRANSCRIPT_OFF_RM</span><span class="plain-syntax">(</span><span class="character-syntax">'A'</span><span class="plain-syntax">); </span><span class="reserved-syntax">new_line</span><span class="plain-syntax">; </span><span class="reserved-syntax">rtrue</span><span class="plain-syntax">; }</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">VM_TranscriptIsOn</span><span class="plain-syntax">() == </span><span class="reserved-syntax">false</span><span class="plain-syntax">) { </span><span class="identifier-syntax">SWITCH_TRANSCRIPT_OFF_RM</span><span class="plain-syntax">(</span><span class="character-syntax">'A'</span><span class="plain-syntax">); </span><span class="reserved-syntax">new_line</span><span class="plain-syntax">; </span><span class="reserved-syntax">rtrue</span><span class="plain-syntax">; }</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">SWITCH_TRANSCRIPT_OFF_RM</span><span class="plain-syntax">(</span><span class="character-syntax">'B'</span><span class="plain-syntax">); </span><span class="reserved-syntax">new_line</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> @</span><span class="identifier-syntax">output_stream</span><span class="plain-syntax"> -2;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> ((0--&gt;8) &amp; </span><span class="constant-syntax">1</span><span class="plain-syntax">) { </span><span class="identifier-syntax">SWITCH_TRANSCRIPT_ON_RM</span><span class="plain-syntax">(</span><span class="character-syntax">'C'</span><span class="plain-syntax">); </span><span class="reserved-syntax">new_line</span><span class="plain-syntax">; </span><span class="reserved-syntax">rtrue</span><span class="plain-syntax">; }</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">transcript_mode</span><span class="plain-syntax"> = </span><span class="reserved-syntax">false</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">VM_TranscriptOff</span><span class="plain-syntax">() == </span><span class="reserved-syntax">false</span><span class="plain-syntax">) { </span><span class="identifier-syntax">SWITCH_TRANSCRIPT_ON_RM</span><span class="plain-syntax">(</span><span class="character-syntax">'C'</span><span class="plain-syntax">); </span><span class="reserved-syntax">new_line</span><span class="plain-syntax">; </span><span class="reserved-syntax">rtrue</span><span class="plain-syntax">; }</span>
<span class="plain-syntax">];</span>
</pre>
<p class="commentary firstcommentary"><a id="SP9" class="paragraph-anchor"></a><b>&#167;9. Announce Story File Version Rule. </b></p>
@ -164,48 +162,13 @@ opcode, and so Glulx followed suit.
<span class="plain-syntax"> </span><span class="reserved-syntax">for</span><span class="plain-syntax"> (</span><span class="identifier-syntax">ix</span><span class="plain-syntax">=6: </span><span class="identifier-syntax">ix</span><span class="plain-syntax"> &lt;= </span><span class="identifier-syntax">UUID_ARRAY</span><span class="plain-syntax">-&gt;0: </span><span class="identifier-syntax">ix</span><span class="plain-syntax">++) </span><span class="reserved-syntax">print</span><span class="plain-syntax"> (</span><span class="identifier-syntax">char</span><span class="plain-syntax">) </span><span class="identifier-syntax">UUID_ARRAY</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">ix</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">print</span><span class="plain-syntax"> </span><span class="string-syntax">"^"</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> }</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">ix</span><span class="plain-syntax"> = </span><span class="constant-syntax">0</span><span class="plain-syntax">; </span><span class="comment-syntax">shut up compiler warning</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">standard_interpreter</span><span class="plain-syntax"> &gt; </span><span class="constant-syntax">0</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">print</span><span class="plain-syntax"> </span><span class="string-syntax">"Standard interpreter "</span><span class="plain-syntax">,</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">standard_interpreter</span><span class="plain-syntax">/256, </span><span class="string-syntax">"."</span><span class="plain-syntax">, </span><span class="identifier-syntax">standard_interpreter</span><span class="plain-syntax">%256,</span>
<span class="plain-syntax"> </span><span class="string-syntax">" ("</span><span class="plain-syntax">, </span><span class="identifier-syntax">HDR_TERPNUMBER</span><span class="plain-syntax">-&gt;0;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">print</span><span class="plain-syntax"> (</span><span class="identifier-syntax">char</span><span class="plain-syntax">) </span><span class="identifier-syntax">HDR_TERPVERSION</span><span class="plain-syntax">-&gt;0;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">print</span><span class="plain-syntax"> </span><span class="string-syntax">")^"</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> } </span><span class="reserved-syntax">else</span><span class="plain-syntax"> {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">print</span><span class="plain-syntax"> </span><span class="string-syntax">"Interpreter "</span><span class="plain-syntax">, </span><span class="identifier-syntax">HDR_TERPNUMBER</span><span class="plain-syntax">-&gt;0, </span><span class="string-syntax">" Version "</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">print</span><span class="plain-syntax"> (</span><span class="identifier-syntax">char</span><span class="plain-syntax">) </span><span class="identifier-syntax">HDR_TERPVERSION</span><span class="plain-syntax">-&gt;0;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">print</span><span class="plain-syntax"> </span><span class="string-syntax">"^"</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> }</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">VM_ReportOnInterpreter</span><span class="plain-syntax">();</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">ShowExtensionVersions</span><span class="plain-syntax">();</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">say__p</span><span class="plain-syntax"> = </span><span class="constant-syntax">1</span><span class="plain-syntax">;</span>
<span class="plain-syntax">];</span>
</pre>
<p class="commentary firstcommentary"><a id="SP10" class="paragraph-anchor"></a><b>&#167;10. Descend To Specific Action Rule. </b>There are 100 or so actions, typically, and this rule is for efficiency's
sake: rather than perform 100 or so comparisons to see which routine to
call, we indirect through a jump table. The routines called are the <span class="extract"><span class="extract-syntax">-Sub</span></span>
routines: thus, for instance, if <span class="extract"><span class="extract-syntax">action</span></span> is <span class="extract"><span class="extract-syntax">##Wait</span></span> then <span class="extract"><span class="extract-syntax">WaitSub</span></span> is
called. It is essential that this routine not be called for fake actions:
in I7 use this is guaranteed, since fake actions are not allowed into the
action machinery at all.
</p>
<p class="commentary">Strangely, Glulx's action routines table is numbered in an off-by-one way
compared to the Z-machine's: hence the <span class="extract"><span class="extract-syntax">+1</span></span>.
</p>
<pre class="displayed-code all-displayed-code code-font">
<span class="plain-syntax">[ </span><span class="identifier-syntax">DESCEND_TO_SPECIFIC_ACTION_R</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> ( #</span><span class="identifier-syntax">actions_table</span><span class="plain-syntax">--&gt;</span><span class="identifier-syntax">action</span><span class="plain-syntax"> )();</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">rtrue</span><span class="plain-syntax">;</span>
<span class="plain-syntax">];</span>
</pre>
<p class="commentary firstcommentary"><a id="SP11" class="paragraph-anchor"></a><b>&#167;11. End Z-only matter. </b></p>
<pre class="displayed-code all-displayed-code code-font">
<span class="plain-syntax">#</span><span class="identifier-syntax">Endif</span><span class="plain-syntax">; </span><span class="comment-syntax">TARGET_ZCODE</span>
</pre>
<nav role="progress"><div class="progresscontainer">
<ul class="progressbar"><li class="progressprev"><a href="S-gll.html">&#10094;</a></li><li class="progresssection"><a href="S-msc.html">msc</a></li><li class="progresssection"><a href="S-gll.html">gll</a></li><li class="progresscurrent">zmc</li><li class="progresssection"><a href="S-lgh.html">lgh</a></li><li class="progresssection"><a href="S-lst.html">lst</a></li><li class="progresssection"><a href="S-ord.html">ord</a></li><li class="progresssection"><a href="S-act.html">act</a></li><li class="progresssection"><a href="S-act2.html">act2</a></li><li class="progresssection"><a href="S-fgr.html">fgr</a></li><li class="progresssection"><a href="S-otf.html">otf</a></li><li class="progresssection"><a href="S-prn.html">prn</a></li><li class="progresssection"><a href="S-wrl.html">wrl</a></li><li class="progresssection"><a href="S-mpr.html">mpr</a></li><li class="progresssection"><a href="S-rtp.html">rtp</a></li><li class="progresssection"><a href="S-tm.html">tm</a></li><li class="progresssection"><a href="S-tst.html">tst</a></li><li class="progresssection"><a href="S-chr.html">chr</a></li><li class="progresssection"><a href="S-str.html">str</a></li><li class="progressnext"><a href="S-lgh.html">&#10095;</a></li></ul></div>
<ul class="progressbar"><li class="progressprev"><a href="S-msc.html">&#10094;</a></li><li class="progresssection"><a href="S-msc.html">msc</a></li><li class="progresscurrent">stt</li><li class="progresssection"><a href="S-lgh.html">lgh</a></li><li class="progresssection"><a href="S-lst.html">lst</a></li><li class="progresssection"><a href="S-ord.html">ord</a></li><li class="progresssection"><a href="S-act.html">act</a></li><li class="progresssection"><a href="S-act2.html">act2</a></li><li class="progresssection"><a href="S-fgr.html">fgr</a></li><li class="progresssection"><a href="S-otf.html">otf</a></li><li class="progresssection"><a href="S-prn.html">prn</a></li><li class="progresssection"><a href="S-wrl.html">wrl</a></li><li class="progresssection"><a href="S-mpr.html">mpr</a></li><li class="progresssection"><a href="S-rtp.html">rtp</a></li><li class="progresssection"><a href="S-tm.html">tm</a></li><li class="progresssection"><a href="S-tst.html">tst</a></li><li class="progresssection"><a href="S-chr.html">chr</a></li><li class="progresssection"><a href="S-str.html">str</a></li><li class="progressnext"><a href="S-lgh.html">&#10095;</a></li></ul></div>
</nav><!--End of weave-->
</main>

View file

@ -280,7 +280,7 @@ only absolute times; we need the following for relative ones.
<span class="plain-syntax">];</span>
</pre>
<nav role="progress"><div class="progresscontainer">
<ul class="progressbar"><li class="progressprev"><a href="S-rtp.html">&#10094;</a></li><li class="progresssection"><a href="S-msc.html">msc</a></li><li class="progresssection"><a href="S-gll.html">gll</a></li><li class="progresssection"><a href="S-zmc.html">zmc</a></li><li class="progresssection"><a href="S-lgh.html">lgh</a></li><li class="progresssection"><a href="S-lst.html">lst</a></li><li class="progresssection"><a href="S-ord.html">ord</a></li><li class="progresssection"><a href="S-act.html">act</a></li><li class="progresssection"><a href="S-act2.html">act2</a></li><li class="progresssection"><a href="S-fgr.html">fgr</a></li><li class="progresssection"><a href="S-otf.html">otf</a></li><li class="progresssection"><a href="S-prn.html">prn</a></li><li class="progresssection"><a href="S-wrl.html">wrl</a></li><li class="progresssection"><a href="S-mpr.html">mpr</a></li><li class="progresssection"><a href="S-rtp.html">rtp</a></li><li class="progresscurrent">tm</li><li class="progresssection"><a href="S-tst.html">tst</a></li><li class="progresssection"><a href="S-chr.html">chr</a></li><li class="progresssection"><a href="S-str.html">str</a></li><li class="progressnext"><a href="S-tst.html">&#10095;</a></li></ul></div>
<ul class="progressbar"><li class="progressprev"><a href="S-rtp.html">&#10094;</a></li><li class="progresssection"><a href="S-msc.html">msc</a></li><li class="progresssection"><a href="S-stt.html">stt</a></li><li class="progresssection"><a href="S-lgh.html">lgh</a></li><li class="progresssection"><a href="S-lst.html">lst</a></li><li class="progresssection"><a href="S-ord.html">ord</a></li><li class="progresssection"><a href="S-act.html">act</a></li><li class="progresssection"><a href="S-act2.html">act2</a></li><li class="progresssection"><a href="S-fgr.html">fgr</a></li><li class="progresssection"><a href="S-otf.html">otf</a></li><li class="progresssection"><a href="S-prn.html">prn</a></li><li class="progresssection"><a href="S-wrl.html">wrl</a></li><li class="progresssection"><a href="S-mpr.html">mpr</a></li><li class="progresssection"><a href="S-rtp.html">rtp</a></li><li class="progresscurrent">tm</li><li class="progresssection"><a href="S-tst.html">tst</a></li><li class="progresssection"><a href="S-chr.html">chr</a></li><li class="progresssection"><a href="S-str.html">str</a></li><li class="progressnext"><a href="S-tst.html">&#10095;</a></li></ul></div>
</nav><!--End of weave-->
</main>

View file

@ -51,7 +51,7 @@
<ul class="crumbs"><li><a href="../index.html">Home</a></li><li><a href="../extensions.html">Kits</a></li><li><a href="index.html">WorldModelKit</a></li><li><b>Tests Template</b></li></ul></div>
<p class="purpose">The command grammar and I6 implementation for testing commands such as TEST, ACTIONS and PURLOIN.</p>
<ul class="toc"><li><a href="S-tst.html#SP1">&#167;1. All testy</a></li><li><a href="S-tst.html#SP2">&#167;2. Abstract Command</a></li><li><a href="S-tst.html#SP3">&#167;3. Actions Command</a></li><li><a href="S-tst.html#SP4">&#167;4. Gonear Command</a></li><li><a href="S-tst.html#SP5">&#167;5. Purloin Command</a></li><li><a href="S-tst.html#SP6">&#167;6. Random Command</a></li><li><a href="S-tst.html#SP7">&#167;7. Relations Command</a></li><li><a href="S-tst.html#SP8">&#167;8. Responses Command</a></li><li><a href="S-tst.html#SP9">&#167;9. Rules Command</a></li><li><a href="S-tst.html#SP10">&#167;10. Dialogue Command</a></li><li><a href="S-tst.html#SP11">&#167;11. Scenes Command</a></li><li><a href="S-tst.html#SP12">&#167;12. Scope Command</a></li><li><a href="S-tst.html#SP13">&#167;13. Showheap Command</a></li><li><a href="S-tst.html#SP14">&#167;14. ShowMe Command</a></li><li><a href="S-tst.html#SP15">&#167;15. Showverb Command</a></li><li><a href="S-tst.html#SP16">&#167;16. Test Command</a></li><li><a href="S-tst.html#SP17">&#167;17. Trace Command</a></li><li><a href="S-tst.html#SP18">&#167;18. Tree Command</a></li><li><a href="S-tst.html#SP19">&#167;19. Grammar</a></li><li><a href="S-tst.html#SP20">&#167;20. End testy</a></li></ul><hr class="tocbar">
<ul class="toc"><li><a href="S-tst.html#SP1">&#167;1. All testy</a></li><li><a href="S-tst.html#SP2">&#167;2. Abstract Command</a></li><li><a href="S-tst.html#SP3">&#167;3. Actions Command</a></li><li><a href="S-tst.html#SP4">&#167;4. Gonear Command</a></li><li><a href="S-tst.html#SP5">&#167;5. Purloin Command</a></li><li><a href="S-tst.html#SP6">&#167;6. Random Command</a></li><li><a href="S-tst.html#SP7">&#167;7. Relations Command</a></li><li><a href="S-tst.html#SP8">&#167;8. Responses Command</a></li><li><a href="S-tst.html#SP9">&#167;9. Rules Command</a></li><li><a href="S-tst.html#SP10">&#167;10. Dialogue Command</a></li><li><a href="S-tst.html#SP11">&#167;11. Scenes Command</a></li><li><a href="S-tst.html#SP12">&#167;12. Scope Command</a></li><li><a href="S-tst.html#SP13">&#167;13. Showheap Command</a></li><li><a href="S-tst.html#SP14">&#167;14. ShowMe Command</a></li><li><a href="S-tst.html#SP15">&#167;15. Showverb Command</a></li><li><a href="S-tst.html#SP16">&#167;16. Test Command</a></li><li><a href="S-tst.html#SP17">&#167;17. Trace Command</a></li><li><a href="S-tst.html#SP18">&#167;18. Tree Command</a></li><li><a href="S-tst.html#SP19">&#167;19. GlkList Command</a></li><li><a href="S-tst.html#SP20">&#167;20. Grammar</a></li><li><a href="S-tst.html#SP21">&#167;21. End testy</a></li></ul><hr class="tocbar">
<p class="commentary firstcommentary"><a id="SP1" class="paragraph-anchor"></a><b>&#167;1. All testy. </b></p>
@ -558,7 +558,19 @@ in I7 terms. It should arguably be withdrawn, but doesn't seem to do any harm.
<span class="plain-syntax"> </span><span class="identifier-syntax">WriteListFrom</span><span class="plain-syntax">(</span><span class="reserved-syntax">child</span><span class="plain-syntax">(</span><span class="identifier-syntax">obj</span><span class="plain-syntax">), </span><span class="identifier-syntax">NEWLINE_BIT</span><span class="plain-syntax">+</span><span class="identifier-syntax">INDENT_BIT</span><span class="plain-syntax">+</span><span class="identifier-syntax">ALWAYS_BIT</span><span class="plain-syntax">+</span><span class="identifier-syntax">FULLINV_BIT</span><span class="plain-syntax">, </span><span class="constant-syntax">1</span><span class="plain-syntax">);</span>
<span class="plain-syntax">];</span>
</pre>
<p class="commentary firstcommentary"><a id="SP19" class="paragraph-anchor"></a><b>&#167;19. Grammar. </b>In the old I6 parser, testing commands had their own scope hardwired in to the
<p class="commentary firstcommentary"><a id="SP19" class="paragraph-anchor"></a><b>&#167;19. GlkList Command. </b>GLKLIST is a testing command best used by those who understand Glulx and its
ways: it isn't documented in the I7 manual, because it is pretty inscrutable
for "real" users, but it's probably worth keeping just the same.
</p>
<pre class="displayed-code all-displayed-code code-font">
<span class="plain-syntax">#</span><span class="identifier-syntax">Ifdef</span><span class="plain-syntax"> </span><span class="identifier-syntax">TARGET_GLULX</span><span class="plain-syntax">;</span>
<span class="plain-syntax">[ </span><span class="identifier-syntax">GlkListSub</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">GlkDebuggingList</span><span class="plain-syntax">();</span>
<span class="plain-syntax">];</span>
<span class="plain-syntax">#</span><span class="identifier-syntax">Endif</span><span class="plain-syntax">;</span>
</pre>
<p class="commentary firstcommentary"><a id="SP20" class="paragraph-anchor"></a><b>&#167;20. Grammar. </b>In the old I6 parser, testing commands had their own scope hardwired in to the
code: this worked by comparing the verb command word directly against <span class="extract"><span class="extract-syntax">'scope'</span></span>
and the like. That would go wrong if the testing commands were translated into
other languages, and was a crude design at best. The following scope token is
@ -632,14 +644,18 @@ not picked up) and able to accept multiple objects.
<span class="identifier-syntax">Verb</span><span class="plain-syntax"> </span><span class="identifier-syntax">meta</span><span class="plain-syntax"> </span><span class="character-syntax">'tree'</span>
<span class="plain-syntax"> * -&gt; </span><span class="identifier-syntax">XTree</span>
<span class="plain-syntax"> * </span><span class="identifier-syntax">scope</span><span class="plain-syntax">=</span><span class="identifier-syntax">testcommandnoun</span><span class="plain-syntax"> -&gt; </span><span class="identifier-syntax">XTree</span><span class="plain-syntax">;</span>
<span class="plain-syntax">#</span><span class="identifier-syntax">Ifdef</span><span class="plain-syntax"> </span><span class="identifier-syntax">TARGET_GLULX</span><span class="plain-syntax">;</span>
<span class="identifier-syntax">Verb</span><span class="plain-syntax"> </span><span class="identifier-syntax">meta</span><span class="plain-syntax"> </span><span class="character-syntax">'glklist'</span>
<span class="plain-syntax"> * -&gt; </span><span class="identifier-syntax">GlkList</span><span class="plain-syntax">;</span>
<span class="plain-syntax">#</span><span class="identifier-syntax">Endif</span><span class="plain-syntax">;</span>
</pre>
<p class="commentary firstcommentary"><a id="SP20" class="paragraph-anchor"></a><b>&#167;20. End testy. </b></p>
<p class="commentary firstcommentary"><a id="SP21" class="paragraph-anchor"></a><b>&#167;21. End testy. </b></p>
<pre class="displayed-code all-displayed-code code-font">
<span class="plain-syntax">#</span><span class="identifier-syntax">Endif</span><span class="plain-syntax">;</span>
</pre>
<nav role="progress"><div class="progresscontainer">
<ul class="progressbar"><li class="progressprev"><a href="S-tm.html">&#10094;</a></li><li class="progresssection"><a href="S-msc.html">msc</a></li><li class="progresssection"><a href="S-gll.html">gll</a></li><li class="progresssection"><a href="S-zmc.html">zmc</a></li><li class="progresssection"><a href="S-lgh.html">lgh</a></li><li class="progresssection"><a href="S-lst.html">lst</a></li><li class="progresssection"><a href="S-ord.html">ord</a></li><li class="progresssection"><a href="S-act.html">act</a></li><li class="progresssection"><a href="S-act2.html">act2</a></li><li class="progresssection"><a href="S-fgr.html">fgr</a></li><li class="progresssection"><a href="S-otf.html">otf</a></li><li class="progresssection"><a href="S-prn.html">prn</a></li><li class="progresssection"><a href="S-wrl.html">wrl</a></li><li class="progresssection"><a href="S-mpr.html">mpr</a></li><li class="progresssection"><a href="S-rtp.html">rtp</a></li><li class="progresssection"><a href="S-tm.html">tm</a></li><li class="progresscurrent">tst</li><li class="progresssection"><a href="S-chr.html">chr</a></li><li class="progresssection"><a href="S-str.html">str</a></li><li class="progressnext"><a href="S-chr.html">&#10095;</a></li></ul></div>
<ul class="progressbar"><li class="progressprev"><a href="S-tm.html">&#10094;</a></li><li class="progresssection"><a href="S-msc.html">msc</a></li><li class="progresssection"><a href="S-stt.html">stt</a></li><li class="progresssection"><a href="S-lgh.html">lgh</a></li><li class="progresssection"><a href="S-lst.html">lst</a></li><li class="progresssection"><a href="S-ord.html">ord</a></li><li class="progresssection"><a href="S-act.html">act</a></li><li class="progresssection"><a href="S-act2.html">act2</a></li><li class="progresssection"><a href="S-fgr.html">fgr</a></li><li class="progresssection"><a href="S-otf.html">otf</a></li><li class="progresssection"><a href="S-prn.html">prn</a></li><li class="progresssection"><a href="S-wrl.html">wrl</a></li><li class="progresssection"><a href="S-mpr.html">mpr</a></li><li class="progresssection"><a href="S-rtp.html">rtp</a></li><li class="progresssection"><a href="S-tm.html">tm</a></li><li class="progresscurrent">tst</li><li class="progresssection"><a href="S-chr.html">chr</a></li><li class="progresssection"><a href="S-str.html">str</a></li><li class="progressnext"><a href="S-chr.html">&#10095;</a></li></ul></div>
</nav><!--End of weave-->
</main>

View file

@ -1015,7 +1015,7 @@ which cannot be asserted true or false.
<span class="plain-syntax">];</span>
</pre>
<nav role="progress"><div class="progresscontainer">
<ul class="progressbar"><li class="progressprev"><a href="S-prn.html">&#10094;</a></li><li class="progresssection"><a href="S-msc.html">msc</a></li><li class="progresssection"><a href="S-gll.html">gll</a></li><li class="progresssection"><a href="S-zmc.html">zmc</a></li><li class="progresssection"><a href="S-lgh.html">lgh</a></li><li class="progresssection"><a href="S-lst.html">lst</a></li><li class="progresssection"><a href="S-ord.html">ord</a></li><li class="progresssection"><a href="S-act.html">act</a></li><li class="progresssection"><a href="S-act2.html">act2</a></li><li class="progresssection"><a href="S-fgr.html">fgr</a></li><li class="progresssection"><a href="S-otf.html">otf</a></li><li class="progresssection"><a href="S-prn.html">prn</a></li><li class="progresscurrent">wrl</li><li class="progresssection"><a href="S-mpr.html">mpr</a></li><li class="progresssection"><a href="S-rtp.html">rtp</a></li><li class="progresssection"><a href="S-tm.html">tm</a></li><li class="progresssection"><a href="S-tst.html">tst</a></li><li class="progresssection"><a href="S-chr.html">chr</a></li><li class="progresssection"><a href="S-str.html">str</a></li><li class="progressnext"><a href="S-mpr.html">&#10095;</a></li></ul></div>
<ul class="progressbar"><li class="progressprev"><a href="S-prn.html">&#10094;</a></li><li class="progresssection"><a href="S-msc.html">msc</a></li><li class="progresssection"><a href="S-stt.html">stt</a></li><li class="progresssection"><a href="S-lgh.html">lgh</a></li><li class="progresssection"><a href="S-lst.html">lst</a></li><li class="progresssection"><a href="S-ord.html">ord</a></li><li class="progresssection"><a href="S-act.html">act</a></li><li class="progresssection"><a href="S-act2.html">act2</a></li><li class="progresssection"><a href="S-fgr.html">fgr</a></li><li class="progresssection"><a href="S-otf.html">otf</a></li><li class="progresssection"><a href="S-prn.html">prn</a></li><li class="progresscurrent">wrl</li><li class="progresssection"><a href="S-mpr.html">mpr</a></li><li class="progresssection"><a href="S-rtp.html">rtp</a></li><li class="progresssection"><a href="S-tm.html">tm</a></li><li class="progresssection"><a href="S-tst.html">tst</a></li><li class="progresssection"><a href="S-chr.html">chr</a></li><li class="progresssection"><a href="S-str.html">str</a></li><li class="progressnext"><a href="S-mpr.html">&#10095;</a></li></ul></div>
</nav><!--End of weave-->
</main>

View file

@ -55,14 +55,9 @@
<span class="sectionpurpose"></span></p>
</li>
<li>
<p class="chapterentry"><a href="S-gll.html">
<spon class="sectiontitle">Glulx Template</span></a> -
<span class="sectionpurpose">To provide Glulx-specific actions.</span></p>
</li>
<li>
<p class="chapterentry"><a href="S-zmc.html">
<spon class="sectiontitle">ZMachine Template</span></a> -
<span class="sectionpurpose">To provide Z-specific actions.</span></p>
<p class="chapterentry"><a href="S-stt.html">
<spon class="sectiontitle">State Template</span></a> -
<span class="sectionpurpose">To implement out of world actions relating to the program state.</span></p>
</li>
<li>
<p class="chapterentry"><a href="S-lgh.html">

View file

@ -1,16 +1,16 @@
Total memory consumption was 137315K = 134 MB
Total memory consumption was 137388K = 134 MB
---- was used for 2100591 objects, in 372222 frames in 0 x 800K = 0K = 0 MB:
---- was used for 2101258 objects, in 372295 frames in 0 x 800K = 0K = 0 MB:
30.2% inter_tree_node_array 59 x 8192 = 483328 objects, 42534752 bytes
19.2% text_stream_array 4811 x 100 = 481100 objects, 27095552 bytes
17.8% linked_list 44815 objects, 25096400 bytes
19.2% text_stream_array 4816 x 100 = 481600 objects, 27123712 bytes
17.8% linked_list 44827 objects, 25103120 bytes
10.1% inter_symbol_array 134 x 1024 = 137216 objects, 14274752 bytes
9.7% inter_error_stash_array 105 x 1024 = 107520 objects, 13765920 bytes
7.5% parse_node 133417 objects, 10673360 bytes
5.4% verb_conjugation 164 objects, 7610912 bytes
4.0% parse_node_annotation_array 356 x 500 = 178000 objects, 5707392 bytes
2.7% scan_directory 922 objects, 3806016 bytes
2.7% scan_directory 923 objects, 3810144 bytes
2.5% pcalc_prop_array 26 x 1000 = 26000 objects, 3536832 bytes
2.2% inter_name_array 67 x 1000 = 67000 objects, 3218144 bytes
1.9% kind_array 68 x 1000 = 68000 objects, 2722176 bytes
@ -18,11 +18,11 @@ Total memory consumption was 137315K = 134 MB
1.4% inter_name_generator_array 51 x 1000 = 51000 objects, 2041632 bytes
1.3% package_request 21234 objects, 1868592 bytes
1.3% vocabulary_entry_array 164 x 100 = 16400 objects, 1842048 bytes
1.1% dict_entry_array 481 x 100 = 48100 objects, 1554592 bytes
1.1% dict_entry_array 482 x 100 = 48200 objects, 1557824 bytes
1.0% inter_symbols_table 26729 objects, 1496824 bytes
1.0% match_trie_array 11 x 1000 = 11000 objects, 1496352 bytes
1.0% inter_symbols_table 26711 objects, 1495816 bytes
1.0% i6_schema_array 24 x 100 = 2400 objects, 1440768 bytes
0.9% inter_package 26711 objects, 1282128 bytes
0.9% inter_package 26729 objects, 1282992 bytes
0.8% map_data 672 objects, 1128960 bytes
0.7% id_body 955 objects, 1092520 bytes
0.7% adjective_meaning 208 objects, 1030016 bytes
@ -36,13 +36,13 @@ Total memory consumption was 137315K = 134 MB
0.3% local_variable_array 48 x 100 = 4800 objects, 462336 bytes
0.2% verb_usage 1148 objects, 394912 bytes
0.2% rule 472 objects, 370048 bytes
0.2% dictionary 7689 objects, 369072 bytes
0.2% dictionary 7693 objects, 369264 bytes
0.2% verb_form 388 objects, 350752 bytes
0.2% noun 2388 objects, 286560 bytes
0.1% compilation_subtask 3369 objects, 269520 bytes
0.1% inter_annotation_array 2 x 8192 = 16384 objects, 262208 bytes
0.1% inference_subject 667 objects, 261464 bytes
0.1% vanilla_function 3744 objects, 239616 bytes
0.1% vanilla_function 3753 objects, 240192 bytes
0.1% binary_predicate 326 objects, 172128 bytes
0.1% hierarchy_location 1179 objects, 169776 bytes
0.1% linguistic_stock_item 3331 objects, 159888 bytes
@ -93,16 +93,16 @@ Total memory consumption was 137315K = 134 MB
---- verb_sense 407 objects, 29304 bytes
---- parse_node_tree 33 objects, 28776 bytes
---- action_pattern_array 7 x 100 = 700 objects, 28224 bytes
---- filename 634 objects, 25360 bytes
---- filename 635 objects, 25400 bytes
---- shared_variable_set_array 6 x 100 = 600 objects, 24192 bytes
---- property 146 objects, 22192 bytes
---- backdrops_data 672 objects, 21504 bytes
---- pathname 526 objects, 21040 bytes
---- pathname 527 objects, 21080 bytes
---- inter_node_list 646 objects, 20672 bytes
---- nonlocal_variable 94 objects, 20304 bytes
---- pipeline_step 15 objects, 20280 bytes
---- build_vertex 169 objects, 20280 bytes
---- action_name 90 objects, 20160 bytes
---- build_vertex 168 objects, 20160 bytes
---- timed_rules_rfd_data 403 objects, 19344 bytes
---- method 395 objects, 18960 bytes
---- pcalc_prop_deferral 86 objects, 17888 bytes
@ -131,10 +131,10 @@ Total memory consumption was 137315K = 134 MB
---- hierarchy_attachment_point 78 objects, 6864 bytes
---- inform_extension 32 objects, 6656 bytes
---- text_literal_holder 163 objects, 6520 bytes
---- section_md 61 objects, 5856 bytes
---- section_md 62 objects, 5952 bytes
---- parsed_use_option_setting 79 objects, 5688 bytes
---- compatibility_specification 114 objects, 5472 bytes
---- build_script 168 objects, 5376 bytes
---- build_script 169 objects, 5408 bytes
---- explicit_action_array 1 x 100 objects, 4832 bytes
---- activity 35 objects, 4760 bytes
---- value_property_data 84 objects, 4704 bytes
@ -251,15 +251,15 @@ Total memory consumption was 137315K = 134 MB
100.0% was used for memory not allocated for objects:
61.8% text stream storage 87006012 bytes in 504091 claims
3.8% dictionary storage 5361152 bytes in 7689 claims
61.8% text stream storage 87060500 bytes in 504665 claims
3.8% dictionary storage 5379072 bytes in 7693 claims
---- sorting 2792 bytes in 403 claims
5.1% source text 7200000 bytes in 3 claims
7.6% source text details 10800000 bytes in 2 claims
0.1% documentation fragments 262144 bytes in 1 claim
---- linguistic stock array 81920 bytes in 2 claims
---- small word set array 105600 bytes in 22 claims
3.2% inter symbols storage 4587584 bytes in 28086 claims
3.2% inter symbols storage 4589888 bytes in 28104 claims
11.9% inter bytecode storage 16761584 bytes in 15 claims
4.4% inter links storage 6222976 bytes in 11 claims
0.1% inter tree location list storage 191232 bytes in 32 claims
@ -269,5 +269,5 @@ Total memory consumption was 137315K = 134 MB
---- code generation workspace for objects 3480 bytes in 19 claims
0.1% emitter array storage 280672 bytes in 2002 claims
-136.-7% was overhead - -192290816 bytes = -187784K = -183 MB
-136.-7% was overhead - -192336024 bytes = -187828K = -183 MB

View file

@ -1,32 +1,32 @@
100.0% in inform7 run
68.8% in compilation to Inter
48.8% in //Sequence::undertake_queued_tasks//
69.7% in compilation to Inter
49.3% in //Sequence::undertake_queued_tasks//
4.8% in //MajorNodes::pre_pass//
3.2% in //MajorNodes::pass_1//
1.8% in //ImperativeDefinitions::assess_all//
1.4% in //RTKindConstructors::compile//
1.4% in //RTPhrasebook::compile_entries//
1.0% in //Sequence::lint_inter//
0.6% in //ImperativeDefinitions::compile_first_block//
0.6% in //World::stage_V//
0.4% in //MajorNodes::pass_2//
0.4% in //Sequence::undertake_queued_tasks//
0.4% in //Sequence::undertake_queued_tasks//
0.2% in //CompletionModule::compile//
0.2% in //InferenceSubjects::emit_all//
0.2% in //RTKindConstructors::compile_permissions//
0.2% in //Task::make_built_in_kind_constructors//
3.2% not specifically accounted for
27.8% in running Inter pipeline
11.8% in step 14/15: generate inform6 -> auto.inf
6.0% in step 5/15: load-binary-kits
1.7% in //ImperativeDefinitions::assess_all//
1.5% in //RTPhrasebook::compile_entries//
1.3% in //RTKindConstructors::compile//
1.1% in //Sequence::lint_inter//
0.5% in //ImperativeDefinitions::compile_first_block//
0.5% in //MajorNodes::pass_2//
0.5% in //Sequence::undertake_queued_tasks//
0.5% in //Sequence::undertake_queued_tasks//
0.5% in //World::stage_V//
0.3% in //InferenceSubjects::emit_all//
0.1% in //CompletionModule::compile//
0.1% in //RTKindConstructors::compile_permissions//
0.1% in //Task::make_built_in_kind_constructors//
2.7% not specifically accounted for
26.7% in running Inter pipeline
11.1% in step 14/15: generate inform6 -> auto.inf
5.7% in step 5/15: load-binary-kits
5.2% in step 6/15: make-synoptic-module
1.8% in step 9/15: make-identifiers-unique
0.4% in step 12/15: eliminate-redundant-operations
0.4% in step 4/15: compile-splats
0.4% in step 7/15: shorten-wiring
0.4% in step 8/15: detect-indirect-calls
0.2% in step 11/15: eliminate-redundant-labels
1.2% not specifically accounted for
3.0% in supervisor
0.4% not specifically accounted for
1.7% in step 9/15: make-identifiers-unique
0.3% in step 12/15: eliminate-redundant-operations
0.3% in step 4/15: compile-splats
0.3% in step 7/15: shorten-wiring
0.3% in step 8/15: detect-indirect-calls
0.1% in step 11/15: eliminate-redundant-labels
1.1% not specifically accounted for
2.8% in supervisor
0.6% not specifically accounted for

View file

@ -8,6 +8,7 @@ Web Syntax Version: 2
Sections
Capabilities
Startup
State
Mathematics
Character Set
Input Output

View file

@ -136,17 +136,3 @@ Glulx are indistinguishable here.
HEADER_VMSTY, SUBHEADER_VMSTY, ALERT_VMSTY: style bold;
}
];
@h Undo.
These simply wrap the relevant opcodes.
=
[ VM_Undo result_code;
@restore_undo result_code;
return result_code;
];
[ VM_Save_Undo result_code;
@save_undo result_code;
return result_code;
];

View file

@ -2,6 +2,31 @@ Input Output Template.
Access to the keyboard and to textual windows.
@h Transcript support.
This is a mode in which the transcript of text in the main window is being
written out to an external file.
|VM_TranscriptIsOn| tests whether this mode is on. |VM_TranscriptOn| should
be called only if it is off, and tries to turn it on, returning |true| or |false|
according to whether or not it succeeds. |VM_TranscriptOff| should be called
only if scripting is on.
=
[ VM_TranscriptIsOn;
return ((HDR_GAMEFLAGS-->0) & 1);
];
[ VM_TranscriptOn;
@output_stream 2;
return VM_TranscriptIsOn();
];
[ VM_TranscriptOff;
@output_stream -2;
if (VM_TranscriptIsOn()) rfalse;
rtrue;
];
@h Variables and Arrays.
=
@ -9,7 +34,6 @@ Constant #dict_par1 = 6;
Constant #dict_par2 = 7;
Global xcommsdir; ! true if command recording is on
Global transcript_mode; ! true if game scripting is on
Constant INPUT_BUFFER_LEN = 120; ! Length of buffer array
@ -187,6 +211,15 @@ routine was added to concentrate lookups of this field in one place.
return $ff-(dword->#dict_par2);
];
@h Action functions.
This looks up the address of a function like |TakeSub| from the table of
"action subroutines".
=
[ VM_ActionFunction act;
return #actions_table-->act;
];
@h The Screen.
Our generic screen model is that the screen is made up of windows: we tend
to refer only to two of these, the main window and the status line, but

View file

@ -11,7 +11,6 @@ activity runs; and then |VM_Initialise()| is called.
[ VM_Initialise i;
standard_interpreter = HDR_TERPSTANDARD-->0;
transcript_mode = ((HDR_GAMEFLAGS-->0) & 1);
dict_start = HDR_DICTIONARY-->0;
dict_entry_size = dict_start->(dict_start->0 + 1);

View file

@ -0,0 +1,76 @@
State Template.
Saving, restoring, restarting and verifying the program from within itself.
@h Environment.
The language "interpreter" here supposes that the eventual program is
running in a VM which is being interpreted, and that may not be the case,
but it's traditional.
=
[ VM_ReportOnInterpreter;
if (standard_interpreter > 0) {
print "Standard interpreter ",
standard_interpreter/256, ".", standard_interpreter%256,
" (", HDR_TERPNUMBER->0;
print (char) HDR_TERPVERSION->0;
print ")^";
} else {
print "Interpreter ", HDR_TERPNUMBER->0, " Version ";
print (char) HDR_TERPVERSION->0;
print "^";
}
];
@h Verification.
This verifies that the current story file is intact.
=
[ VM_Verify;
@verify ?Vmaybe;
rfalse;
.Vmaybe; rtrue;
];
@h Save, restore, restart.
Restart does what it says: restarts the program as if it had just loaded for
the first time.
|VM_Save()| attempts to save the current state of the program to a file, and
returns 0 if this fails, 1 if this succeeds, or 2 if in fact a restore has
just succeeded. (A successful restoration should resume execution where the
save succeeded, but we want to distinguish those cases.)
|VM_Restore()| pretends to return |true| or |false| according to whether or not
it succeeds, but in fact it can only return |false| to indicate failure, because
a successful restoration means that execution has transferred to |VM_Save|
instead.
=
[ VM_Restart;
@restart;
];
[ VM_Restore;
restore RMaybe; rfalse;
.RMaybe; rtrue;
];
[ VM_Save flag;
@save -> flag;
return flag;
];
@h Undo.
These also simply wrap the relevant opcodes.
=
[ VM_Undo result_code;
@restore_undo result_code;
return result_code;
];
[ VM_Save_Undo result_code;
@save_undo result_code;
return result_code;
];

View file

@ -9,6 +9,7 @@ Sections
Capabilities
Glk
Startup
State
Mathematics
Character Set
Input Output

View file

@ -139,18 +139,3 @@ not the place to discuss whether that was a wise decision for Glk to take.)
INPUT_VMSTY: glk_set_style(style_Input);
}
];
@h Undo.
These are really emulations of the Z-machine's conventions on UNDO.
=
[ VM_Undo result_code;
@restoreundo result_code;
return (~~result_code);
];
[ VM_Save_Undo result_code;
@saveundo result_code;
if (result_code == -1) { GGRecoverObjects(); return 2; }
return (~~result_code);
];

View file

@ -2,36 +2,6 @@ Input Output Template.
Access to the keyboard and to textual windows.
@h Variables and Arrays.
=
Constant DICT_ENTRY_BYTES = 12+DICT_WORD_SIZE*WORDSIZE;
Constant #dict_par1 = DICT_WORD_SIZE*WORDSIZE+4+1;
Constant #dict_par2 = DICT_WORD_SIZE*WORDSIZE+4+3;
Array gg_event --> 4;
Array gg_arguments buffer 28;
Global gg_mainwin = 0;
Global gg_statuswin = 0;
Global gg_quotewin = 0;
Global gg_scriptfref = 0;
Global gg_scriptstr = 0;
Global gg_savestr = 0;
Global gg_commandstr = 0;
Global gg_command_reading = 0; ! true if gg_commandstr is being replayed
Global gg_foregroundchan = 0;
Global gg_backgroundchan = 0;
Constant INPUT_BUFFER_LEN = 260; ! No extra byte necessary
Constant MAX_BUFFER_WORDS = 20;
Constant PARSE_BUFFER_LEN = 61;
Array buffer --> INPUT_BUFFER_LEN;
Array buffer2 --> INPUT_BUFFER_LEN;
Array buffer3 --> INPUT_BUFFER_LEN;
Array parse --> PARSE_BUFFER_LEN;
Array parse2 --> PARSE_BUFFER_LEN;
@h Rocks.
These are unique ID codes used to mark resources; think of them as inedible
cookies.
@ -48,6 +18,77 @@ Constant GG_SCRIPTFREF_ROCK 401;
Constant GG_FOREGROUNDCHAN_ROCK 410;
Constant GG_BACKGROUNDCHAN_ROCK 411;
@h Transcript support.
This is a mode in which the transcript of text in the main window is being
written out to an external file.
|VM_TranscriptIsOn| tests whether this mode is on. |VM_TranscriptOn| should
be called only if it is off, and tries to turn it on, returning |true| or |false|
according to whether or not it succeeds. |VM_TranscriptOff| should be called
only if scripting is on: this always succeeds.
=
Global gg_scriptfref = 0;
Global gg_scriptstr = 0;
[ VM_TranscriptIsOn;
if (gg_scriptstr) rtrue;
rfalse;
];
[ VM_TranscriptOn;
while (true) {
if (gg_scriptfref == 0) {
gg_scriptfref = glk_fileref_create_by_prompt($102, $05, GG_SCRIPTFREF_ROCK);
if (gg_scriptfref == 0) rfalse;
}
! stream_open_file
gg_scriptstr = glk_stream_open_file(gg_scriptfref, $05, GG_SCRIPTSTR_ROCK);
if (gg_scriptstr == 0) {
! Could not open selected file; select again
glk_fileref_destroy(gg_scriptfref);
gg_scriptfref = 0;
continue;
}
glk_window_set_echo_stream(gg_mainwin, gg_scriptstr);
rtrue;
}
];
[ VM_TranscriptOff;
glk_stream_close(gg_scriptstr, 0); ! stream_close
gg_scriptstr = 0;
rtrue;
];
@h Variables and Arrays.
=
Constant DICT_ENTRY_BYTES = 12+DICT_WORD_SIZE*WORDSIZE;
Constant #dict_par1 = DICT_WORD_SIZE*WORDSIZE+4+1;
Constant #dict_par2 = DICT_WORD_SIZE*WORDSIZE+4+3;
Array gg_event --> 4;
Array gg_arguments buffer 28;
Global gg_mainwin = 0;
Global gg_statuswin = 0;
Global gg_quotewin = 0;
Global gg_savestr = 0;
Global gg_commandstr = 0;
Global gg_command_reading = 0; ! true if gg_commandstr is being replayed
Global gg_foregroundchan = 0;
Global gg_backgroundchan = 0;
Constant INPUT_BUFFER_LEN = 260; ! No extra byte necessary
Constant MAX_BUFFER_WORDS = 20;
Constant PARSE_BUFFER_LEN = 61;
Array buffer --> INPUT_BUFFER_LEN;
Array buffer2 --> INPUT_BUFFER_LEN;
Array buffer3 --> INPUT_BUFFER_LEN;
Array parse --> PARSE_BUFFER_LEN;
Array parse2 --> PARSE_BUFFER_LEN;
@h Dictionary words.
This tests whether an address is probably that of a dictionary word. It's used
only for debugging output, so the false positives here really do not matter.
@ -433,6 +474,18 @@ routine was added to concentrate lookups of this field in one place.
return verbnum;
];
@h Action functions.
This looks up the address of a function like |TakeSub| from the table of
"action subroutines".
Strangely, Glulx's action routines table is numbered in an off-by-one way
compared to the Z-machine's: hence the |+1| here.
=
[ VM_ActionFunction act;
return #actions_table-->(act+1);
];
@h Glulx-Only Printing Routines.
Partly because of the smallness of the range of representable values in
the Z-machine, there is little run-time type-checking that can be done:

View file

@ -0,0 +1,114 @@
State Template.
Saving, restoring, restarting and verifying the program from within itself.
@h Environment.
The language "interpreter" here supposes that the eventual program is
running in a VM which is being interpreted, and that may not be the case,
but it's traditional.
=
[ VM_ReportOnInterpreter ix;
@gestalt 1 0 ix;
print "Interpreter version ", ix / $10000, ".", (ix & $FF00) / $100,
".", ix & $FF, " / ";
@gestalt 0 0 ix;
print "VM ", ix / $10000, ".", (ix & $FF00) / $100, ".", ix & $FF, "^";
];
@h Verification.
This verifies that the current story file is intact.
=
[ VM_Verify res;
@verify res;
return res;
];
@h Save, restore, restart.
Restart does what it says: restarts the program as if it had just loaded for
the first time.
|VM_Save()| attempts to save the current state of the program to a file, and
returns 0 if this fails, 1 if this succeeds, or 2 if in fact a restore has
just succeeded. (A successful restoration should resume execution where the
save succeeded, but we want to distinguish those cases.)
|VM_Restore()| pretends to return |true| or |false| according to whether or not
it succeeds, but in fact it can only return |false| to indicate failure, because
a successful restoration means that execution has transferred to |VM_Save|
instead.
=
[ VM_Restart;
@restart;
];
[ VM_Restore res fref;
fref = glk_fileref_create_by_prompt($01, $02, 0);
if (fref == 0) jump RFailed;
gg_savestr = glk_stream_open_file(fref, $02, GG_SAVESTR_ROCK);
glk_fileref_destroy(fref);
if (gg_savestr == 0) jump RFailed;
@restore gg_savestr res;
glk_stream_close(gg_savestr, 0);
gg_savestr = 0;
.RFailed;
rfalse;
];
[ VM_Save fref len res;
fref = glk_fileref_create_by_prompt(fileusage_SavedGame, filemode_Write, 0);
if (fref) {
gg_savestr = glk_stream_open_file(fref, filemode_Write, GG_SAVESTR_ROCK);
if (gg_savestr) {
@save gg_savestr res;
if (res == -1) {
! The player actually just typed "restore". We first have to recover
! all the Glk objects; the values in our global variables are all wrong.
GGRecoverObjects();
glk_stream_close(gg_savestr, GLK_NULL);
gg_savestr = 0;
return 2;
}
glk_stream_close(gg_savestr, GLK_NULL);
gg_savestr = 0;
if (res == 0) {
! Check that the savefile was actually written - this is mostly to account for browser limits in Parchment
if (glk_fileref_does_file_exist(fref)) {
gg_savestr = glk_stream_open_file(fref, filemode_Read, GG_SAVESTR_ROCK);
if (gg_savestr) {
glk_stream_set_position(gg_savestr, 0, seekmode_End);
len = glk_stream_get_position(gg_savestr);
glk_stream_close(gg_savestr, GLK_NULL);
gg_savestr = 0;
if (len) {
! We've confirmed the file exists and has content, which is about all we can do
glk_fileref_destroy(fref);
return 1;
}
! Cleanup the empty file
glk_fileref_delete_file(fref);
}
}
}
}
glk_fileref_destroy(fref);
}
return 0;
];
@h Undo.
These are really emulations of the Z-machine's conventions on UNDO.
=
[ VM_Undo result_code;
@restoreundo result_code;
return (~~result_code);
];
[ VM_Save_Undo result_code;
@saveundo result_code;
if (result_code == -1) { GGRecoverObjects(); return 2; }
return (~~result_code);
];

View file

@ -7,8 +7,7 @@ Web Syntax Version: 2
Sections
Miscellany
Glulx
ZMachine
State
Light
ListWriter
OrderOfPlay

View file

@ -715,6 +715,21 @@ Array Details_of_Specific_Action-->5;
rtrue;
];
@h Descend To Specific Action Rule.
There are 100 or so actions, typically, and this rule is for efficiency's
sake: rather than perform 100 or so comparisons to see which routine to
call, we indirect through a jump table. The routines called are the |-Sub|
routines: thus, for instance, if |action| is |##Wait| then |WaitSub| is
called. It is essential that this routine not be called for fake actions:
in I7 use this is guaranteed, since fake actions are not allowed into the
action machinery at all.
=
[ DESCEND_TO_SPECIFIC_ACTION_R;
( VM_ActionFunction(action) )();
rtrue;
];
@h Work Out Details Of Specific Action Rule.
This is one of the I6 primitive rules in the specific action processing
rulebook, and it's basically a trick to allow information known to the

View file

@ -1,211 +0,0 @@
Glulx Template.
To provide Glulx-specific actions.
@h Begin Glulx-only matter.
=
#Ifdef TARGET_GLULX;
@h GlkList Command.
GLKLIST is a testing command best used by those who understand Glulx and its
ways: it isn't documented in the I7 manual, because it is pretty inscrutable
for "real" users, but it's probably worth keeping just the same.
=
#Ifdef DEBUG;
[ GlkListSub;
GlkDebuggingList();
];
Verb meta 'glklist'
* -> GlkList;
#Endif;
@h Quit The Game Rule.
=
[ QUIT_THE_GAME_R;
if (actor ~= player) rfalse;
QUIT_THE_GAME_RM('A');
if (YesOrNo()~=0) quit;
];
@h Restart The Game Rule.
=
[ RESTART_THE_GAME_R;
if (actor ~= player) rfalse;
RESTART_THE_GAME_RM('A');
if (YesOrNo()~=0) {
@restart;
RESTART_THE_GAME_RM('B'); new_line;
}
];
@h Restore The Game Rule.
=
[ RESTORE_THE_GAME_R res fref;
if (actor ~= player) rfalse;
fref = glk_fileref_create_by_prompt($01, $02, 0);
if (fref == 0) jump RFailed;
gg_savestr = glk_stream_open_file(fref, $02, GG_SAVESTR_ROCK);
glk_fileref_destroy(fref);
if (gg_savestr == 0) jump RFailed;
@restore gg_savestr res;
glk_stream_close(gg_savestr, 0);
gg_savestr = 0;
.RFailed;
RESTORE_THE_GAME_RM('A'); new_line;
];
@h Save The Game Rule.
=
[ SAVE_THE_GAME_R fref len res;
if (actor ~= player) rfalse;
fref = glk_fileref_create_by_prompt(fileusage_SavedGame, filemode_Write, 0);
if (fref) {
gg_savestr = glk_stream_open_file(fref, filemode_Write, GG_SAVESTR_ROCK);
if (gg_savestr) {
@save gg_savestr res;
if (res == -1) {
! The player actually just typed "restore". We first have to recover
! all the Glk objects; the values in our global variables are all wrong.
GGRecoverObjects();
glk_stream_close(gg_savestr, GLK_NULL);
gg_savestr = 0;
RESTORE_THE_GAME_RM('B'); new_line;
rtrue;
}
glk_stream_close(gg_savestr, GLK_NULL);
gg_savestr = 0;
if (res == 0) {
! Check that the savefile was actually written - this is mostly to account for browser limits in Parchment
if (glk_fileref_does_file_exist(fref)) {
gg_savestr = glk_stream_open_file(fref, filemode_Read, GG_SAVESTR_ROCK);
if (gg_savestr) {
glk_stream_set_position(gg_savestr, 0, seekmode_End);
len = glk_stream_get_position(gg_savestr);
glk_stream_close(gg_savestr, GLK_NULL);
gg_savestr = 0;
if (len) {
! We've confirmed the file exists and has content, which is about all we can do
SAVE_THE_GAME_RM('B'); new_line;
glk_fileref_destroy(fref);
rtrue;
}
! Cleanup the empty file
glk_fileref_delete_file(fref);
}
}
}
}
glk_fileref_destroy(fref);
}
SAVE_THE_GAME_RM('A'); new_line;
];
@h Verify The Story File Rule.
This is a fossil now, really, but in the days of Infocom, the 110K story
file occupying an entire disc was a huge data set: floppy discs were by no
means a reliable medium, and cheap hardware often used hit-and-miss
components, as on the notorious Commodore 64 disc controller. If somebody
experienced an apparent bug in play, it could easily be that he had a
corrupt disc or was unable to read data of that density. So the VERIFY
command, which took up to ten minutes on some early computers, would chug
through the entire story file and compute a checksum, compare it against a
known result in the header, and determine that the story file could or
could not properly be read. The Z-machine provided this service as an
opcode, and so Glulx followed suit.
=
[ VERIFY_THE_STORY_FILE_R res;
if (actor ~= player) rfalse;
@verify res;
if (res == 0) { VERIFY_THE_STORY_FILE_RM('A'); new_line; rtrue; }
VERIFY_THE_STORY_FILE_RM('B'); new_line;
];
@h Switch Transcript On Rule.
=
[ SWITCH_TRANSCRIPT_ON_R;
if (actor ~= player) rfalse;
if (gg_scriptstr ~= 0) { SWITCH_TRANSCRIPT_ON_RM('A'); new_line; rtrue; }
.S2Failed;
if (gg_scriptfref == 0) {
gg_scriptfref = glk_fileref_create_by_prompt($102, $05, GG_SCRIPTFREF_ROCK);
if (gg_scriptfref == 0) jump S1Failed;
}
! stream_open_file
gg_scriptstr = glk_stream_open_file(gg_scriptfref, $05, GG_SCRIPTSTR_ROCK);
if (gg_scriptstr == 0) {
! Could not open selected file; select again
glk_fileref_destroy(gg_scriptfref);
gg_scriptfref = 0;
jump S2Failed;
}
glk_window_set_echo_stream(gg_mainwin, gg_scriptstr);
SWITCH_TRANSCRIPT_ON_RM('B'); new_line;
VersionSub();
return;
.S1Failed;
SWITCH_TRANSCRIPT_ON_RM('C'); new_line;
];
@h Switch Transcript Off Rule.
=
[ SWITCH_TRANSCRIPT_OFF_R;
if (actor ~= player) rfalse;
if (gg_scriptstr == 0) { SWITCH_TRANSCRIPT_OFF_RM('A'); new_line; rtrue; }
SWITCH_TRANSCRIPT_OFF_RM('B'); new_line;
glk_stream_close(gg_scriptstr, 0); ! stream_close
gg_scriptstr = 0;
];
@h Announce Story File Version Rule.
=
[ ANNOUNCE_STORY_FILE_VERSION_R ix;
if (actor ~= player) rfalse;
Banner();
print "Inform 7 v", (PrintI6Text) I7_FULL_VERSION_NUMBER, "^";
if (UUID_ARRAY->0 >= 6) {
print "Identification number: ";
for (ix=6: ix <= UUID_ARRAY->0: ix++) print (char) UUID_ARRAY->ix;
print "^";
}
@gestalt 1 0 ix;
print "Interpreter version ", ix / $10000, ".", (ix & $FF00) / $100,
".", ix & $FF, " / ";
@gestalt 0 0 ix;
print "VM ", ix / $10000, ".", (ix & $FF00) / $100, ".", ix & $FF, "^";
ShowExtensionVersions();
say__p = 1;
];
@h Descend To Specific Action Rule.
There are 100 or so actions, typically, and this rule is for efficiency's
sake: rather than perform 100 or so comparisons to see which routine to
call, we indirect through a jump table. The routines called are the |-Sub|
routines: thus, for instance, if |action| is |##Wait| then |WaitSub| is
called. It is essential that this routine not be called for fake actions:
in I7 use this is guaranteed, since fake actions are not allowed into the
action machinery at all.
Strangely, Glulx's action routines table is numbered in an off-by-one way
compared to the Z-machine's: hence the |+1|.
=
[ DESCEND_TO_SPECIFIC_ACTION_R;
( #actions_table-->(action+1) )();
rtrue;
];
@h End Glulx-only matter.
=
#Endif;

View file

@ -2,19 +2,6 @@ OutOfWorld Template.
To implement some of the out of world actions.
@h Perform Undo.
=
[ Perform_Undo;
if (CommandParserKit`UNDO_PREVENTION_CFGF) {
IMMEDIATELY_UNDO_RM('A'); new_line; return;
}
if (IterationsOfTurnSequence == 0) { IMMEDIATELY_UNDO_RM('B'); new_line; return; }
if (undo_flag == 0) { IMMEDIATELY_UNDO_RM('C'); new_line; return; }
if (undo_flag == 1) { IMMEDIATELY_UNDO_RM('D'); new_line; return; }
if (VM_Undo() == 0) { IMMEDIATELY_UNDO_RM('F'); new_line; }
];
@h Announce Score Rule.
=

View file

@ -1,11 +1,6 @@
ZMachine Template.
State Template.
To provide Z-specific actions.
@h Begin Z-only matter.
=
#Ifdef TARGET_ZCODE;
To implement out of world actions relating to the program state.
@h Quit The Game Rule.
@ -23,7 +18,7 @@ To provide Z-specific actions.
if (actor ~= player) rfalse;
RESTART_THE_GAME_RM('A');
if (YesOrNo()~=0) {
@restart;
VM_Restart();
RESTART_THE_GAME_RM('B'); new_line;
}
];
@ -33,10 +28,11 @@ To provide Z-specific actions.
=
[ RESTORE_THE_GAME_R;
if (actor ~= player) rfalse;
restore RMaybe;
RESTORE_THE_GAME_RM('A'); new_line;
rtrue;
.RMaybe; RESTORE_THE_GAME_RM('B'); new_line;
if (VM_Restore()) {
RESTORE_THE_GAME_RM('B'); new_line;
} else {
RESTORE_THE_GAME_RM('A'); new_line;
}
];
@h Save The Game Rule.
@ -44,14 +40,26 @@ To provide Z-specific actions.
=
[ SAVE_THE_GAME_R flag;
if (actor ~= player) rfalse;
@save -> flag;
switch (flag) {
switch (VM_Save()) {
0: SAVE_THE_GAME_RM('A'); new_line;
1: SAVE_THE_GAME_RM('B'); new_line;
2: RESTORE_THE_GAME_RM('B'); new_line;
}
];
@h Perform Undo.
=
[ Perform_Undo;
if (CommandParserKit`UNDO_PREVENTION_CFGF) {
IMMEDIATELY_UNDO_RM('A'); new_line; return;
}
if (IterationsOfTurnSequence == 0) { IMMEDIATELY_UNDO_RM('B'); new_line; return; }
if (undo_flag == 0) { IMMEDIATELY_UNDO_RM('C'); new_line; return; }
if (undo_flag == 1) { IMMEDIATELY_UNDO_RM('D'); new_line; return; }
if (VM_Undo() == 0) { IMMEDIATELY_UNDO_RM('F'); new_line; }
];
@h Verify The Story File Rule.
This is a fossil now, really, but in the days of Infocom, the 110K story
file occupying an entire disc was a huge data set: floppy discs were by no
@ -62,17 +70,13 @@ corrupt disc or was unable to read data of that density. So the VERIFY
command, which took up to ten minutes on some early computers, would chug
through the entire story file and compute a checksum, compare it against a
known result in the header, and determine that the story file could or
could not properly be read. The Z-machine provided this service as an
opcode, and so Glulx followed suit.
could not properly be read.
=
[ VERIFY_THE_STORY_FILE_R;
if (actor ~= player) rfalse;
@verify ?Vmaybe;
jump Vwrong;
.Vmaybe; VERIFY_THE_STORY_FILE_RM('A'); new_line; rtrue;
.Vwrong;
VERIFY_THE_STORY_FILE_RM('B'); new_line;
if (VM_Verify()) { VERIFY_THE_STORY_FILE_RM('A'); new_line; }
else { VERIFY_THE_STORY_FILE_RM('B'); new_line; }
];
@h Switch Transcript On Rule.
@ -80,12 +84,9 @@ opcode, and so Glulx followed suit.
=
[ SWITCH_TRANSCRIPT_ON_R;
if (actor ~= player) rfalse;
transcript_mode = ((0-->8) & 1);
if (transcript_mode) { SWITCH_TRANSCRIPT_ON_RM('A'); new_line; rtrue; }
@output_stream 2;
if (((0-->8) & 1) == 0) { SWITCH_TRANSCRIPT_ON_RM('C'); new_line; rtrue; }
if (VM_TranscriptIsOn()) { SWITCH_TRANSCRIPT_ON_RM('A'); new_line; rtrue; }
if (VM_TranscriptOn() == false) { SWITCH_TRANSCRIPT_ON_RM('C'); new_line; rtrue; }
SWITCH_TRANSCRIPT_ON_RM('B'); new_line; VersionSub();
transcript_mode = true;
];
@h Switch Transcript Off Rule.
@ -93,12 +94,9 @@ opcode, and so Glulx followed suit.
=
[ SWITCH_TRANSCRIPT_OFF_R;
if (actor ~= player) rfalse;
transcript_mode = ((0-->8) & 1);
if (transcript_mode == false) { SWITCH_TRANSCRIPT_OFF_RM('A'); new_line; rtrue; }
if (VM_TranscriptIsOn() == false) { SWITCH_TRANSCRIPT_OFF_RM('A'); new_line; rtrue; }
SWITCH_TRANSCRIPT_OFF_RM('B'); new_line;
@output_stream -2;
if ((0-->8) & 1) { SWITCH_TRANSCRIPT_ON_RM('C'); new_line; rtrue; }
transcript_mode = false;
if (VM_TranscriptOff() == false) { SWITCH_TRANSCRIPT_ON_RM('C'); new_line; rtrue; }
];
@h Announce Story File Version Rule.
@ -113,38 +111,7 @@ opcode, and so Glulx followed suit.
for (ix=6: ix <= UUID_ARRAY->0: ix++) print (char) UUID_ARRAY->ix;
print "^";
}
ix = 0; ! shut up compiler warning
if (standard_interpreter > 0) {
print "Standard interpreter ",
standard_interpreter/256, ".", standard_interpreter%256,
" (", HDR_TERPNUMBER->0;
print (char) HDR_TERPVERSION->0;
print ")^";
} else {
print "Interpreter ", HDR_TERPNUMBER->0, " Version ";
print (char) HDR_TERPVERSION->0;
print "^";
}
VM_ReportOnInterpreter();
ShowExtensionVersions();
say__p = 1;
];
@h Descend To Specific Action Rule.
There are 100 or so actions, typically, and this rule is for efficiency's
sake: rather than perform 100 or so comparisons to see which routine to
call, we indirect through a jump table. The routines called are the |-Sub|
routines: thus, for instance, if |action| is |##Wait| then |WaitSub| is
called. It is essential that this routine not be called for fake actions:
in I7 use this is guaranteed, since fake actions are not allowed into the
action machinery at all.
=
[ DESCEND_TO_SPECIFIC_ACTION_R;
( #actions_table-->action )();
rtrue;
];
@h End Z-only matter.
=
#Endif; ! TARGET_ZCODE

View file

@ -506,6 +506,18 @@ in I7 terms. It should arguably be withdrawn, but doesn't seem to do any harm.
WriteListFrom(child(obj), NEWLINE_BIT+INDENT_BIT+ALWAYS_BIT+FULLINV_BIT, 1);
];
@h GlkList Command.
GLKLIST is a testing command best used by those who understand Glulx and its
ways: it isn't documented in the I7 manual, because it is pretty inscrutable
for "real" users, but it's probably worth keeping just the same.
=
#Ifdef TARGET_GLULX;
[ GlkListSub;
GlkDebuggingList();
];
#Endif;
@h Grammar.
In the old I6 parser, testing commands had their own scope hardwired in to the
code: this worked by comparing the verb command word directly against |'scope'|
@ -580,6 +592,10 @@ Verb meta 'trace'
Verb meta 'tree'
* -> XTree
* scope=testcommandnoun -> XTree;
#Ifdef TARGET_GLULX;
Verb meta 'glklist'
* -> GlkList;
#Endif;
@h End testy.