1
0
Fork 0
mirror of https://github.com/ganelson/inform.git synced 2024-07-08 10:04:21 +03:00
inform7/docs/WorldModelKit/S-gll.html
2020-04-15 23:49:59 +01:00

321 lines
38 KiB
HTML

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<title>Glulx Template</title>
<meta name="viewport" content="width=device-width initial-scale=1">
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<meta http-equiv="Content-Language" content="en-gb">
<link href="../inweb.css" rel="stylesheet" rev="stylesheet" type="text/css">
</head>
<body>
<nav role="navigation">
<h1><a href="../index.html">
<img src="../docs-src/Figures/Inform.png" height=72">
</a></h1>
<ul><li><a href="../compiler.html">compiler tools</a></li>
<li><a href="../other.html">other tools</a></li>
<li><a href="../extensions.html">extensions and kits</a></li>
<li><a href="../units.html">unit test tools</a></li>
</ul><h2>Extensions</h2><ul>
<li><a href="../basic_inform/index.html">basic_inform</a></li>
<li><a href="../standard_rules/index.html">standard_rules</a></li>
</ul><h2>Kits</h2><ul>
<li><a href="../BasicInformKit/index.html">BasicInformKit</a></li>
<li><a href="../BasicInformExtrasKit/index.html">BasicInformExtrasKit</a></li>
<li><a href="../CommandParserKit/index.html">CommandParserKit</a></li>
<li><a href="../EnglishLanguageKit/index.html">EnglishLanguageKit</a></li>
<li><a href="index.html"><span class="selectedlink">WorldModelKit</span></a></li>
</ul>
</nav>
<main role="main">
<!--Weave of 'Glulx Template' generated by 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>Glulx Template</b></li></ul><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. Undo</a></li><li><a href="S-gll.html#SP4">&#167;4. Quit The Game Rule</a></li><li><a href="S-gll.html#SP5">&#167;5. Restart The Game Rule</a></li><li><a href="S-gll.html#SP6">&#167;6. Restore The Game Rule</a></li><li><a href="S-gll.html#SP7">&#167;7. Save The Game Rule</a></li><li><a href="S-gll.html#SP8">&#167;8. Verify The Story File Rule</a></li><li><a href="S-gll.html#SP9">&#167;9. Switch Transcript On Rule</a></li><li><a href="S-gll.html#SP10">&#167;10. Switch Transcript Off Rule</a></li><li><a href="S-gll.html#SP11">&#167;11. Announce Story File Version Rule</a></li><li><a href="S-gll.html#SP12">&#167;12. Descend To Specific Action Rule</a></li><li><a href="S-gll.html#SP13">&#167;13. End Glulx-only matter</a></li></ul><hr class="tocbar">
<p class="inwebparagraph"><a id="SP1"></a><b>&#167;1. Begin Glulx-only matter. </b></p>
<pre class="display">
<span class="plain">#</span><span class="identifier">Ifdef</span><span class="plain"> </span><span class="identifier">TARGET_GLULX</span><span class="plain">;</span>
</pre>
<p class="inwebparagraph"></p>
<p class="inwebparagraph"><a id="SP2"></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="display">
<span class="plain">#</span><span class="identifier">Ifdef</span><span class="plain"> </span><span class="identifier">DEBUG</span><span class="plain">;</span>
<span class="plain">[ </span><span class="identifier">GlkListSub</span><span class="plain"> </span><span class="identifier">id</span><span class="plain"> </span><span class="identifier">val</span><span class="plain">;</span>
<span class="identifier">id</span><span class="plain"> = </span><span class="identifier">glk_window_iterate</span><span class="plain">(0, </span><span class="identifier">gg_arguments</span><span class="plain">);</span>
<span class="reserved">while</span><span class="plain"> (</span><span class="identifier">id</span><span class="plain">) {</span>
<span class="reserved">print</span><span class="plain"> </span><span class="string">"Window "</span><span class="plain">, </span><span class="identifier">id</span><span class="plain">, </span><span class="string">" ("</span><span class="plain">, </span><span class="identifier">gg_arguments</span><span class="plain">--&gt;0, </span><span class="string">"): "</span><span class="plain">;</span>
<span class="identifier">val</span><span class="plain"> = </span><span class="identifier">glk_window_get_type</span><span class="plain">(</span><span class="identifier">id</span><span class="plain">);</span>
<span class="reserved">switch</span><span class="plain"> (</span><span class="identifier">val</span><span class="plain">) {</span>
<span class="plain"> </span><span class="constant">1</span><span class="plain">: </span><span class="reserved">print</span><span class="plain"> </span><span class="string">"pair"</span><span class="plain">;</span>
<span class="plain"> </span><span class="constant">2</span><span class="plain">: </span><span class="reserved">print</span><span class="plain"> </span><span class="string">"blank"</span><span class="plain">;</span>
<span class="plain"> </span><span class="constant">3</span><span class="plain">: </span><span class="reserved">print</span><span class="plain"> </span><span class="string">"textbuffer"</span><span class="plain">;</span>
<span class="plain"> </span><span class="constant">4</span><span class="plain">: </span><span class="reserved">print</span><span class="plain"> </span><span class="string">"textgrid"</span><span class="plain">;</span>
<span class="plain"> </span><span class="constant">5</span><span class="plain">: </span><span class="reserved">print</span><span class="plain"> </span><span class="string">"graphics"</span><span class="plain">;</span>
<span class="plain"> </span><span class="reserved">default</span><span class="plain">: </span><span class="reserved">print</span><span class="plain"> </span><span class="string">"unknown"</span><span class="plain">;</span>
<span class="plain">}</span>
<span class="identifier">val</span><span class="plain"> = </span><span class="identifier">glk_window_get_parent</span><span class="plain">(</span><span class="identifier">id</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">val</span><span class="plain">) </span><span class="reserved">print</span><span class="plain"> </span><span class="string">", parent is window "</span><span class="plain">, </span><span class="identifier">val</span><span class="plain">;</span>
<span class="reserved">else</span><span class="plain"> </span><span class="reserved">print</span><span class="plain"> </span><span class="string">", no parent (root)"</span><span class="plain">;</span>
<span class="identifier">val</span><span class="plain"> = </span><span class="identifier">glk_window_get_stream</span><span class="plain">(</span><span class="identifier">id</span><span class="plain">);</span>
<span class="reserved">print</span><span class="plain"> </span><span class="string">", stream "</span><span class="plain">, </span><span class="identifier">val</span><span class="plain">;</span>
<span class="identifier">val</span><span class="plain"> = </span><span class="identifier">glk_window_get_echo_stream</span><span class="plain">(</span><span class="identifier">id</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">val</span><span class="plain">) </span><span class="reserved">print</span><span class="plain"> </span><span class="string">", echo stream "</span><span class="plain">, </span><span class="identifier">val</span><span class="plain">;</span>
<span class="reserved">print</span><span class="plain"> </span><span class="string">"^"</span><span class="plain">;</span>
<span class="identifier">id</span><span class="plain"> = </span><span class="identifier">glk_window_iterate</span><span class="plain">(</span><span class="identifier">id</span><span class="plain">, </span><span class="identifier">gg_arguments</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="identifier">id</span><span class="plain"> = </span><span class="identifier">glk_stream_iterate</span><span class="plain">(0, </span><span class="identifier">gg_arguments</span><span class="plain">);</span>
<span class="reserved">while</span><span class="plain"> (</span><span class="identifier">id</span><span class="plain">) {</span>
<span class="reserved">print</span><span class="plain"> </span><span class="string">"Stream "</span><span class="plain">, </span><span class="identifier">id</span><span class="plain">, </span><span class="string">" ("</span><span class="plain">, </span><span class="identifier">gg_arguments</span><span class="plain">--&gt;0, </span><span class="string">")^"</span><span class="plain">;</span>
<span class="identifier">id</span><span class="plain"> = </span><span class="identifier">glk_stream_iterate</span><span class="plain">(</span><span class="identifier">id</span><span class="plain">, </span><span class="identifier">gg_arguments</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="identifier">id</span><span class="plain"> = </span><span class="identifier">glk_fileref_iterate</span><span class="plain">(0, </span><span class="identifier">gg_arguments</span><span class="plain">);</span>
<span class="reserved">while</span><span class="plain"> (</span><span class="identifier">id</span><span class="plain">) {</span>
<span class="reserved">print</span><span class="plain"> </span><span class="string">"Fileref "</span><span class="plain">, </span><span class="identifier">id</span><span class="plain">, </span><span class="string">" ("</span><span class="plain">, </span><span class="identifier">gg_arguments</span><span class="plain">--&gt;0, </span><span class="string">")^"</span><span class="plain">;</span>
<span class="identifier">id</span><span class="plain"> = </span><span class="identifier">glk_fileref_iterate</span><span class="plain">(</span><span class="identifier">id</span><span class="plain">, </span><span class="identifier">gg_arguments</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">glk_gestalt</span><span class="plain">(</span><span class="identifier">gestalt_Sound</span><span class="plain">, </span><span class="constant">0</span><span class="plain">)) {</span>
<span class="identifier">id</span><span class="plain"> = </span><span class="identifier">glk_schannel_iterate</span><span class="plain">(0, </span><span class="identifier">gg_arguments</span><span class="plain">);</span>
<span class="reserved">while</span><span class="plain"> (</span><span class="identifier">id</span><span class="plain">) {</span>
<span class="reserved">print</span><span class="plain"> </span><span class="string">"Soundchannel "</span><span class="plain">, </span><span class="identifier">id</span><span class="plain">, </span><span class="string">" ("</span><span class="plain">, </span><span class="identifier">gg_arguments</span><span class="plain">--&gt;0, </span><span class="string">")^"</span><span class="plain">;</span>
<span class="identifier">id</span><span class="plain"> = </span><span class="identifier">glk_schannel_iterate</span><span class="plain">(</span><span class="identifier">id</span><span class="plain">, </span><span class="identifier">gg_arguments</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="plain">}</span>
<span class="plain">];</span>
<span class="identifier">Verb</span><span class="plain"> </span><span class="identifier">meta</span><span class="plain"> </span><span class="character">'glklist'</span>
<span class="plain">* -&gt; </span><span class="identifier">GlkList</span><span class="plain">;</span>
<span class="plain">#</span><span class="identifier">Endif</span><span class="plain">;</span>
</pre>
<p class="inwebparagraph"></p>
<p class="inwebparagraph"><a id="SP3"></a><b>&#167;3. Undo. </b>These are really emulations of the Z-machine's conventions on UNDO: Glulx's
undo opcodes used different result codes while providing essentially the same
functionality, for reasons which are opaque, but no trouble is caused thereby.
</p>
<pre class="display">
<span class="plain">[ </span><span class="identifier">VM_Undo</span><span class="plain"> </span><span class="identifier">result_code</span><span class="plain">;</span>
<span class="plain">@</span><span class="identifier">restoreundo</span><span class="plain"> </span><span class="identifier">result_code</span><span class="plain">;</span>
<span class="reserved">return</span><span class="plain"> (~~</span><span class="identifier">result_code</span><span class="plain">);</span>
<span class="plain">];</span>
<span class="plain">[ </span><span class="identifier">VM_Save_Undo</span><span class="plain"> </span><span class="identifier">result_code</span><span class="plain">;</span>
<span class="plain">@</span><span class="identifier">saveundo</span><span class="plain"> </span><span class="identifier">result_code</span><span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">result_code</span><span class="plain"> == -1) { </span><span class="identifier">GGRecoverObjects</span><span class="plain">(); </span><span class="reserved">return</span><span class="plain"> </span><span class="constant">2</span><span class="plain">; }</span>
<span class="reserved">return</span><span class="plain"> (~~</span><span class="identifier">result_code</span><span class="plain">);</span>
<span class="plain">];</span>
</pre>
<p class="inwebparagraph"></p>
<p class="inwebparagraph"><a id="SP4"></a><b>&#167;4. Quit The Game Rule. </b></p>
<pre class="display">
<span class="plain">[ </span><span class="identifier">QUIT_THE_GAME_R</span><span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">actor</span><span class="plain"> ~= </span><span class="identifier">player</span><span class="plain">) </span><span class="reserved">rfalse</span><span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">actor</span><span class="plain"> == </span><span class="identifier">player</span><span class="plain">) &amp;&amp; (</span><span class="identifier">untouchable_silence</span><span class="plain"> == </span><span class="reserved">false</span><span class="plain">))</span>
<span class="identifier">QUIT_THE_GAME_RM</span><span class="plain">(</span><span class="character">'A'</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">YesOrNo</span><span class="plain">()~=0) </span><span class="reserved">quit</span><span class="plain">;</span>
<span class="plain">];</span>
</pre>
<p class="inwebparagraph"></p>
<p class="inwebparagraph"><a id="SP5"></a><b>&#167;5. Restart The Game Rule. </b></p>
<pre class="display">
<span class="plain">[ </span><span class="identifier">RESTART_THE_GAME_R</span><span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">actor</span><span class="plain"> ~= </span><span class="identifier">player</span><span class="plain">) </span><span class="reserved">rfalse</span><span class="plain">;</span>
<span class="identifier">RESTART_THE_GAME_RM</span><span class="plain">(</span><span class="character">'A'</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">YesOrNo</span><span class="plain">()~=0) {</span>
<span class="plain">@</span><span class="identifier">restart</span><span class="plain">;</span>
<span class="identifier">RESTART_THE_GAME_RM</span><span class="plain">(</span><span class="character">'B'</span><span class="plain">); </span><span class="reserved">new_line</span><span class="plain">;</span>
<span class="plain">}</span>
<span class="plain">];</span>
</pre>
<p class="inwebparagraph"></p>
<p class="inwebparagraph"><a id="SP6"></a><b>&#167;6. Restore The Game Rule. </b></p>
<pre class="display">
<span class="plain">[ </span><span class="identifier">RESTORE_THE_GAME_R</span><span class="plain"> </span><span class="identifier">res</span><span class="plain"> </span><span class="identifier">fref</span><span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">actor</span><span class="plain"> ~= </span><span class="identifier">player</span><span class="plain">) </span><span class="reserved">rfalse</span><span class="plain">;</span>
<span class="identifier">fref</span><span class="plain"> = </span><span class="identifier">glk_fileref_create_by_prompt</span><span class="plain">(</span><span class="constant">$01</span><span class="plain">, </span><span class="constant">$02</span><span class="plain">, </span><span class="constant">0</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">fref</span><span class="plain"> == </span><span class="constant">0</span><span class="plain">) </span><span class="reserved">jump</span><span class="plain"> </span><span class="identifier">RFailed</span><span class="plain">;</span>
<span class="identifier">gg_savestr</span><span class="plain"> = </span><span class="identifier">glk_stream_open_file</span><span class="plain">(</span><span class="identifier">fref</span><span class="plain">, </span><span class="constant">$02</span><span class="plain">, </span><span class="identifier">GG_SAVESTR_ROCK</span><span class="plain">);</span>
<span class="identifier">glk_fileref_destroy</span><span class="plain">(</span><span class="identifier">fref</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">gg_savestr</span><span class="plain"> == </span><span class="constant">0</span><span class="plain">) </span><span class="reserved">jump</span><span class="plain"> </span><span class="identifier">RFailed</span><span class="plain">;</span>
<span class="plain">@</span><span class="reserved">restore</span><span class="plain"> </span><span class="identifier">gg_savestr</span><span class="plain"> </span><span class="identifier">res</span><span class="plain">;</span>
<span class="identifier">glk_stream_close</span><span class="plain">(</span><span class="identifier">gg_savestr</span><span class="plain">, </span><span class="constant">0</span><span class="plain">);</span>
<span class="identifier">gg_savestr</span><span class="plain"> = </span><span class="constant">0</span><span class="plain">;</span>
<span class="plain">.</span><span class="identifier">RFailed</span><span class="plain">;</span>
<span class="identifier">RESTORE_THE_GAME_RM</span><span class="plain">(</span><span class="character">'A'</span><span class="plain">); </span><span class="reserved">new_line</span><span class="plain">;</span>
<span class="plain">];</span>
</pre>
<p class="inwebparagraph"></p>
<p class="inwebparagraph"><a id="SP7"></a><b>&#167;7. Save The Game Rule. </b></p>
<pre class="display">
<span class="plain">[ </span><span class="identifier">SAVE_THE_GAME_R</span><span class="plain"> </span><span class="identifier">res</span><span class="plain"> </span><span class="identifier">fref</span><span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">actor</span><span class="plain"> ~= </span><span class="identifier">player</span><span class="plain">) </span><span class="reserved">rfalse</span><span class="plain">;</span>
<span class="identifier">fref</span><span class="plain"> = </span><span class="identifier">glk_fileref_create_by_prompt</span><span class="plain">(</span><span class="constant">$01</span><span class="plain">, </span><span class="constant">$01</span><span class="plain">, </span><span class="constant">0</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">fref</span><span class="plain"> == </span><span class="constant">0</span><span class="plain">) </span><span class="reserved">jump</span><span class="plain"> </span><span class="identifier">SFailed</span><span class="plain">;</span>
<span class="identifier">gg_savestr</span><span class="plain"> = </span><span class="identifier">glk_stream_open_file</span><span class="plain">(</span><span class="identifier">fref</span><span class="plain">, </span><span class="constant">$01</span><span class="plain">, </span><span class="identifier">GG_SAVESTR_ROCK</span><span class="plain">);</span>
<span class="identifier">glk_fileref_destroy</span><span class="plain">(</span><span class="identifier">fref</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">gg_savestr</span><span class="plain"> == </span><span class="constant">0</span><span class="plain">) </span><span class="reserved">jump</span><span class="plain"> </span><span class="identifier">SFailed</span><span class="plain">;</span>
<span class="plain">@</span><span class="reserved">save</span><span class="plain"> </span><span class="identifier">gg_savestr</span><span class="plain"> </span><span class="identifier">res</span><span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">res</span><span class="plain"> == -1) {</span>
<span class="comment">The player actually just typed "restore". We first have to recover</span>
<span class="comment">all the Glk objects; the values in our global variables are all wrong.</span>
<span class="identifier">GGRecoverObjects</span><span class="plain">();</span>
<span class="identifier">glk_stream_close</span><span class="plain">(</span><span class="identifier">gg_savestr</span><span class="plain">, </span><span class="constant">0</span><span class="plain">); </span><span class="comment">stream_close</span>
<span class="identifier">gg_savestr</span><span class="plain"> = </span><span class="constant">0</span><span class="plain">;</span>
<span class="identifier">RESTORE_THE_GAME_RM</span><span class="plain">(</span><span class="character">'B'</span><span class="plain">); </span><span class="reserved">new_line</span><span class="plain">;</span>
<span class="reserved">rtrue</span><span class="plain">;</span>
<span class="plain">}</span>
<span class="identifier">glk_stream_close</span><span class="plain">(</span><span class="identifier">gg_savestr</span><span class="plain">, </span><span class="constant">0</span><span class="plain">); </span><span class="comment">stream_close</span>
<span class="identifier">gg_savestr</span><span class="plain"> = </span><span class="constant">0</span><span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">res</span><span class="plain"> == </span><span class="constant">0</span><span class="plain">) { </span><span class="identifier">SAVE_THE_GAME_RM</span><span class="plain">(</span><span class="character">'B'</span><span class="plain">); </span><span class="reserved">new_line</span><span class="plain">; </span><span class="reserved">rtrue</span><span class="plain">; }</span>
<span class="plain">.</span><span class="identifier">SFailed</span><span class="plain">;</span>
<span class="identifier">SAVE_THE_GAME_RM</span><span class="plain">(</span><span class="character">'A'</span><span class="plain">); </span><span class="reserved">new_line</span><span class="plain">;</span>
<span class="plain">];</span>
</pre>
<p class="inwebparagraph"></p>
<p class="inwebparagraph"><a id="SP8"></a><b>&#167;8. 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="display">
<span class="plain">[ </span><span class="identifier">VERIFY_THE_STORY_FILE_R</span><span class="plain"> </span><span class="identifier">res</span><span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">actor</span><span class="plain"> ~= </span><span class="identifier">player</span><span class="plain">) </span><span class="reserved">rfalse</span><span class="plain">;</span>
<span class="plain">@</span><span class="identifier">verify</span><span class="plain"> </span><span class="identifier">res</span><span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">res</span><span class="plain"> == </span><span class="constant">0</span><span class="plain">) { </span><span class="identifier">VERIFY_THE_STORY_FILE_RM</span><span class="plain">(</span><span class="character">'A'</span><span class="plain">); </span><span class="reserved">new_line</span><span class="plain">; </span><span class="reserved">rtrue</span><span class="plain">; }</span>
<span class="identifier">VERIFY_THE_STORY_FILE_RM</span><span class="plain">(</span><span class="character">'B'</span><span class="plain">); </span><span class="reserved">new_line</span><span class="plain">;</span>
<span class="plain">];</span>
</pre>
<p class="inwebparagraph"></p>
<p class="inwebparagraph"><a id="SP9"></a><b>&#167;9. Switch Transcript On Rule. </b></p>
<pre class="display">
<span class="plain">[ </span><span class="identifier">SWITCH_TRANSCRIPT_ON_R</span><span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">actor</span><span class="plain"> ~= </span><span class="identifier">player</span><span class="plain">) </span><span class="reserved">rfalse</span><span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">gg_scriptstr</span><span class="plain"> ~= </span><span class="constant">0</span><span class="plain">) { </span><span class="identifier">SWITCH_TRANSCRIPT_ON_RM</span><span class="plain">(</span><span class="character">'A'</span><span class="plain">); </span><span class="reserved">new_line</span><span class="plain">; </span><span class="reserved">rtrue</span><span class="plain">; }</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">gg_scriptfref</span><span class="plain"> == </span><span class="constant">0</span><span class="plain">) {</span>
<span class="identifier">gg_scriptfref</span><span class="plain"> = </span><span class="identifier">glk_fileref_create_by_prompt</span><span class="plain">(</span><span class="constant">$102</span><span class="plain">, </span><span class="constant">$05</span><span class="plain">, </span><span class="identifier">GG_SCRIPTFREF_ROCK</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">gg_scriptfref</span><span class="plain"> == </span><span class="constant">0</span><span class="plain">) </span><span class="reserved">jump</span><span class="plain"> </span><span class="identifier">S1Failed</span><span class="plain">;</span>
<span class="plain">}</span>
<span class="comment">stream_open_file</span>
<span class="identifier">gg_scriptstr</span><span class="plain"> = </span><span class="identifier">glk_stream_open_file</span><span class="plain">(</span><span class="identifier">gg_scriptfref</span><span class="plain">, </span><span class="constant">$05</span><span class="plain">, </span><span class="identifier">GG_SCRIPTSTR_ROCK</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">gg_scriptstr</span><span class="plain"> == </span><span class="constant">0</span><span class="plain">) </span><span class="reserved">jump</span><span class="plain"> </span><span class="identifier">S1Failed</span><span class="plain">;</span>
<span class="identifier">glk_window_set_echo_stream</span><span class="plain">(</span><span class="identifier">gg_mainwin</span><span class="plain">, </span><span class="identifier">gg_scriptstr</span><span class="plain">);</span>
<span class="identifier">SWITCH_TRANSCRIPT_ON_RM</span><span class="plain">(</span><span class="character">'B'</span><span class="plain">); </span><span class="reserved">new_line</span><span class="plain">;</span>
<span class="identifier">VersionSub</span><span class="plain">();</span>
<span class="reserved">return</span><span class="plain">;</span>
<span class="plain">.</span><span class="identifier">S1Failed</span><span class="plain">;</span>
<span class="identifier">SWITCH_TRANSCRIPT_ON_RM</span><span class="plain">(</span><span class="character">'C'</span><span class="plain">); </span><span class="reserved">new_line</span><span class="plain">;</span>
<span class="plain">];</span>
</pre>
<p class="inwebparagraph"></p>
<p class="inwebparagraph"><a id="SP10"></a><b>&#167;10. Switch Transcript Off Rule. </b></p>
<pre class="display">
<span class="plain">[ </span><span class="identifier">SWITCH_TRANSCRIPT_OFF_R</span><span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">actor</span><span class="plain"> ~= </span><span class="identifier">player</span><span class="plain">) </span><span class="reserved">rfalse</span><span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">gg_scriptstr</span><span class="plain"> == </span><span class="constant">0</span><span class="plain">) { </span><span class="identifier">SWITCH_TRANSCRIPT_OFF_RM</span><span class="plain">(</span><span class="character">'A'</span><span class="plain">); </span><span class="reserved">new_line</span><span class="plain">; </span><span class="reserved">rtrue</span><span class="plain">; }</span>
<span class="identifier">SWITCH_TRANSCRIPT_OFF_RM</span><span class="plain">(</span><span class="character">'B'</span><span class="plain">); </span><span class="reserved">new_line</span><span class="plain">;</span>
<span class="identifier">glk_stream_close</span><span class="plain">(</span><span class="identifier">gg_scriptstr</span><span class="plain">, </span><span class="constant">0</span><span class="plain">); </span><span class="comment">stream_close</span>
<span class="identifier">gg_scriptstr</span><span class="plain"> = </span><span class="constant">0</span><span class="plain">;</span>
<span class="plain">];</span>
</pre>
<p class="inwebparagraph"></p>
<p class="inwebparagraph"><a id="SP11"></a><b>&#167;11. Announce Story File Version Rule. </b></p>
<pre class="display">
<span class="plain">[ </span><span class="identifier">ANNOUNCE_STORY_FILE_VERSION_R</span><span class="plain"> </span><span class="identifier">ix</span><span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">actor</span><span class="plain"> ~= </span><span class="identifier">player</span><span class="plain">) </span><span class="reserved">rfalse</span><span class="plain">;</span>
<span class="identifier">Banner</span><span class="plain">();</span>
<span class="reserved">print</span><span class="plain"> </span><span class="string">"Identification number: "</span><span class="plain">;</span>
<span class="reserved">for</span><span class="plain"> (</span><span class="identifier">ix</span><span class="plain">=6: </span><span class="identifier">ix</span><span class="plain"> &lt;= </span><span class="identifier">UUID_ARRAY</span><span class="plain">-&gt;0: </span><span class="identifier">ix</span><span class="plain">++) </span><span class="reserved">print</span><span class="plain"> (</span><span class="identifier">char</span><span class="plain">) </span><span class="identifier">UUID_ARRAY</span><span class="plain">-&gt;</span><span class="identifier">ix</span><span class="plain">;</span>
<span class="reserved">print</span><span class="plain"> </span><span class="string">"^"</span><span class="plain">;</span>
<span class="plain">@</span><span class="identifier">gestalt</span><span class="plain"> </span><span class="constant">1</span><span class="plain"> </span><span class="constant">0</span><span class="plain"> </span><span class="identifier">ix</span><span class="plain">;</span>
<span class="reserved">print</span><span class="plain"> </span><span class="string">"Interpreter version "</span><span class="plain">, </span><span class="identifier">ix</span><span class="plain"> / </span><span class="constant">$10000</span><span class="plain">, </span><span class="string">"."</span><span class="plain">, (</span><span class="identifier">ix</span><span class="plain"> &amp; </span><span class="constant">$FF00</span><span class="plain">) / </span><span class="constant">$100</span><span class="plain">,</span>
<span class="string">"."</span><span class="plain">, </span><span class="identifier">ix</span><span class="plain"> &amp; </span><span class="constant">$FF</span><span class="plain">, </span><span class="string">" / "</span><span class="plain">;</span>
<span class="plain">@</span><span class="identifier">gestalt</span><span class="plain"> </span><span class="constant">0</span><span class="plain"> </span><span class="constant">0</span><span class="plain"> </span><span class="identifier">ix</span><span class="plain">;</span>
<span class="reserved">print</span><span class="plain"> </span><span class="string">"VM "</span><span class="plain">, </span><span class="identifier">ix</span><span class="plain"> / </span><span class="constant">$10000</span><span class="plain">, </span><span class="string">"."</span><span class="plain">, (</span><span class="identifier">ix</span><span class="plain"> &amp; </span><span class="constant">$FF00</span><span class="plain">) / </span><span class="constant">$100</span><span class="plain">, </span><span class="string">"."</span><span class="plain">, </span><span class="identifier">ix</span><span class="plain"> &amp; </span><span class="constant">$FF</span><span class="plain">, </span><span class="string">"^"</span><span class="plain">;</span>
<span class="identifier">ShowExtensionVersions</span><span class="plain">();</span>
<span class="identifier">say__p</span><span class="plain"> = </span><span class="constant">1</span><span class="plain">;</span>
<span class="plain">];</span>
</pre>
<p class="inwebparagraph"></p>
<p class="inwebparagraph"><a id="SP12"></a><b>&#167;12. 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 <code class="display"><span class="extract">-Sub</span></code>
routines: thus, for instance, if <code class="display"><span class="extract">action</span></code> is <code class="display"><span class="extract">##Wait</span></code> then <code class="display"><span class="extract">WaitSub</span></code> 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="inwebparagraph">Strangely, Glulx's action routines table is numbered in an off-by-one way
compared to the Z-machine's: hence the <code class="display"><span class="extract">+1</span></code>.
</p>
<pre class="display">
<span class="plain">[ </span><span class="identifier">DESCEND_TO_SPECIFIC_ACTION_R</span><span class="plain">;</span>
<span class="reserved">indirect</span><span class="plain">(#</span><span class="identifier">actions_table</span><span class="plain">--&gt;(</span><span class="identifier">action</span><span class="plain">+1));</span>
<span class="reserved">rtrue</span><span class="plain">;</span>
<span class="plain">];</span>
</pre>
<p class="inwebparagraph"></p>
<p class="inwebparagraph"><a id="SP13"></a><b>&#167;13. End Glulx-only matter. </b></p>
<pre class="display">
<span class="plain">#</span><span class="identifier">Endif</span><span class="plain">;</span>
</pre>
<p class="inwebparagraph"></p>
<hr class="tocbar">
<ul class="toc"><li><a href="S-msc.html">Back to 'Output Template'</a></li><li><a href="S-zmc.html">Continue with 'ZMachine Template'</a></li></ul><hr class="tocbar">
<!--End of weave-->
</main>
</body>
</html>