1
0
Fork 0
mirror of https://github.com/ganelson/inform.git synced 2024-07-05 08:34:22 +03:00
inform7/docs/if-module/3-tm2.html

585 lines
68 KiB
HTML

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<title>3/scn</title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<meta http-equiv="Content-Language" content="en-gb">
<link href="inweb.css" rel="stylesheet" rev="stylesheet" type="text/css">
</head>
<body>
<!--Weave of '3/tm2' generated by 7-->
<ul class="crumbs"><li><a href="../webs.html">&#9733;</a></li><li><a href="index.html">if</a></li><li><a href="index.html#3">Chapter 3: Space and Time</a></li><li><b>Temporal Map</b></li></ul><p class="purpose">Parallel to the World index of space is the Scenes index of time, and in this section we render it as HTML.</p>
<ul class="toc"><li><a href="#SP2">&#167;2. Table of Scenes</a></li></ul><hr class="tocbar">
<p class="inwebparagraph"><a id="SP1"></a><b>&#167;1. </b>The mapping of time is on the one hand simpler than the mapping of space
since there is only one dimension, but on the other hand more complex since
scenes can be multiply present at the same instant of time (whereas rooms
cannot be multiply present at the same point in space). We resolve this
with a notation which takes a little bit of on-screen explanation, but
seems natural enough to learn in practice.
</p>
<pre class="display">
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">PL::Scenes::Index::index</span><span class="plain">(</span><span class="identifier">OUTPUT_STREAM</span><span class="plain">) {</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">nr</span><span class="plain"> = </span><span class="identifier">NUMBER_CREATED</span><span class="plain">(</span><span class="reserved">scene</span><span class="plain">);</span>
<span class="reserved">scene</span><span class="plain"> **</span><span class="identifier">sorted</span><span class="plain"> = </span><span class="identifier">Memory::I7_calloc</span><span class="plain">(</span><span class="identifier">nr</span><span class="plain">, </span><span class="reserved">sizeof</span><span class="plain">(</span><span class="reserved">scene</span><span class="plain"> *), </span><span class="identifier">INDEX_SORTING_MREASON</span><span class="plain">);</span>
&lt;<span class="cwebmacro">Sort the scenes</span> <span class="cwebmacronumber">1.1</span>&gt;<span class="plain">;</span>
&lt;<span class="cwebmacro">Tabulate the scenes</span> <span class="cwebmacronumber">1.2</span>&gt;<span class="plain">;</span>
&lt;<span class="cwebmacro">Show the legend for the scene table icons</span> <span class="cwebmacronumber">1.3</span>&gt;<span class="plain">;</span>
&lt;<span class="cwebmacro">Give details of each scene in turn</span> <span class="cwebmacronumber">1.5</span>&gt;<span class="plain">;</span>
<span class="identifier">Memory::I7_array_free</span><span class="plain">(</span><span class="identifier">sorted</span><span class="plain">, </span><span class="identifier">INDEX_SORTING_MREASON</span><span class="plain">, </span><span class="identifier">nr</span><span class="plain">, </span><span class="reserved">sizeof</span><span class="plain">(</span><span class="reserved">scene</span><span class="plain"> *));</span>
<span class="plain">}</span>
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">PL::Scenes::Index::index_rules</span><span class="plain">(</span><span class="identifier">OUTPUT_STREAM</span><span class="plain">) {</span>
<span class="identifier">Rulebooks::index_scene</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">); </span> <span class="comment">rules in generic scene-ending rulebooks</span>
&lt;<span class="cwebmacro">Show the generic scene-change rules</span> <span class="cwebmacronumber">1.4</span>&gt;<span class="plain">;</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">The function PL::Scenes::Index::index appears nowhere else.</p>
<p class="endnote">The function PL::Scenes::Index::index_rules appears nowhere else.</p>
<p class="inwebparagraph"><a id="SP1_1"></a><b>&#167;1.1. </b>As usual, we sort with the C library's <code class="display"><span class="extract">qsort</span></code>.
</p>
<p class="macrodefinition"><code class="display">
&lt;<span class="cwebmacrodefn">Sort the scenes</span> <span class="cwebmacronumber">1.1</span>&gt; =
</code></p>
<pre class="displaydefn">
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">i</span><span class="plain"> = 0;</span>
<span class="reserved">scene</span><span class="plain"> *</span><span class="identifier">sc</span><span class="plain">;</span>
<span class="identifier">LOOP_OVER</span><span class="plain">(</span><span class="identifier">sc</span><span class="plain">, </span><span class="reserved">scene</span><span class="plain">) </span><span class="identifier">sorted</span><span class="plain">[</span><span class="identifier">i</span><span class="plain">++] = </span><span class="identifier">sc</span><span class="plain">;</span>
<span class="identifier">qsort</span><span class="plain">(</span><span class="identifier">sorted</span><span class="plain">, (</span><span class="identifier">size_t</span><span class="plain">) </span><span class="identifier">nr</span><span class="plain">, </span><span class="reserved">sizeof</span><span class="plain">(</span><span class="reserved">scene</span><span class="plain"> *), </span><span class="functiontext">PL::Scenes::Index::compare_scenes</span><span class="plain">);</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">This code is used in <a href="#SP1">&#167;1</a>.</p>
<p class="inwebparagraph"><a id="SP1_2"></a><b>&#167;1.2. </b>The sorted ordering is used as-is later on, when we get to the details, but
for the tabulation it's refined further. First we have the start-of-play
scenes, in sorted order; then scenes with a condition for their beginning
(end 0), in sorted order; then scenes that don't, and which haven't been
covered as a result of one of the earlier ones, also in sorted order. (This
third category is usually empty except for scenes the author has forgotten
about and created but never made use of.)
</p>
<p class="macrodefinition"><code class="display">
&lt;<span class="cwebmacrodefn">Tabulate the scenes</span> <span class="cwebmacronumber">1.2</span>&gt; =
</code></p>
<pre class="displaydefn">
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">i</span><span class="plain">;</span>
<span class="reserved">for</span><span class="plain"> (</span><span class="identifier">i</span><span class="plain">=0; </span><span class="identifier">i</span><span class="plain">&lt;</span><span class="identifier">nr</span><span class="plain">; </span><span class="identifier">i</span><span class="plain">++) {</span>
<span class="reserved">scene</span><span class="plain"> *</span><span class="identifier">sc</span><span class="plain"> = </span><span class="identifier">sorted</span><span class="plain">[</span><span class="identifier">i</span><span class="plain">];</span>
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">sc</span><span class="plain">-</span><span class="element">&gt;start_of_play</span><span class="plain">) || (</span><span class="identifier">sc</span><span class="plain"> == </span><span class="identifier">SC_entire_game</span><span class="plain">))</span>
<span class="functiontext">PL::Scenes::Index::index_from_scene</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="identifier">sc</span><span class="plain">, 0, </span><span class="constant">START_OF_PLAY_END</span><span class="plain">, </span><span class="identifier">NULL</span><span class="plain">, </span><span class="identifier">sorted</span><span class="plain">, </span><span class="identifier">nr</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="reserved">for</span><span class="plain"> (</span><span class="identifier">i</span><span class="plain">=0; </span><span class="identifier">i</span><span class="plain">&lt;</span><span class="identifier">nr</span><span class="plain">; </span><span class="identifier">i</span><span class="plain">++) {</span>
<span class="reserved">scene</span><span class="plain"> *</span><span class="identifier">sc</span><span class="plain"> = </span><span class="identifier">sorted</span><span class="plain">[</span><span class="identifier">i</span><span class="plain">];</span>
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">sc</span><span class="plain">-</span><span class="element">&gt;anchor_condition</span><span class="plain">[0]) &amp;&amp; (</span><span class="identifier">sc</span><span class="plain"> != </span><span class="identifier">SC_entire_game</span><span class="plain">))</span>
<span class="functiontext">PL::Scenes::Index::index_from_scene</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="identifier">sc</span><span class="plain">, 0, </span><span class="constant">START_OF_PLAY_END</span><span class="plain">, </span><span class="identifier">NULL</span><span class="plain">, </span><span class="identifier">sorted</span><span class="plain">, </span><span class="identifier">nr</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="reserved">for</span><span class="plain"> (</span><span class="identifier">i</span><span class="plain">=0; </span><span class="identifier">i</span><span class="plain">&lt;</span><span class="identifier">nr</span><span class="plain">; </span><span class="identifier">i</span><span class="plain">++) {</span>
<span class="reserved">scene</span><span class="plain"> *</span><span class="identifier">sc</span><span class="plain"> = </span><span class="identifier">sorted</span><span class="plain">[</span><span class="identifier">i</span><span class="plain">];</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">sc</span><span class="plain">-</span><span class="element">&gt;indexed</span><span class="plain"> == </span><span class="identifier">FALSE</span><span class="plain">)</span>
<span class="functiontext">PL::Scenes::Index::index_from_scene</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="identifier">sc</span><span class="plain">, 0, </span><span class="constant">NEVER_HAPPENS_END</span><span class="plain">, </span><span class="identifier">NULL</span><span class="plain">, </span><span class="identifier">sorted</span><span class="plain">, </span><span class="identifier">nr</span><span class="plain">);</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">This code is used in <a href="#SP1">&#167;1</a>.</p>
<p class="inwebparagraph"><a id="SP1_3"></a><b>&#167;1.3. </b><code class="display">
&lt;<span class="cwebmacrodefn">Show the legend for the scene table icons</span> <span class="cwebmacronumber">1.3</span>&gt; =
</code></p>
<pre class="displaydefn">
<span class="identifier">HTML_OPEN</span><span class="plain">(</span><span class="string">"p"</span><span class="plain">); </span><span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"Legend: "</span><span class="plain">);</span>
<span class="functiontext">PL::Scenes::Index::scene_icon_legend</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="string">"WPB"</span><span class="plain">, </span><span class="string">"Begins when play begins"</span><span class="plain">);</span>
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"; "</span><span class="plain">);</span>
<span class="functiontext">PL::Scenes::Index::scene_icon_legend</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="string">"WhenC"</span><span class="plain">, </span><span class="string">"can begin whenever some condition holds"</span><span class="plain">);</span>
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"; "</span><span class="plain">);</span>
<span class="functiontext">PL::Scenes::Index::scene_icon_legend</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="string">"Segue"</span><span class="plain">, </span><span class="string">"follows when a previous scene ends"</span><span class="plain">);</span>
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"; "</span><span class="plain">);</span>
<span class="functiontext">PL::Scenes::Index::scene_icon_legend</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="string">"Simul"</span><span class="plain">, </span><span class="string">"begins simultaneously"</span><span class="plain">);</span>
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"; "</span><span class="plain">);</span>
<span class="functiontext">PL::Scenes::Index::scene_icon_legend</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="string">"WNever"</span><span class="plain">, </span><span class="string">"never begins"</span><span class="plain">);</span>
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"; "</span><span class="plain">);</span>
<span class="functiontext">PL::Scenes::Index::scene_icon_legend</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="string">"ENever"</span><span class="plain">, </span><span class="string">"never ends"</span><span class="plain">);</span>
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"; "</span><span class="plain">);</span>
<span class="functiontext">PL::Scenes::Index::scene_icon_legend</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="string">"Recurring"</span><span class="plain">, </span><span class="string">"recurring (can happen more than once)"</span><span class="plain">);</span>
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">". &lt;i&gt;Scene names are italicised when and if they appear for a second "</span>
<span class="string">"or subsequent time because the scene can begin in more than one way&lt;/i&gt;."</span><span class="plain">);</span>
<span class="identifier">HTML_CLOSE</span><span class="plain">(</span><span class="string">"p"</span><span class="plain">);</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">This code is used in <a href="#SP1">&#167;1</a>.</p>
<p class="inwebparagraph"><a id="SP1_4"></a><b>&#167;1.4. </b><code class="display">
&lt;<span class="cwebmacrodefn">Show the generic scene-change rules</span> <span class="cwebmacronumber">1.4</span>&gt; =
</code></p>
<pre class="displaydefn">
<span class="identifier">HTML_OPEN</span><span class="plain">(</span><span class="string">"p"</span><span class="plain">);</span>
<span class="identifier">Index::anchor</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"SRULES"</span><span class="plain">);</span>
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"&lt;b&gt;General rules applying to scene changes&lt;/b&gt;"</span><span class="plain">);</span>
<span class="identifier">HTML_CLOSE</span><span class="plain">(</span><span class="string">"p"</span><span class="plain">);</span>
<span class="identifier">Rulebooks::index_rules_box</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="string">"When a scene begins"</span><span class="plain">, </span><span class="identifier">EMPTY_WORDING</span><span class="plain">, </span><span class="identifier">NULL</span><span class="plain">,</span>
<span class="identifier">built_in_rulebooks</span><span class="plain">[</span><span class="identifier">WHEN_SCENE_BEGINS_RB</span><span class="plain">], </span><span class="identifier">NULL</span><span class="plain">, </span><span class="identifier">NULL</span><span class="plain">, 1, </span><span class="identifier">FALSE</span><span class="plain">);</span>
<span class="identifier">Rulebooks::index_rules_box</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="string">"When a scene ends"</span><span class="plain">, </span><span class="identifier">EMPTY_WORDING</span><span class="plain">, </span><span class="identifier">NULL</span><span class="plain">,</span>
<span class="identifier">built_in_rulebooks</span><span class="plain">[</span><span class="identifier">WHEN_SCENE_ENDS_RB</span><span class="plain">], </span><span class="identifier">NULL</span><span class="plain">, </span><span class="identifier">NULL</span><span class="plain">, 1, </span><span class="identifier">FALSE</span><span class="plain">);</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">This code is used in <a href="#SP1">&#167;1</a>.</p>
<p class="inwebparagraph"><a id="SP1_5"></a><b>&#167;1.5. </b><code class="display">
&lt;<span class="cwebmacrodefn">Give details of each scene in turn</span> <span class="cwebmacronumber">1.5</span>&gt; =
</code></p>
<pre class="displaydefn">
<span class="identifier">Index::anchor</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"SDETAILS"</span><span class="plain">);</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">i</span><span class="plain">;</span>
<span class="reserved">for</span><span class="plain"> (</span><span class="identifier">i</span><span class="plain">=0; </span><span class="identifier">i</span><span class="plain">&lt;</span><span class="identifier">nr</span><span class="plain">; </span><span class="identifier">i</span><span class="plain">++) {</span>
<span class="identifier">HTML_TAG</span><span class="plain">(</span><span class="string">"hr"</span><span class="plain">);</span>
<span class="reserved">scene</span><span class="plain"> *</span><span class="identifier">sc</span><span class="plain"> = </span><span class="identifier">sorted</span><span class="plain">[</span><span class="identifier">i</span><span class="plain">];</span>
&lt;<span class="cwebmacro">Give details of a specific scene</span> <span class="cwebmacronumber">1.5.1</span>&gt;<span class="plain">;</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">This code is used in <a href="#SP1">&#167;1</a>.</p>
<p class="inwebparagraph"><a id="SP1_5_1"></a><b>&#167;1.5.1. </b>The curious condition about end 1 here is to avoid printing "Ends: Never"
in cases where fancier ends for the scene exist, so that the scene can, in
fact, end.
</p>
<p class="macrodefinition"><code class="display">
&lt;<span class="cwebmacrodefn">Give details of a specific scene</span> <span class="cwebmacronumber">1.5.1</span>&gt; =
</code></p>
<pre class="displaydefn">
&lt;<span class="cwebmacro">Index the name and recurrence status of the scene</span> <span class="cwebmacronumber">1.5.1.1</span>&gt;<span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">sc</span><span class="plain"> == </span><span class="identifier">SC_entire_game</span><span class="plain">) </span>&lt;<span class="cwebmacro">Explain the Entire Game scene</span> <span class="cwebmacronumber">1.5.1.2</span>&gt;<span class="plain">;</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">end</span><span class="plain">;</span>
<span class="reserved">for</span><span class="plain"> (</span><span class="identifier">end</span><span class="plain">=0; </span><span class="identifier">end</span><span class="plain">&lt;</span><span class="identifier">sc</span><span class="plain">-</span><span class="element">&gt;no_ends</span><span class="plain">; </span><span class="identifier">end</span><span class="plain">++) {</span>
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">end</span><span class="plain"> == 1) &amp;&amp; (</span><span class="identifier">sc</span><span class="plain">-</span><span class="element">&gt;no_ends</span><span class="plain"> &gt; 2) &amp;&amp;</span>
<span class="plain">(</span><span class="identifier">sc</span><span class="plain">-</span><span class="element">&gt;anchor_condition</span><span class="plain">[1]==</span><span class="identifier">NULL</span><span class="plain">) &amp;&amp; (</span><span class="identifier">sc</span><span class="plain">-</span><span class="element">&gt;anchor_scene</span><span class="plain">[1]==</span><span class="identifier">NULL</span><span class="plain">))</span>
<span class="reserved">continue</span><span class="plain">;</span>
&lt;<span class="cwebmacro">Index the conditions for this scene end to occur</span> <span class="cwebmacronumber">1.5.1.4</span>&gt;<span class="plain">;</span>
&lt;<span class="cwebmacro">Index the rules which apply when this scene end occurs</span> <span class="cwebmacronumber">1.5.1.5</span>&gt;<span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">end</span><span class="plain"> == 0) </span>&lt;<span class="cwebmacro">Index the rules which apply during this scene</span> <span class="cwebmacronumber">1.5.1.3</span>&gt;<span class="plain">;</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">This code is used in <a href="#SP1_5">&#167;1.5</a>.</p>
<p class="inwebparagraph"><a id="SP1_5_1_1"></a><b>&#167;1.5.1.1. </b><code class="display">
&lt;<span class="cwebmacrodefn">Index the name and recurrence status of the scene</span> <span class="cwebmacronumber">1.5.1.1</span>&gt; =
</code></p>
<pre class="displaydefn">
<span class="identifier">HTMLFiles::open_para</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, 1, </span><span class="string">"hanging"</span><span class="plain">);</span>
<span class="identifier">Index::anchor_numbered</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="identifier">sc</span><span class="plain">-&gt;</span><span class="identifier">allocation_id</span><span class="plain">);</span>
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"&lt;b&gt;The &lt;i&gt;%+W&lt;/i&gt; scene&lt;/b&gt;"</span><span class="plain">, </span><span class="functiontext">PL::Scenes::get_name</span><span class="plain">(</span><span class="identifier">sc</span><span class="plain">));</span>
<span class="identifier">Index::link</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="identifier">Wordings::first_wn</span><span class="plain">(</span><span class="identifier">ParseTree::get_text</span><span class="plain">(</span><span class="identifier">sc</span><span class="plain">-</span><span class="element">&gt;scene_declared_at</span><span class="plain">)));</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">World::Inferences::get_EO_state</span><span class="plain">(</span>
<span class="identifier">Instances::as_subject</span><span class="plain">(</span><span class="identifier">sc</span><span class="plain">-</span><span class="element">&gt;as_instance</span><span class="plain">), </span><span class="identifier">P_recurring</span><span class="plain">) &gt; 0)</span>
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"&amp;nbsp;&amp;nbsp;&lt;i&gt;recurring&lt;/i&gt;"</span><span class="plain">);</span>
<span class="identifier">HTML_CLOSE</span><span class="plain">(</span><span class="string">"p"</span><span class="plain">);</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">This code is used in <a href="#SP1_5_1">&#167;1.5.1</a>.</p>
<p class="inwebparagraph"><a id="SP1_5_1_2"></a><b>&#167;1.5.1.2. </b><code class="display">
&lt;<span class="cwebmacrodefn">Explain the Entire Game scene</span> <span class="cwebmacronumber">1.5.1.2</span>&gt; =
</code></p>
<pre class="displaydefn">
<span class="identifier">HTMLFiles::open_para</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, 1, </span><span class="string">"tight"</span><span class="plain">);</span>
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"The Entire Game scene is built-in. It is going on whenever play is "</span>
<span class="string">"going on. (It is recurring so that if the story ends, but then resumes, "</span>
<span class="string">"it too will end but then begin again.)"</span><span class="plain">);</span>
<span class="identifier">HTML_CLOSE</span><span class="plain">(</span><span class="string">"p"</span><span class="plain">);</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">This code is used in <a href="#SP1_5_1">&#167;1.5.1</a>.</p>
<p class="inwebparagraph"><a id="SP1_5_1_3"></a><b>&#167;1.5.1.3. </b><code class="display">
&lt;<span class="cwebmacrodefn">Index the rules which apply during this scene</span> <span class="cwebmacronumber">1.5.1.3</span>&gt; =
</code></p>
<pre class="displaydefn">
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">rbc</span><span class="plain"> = 0;</span>
<span class="identifier">rulebook</span><span class="plain"> *</span><span class="identifier">rb</span><span class="plain">;</span>
<span class="identifier">LOOP_OVER</span><span class="plain">(</span><span class="identifier">rb</span><span class="plain">, </span><span class="identifier">rulebook</span><span class="plain">) {</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Rulebooks::is_empty</span><span class="plain">(</span><span class="identifier">rb</span><span class="plain">, </span><span class="identifier">Rulebooks::scene_context</span><span class="plain">(</span><span class="identifier">sc</span><span class="plain">)) == </span><span class="identifier">FALSE</span><span class="plain">) {</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">rbc</span><span class="plain">++ == 0) {</span>
<span class="identifier">HTMLFiles::open_para</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, 1, </span><span class="string">"hanging"</span><span class="plain">);</span>
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"&lt;i&gt;During this scene:&lt;/i&gt;"</span><span class="plain">);</span>
<span class="identifier">HTML_CLOSE</span><span class="plain">(</span><span class="string">"p"</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="identifier">HTMLFiles::open_para</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, 2, </span><span class="string">"hanging"</span><span class="plain">);</span>
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"&lt;i&gt;%+W&lt;/i&gt;"</span><span class="plain">, </span><span class="identifier">rb</span><span class="plain">-&gt;</span><span class="identifier">primary_name</span><span class="plain">); </span><span class="identifier">HTML_CLOSE</span><span class="plain">(</span><span class="string">"p"</span><span class="plain">);</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">ignore_me</span><span class="plain"> = 0;</span>
<span class="identifier">Rulebooks::index</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="identifier">rb</span><span class="plain">, </span><span class="string">""</span><span class="plain">, </span><span class="identifier">Rulebooks::scene_context</span><span class="plain">(</span><span class="identifier">sc</span><span class="plain">), &amp;</span><span class="identifier">ignore_me</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">This code is used in <a href="#SP1_5_1">&#167;1.5.1</a>.</p>
<p class="inwebparagraph"><a id="SP1_5_1_4"></a><b>&#167;1.5.1.4. </b><code class="display">
&lt;<span class="cwebmacrodefn">Index the conditions for this scene end to occur</span> <span class="cwebmacronumber">1.5.1.4</span>&gt; =
</code></p>
<pre class="displaydefn">
<span class="identifier">HTMLFiles::open_para</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, 1, </span><span class="string">"hanging"</span><span class="plain">);</span>
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"&lt;i&gt;%s "</span><span class="plain">, (</span><span class="identifier">end</span><span class="plain">==0)?</span><span class="string">"Begins"</span><span class="plain">:</span><span class="string">"Ends"</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">end</span><span class="plain"> &gt;= 2) </span><span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"%+W "</span><span class="plain">, </span><span class="identifier">sc</span><span class="plain">-</span><span class="element">&gt;end_names</span><span class="plain">[</span><span class="identifier">end</span><span class="plain">]);</span>
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"when:&lt;/i&gt; "</span><span class="plain">);</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">count</span><span class="plain"> = 0;</span>
&lt;<span class="cwebmacro">Index the play-begins condition</span> <span class="cwebmacronumber">1.5.1.4.1</span>&gt;<span class="plain">;</span>
&lt;<span class="cwebmacro">Index the I7 condition for a scene to end</span> <span class="cwebmacronumber">1.5.1.4.2</span>&gt;<span class="plain">;</span>
&lt;<span class="cwebmacro">Index connections to other scene ends</span> <span class="cwebmacronumber">1.5.1.4.3</span>&gt;<span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">count</span><span class="plain"> == 0) </span><span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"&lt;b&gt;never&lt;/b&gt;"</span><span class="plain">);</span>
<span class="identifier">HTML_CLOSE</span><span class="plain">(</span><span class="string">"p"</span><span class="plain">);</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">This code is used in <a href="#SP1_5_1">&#167;1.5.1</a>.</p>
<p class="inwebparagraph"><a id="SP1_5_1_4_1"></a><b>&#167;1.5.1.4.1. </b><code class="display">
&lt;<span class="cwebmacrodefn">Index the play-begins condition</span> <span class="cwebmacronumber">1.5.1.4.1</span>&gt; =
</code></p>
<pre class="displaydefn">
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">end</span><span class="plain">==0) &amp;&amp; (</span><span class="identifier">sc</span><span class="plain">-</span><span class="element">&gt;start_of_play</span><span class="plain">)) {</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">count</span><span class="plain"> &gt; 0) {</span>
<span class="identifier">HTML_TAG</span><span class="plain">(</span><span class="string">"br"</span><span class="plain">);</span>
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"&lt;i&gt;or when:&lt;/i&gt; "</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"&lt;b&gt;play begins&lt;/b&gt;"</span><span class="plain">);</span>
<span class="identifier">count</span><span class="plain">++;</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">This code is used in <a href="#SP1_5_1_4">&#167;1.5.1.4</a>.</p>
<p class="inwebparagraph"><a id="SP1_5_1_4_2"></a><b>&#167;1.5.1.4.2. </b><code class="display">
&lt;<span class="cwebmacrodefn">Index the I7 condition for a scene to end</span> <span class="cwebmacronumber">1.5.1.4.2</span>&gt; =
</code></p>
<pre class="displaydefn">
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">sc</span><span class="plain">-</span><span class="element">&gt;anchor_condition</span><span class="plain">[</span><span class="identifier">end</span><span class="plain">]) {</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">count</span><span class="plain"> &gt; 0) {</span>
<span class="identifier">HTML_TAG</span><span class="plain">(</span><span class="string">"br"</span><span class="plain">);</span>
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"&lt;i&gt;or when:&lt;/i&gt; "</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"%+W"</span><span class="plain">, </span><span class="identifier">ParseTree::get_text</span><span class="plain">(</span><span class="identifier">sc</span><span class="plain">-</span><span class="element">&gt;anchor_condition</span><span class="plain">[</span><span class="identifier">end</span><span class="plain">]));</span>
<span class="identifier">Index::link</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="identifier">Wordings::first_wn</span><span class="plain">(</span><span class="identifier">ParseTree::get_text</span><span class="plain">(</span><span class="identifier">sc</span><span class="plain">-</span><span class="element">&gt;anchor_condition_set</span><span class="plain">[</span><span class="identifier">end</span><span class="plain">])));</span>
<span class="identifier">count</span><span class="plain">++;</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">This code is used in <a href="#SP1_5_1_4">&#167;1.5.1.4</a>.</p>
<p class="inwebparagraph"><a id="SP1_5_1_4_3"></a><b>&#167;1.5.1.4.3. </b><code class="display">
&lt;<span class="cwebmacrodefn">Index connections to other scene ends</span> <span class="cwebmacronumber">1.5.1.4.3</span>&gt; =
</code></p>
<pre class="displaydefn">
<span class="reserved">scene_connector</span><span class="plain"> *</span><span class="identifier">scon</span><span class="plain">;</span>
<span class="reserved">for</span><span class="plain"> (</span><span class="identifier">scon</span><span class="plain"> = </span><span class="identifier">sc</span><span class="plain">-</span><span class="element">&gt;anchor_scene</span><span class="plain">[</span><span class="identifier">end</span><span class="plain">]; </span><span class="identifier">scon</span><span class="plain">; </span><span class="identifier">scon</span><span class="plain">=</span><span class="identifier">scon</span><span class="plain">-</span><span class="element">&gt;next</span><span class="plain">) {</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">count</span><span class="plain"> &gt; 0) {</span>
<span class="identifier">HTML_TAG</span><span class="plain">(</span><span class="string">"br"</span><span class="plain">);</span>
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"&lt;i&gt;or when:&lt;/i&gt; "</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="identifier">wording</span><span class="plain"> </span><span class="identifier">NW</span><span class="plain"> = </span><span class="identifier">Instances::get_name</span><span class="plain">(</span><span class="identifier">scon</span><span class="plain">-</span><span class="element">&gt;connect_to</span><span class="plain">-</span><span class="element">&gt;as_instance</span><span class="plain">, </span><span class="identifier">FALSE</span><span class="plain">);</span>
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"&lt;b&gt;%+W&lt;/b&gt; &lt;i&gt;%s&lt;/i&gt;"</span><span class="plain">, </span><span class="identifier">NW</span><span class="plain">, (</span><span class="identifier">scon</span><span class="plain">-</span><span class="element">&gt;end</span><span class="plain">==0)?</span><span class="string">"begins"</span><span class="plain">:</span><span class="string">"ends"</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">scon</span><span class="plain">-</span><span class="element">&gt;end</span><span class="plain"> &gt;= 2) </span><span class="identifier">WRITE</span><span class="plain">(</span><span class="string">" %+W"</span><span class="plain">, </span><span class="identifier">scon</span><span class="plain">-</span><span class="element">&gt;connect_to</span><span class="plain">-</span><span class="element">&gt;end_names</span><span class="plain">[</span><span class="identifier">scon</span><span class="plain">-</span><span class="element">&gt;end</span><span class="plain">]);</span>
<span class="identifier">Index::link</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="identifier">Wordings::first_wn</span><span class="plain">(</span><span class="identifier">ParseTree::get_text</span><span class="plain">(</span><span class="identifier">scon</span><span class="plain">-</span><span class="element">&gt;where_said</span><span class="plain">)));</span>
<span class="identifier">count</span><span class="plain">++;</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">This code is used in <a href="#SP1_5_1_4">&#167;1.5.1.4</a>.</p>
<p class="inwebparagraph"><a id="SP1_5_1_5"></a><b>&#167;1.5.1.5. </b><code class="display">
&lt;<span class="cwebmacrodefn">Index the rules which apply when this scene end occurs</span> <span class="cwebmacronumber">1.5.1.5</span>&gt; =
</code></p>
<pre class="displaydefn">
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Rulebooks::is_empty</span><span class="plain">(</span><span class="identifier">sc</span><span class="plain">-</span><span class="element">&gt;end_rulebook</span><span class="plain">[</span><span class="identifier">end</span><span class="plain">], </span><span class="identifier">Rulebooks::no_rule_context</span><span class="plain">()) == </span><span class="identifier">FALSE</span><span class="plain">) {</span>
<span class="identifier">HTMLFiles::open_para</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, 1, </span><span class="string">"hanging"</span><span class="plain">);</span>
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"&lt;i&gt;What happens:&lt;/i&gt;"</span><span class="plain">); </span><span class="identifier">HTML_CLOSE</span><span class="plain">(</span><span class="string">"p"</span><span class="plain">);</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">ignore_me</span><span class="plain"> = 0;</span>
<span class="identifier">Rulebooks::index</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="identifier">sc</span><span class="plain">-</span><span class="element">&gt;end_rulebook</span><span class="plain">[</span><span class="identifier">end</span><span class="plain">], </span><span class="string">""</span><span class="plain">, </span><span class="identifier">Rulebooks::no_rule_context</span><span class="plain">(), &amp;</span><span class="identifier">ignore_me</span><span class="plain">);</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">This code is used in <a href="#SP1_5_1">&#167;1.5.1</a>.</p>
<p class="inwebparagraph"><a id="SP2"></a><b>&#167;2. Table of Scenes. </b>We finally return to the table of scenes. The following is recursive, and
is called at the top level for each scene in turn which starts at the start
of play (see above).
</p>
<p class="inwebparagraph">A scene entry can be arrived at in three ways: through one of its ends, in
which case <code class="display"><span class="extract">end</span></code> is the number (0 for begins, 1 for standard ends, and so on),
or through being already active at the start of play, or through being covered
in the index even though it never happens in play. This means we need two
additional <code class="display"><span class="extract">end</span></code> numbers. They are only ever used at the top level, that is,
on the initial call when <code class="display"><span class="extract">depth</span></code> is 0.
</p>
<pre class="definitions">
<span class="definitionkeyword">define</span> <span class="constant">START_OF_PLAY_END</span><span class="plain"> -1</span>
<span class="definitionkeyword">define</span> <span class="constant">NEVER_HAPPENS_END</span><span class="plain"> -2</span>
</pre>
<pre class="display">
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">PL::Scenes::Index::index_from_scene</span><span class="plain">(</span><span class="identifier">OUTPUT_STREAM</span><span class="plain">, </span><span class="reserved">scene</span><span class="plain"> *</span><span class="identifier">sc</span><span class="plain">, </span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">depth</span><span class="plain">,</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">end</span><span class="plain">, </span><span class="reserved">scene</span><span class="plain"> *</span><span class="identifier">sc_from</span><span class="plain">, </span><span class="reserved">scene</span><span class="plain"> **</span><span class="identifier">sorted</span><span class="plain">, </span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">nr</span><span class="plain">) {</span>
<span class="identifier">HTMLFiles::open_para</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="identifier">depth</span><span class="plain">+1, </span><span class="string">"tight"</span><span class="plain">);</span>
&lt;<span class="cwebmacro">Indicate the route by which this scene was reached</span> <span class="cwebmacronumber">2.1</span>&gt;<span class="plain">;</span>
&lt;<span class="cwebmacro">Name the scene in the table, italicised if we've seen it already</span> <span class="cwebmacronumber">2.2</span>&gt;<span class="character">;</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">sc</span><span class="plain">-</span><span class="element">&gt;indexed</span><span class="plain"> == </span><span class="identifier">FALSE</span><span class="plain">) {</span>
&lt;<span class="cwebmacro">Show the never-ends icon if appropriate</span> <span class="cwebmacronumber">2.3</span>&gt;<span class="plain">;</span>
&lt;<span class="cwebmacro">Show the recurring icon if appropriate</span> <span class="cwebmacronumber">2.4</span>&gt;<span class="plain">;</span>
<span class="plain">}</span>
<span class="identifier">HTML_CLOSE</span><span class="plain">(</span><span class="string">"p"</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">sc</span><span class="plain">-</span><span class="element">&gt;indexed</span><span class="plain">) </span><span class="reserved">return</span><span class="plain">;</span>
<span class="identifier">sc</span><span class="plain">-</span><span class="element">&gt;indexed</span><span class="plain"> = </span><span class="identifier">TRUE</span><span class="plain">;</span>
&lt;<span class="cwebmacro">Indent to tabulate other scenes connected to the ends of this one</span> <span class="cwebmacronumber">2.5</span>&gt;<span class="plain">;</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">The function PL::Scenes::Index::index_from_scene is used in <a href="#SP1_2">&#167;1.2</a>, <a href="#SP2_5">&#167;2.5</a>.</p>
<p class="inwebparagraph"><a id="SP2_1"></a><b>&#167;2.1. </b><code class="display">
&lt;<span class="cwebmacrodefn">Indicate the route by which this scene was reached</span> <span class="cwebmacronumber">2.1</span>&gt; =
</code></p>
<pre class="displaydefn">
<span class="reserved">switch</span><span class="plain">(</span><span class="identifier">end</span><span class="plain">) {</span>
<span class="reserved">case</span><span class="plain"> 0: </span><span class="functiontext">PL::Scenes::Index::scene_icon</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="string">"Simul"</span><span class="plain">); </span><span class="reserved">break</span><span class="plain">;</span>
<span class="reserved">case</span><span class="plain"> 1: </span><span class="functiontext">PL::Scenes::Index::scene_icon</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="string">"Segue"</span><span class="plain">); </span><span class="reserved">break</span><span class="plain">;</span>
<span class="reserved">case</span><span class="plain"> </span><span class="constant">START_OF_PLAY_END</span><span class="plain">: </span><span class="reserved">break</span><span class="plain">;</span>
<span class="reserved">case</span><span class="plain"> </span><span class="constant">NEVER_HAPPENS_END</span><span class="plain">: </span><span class="functiontext">PL::Scenes::Index::scene_icon</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="string">"WNever"</span><span class="plain">); </span><span class="reserved">break</span><span class="plain">;</span>
<span class="reserved">default</span><span class="plain">:</span>
<span class="functiontext">PL::Scenes::Index::scene_icon</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="string">"Segue"</span><span class="plain">);</span>
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"[ends %+W]&amp;nbsp;"</span><span class="plain">, </span><span class="identifier">sc_from</span><span class="plain">-</span><span class="element">&gt;end_names</span><span class="plain">[</span><span class="identifier">end</span><span class="plain">]); </span><span class="reserved">break</span><span class="plain">;</span>
<span class="plain">}</span>
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">sc</span><span class="plain">-</span><span class="element">&gt;indexed</span><span class="plain"> == </span><span class="identifier">FALSE</span><span class="plain">) || (</span><span class="identifier">depth</span><span class="plain"> == 0)) {</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">sc</span><span class="plain"> == </span><span class="identifier">SC_entire_game</span><span class="plain">) </span><span class="functiontext">PL::Scenes::Index::scene_icon</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="string">"WPB"</span><span class="plain">);</span>
<span class="reserved">else</span><span class="plain"> </span><span class="reserved">if</span><span class="plain"> (</span><span class="identifier">sc</span><span class="plain">-</span><span class="element">&gt;anchor_condition</span><span class="plain">[0]) </span><span class="functiontext">PL::Scenes::Index::scene_icon</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="string">"WhenC"</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">sc</span><span class="plain">-</span><span class="element">&gt;start_of_play</span><span class="plain">) </span><span class="functiontext">PL::Scenes::Index::scene_icon</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="string">"WPB"</span><span class="plain">);</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">This code is used in <a href="#SP2">&#167;2</a>.</p>
<p class="inwebparagraph"><a id="SP2_2"></a><b>&#167;2.2. </b><code class="display">
&lt;<span class="cwebmacrodefn">Name the scene in the table, italicised if we've seen it already</span> <span class="cwebmacronumber">2.2</span>&gt; =
</code></p>
<pre class="displaydefn">
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">sc</span><span class="plain">-</span><span class="element">&gt;indexed</span><span class="plain">) </span><span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"&lt;i&gt;"</span><span class="plain">);</span>
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"%+W"</span><span class="plain">, </span><span class="identifier">Instances::get_name</span><span class="plain">(</span><span class="identifier">sc</span><span class="plain">-</span><span class="element">&gt;as_instance</span><span class="plain">, </span><span class="identifier">FALSE</span><span class="plain">));</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">sc</span><span class="plain">-</span><span class="element">&gt;indexed</span><span class="plain">) </span><span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"&lt;/i&gt;"</span><span class="plain">);</span>
<span class="reserved">else</span><span class="plain"> </span><span class="identifier">Index::below_link_numbered</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="identifier">sc</span><span class="plain">-&gt;</span><span class="identifier">allocation_id</span><span class="plain">);</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">This code is used in <a href="#SP2">&#167;2</a>.</p>
<p class="inwebparagraph"><a id="SP2_3"></a><b>&#167;2.3. </b><code class="display">
&lt;<span class="cwebmacrodefn">Show the never-ends icon if appropriate</span> <span class="cwebmacronumber">2.3</span>&gt; =
</code></p>
<pre class="displaydefn">
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">ways_to_end</span><span class="plain"> = 0, </span><span class="identifier">e</span><span class="plain">;</span>
<span class="reserved">for</span><span class="plain"> (</span><span class="identifier">e</span><span class="plain">=1; </span><span class="identifier">e</span><span class="plain">&lt;</span><span class="identifier">sc</span><span class="plain">-</span><span class="element">&gt;no_ends</span><span class="plain">; </span><span class="identifier">e</span><span class="plain">++) {</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">sc</span><span class="plain">-</span><span class="element">&gt;anchor_scene</span><span class="plain">[</span><span class="identifier">e</span><span class="plain">]) </span><span class="identifier">ways_to_end</span><span class="plain">++;</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">sc</span><span class="plain">-</span><span class="element">&gt;anchor_condition</span><span class="plain">[</span><span class="identifier">e</span><span class="plain">]) </span><span class="identifier">ways_to_end</span><span class="plain">++;</span>
<span class="plain">}</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">ways_to_end</span><span class="plain"> == 0) </span><span class="functiontext">PL::Scenes::Index::scene_icon_append</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="string">"ENever"</span><span class="plain">);</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">This code is used in <a href="#SP2">&#167;2</a>.</p>
<p class="inwebparagraph"><a id="SP2_4"></a><b>&#167;2.4. </b><code class="display">
&lt;<span class="cwebmacrodefn">Show the recurring icon if appropriate</span> <span class="cwebmacronumber">2.4</span>&gt; =
</code></p>
<pre class="displaydefn">
<span class="identifier">inference_subject</span><span class="plain"> *</span><span class="identifier">subj</span><span class="plain"> = </span><span class="identifier">Instances::as_subject</span><span class="plain">(</span><span class="identifier">sc</span><span class="plain">-</span><span class="element">&gt;as_instance</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">World::Inferences::get_EO_state</span><span class="plain">(</span><span class="identifier">subj</span><span class="plain">, </span><span class="identifier">P_recurring</span><span class="plain">) &gt; </span><span class="identifier">UNKNOWN_CE</span><span class="plain">)</span>
<span class="functiontext">PL::Scenes::Index::scene_icon_append</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="string">"Recurring"</span><span class="plain">);</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">This code is used in <a href="#SP2">&#167;2</a>.</p>
<p class="inwebparagraph"><a id="SP2_5"></a><b>&#167;2.5. </b>And this is where the routine recurses, so that consequent scenes are
tabulated underneath the present one, indented one step further in (since
indentation is coupled to <code class="display"><span class="extract">depth</span></code>). First we recurse to scenes which end when
this one does; then to scenes which begin when this one ends.
</p>
<p class="macrodefinition"><code class="display">
&lt;<span class="cwebmacrodefn">Indent to tabulate other scenes connected to the ends of this one</span> <span class="cwebmacronumber">2.5</span>&gt; =
</code></p>
<pre class="displaydefn">
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">i</span><span class="plain">;</span>
<span class="reserved">for</span><span class="plain"> (</span><span class="identifier">i</span><span class="plain">=0; </span><span class="identifier">i</span><span class="plain">&lt;</span><span class="identifier">nr</span><span class="plain">; </span><span class="identifier">i</span><span class="plain">++) {</span>
<span class="reserved">scene</span><span class="plain"> *</span><span class="identifier">sc2</span><span class="plain"> = </span><span class="identifier">sorted</span><span class="plain">[</span><span class="identifier">i</span><span class="plain">];</span>
<span class="reserved">scene_connector</span><span class="plain"> *</span><span class="identifier">scon</span><span class="plain">;</span>
<span class="reserved">for</span><span class="plain"> (</span><span class="identifier">scon</span><span class="plain"> = </span><span class="identifier">sc2</span><span class="plain">-</span><span class="element">&gt;anchor_scene</span><span class="plain">[0]; </span><span class="identifier">scon</span><span class="plain">; </span><span class="identifier">scon</span><span class="plain">=</span><span class="identifier">scon</span><span class="plain">-</span><span class="element">&gt;next</span><span class="plain">)</span>
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">scon</span><span class="plain">-</span><span class="element">&gt;connect_to</span><span class="plain"> == </span><span class="identifier">sc</span><span class="plain">) &amp;&amp; (</span><span class="identifier">scon</span><span class="plain">-</span><span class="element">&gt;end</span><span class="plain"> &gt;= 1))</span>
<span class="functiontext">PL::Scenes::Index::index_from_scene</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="identifier">sc2</span><span class="plain">, </span><span class="identifier">depth</span><span class="plain"> + 1, </span><span class="identifier">scon</span><span class="plain">-</span><span class="element">&gt;end</span><span class="plain">, </span><span class="identifier">sc</span><span class="plain">, </span><span class="identifier">sorted</span><span class="plain">, </span><span class="identifier">nr</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="reserved">for</span><span class="plain"> (</span><span class="identifier">i</span><span class="plain">=0; </span><span class="identifier">i</span><span class="plain">&lt;</span><span class="identifier">nr</span><span class="plain">; </span><span class="identifier">i</span><span class="plain">++) {</span>
<span class="reserved">scene</span><span class="plain"> *</span><span class="identifier">sc2</span><span class="plain"> = </span><span class="identifier">sorted</span><span class="plain">[</span><span class="identifier">i</span><span class="plain">];</span>
<span class="reserved">scene_connector</span><span class="plain"> *</span><span class="identifier">scon</span><span class="plain">;</span>
<span class="reserved">for</span><span class="plain"> (</span><span class="identifier">scon</span><span class="plain"> = </span><span class="identifier">sc2</span><span class="plain">-</span><span class="element">&gt;anchor_scene</span><span class="plain">[0]; </span><span class="identifier">scon</span><span class="plain">; </span><span class="identifier">scon</span><span class="plain">=</span><span class="identifier">scon</span><span class="plain">-</span><span class="element">&gt;next</span><span class="plain">)</span>
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">scon</span><span class="plain">-</span><span class="element">&gt;connect_to</span><span class="plain"> == </span><span class="identifier">sc</span><span class="plain">) &amp;&amp; (</span><span class="identifier">scon</span><span class="plain">-</span><span class="element">&gt;end</span><span class="plain"> == 0))</span>
<span class="functiontext">PL::Scenes::Index::index_from_scene</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="identifier">sc2</span><span class="plain">, </span><span class="identifier">depth</span><span class="plain">, </span><span class="identifier">scon</span><span class="plain">-</span><span class="element">&gt;end</span><span class="plain">, </span><span class="identifier">sc</span><span class="plain">, </span><span class="identifier">sorted</span><span class="plain">, </span><span class="identifier">nr</span><span class="plain">);</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">This code is used in <a href="#SP2">&#167;2</a>.</p>
<p class="inwebparagraph"><a id="SP3"></a><b>&#167;3. </b>We have been using:
</p>
<pre class="display">
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">PL::Scenes::Index::scene_icon</span><span class="plain">(</span><span class="identifier">OUTPUT_STREAM</span><span class="plain">, </span><span class="reserved">char</span><span class="plain"> *</span><span class="identifier">si</span><span class="plain">) {</span>
<span class="functiontext">PL::Scenes::Index::scene_icon_unspaced</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="identifier">si</span><span class="plain">); </span><span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"&amp;nbsp;&amp;nbsp;"</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">PL::Scenes::Index::scene_icon_append</span><span class="plain">(</span><span class="identifier">OUTPUT_STREAM</span><span class="plain">, </span><span class="reserved">char</span><span class="plain"> *</span><span class="identifier">si</span><span class="plain">) {</span>
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"&amp;nbsp;&amp;nbsp;"</span><span class="plain">); </span><span class="functiontext">PL::Scenes::Index::scene_icon_unspaced</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="identifier">si</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">PL::Scenes::Index::scene_icon_legend</span><span class="plain">(</span><span class="identifier">OUTPUT_STREAM</span><span class="plain">, </span><span class="reserved">char</span><span class="plain"> *</span><span class="identifier">si</span><span class="plain">, </span><span class="reserved">char</span><span class="plain"> *</span><span class="identifier">gloss</span><span class="plain">) {</span>
<span class="functiontext">PL::Scenes::Index::scene_icon_unspaced</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="identifier">si</span><span class="plain">); </span><span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"&amp;nbsp;&lt;i&gt;%s&lt;/i&gt;"</span><span class="plain">, </span><span class="identifier">gloss</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">PL::Scenes::Index::scene_icon_unspaced</span><span class="plain">(</span><span class="identifier">OUTPUT_STREAM</span><span class="plain">, </span><span class="reserved">char</span><span class="plain"> *</span><span class="identifier">si</span><span class="plain">) {</span>
<span class="identifier">HTML_TAG_WITH</span><span class="plain">(</span><span class="string">"img"</span><span class="plain">, </span><span class="string">"border=0 src=inform:/scene_icons/%s.png"</span><span class="plain">, </span><span class="identifier">si</span><span class="plain">);</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">The function PL::Scenes::Index::scene_icon is used in <a href="#SP2_1">&#167;2.1</a>.</p>
<p class="endnote">The function PL::Scenes::Index::scene_icon_append is used in <a href="#SP2_3">&#167;2.3</a>, <a href="#SP2_4">&#167;2.4</a>.</p>
<p class="endnote">The function PL::Scenes::Index::scene_icon_legend is used in <a href="#SP1_3">&#167;1.3</a>.</p>
<p class="endnote">The function PL::Scenes::Index::scene_icon_unspaced appears nowhere else.</p>
<p class="inwebparagraph"><a id="SP4"></a><b>&#167;4. </b>Lastly: the following is the criterion used for sorting the scenes into
their indexing order. The Entire Game always comes first, and then come the
rest in ascending alphabetical order.
</p>
<pre class="display">
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">PL::Scenes::Index::compare_scenes</span><span class="plain">(</span><span class="reserved">const</span><span class="plain"> </span><span class="reserved">void</span><span class="plain"> *</span><span class="identifier">ent1</span><span class="plain">, </span><span class="reserved">const</span><span class="plain"> </span><span class="reserved">void</span><span class="plain"> *</span><span class="identifier">ent2</span><span class="plain">) {</span>
<span class="reserved">const</span><span class="plain"> </span><span class="reserved">scene</span><span class="plain"> *</span><span class="identifier">sc1</span><span class="plain"> = *((</span><span class="reserved">const</span><span class="plain"> </span><span class="reserved">scene</span><span class="plain"> **) </span><span class="identifier">ent1</span><span class="plain">);</span>
<span class="reserved">const</span><span class="plain"> </span><span class="reserved">scene</span><span class="plain"> *</span><span class="identifier">sc2</span><span class="plain"> = *((</span><span class="reserved">const</span><span class="plain"> </span><span class="reserved">scene</span><span class="plain"> **) </span><span class="identifier">ent2</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">sc1</span><span class="plain"> == </span><span class="identifier">SC_entire_game</span><span class="plain">) &amp;&amp; (</span><span class="identifier">sc2</span><span class="plain"> != </span><span class="identifier">SC_entire_game</span><span class="plain">)) </span><span class="reserved">return</span><span class="plain"> -1;</span>
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">sc1</span><span class="plain"> != </span><span class="identifier">SC_entire_game</span><span class="plain">) &amp;&amp; (</span><span class="identifier">sc2</span><span class="plain"> == </span><span class="identifier">SC_entire_game</span><span class="plain">)) </span><span class="reserved">return</span><span class="plain"> 1;</span>
<span class="identifier">wording</span><span class="plain"> </span><span class="identifier">SW1</span><span class="plain"> = </span><span class="identifier">Instances::get_name</span><span class="plain">(</span><span class="identifier">sc1</span><span class="plain">-</span><span class="element">&gt;as_instance</span><span class="plain">, </span><span class="identifier">FALSE</span><span class="plain">);</span>
<span class="identifier">wording</span><span class="plain"> </span><span class="identifier">SW2</span><span class="plain"> = </span><span class="identifier">Instances::get_name</span><span class="plain">(</span><span class="identifier">sc2</span><span class="plain">-</span><span class="element">&gt;as_instance</span><span class="plain">, </span><span class="identifier">FALSE</span><span class="plain">);</span>
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">Wordings::strcmp</span><span class="plain">(</span><span class="identifier">SW1</span><span class="plain">, </span><span class="identifier">SW2</span><span class="plain">);</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">The function PL::Scenes::Index::compare_scenes is used in <a href="#SP1_1">&#167;1.1</a>.</p>
<hr class="tocbar">
<ul class="toc"><li><a href="3-scn.html">Back to 'Scenes'</a></li><li><a href="3-ts.html">Continue with 'The Score'</a></li></ul><hr class="tocbar">
<!--End of weave-->
</body>
</html>