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-rgn.html
2019-04-12 14:47:00 +01:00

588 lines
64 KiB
HTML

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<title>3/bck</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/rgn' 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>Regions</b></li></ul><p class="purpose">A plugin providing support for grouping rooms together into named and nestable regions.</p>
<ul class="toc"><li><a href="#SP1">&#167;1. Definitions</a></li><li><a href="#SP5">&#167;5. Initialising</a></li><li><a href="#SP6">&#167;6. Kinds</a></li><li><a href="#SP11">&#167;11. Properties</a></li><li><a href="#SP14">&#167;14. Assertions</a></li><li><a href="#SP15">&#167;15. Relations</a></li><li><a href="#SP19">&#167;19. Model completion</a></li></ul><hr class="tocbar">
<p class="inwebparagraph"><a id="SP1"></a><b>&#167;1. Definitions. </b></p>
<p class="inwebparagraph"><a id="SP2"></a><b>&#167;2. </b>The relation "R in S" behaves so differently for regions that we need to
define it separately, even though there's no difference in English syntax. So:
</p>
<pre class="display">
<span class="identifier">binary_predicate</span><span class="plain"> *</span><span class="identifier">R_regional_containment</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
</pre>
<p class="inwebparagraph"></p>
<p class="inwebparagraph"><a id="SP3"></a><b>&#167;3. </b>"Region" is in fact one of the four top-level kinds in the standard I7
hierarchy, alongside thing, room and direction.
</p>
<pre class="display">
<span class="identifier">kind</span><span class="plain"> *</span><span class="identifier">K_region</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
<span class="identifier">inference_subject</span><span class="plain"> *</span><span class="identifier">infs_region</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
<span class="identifier">property</span><span class="plain"> *</span><span class="identifier">P_map_region</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">; </span> <span class="comment">a value property giving the region of a room</span>
<span class="identifier">property</span><span class="plain"> *</span><span class="identifier">P_regional_found_in</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">; </span> <span class="comment">an I6-only property used for implementation</span>
</pre>
<p class="inwebparagraph"></p>
<p class="inwebparagraph"><a id="SP4"></a><b>&#167;4. </b>Every inference subject contains a pointer to its own unique copy of the
following minimal structure, though it will only be relevant for instances of
"room":
</p>
<pre class="display">
<span class="reserved">typedef</span><span class="plain"> </span><span class="reserved">struct</span><span class="plain"> </span><span class="reserved">regions_data</span><span class="plain"> {</span>
<span class="reserved">struct</span><span class="plain"> </span><span class="identifier">instance</span><span class="plain"> *</span><span class="identifier">in_region</span><span class="plain">; </span> <span class="comment">smallest region containing me (rooms only)</span>
<span class="reserved">struct</span><span class="plain"> </span><span class="identifier">parse_node</span><span class="plain"> *</span><span class="identifier">in_region_set_at</span><span class="plain">; </span> <span class="comment">where this is decided</span>
<span class="reserved">struct</span><span class="plain"> </span><span class="identifier">inter_name</span><span class="plain"> *</span><span class="identifier">in_region_iname</span><span class="plain">; </span> <span class="comment">for testing regional containment found-ins</span>
<span class="identifier">MEMORY_MANAGEMENT</span>
<span class="plain">} </span><span class="reserved">regions_data</span><span class="plain">;</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">The structure regions_data is private to this section.</p>
<p class="inwebparagraph"><a id="SP5"></a><b>&#167;5. Initialising. </b></p>
<pre class="display">
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">PL::Regions::start</span><span class="plain">(</span><span class="reserved">void</span><span class="plain">) {</span>
<span class="identifier">PLUGIN_REGISTER</span><span class="plain">(</span><span class="identifier">PLUGIN_NEW_BASE_KIND_NOTIFY</span><span class="plain">, </span><span class="functiontext">PL::Regions::regions_new_base_kind_notify</span><span class="plain">);</span>
<span class="identifier">PLUGIN_REGISTER</span><span class="plain">(</span><span class="identifier">PLUGIN_SET_SUBKIND_NOTIFY</span><span class="plain">, </span><span class="functiontext">PL::Regions::regions_set_subkind_notify</span><span class="plain">);</span>
<span class="identifier">PLUGIN_REGISTER</span><span class="plain">(</span><span class="identifier">PLUGIN_NEW_SUBJECT_NOTIFY</span><span class="plain">, </span><span class="functiontext">PL::Regions::regions_new_subject_notify</span><span class="plain">);</span>
<span class="identifier">PLUGIN_REGISTER</span><span class="plain">(</span><span class="identifier">PLUGIN_NEW_PROPERTY_NOTIFY</span><span class="plain">, </span><span class="functiontext">PL::Regions::regions_new_property_notify</span><span class="plain">);</span>
<span class="identifier">PLUGIN_REGISTER</span><span class="plain">(</span><span class="identifier">PLUGIN_COMPLETE_MODEL</span><span class="plain">, </span><span class="functiontext">PL::Regions::regions_complete_model</span><span class="plain">);</span>
<span class="identifier">PLUGIN_REGISTER</span><span class="plain">(</span><span class="identifier">PLUGIN_MORE_SPECIFIC</span><span class="plain">, </span><span class="functiontext">PL::Regions::regions_more_specific</span><span class="plain">);</span>
<span class="identifier">PLUGIN_REGISTER</span><span class="plain">(</span><span class="identifier">PLUGIN_ESTIMATE_PROPERTY_USAGE</span><span class="plain">, </span><span class="functiontext">PL::Regions::regions_estimate_property_usage</span><span class="plain">);</span>
<span class="identifier">PLUGIN_REGISTER</span><span class="plain">(</span><span class="identifier">PLUGIN_INTERVENE_IN_ASSERTION</span><span class="plain">, </span><span class="functiontext">PL::Regions::regions_intervene_in_assertion</span><span class="plain">);</span>
<span class="identifier">PLUGIN_REGISTER</span><span class="plain">(</span><span class="identifier">PLUGIN_NAME_TO_EARLY_INFS</span><span class="plain">, </span><span class="functiontext">PL::Regions::regions_name_to_early_infs</span><span class="plain">);</span>
<span class="identifier">PLUGIN_REGISTER</span><span class="plain">(</span><span class="identifier">PLUGIN_ADD_TO_WORLD_INDEX</span><span class="plain">, </span><span class="functiontext">PL::Regions::regions_add_to_World_index</span><span class="plain">);</span>
<span class="identifier">infs_region</span><span class="plain"> = </span><span class="identifier">InferenceSubjects::new</span><span class="plain">(</span><span class="identifier">global_constants</span><span class="plain">,</span>
<span class="identifier">FUND_SUB</span><span class="plain">, </span><span class="identifier">NULL_GENERAL_POINTER</span><span class="plain">, </span><span class="identifier">LIKELY_CE</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="reserved">regions_data</span><span class="plain"> *</span><span class="functiontext">PL::Regions::new_data</span><span class="plain">(</span><span class="identifier">inference_subject</span><span class="plain"> *</span><span class="identifier">subj</span><span class="plain">) {</span>
<span class="reserved">regions_data</span><span class="plain"> *</span><span class="identifier">rd</span><span class="plain"> = </span><span class="identifier">CREATE</span><span class="plain">(</span><span class="reserved">regions_data</span><span class="plain">);</span>
<span class="identifier">rd</span><span class="plain">-</span><span class="element">&gt;in_region</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
<span class="identifier">rd</span><span class="plain">-</span><span class="element">&gt;in_region_set_at</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
<span class="identifier">rd</span><span class="plain">-</span><span class="element">&gt;in_region_iname</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">rd</span><span class="plain">;</span>
<span class="plain">}</span>
<span class="identifier">inter_name</span><span class="plain"> *</span><span class="functiontext">PL::Regions::found_in_iname</span><span class="plain">(</span><span class="identifier">instance</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">PF_I</span><span class="plain">(</span><span class="identifier">regions</span><span class="plain">, </span><span class="identifier">I</span><span class="plain">)-</span><span class="element">&gt;in_region_iname</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">) {</span>
<span class="identifier">inter_name</span><span class="plain"> *</span><span class="identifier">iname</span><span class="plain"> = </span><span class="identifier">Instances::iname</span><span class="plain">(</span><span class="identifier">I</span><span class="plain">);</span>
<span class="identifier">PF_I</span><span class="plain">(</span><span class="identifier">regions</span><span class="plain">, </span><span class="identifier">I</span><span class="plain">)-</span><span class="element">&gt;in_region_iname</span><span class="plain"> = </span><span class="identifier">Packaging::function</span><span class="plain">(</span>
<span class="identifier">InterNames::one_off</span><span class="plain">(</span><span class="identifier">I</span><span class="string">"region_found_in_fn"</span><span class="plain">, </span><span class="identifier">iname</span><span class="plain">-&gt;</span><span class="identifier">eventual_owner</span><span class="plain">),</span>
<span class="identifier">iname</span><span class="plain">-&gt;</span><span class="identifier">eventual_owner</span><span class="plain">,</span>
<span class="identifier">InterNames::new</span><span class="plain">(</span><span class="identifier">REGION_FOUND_IN_ROUTINE_INAMEF</span><span class="plain">));</span>
<span class="plain">}</span>
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">PF_I</span><span class="plain">(</span><span class="identifier">regions</span><span class="plain">, </span><span class="identifier">I</span><span class="plain">)-</span><span class="element">&gt;in_region_iname</span><span class="plain">;</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">The function PL::Regions::start appears nowhere else.</p>
<p class="endnote">The function PL::Regions::new_data is used in <a href="#SP7">&#167;7</a>.</p>
<p class="endnote">The function PL::Regions::found_in_iname is used in <a href="#SP19_2">&#167;19.2</a>, <a href="#SP20">&#167;20</a>.</p>
<p class="inwebparagraph"><a id="SP6"></a><b>&#167;6. Kinds. </b>This a kind name to do with regions which Inform provides special support
for; it recognises the English name when defined by the Standard Rules. (So
there is no need to translate this to other languages.)
</p>
<pre class="display">
<span class="plain">&lt;</span><span class="identifier">notable</span><span class="plain">-</span><span class="identifier">regions</span><span class="plain">-</span><span class="identifier">kinds</span><span class="plain">&gt; ::=</span>
<span class="identifier">region</span>
</pre>
<p class="inwebparagraph"></p>
<p class="inwebparagraph"><a id="SP7"></a><b>&#167;7. </b></p>
<pre class="display">
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">PL::Regions::regions_new_base_kind_notify</span><span class="plain">(</span><span class="identifier">kind</span><span class="plain"> *</span><span class="identifier">new_base</span><span class="plain">, </span><span class="reserved">char</span><span class="plain"> *</span><span class="identifier">text_stream</span><span class="plain">, </span><span class="identifier">wording</span><span class="plain"> </span><span class="identifier">W</span><span class="plain">) {</span>
<span class="reserved">if</span><span class="plain"> (&lt;</span><span class="identifier">notable</span><span class="plain">-</span><span class="identifier">regions</span><span class="plain">-</span><span class="identifier">kinds</span><span class="plain">&gt;(</span><span class="identifier">W</span><span class="plain">)) {</span>
<span class="identifier">K_region</span><span class="plain"> = </span><span class="identifier">new_base</span><span class="plain">; </span><span class="reserved">return</span><span class="plain"> </span><span class="identifier">TRUE</span><span class="plain">;</span>
<span class="plain">}</span>
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">FALSE</span><span class="plain">;</span>
<span class="plain">}</span>
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">PL::Regions::regions_new_subject_notify</span><span class="plain">(</span><span class="identifier">inference_subject</span><span class="plain"> *</span><span class="identifier">subj</span><span class="plain">) {</span>
<span class="identifier">CREATE_PF_DATA</span><span class="plain">(</span><span class="identifier">regions</span><span class="plain">, </span><span class="identifier">subj</span><span class="plain">, </span><span class="functiontext">PL::Regions::new_data</span><span class="plain">);</span>
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">FALSE</span><span class="plain">;</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">The function PL::Regions::regions_new_base_kind_notify is used in <a href="#SP5">&#167;5</a>.</p>
<p class="endnote">The function PL::Regions::regions_new_subject_notify is used in <a href="#SP5">&#167;5</a>.</p>
<p class="inwebparagraph"><a id="SP8"></a><b>&#167;8. </b>Region needs to be an abstract object, not a thing or a room, so:
</p>
<pre class="display">
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">PL::Regions::regions_set_subkind_notify</span><span class="plain">(</span><span class="identifier">kind</span><span class="plain"> *</span><span class="identifier">sub</span><span class="plain">, </span><span class="identifier">kind</span><span class="plain"> *</span><span class="identifier">super</span><span class="plain">) {</span>
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">sub</span><span class="plain"> == </span><span class="identifier">K_region</span><span class="plain">) &amp;&amp; (</span><span class="identifier">super</span><span class="plain"> != </span><span class="identifier">K_object</span><span class="plain">)) {</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">problem_count</span><span class="plain"> == 0)</span>
<span class="identifier">Problems::Issue::sentence_problem</span><span class="plain">(</span><span class="identifier">_p_</span><span class="plain">(</span><span class="identifier">PM_RegionAdrift</span><span class="plain">),</span>
<span class="string">"'region' is not allowed to be a kind of anything (other than "</span>
<span class="string">"'object')"</span><span class="plain">,</span>
<span class="string">"because it's too fundamental to the way Inform maps out the "</span>
<span class="string">"geography of the physical world."</span><span class="plain">);</span>
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">TRUE</span><span class="plain">;</span>
<span class="plain">}</span>
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">FALSE</span><span class="plain">;</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">The function PL::Regions::regions_set_subkind_notify is used in <a href="#SP5">&#167;5</a>.</p>
<p class="inwebparagraph"><a id="SP9"></a><b>&#167;9. </b></p>
<pre class="display">
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">PL::Regions::object_is_a_region</span><span class="plain">(</span><span class="identifier">instance</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">Plugins::Manage::plugged_in</span><span class="plain">(</span><span class="identifier">regions_plugin</span><span class="plain">)) &amp;&amp; (</span><span class="identifier">K_region</span><span class="plain">) &amp;&amp; (</span><span class="identifier">I</span><span class="plain">) &amp;&amp;</span>
<span class="plain">(</span><span class="identifier">Instances::of_kind</span><span class="plain">(</span><span class="identifier">I</span><span class="plain">, </span><span class="identifier">K_region</span><span class="plain">))) </span><span class="reserved">return</span><span class="plain"> </span><span class="identifier">TRUE</span><span class="plain">;</span>
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">FALSE</span><span class="plain">;</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">The function PL::Regions::object_is_a_region is used in <a href="#SP18">&#167;18</a>, 3/sm (<a href="3-sm.html#SP32_2">&#167;32.2</a>), 3/em (<a href="3-em.html#SP11">&#167;11</a>, <a href="3-em.html#SP22_4_1">&#167;22.4.1</a>).</p>
<p class="inwebparagraph"><a id="SP10"></a><b>&#167;10. </b>Rooms are always more specific than regions; if region X is within
region Y, then X is more specific than Y; otherwise any two regions are
equally specific. (This is used in sorting rules by the specificity of their
domains.)
</p>
<pre class="display">
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">PL::Regions::regions_more_specific</span><span class="plain">(</span><span class="identifier">instance</span><span class="plain"> *</span><span class="identifier">I1</span><span class="plain">, </span><span class="identifier">instance</span><span class="plain"> *</span><span class="identifier">I2</span><span class="plain">) {</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">r1</span><span class="plain"> = </span><span class="identifier">Instances::of_kind</span><span class="plain">(</span><span class="identifier">I1</span><span class="plain">, </span><span class="identifier">K_room</span><span class="plain">);</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">r2</span><span class="plain"> = </span><span class="identifier">Instances::of_kind</span><span class="plain">(</span><span class="identifier">I2</span><span class="plain">, </span><span class="identifier">K_room</span><span class="plain">);</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">reg1</span><span class="plain"> = </span><span class="identifier">Instances::of_kind</span><span class="plain">(</span><span class="identifier">I1</span><span class="plain">, </span><span class="identifier">K_region</span><span class="plain">);</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">reg2</span><span class="plain"> = </span><span class="identifier">Instances::of_kind</span><span class="plain">(</span><span class="identifier">I2</span><span class="plain">, </span><span class="identifier">K_region</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">r1</span><span class="plain">) &amp;&amp; (</span><span class="identifier">reg2</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">reg1</span><span class="plain">) &amp;&amp; (</span><span class="identifier">r2</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">reg1</span><span class="plain">) &amp;&amp; (</span><span class="identifier">reg2</span><span class="plain">)) {</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">PL::Spatial::encloses</span><span class="plain">(</span><span class="identifier">I1</span><span class="plain">, </span><span class="identifier">I2</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="functiontext">PL::Spatial::encloses</span><span class="plain">(</span><span class="identifier">I2</span><span class="plain">, </span><span class="identifier">I1</span><span class="plain">)) </span><span class="reserved">return</span><span class="plain"> -1;</span>
<span class="plain">}</span>
<span class="reserved">return</span><span class="plain"> 0;</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">The function PL::Regions::regions_more_specific is used in <a href="#SP5">&#167;5</a>.</p>
<p class="inwebparagraph"><a id="SP11"></a><b>&#167;11. Properties. </b>This is a property name to do with regions which Inform provides special
support for; it recognises the English name when it is defined by the
Standard Rules. (So there is no need to translate this to other languages.)
</p>
<pre class="display">
<span class="plain">&lt;</span><span class="identifier">notable</span><span class="plain">-</span><span class="identifier">regions</span><span class="plain">-</span><span class="identifier">properties</span><span class="plain">&gt; ::=</span>
<span class="identifier">map</span><span class="plain"> </span><span class="identifier">region</span>
</pre>
<p class="inwebparagraph"></p>
<p class="inwebparagraph"><a id="SP12"></a><b>&#167;12. </b></p>
<pre class="display">
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">PL::Regions::regions_new_property_notify</span><span class="plain">(</span><span class="identifier">property</span><span class="plain"> *</span><span class="identifier">prn</span><span class="plain">) {</span>
<span class="reserved">if</span><span class="plain"> (&lt;</span><span class="identifier">notable</span><span class="plain">-</span><span class="identifier">regions</span><span class="plain">-</span><span class="identifier">properties</span><span class="plain">&gt;(</span><span class="identifier">prn</span><span class="plain">-</span><span class="element">&gt;name</span><span class="plain">))</span>
<span class="identifier">P_map_region</span><span class="plain"> = </span><span class="identifier">prn</span><span class="plain">;</span>
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">FALSE</span><span class="plain">;</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">The function PL::Regions::regions_new_property_notify is used in <a href="#SP5">&#167;5</a>.</p>
<p class="inwebparagraph"><a id="SP13"></a><b>&#167;13. </b></p>
<pre class="display">
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">PL::Regions::regions_estimate_property_usage</span><span class="plain">(</span><span class="identifier">kind</span><span class="plain"> *</span><span class="identifier">k</span><span class="plain">, </span><span class="reserved">int</span><span class="plain"> *</span><span class="identifier">words_used</span><span class="plain">) {</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Kinds::Compare::eq</span><span class="plain">(</span><span class="identifier">k</span><span class="plain">, </span><span class="identifier">K_region</span><span class="plain">)) *</span><span class="identifier">words_used</span><span class="plain"> += 2;</span>
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">FALSE</span><span class="plain">;</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">The function PL::Regions::regions_estimate_property_usage is used in <a href="#SP5">&#167;5</a>.</p>
<p class="inwebparagraph"><a id="SP14"></a><b>&#167;14. Assertions. </b>The following doesn't really intervene at all: it simply produces two problem
messages which would have been less helpful if core Inform had produced them.
</p>
<pre class="display">
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">PL::Regions::regions_intervene_in_assertion</span><span class="plain">(</span><span class="identifier">parse_node</span><span class="plain"> *</span><span class="identifier">px</span><span class="plain">, </span><span class="identifier">parse_node</span><span class="plain"> *</span><span class="identifier">py</span><span class="plain">) {</span>
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">ParseTree::get_type</span><span class="plain">(</span><span class="identifier">px</span><span class="plain">) == </span><span class="identifier">PROPER_NOUN_NT</span><span class="plain">) &amp;&amp;</span>
<span class="plain">(</span><span class="identifier">ParseTree::get_type</span><span class="plain">(</span><span class="identifier">py</span><span class="plain">) == </span><span class="identifier">COMMON_NOUN_NT</span><span class="plain">)) {</span>
<span class="identifier">inference_subject</span><span class="plain"> *</span><span class="identifier">left_subject</span><span class="plain"> = </span><span class="identifier">ParseTree::get_subject</span><span class="plain">(</span><span class="identifier">px</span><span class="plain">);</span>
<span class="identifier">inference_subject</span><span class="plain"> *</span><span class="identifier">right_kind</span><span class="plain"> = </span><span class="identifier">ParseTree::get_subject</span><span class="plain">(</span><span class="identifier">py</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">InferenceSubjects::is_an_object</span><span class="plain">(</span><span class="identifier">left_subject</span><span class="plain">)) &amp;&amp;</span>
<span class="plain">(</span><span class="identifier">right_kind</span><span class="plain"> == </span><span class="identifier">Kinds::Knowledge::as_subject</span><span class="plain">(</span><span class="identifier">K_region</span><span class="plain">))) {</span>
<span class="identifier">instance</span><span class="plain"> *</span><span class="identifier">left_object</span><span class="plain"> = </span><span class="identifier">InferenceSubjects::as_object_instance</span><span class="plain">(</span><span class="identifier">left_subject</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">left_object</span><span class="plain">) &amp;&amp;</span>
<span class="plain">(</span><span class="identifier">current_sentence</span><span class="plain"> != </span><span class="identifier">Instances::get_creating_sentence</span><span class="plain">(</span><span class="identifier">left_object</span><span class="plain">)) &amp;&amp;</span>
<span class="plain">(</span><span class="identifier">Instances::of_kind</span><span class="plain">(</span><span class="identifier">left_object</span><span class="plain">, </span><span class="identifier">K_region</span><span class="plain">) == </span><span class="identifier">FALSE</span><span class="plain">)) {</span>
<span class="identifier">Problems::Issue::subject_problem_at_sentence</span><span class="plain">(</span><span class="identifier">_p_</span><span class="plain">(</span><span class="identifier">PM_ExistingRegion</span><span class="plain">),</span>
<span class="identifier">left_subject</span><span class="plain">,</span>
<span class="string">"(which I notice in another sentence) seems now to "</span>
<span class="string">"be declared as a new region"</span><span class="plain">,</span>
<span class="string">"which is suspect. Perhaps I have misinterpreted what was "</span>
<span class="string">"meant to be a new name for an old one?"</span><span class="plain">);</span>
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">TRUE</span><span class="plain">;</span>
<span class="plain">}</span>
<span class="plain">}</span>
<span class="plain">}</span>
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">ParseTree::get_type</span><span class="plain">(</span><span class="identifier">px</span><span class="plain">) == </span><span class="identifier">RELATIONSHIP_NT</span><span class="plain">) &amp;&amp;</span>
<span class="plain">(</span><span class="identifier">ParseTree::get_subject</span><span class="plain">(</span><span class="identifier">py</span><span class="plain">) == </span><span class="identifier">Kinds::Knowledge::as_subject</span><span class="plain">(</span><span class="identifier">K_region</span><span class="plain">))) {</span>
<span class="identifier">Problems::Issue::assertion_problem</span><span class="plain">(</span><span class="identifier">_p_</span><span class="plain">(</span><span class="identifier">PM_RegionRelated</span><span class="plain">),</span>
<span class="string">"a region cannot be given a specific location"</span><span class="plain">,</span>
<span class="string">"since it contains what may be many rooms, which may not be "</span>
<span class="string">"contiguous and could be scattered about all over. (Sometimes "</span>
<span class="string">"this problem arises because an ambiguous sentence like 'East "</span>
<span class="string">"of Eden is a region.' has been used: Inform reads that as "</span>
<span class="string">"saying that a nameless region lies to the east of the room "</span>
<span class="string">"'Eden'. The desired effect can be got using 'called' to stop "</span>
<span class="string">"Inform taking 'East of' literally: for instance, 'The Land of "</span>
<span class="string">"Nod is in a region called East of Eden.'"</span><span class="plain">);</span>
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">TRUE</span><span class="plain">;</span>
<span class="plain">}</span>
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">FALSE</span><span class="plain">;</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">The function PL::Regions::regions_intervene_in_assertion is used in <a href="#SP5">&#167;5</a>.</p>
<p class="inwebparagraph"><a id="SP15"></a><b>&#167;15. Relations. </b></p>
<pre class="display">
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">PL::Regions::regions_name_to_early_infs</span><span class="plain">(</span><span class="identifier">wording</span><span class="plain"> </span><span class="identifier">W</span><span class="plain">, </span><span class="identifier">inference_subject</span><span class="plain"> **</span><span class="identifier">infs</span><span class="plain">) {</span>
<span class="reserved">if</span><span class="plain"> ((&lt;</span><span class="identifier">notable</span><span class="plain">-</span><span class="identifier">regions</span><span class="plain">-</span><span class="identifier">kinds</span><span class="plain">&gt;(</span><span class="identifier">W</span><span class="plain">)) &amp;&amp; (</span><span class="identifier">K_region</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">)) *</span><span class="identifier">infs</span><span class="plain"> = </span><span class="identifier">infs_region</span><span class="plain">;</span>
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">FALSE</span><span class="plain">;</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">The function PL::Regions::regions_name_to_early_infs is used in <a href="#SP5">&#167;5</a>.</p>
<p class="inwebparagraph"><a id="SP16"></a><b>&#167;16. </b></p>
<pre class="display">
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">PL::Regions::create_relations</span><span class="plain">(</span><span class="reserved">void</span><span class="plain">) {</span>
<span class="identifier">R_regional_containment</span><span class="plain"> =</span>
<span class="identifier">BinaryPredicates::make_pair</span><span class="plain">(</span><span class="identifier">SPATIAL_KBP</span><span class="plain">,</span>
<span class="identifier">BinaryPredicates::new_term</span><span class="plain">(</span><span class="identifier">infs_region</span><span class="plain">),</span>
<span class="identifier">BinaryPredicates::new_term</span><span class="plain">(</span><span class="identifier">Kinds::Knowledge::as_subject</span><span class="plain">(</span><span class="identifier">K_object</span><span class="plain">)),</span>
<span class="identifier">I</span><span class="string">"region-contains"</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"in-region"</span><span class="plain">,</span>
<span class="identifier">NULL</span><span class="plain">, </span><span class="identifier">NULL</span><span class="plain">, </span><span class="identifier">Calculus::Schemas::new</span><span class="plain">(</span><span class="string">"TestRegionalContainment(*2,*1)"</span><span class="plain">),</span>
<span class="identifier">Preform::Nonparsing::wording</span><span class="plain">(&lt;</span><span class="identifier">relation</span><span class="plain">-</span><span class="identifier">names</span><span class="plain">&gt;,</span>
<span class="identifier">REGIONAL_CONTAINMENT_RELATION_NAME</span><span class="plain">));</span>
<span class="identifier">BinaryPredicates::set_index_details</span><span class="plain">(</span><span class="identifier">R_regional_containment</span><span class="plain">, </span><span class="identifier">NULL</span><span class="plain">, </span><span class="string">"room/region"</span><span class="plain">);</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">The function PL::Regions::create_relations is used in 3/sr (<a href="3-sr.html#SP3">&#167;3</a>).</p>
<p class="inwebparagraph"><a id="SP17"></a><b>&#167;17. </b>We intervene only in limited cases: X contains Y, X regionally contains Y,
or X incorporates Y; and only when X is a region. (This of course only
applies to the built-in spatial relationships; regions are entirely free
to participate in nonspatial relations.)
</p>
<pre class="display">
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">PL::Regions::assert_relations</span><span class="plain">(</span><span class="identifier">binary_predicate</span><span class="plain"> *</span><span class="identifier">relation</span><span class="plain">,</span>
<span class="identifier">instance</span><span class="plain"> *</span><span class="identifier">I0</span><span class="plain">, </span><span class="identifier">instance</span><span class="plain"> *</span><span class="identifier">I1</span><span class="plain">) {</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">I0_is_region</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">Instances::of_kind</span><span class="plain">(</span><span class="identifier">I0</span><span class="plain">, </span><span class="identifier">K_region</span><span class="plain">)) </span><span class="identifier">I0_is_region</span><span class="plain"> = </span><span class="identifier">TRUE</span><span class="plain">;</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">I1_is_region</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">Instances::of_kind</span><span class="plain">(</span><span class="identifier">I1</span><span class="plain">, </span><span class="identifier">K_region</span><span class="plain">)) </span><span class="identifier">I1_is_region</span><span class="plain"> = </span><span class="identifier">TRUE</span><span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">I0_is_region</span><span class="plain">) {</span>
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">relation</span><span class="plain"> == </span><span class="identifier">R_incorporation</span><span class="plain">) ||</span>
<span class="plain">(</span><span class="identifier">relation</span><span class="plain"> == </span><span class="identifier">R_containment</span><span class="plain">) ||</span>
<span class="plain">(</span><span class="identifier">relation</span><span class="plain"> == </span><span class="identifier">R_regional_containment</span><span class="plain">)) {</span>
&lt;<span class="cwebmacro">You can only be declared as in one region</span> <span class="cwebmacronumber">17.1</span>&gt;<span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">I1_is_region</span><span class="plain">) </span>&lt;<span class="cwebmacro">A region is being put inside a region</span> <span class="cwebmacronumber">17.2</span>&gt;
<span class="reserved">else</span><span class="plain"> </span>&lt;<span class="cwebmacro">A room is being put inside a region</span> <span class="cwebmacronumber">17.3</span>&gt;<span class="plain">;</span>
<span class="plain">} </span><span class="reserved">else</span><span class="plain"> {</span>
<span class="identifier">Problems::Issue::sentence_problem</span><span class="plain">(</span><span class="identifier">_p_</span><span class="plain">(</span><span class="identifier">PM_RegionRelation</span><span class="plain">),</span>
<span class="string">"regions can only contain rooms"</span><span class="plain">,</span>
<span class="string">"and have no other relationships."</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">TRUE</span><span class="plain">;</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">I1_is_region</span><span class="plain">) {</span>
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">relation</span><span class="plain"> == </span><span class="identifier">R_incorporation</span><span class="plain">) ||</span>
<span class="plain">(</span><span class="identifier">relation</span><span class="plain"> == </span><span class="identifier">R_containment</span><span class="plain">) ||</span>
<span class="plain">(</span><span class="identifier">relation</span><span class="plain"> == </span><span class="identifier">R_regional_containment</span><span class="plain">)) {</span>
<span class="identifier">Problems::Issue::sentence_problem</span><span class="plain">(</span><span class="identifier">_p_</span><span class="plain">(</span><span class="identifier">PM_RegionRelation2</span><span class="plain">),</span>
<span class="string">"regions can only be contained in other regions"</span><span class="plain">,</span>
<span class="string">"and not for example in rooms."</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="plain">}</span>
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">FALSE</span><span class="plain">;</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">The function PL::Regions::assert_relations is used in 3/sr (<a href="3-sr.html#SP6_1">&#167;6.1</a>).</p>
<p class="inwebparagraph"><a id="SP17_1"></a><b>&#167;17.1. </b><code class="display">
&lt;<span class="cwebmacrodefn">You can only be declared as in one region</span> <span class="cwebmacronumber">17.1</span>&gt; =
</code></p>
<pre class="displaydefn">
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">PF_I</span><span class="plain">(</span><span class="identifier">regions</span><span class="plain">, </span><span class="identifier">I1</span><span class="plain">)-</span><span class="element">&gt;in_region</span><span class="plain">) &amp;&amp;</span>
<span class="plain">(</span><span class="identifier">PF_I</span><span class="plain">(</span><span class="identifier">regions</span><span class="plain">, </span><span class="identifier">I1</span><span class="plain">)-</span><span class="element">&gt;in_region</span><span class="plain"> != </span><span class="identifier">I0</span><span class="plain">)) {</span>
<span class="identifier">Problems::Issue::sentence_problem</span><span class="plain">(</span><span class="identifier">_p_</span><span class="plain">(</span><span class="identifier">PM_RegionInTwoRegions</span><span class="plain">),</span>
<span class="string">"each region can only be declared to be inside a single "</span>
<span class="string">"other region"</span><span class="plain">,</span>
<span class="string">"since although regions can be placed inside each other, "</span>
<span class="string">"they are not permitted to overlap."</span><span class="plain">);</span>
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">TRUE</span><span class="plain">;</span>
<span class="plain">}</span>
<span class="identifier">PF_I</span><span class="plain">(</span><span class="identifier">regions</span><span class="plain">, </span><span class="identifier">I1</span><span class="plain">)-</span><span class="element">&gt;in_region</span><span class="plain"> = </span><span class="identifier">I0</span><span class="plain">;</span>
<span class="identifier">PF_I</span><span class="plain">(</span><span class="identifier">regions</span><span class="plain">, </span><span class="identifier">I1</span><span class="plain">)-</span><span class="element">&gt;in_region_set_at</span><span class="plain"> = </span><span class="identifier">current_sentence</span><span class="plain">;</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">This code is used in <a href="#SP17">&#167;17</a>.</p>
<p class="inwebparagraph"><a id="SP17_2"></a><b>&#167;17.2. </b><code class="display">
&lt;<span class="cwebmacrodefn">A region is being put inside a region</span> <span class="cwebmacronumber">17.2</span>&gt; =
</code></p>
<pre class="displaydefn">
<span class="identifier">inference_subject</span><span class="plain"> *</span><span class="identifier">inner</span><span class="plain"> = </span><span class="identifier">Instances::as_subject</span><span class="plain">(</span><span class="identifier">I1</span><span class="plain">);</span>
<span class="identifier">inference_subject</span><span class="plain"> *</span><span class="identifier">outer</span><span class="plain"> = </span><span class="identifier">Instances::as_subject</span><span class="plain">(</span><span class="identifier">I0</span><span class="plain">);</span>
<span class="identifier">World::Inferences::draw</span><span class="plain">(</span><span class="constant">PARENTAGE_INF</span><span class="plain">, </span><span class="identifier">inner</span><span class="plain">, </span><span class="identifier">CERTAIN_CE</span><span class="plain">, </span><span class="identifier">outer</span><span class="plain">, </span><span class="identifier">NULL</span><span class="plain">);</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">This code is used in <a href="#SP17">&#167;17</a>.</p>
<p class="inwebparagraph"><a id="SP17_3"></a><b>&#167;17.3. </b>Anything in or part of a region is necessarily a room, if it isn't known
to be a region already:
</p>
<p class="macrodefinition"><code class="display">
&lt;<span class="cwebmacrodefn">A room is being put inside a region</span> <span class="cwebmacronumber">17.3</span>&gt; =
</code></p>
<pre class="displaydefn">
<span class="identifier">inference_subject</span><span class="plain"> *</span><span class="identifier">rm</span><span class="plain"> = </span><span class="identifier">Instances::as_subject</span><span class="plain">(</span><span class="identifier">I1</span><span class="plain">);</span>
<span class="identifier">parse_node</span><span class="plain"> *</span><span class="identifier">spec</span><span class="plain"> = </span><span class="identifier">Rvalues::from_instance</span><span class="plain">(</span><span class="identifier">I0</span><span class="plain">);</span>
<span class="identifier">Calculus::Propositions::Abstract::assert_kind_of_object</span><span class="plain">(</span><span class="identifier">I1</span><span class="plain">, </span><span class="identifier">K_room</span><span class="plain">);</span>
<span class="identifier">World::Inferences::draw_property</span><span class="plain">(</span><span class="identifier">rm</span><span class="plain">, </span><span class="identifier">P_map_region</span><span class="plain">, </span><span class="identifier">spec</span><span class="plain">);</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">This code is used in <a href="#SP17">&#167;17</a>.</p>
<p class="inwebparagraph"><a id="SP18"></a><b>&#167;18. </b>Note that because we use regular <code class="display"><span class="extract">PARENTAGE_INF</span></code> inferences to remember
that one region is inside another, it follows that the progenitor of a
region is either the next broadest region containing it, or else <code class="display"><span class="extract">NULL</span></code>.
</p>
<pre class="display">
<span class="identifier">instance</span><span class="plain"> *</span><span class="functiontext">PL::Regions::enclosing</span><span class="plain">(</span><span class="identifier">instance</span><span class="plain"> *</span><span class="identifier">reg</span><span class="plain">) {</span>
<span class="identifier">instance</span><span class="plain"> *</span><span class="identifier">P</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">PL::Spatial::object_is_a_room</span><span class="plain">(</span><span class="identifier">reg</span><span class="plain">)) </span><span class="identifier">P</span><span class="plain"> = </span><span class="identifier">PF_I</span><span class="plain">(</span><span class="identifier">regions</span><span class="plain">, </span><span class="identifier">reg</span><span class="plain">)-</span><span class="element">&gt;in_region</span><span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">PL::Regions::object_is_a_region</span><span class="plain">(</span><span class="identifier">reg</span><span class="plain">)) </span><span class="identifier">P</span><span class="plain"> = </span><span class="functiontext">PL::Spatial::progenitor</span><span class="plain">(</span><span class="identifier">reg</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">PL::Regions::object_is_a_region</span><span class="plain">(</span><span class="identifier">P</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">NULL</span><span class="plain">;</span>
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">P</span><span class="plain">;</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">The function PL::Regions::enclosing is used in <a href="#SP21">&#167;21</a>, 3/sm2 (<a href="3-sm2.html#SP38">&#167;38</a>, <a href="3-sm2.html#SP42_1">&#167;42.1</a>, <a href="3-sm2.html#SP43_2">&#167;43.2</a>), 3/hm (<a href="3-hm.html#SP6_2">&#167;6.2</a>, <a href="3-hm.html#SP13">&#167;13</a>), 3/em (<a href="3-em.html#SP11">&#167;11</a>).</p>
<p class="inwebparagraph"><a id="SP19"></a><b>&#167;19. Model completion. </b></p>
<pre class="display">
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">PL::Regions::regions_complete_model</span><span class="plain">(</span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">stage</span><span class="plain">) {</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">stage</span><span class="plain"> == 2) </span>&lt;<span class="cwebmacro">Assert map-region properties of rooms and regions</span> <span class="cwebmacronumber">19.1</span>&gt;<span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">stage</span><span class="plain"> == 3) </span>&lt;<span class="cwebmacro">Assert regional-found-in properties of regions</span> <span class="cwebmacronumber">19.2</span>&gt;<span class="plain">;</span>
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">FALSE</span><span class="plain">;</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">The function PL::Regions::regions_complete_model is used in <a href="#SP5">&#167;5</a>.</p>
<p class="inwebparagraph"><a id="SP19_1"></a><b>&#167;19.1. </b>The following is needed in case somebody does something like this:
</p>
<blockquote>
<p>A desert room is a kind of room. The map region of a desert room is usually Sahara.</p>
</blockquote>
<p class="macrodefinition"><code class="display">
&lt;<span class="cwebmacrodefn">Assert map-region properties of rooms and regions</span> <span class="cwebmacronumber">19.1</span>&gt; =
</code></p>
<pre class="displaydefn">
<span class="identifier">instance</span><span class="plain"> *</span><span class="identifier">I</span><span class="plain">;</span>
<span class="identifier">LOOP_OVER_OBJECT_INSTANCES</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">Instances::of_kind</span><span class="plain">(</span><span class="identifier">I</span><span class="plain">, </span><span class="identifier">K_room</span><span class="plain">)) ||</span>
<span class="plain">(</span><span class="identifier">Instances::of_kind</span><span class="plain">(</span><span class="identifier">I</span><span class="plain">, </span><span class="identifier">K_region</span><span class="plain">))) {</span>
<span class="identifier">parse_node</span><span class="plain"> *</span><span class="identifier">where</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
<span class="identifier">parse_node</span><span class="plain"> *</span><span class="identifier">val</span><span class="plain"> = </span><span class="identifier">World::Inferences::get_prop_state_at</span><span class="plain">(</span>
<span class="identifier">Instances::as_subject</span><span class="plain">(</span><span class="identifier">I</span><span class="plain">), </span><span class="identifier">P_map_region</span><span class="plain">, &amp;</span><span class="identifier">where</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="identifier">instance</span><span class="plain"> *</span><span class="identifier">reg</span><span class="plain"> =</span>
<span class="identifier">Rvalues::to_object_instance</span><span class="plain">(</span><span class="identifier">val</span><span class="plain">);</span>
<span class="identifier">PF_I</span><span class="plain">(</span><span class="identifier">regions</span><span class="plain">, </span><span class="identifier">I</span><span class="plain">)-</span><span class="element">&gt;in_region</span><span class="plain"> = </span><span class="identifier">reg</span><span class="plain">;</span>
<span class="identifier">PF_I</span><span class="plain">(</span><span class="identifier">regions</span><span class="plain">, </span><span class="identifier">I</span><span class="plain">)-</span><span class="element">&gt;in_region_set_at</span><span class="plain"> = </span><span class="identifier">where</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="#SP19">&#167;19</a>.</p>
<p class="inwebparagraph"><a id="SP19_2"></a><b>&#167;19.2. </b><code class="display">
&lt;<span class="cwebmacrodefn">Assert regional-found-in properties of regions</span> <span class="cwebmacronumber">19.2</span>&gt; =
</code></p>
<pre class="displaydefn">
<span class="identifier">P_regional_found_in</span><span class="plain"> = </span><span class="identifier">Properties::Valued::new_nameless</span><span class="plain">(</span>
<span class="identifier">I</span><span class="string">"regional_found_in"</span><span class="plain">, </span><span class="identifier">K_text</span><span class="plain">);</span>
<span class="identifier">instance</span><span class="plain"> *</span><span class="identifier">I</span><span class="plain">;</span>
<span class="identifier">LOOP_OVER_OBJECT_INSTANCES</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">Instances::of_kind</span><span class="plain">(</span><span class="identifier">I</span><span class="plain">, </span><span class="identifier">K_region</span><span class="plain">)) {</span>
<span class="identifier">inter_name</span><span class="plain"> *</span><span class="identifier">iname</span><span class="plain"> = </span><span class="functiontext">PL::Regions::found_in_iname</span><span class="plain">(</span><span class="identifier">I</span><span class="plain">);</span>
<span class="identifier">InterNames::to_symbol</span><span class="plain">(</span><span class="identifier">iname</span><span class="plain">);</span>
<span class="identifier">Properties::Valued::assert</span><span class="plain">(</span><span class="identifier">P_regional_found_in</span><span class="plain">, </span><span class="identifier">Instances::as_subject</span><span class="plain">(</span><span class="identifier">I</span><span class="plain">),</span>
<span class="identifier">Rvalues::from_iname</span><span class="plain">(</span><span class="identifier">iname</span><span class="plain">), </span><span class="identifier">CERTAIN_CE</span><span class="plain">);</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">This code is used in <a href="#SP19">&#167;19</a>.</p>
<p class="inwebparagraph"><a id="SP20"></a><b>&#167;20. </b></p>
<pre class="display">
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">PL::Regions::write_regional_found_in_routines</span><span class="plain">(</span><span class="reserved">void</span><span class="plain">) {</span>
<span class="identifier">instance</span><span class="plain"> *</span><span class="identifier">I</span><span class="plain">;</span>
<span class="identifier">LOOP_OVER_OBJECT_INSTANCES</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">Instances::of_kind</span><span class="plain">(</span><span class="identifier">I</span><span class="plain">, </span><span class="identifier">K_region</span><span class="plain">)) {</span>
<span class="identifier">inter_name</span><span class="plain"> *</span><span class="identifier">iname</span><span class="plain"> = </span><span class="functiontext">PL::Regions::found_in_iname</span><span class="plain">(</span><span class="identifier">I</span><span class="plain">);</span>
<span class="identifier">packaging_state</span><span class="plain"> </span><span class="identifier">save</span><span class="plain"> = </span><span class="identifier">Routines::begin</span><span class="plain">(</span><span class="identifier">iname</span><span class="plain">);</span>
<span class="identifier">Emit::inv_primitive</span><span class="plain">(</span><span class="identifier">if_interp</span><span class="plain">);</span>
<span class="identifier">Emit::down</span><span class="plain">();</span>
<span class="identifier">Emit::inv_call</span><span class="plain">(</span><span class="identifier">InterNames::to_symbol</span><span class="plain">(</span><span class="identifier">Hierarchy::find</span><span class="plain">(</span><span class="identifier">TESTREGIONALCONTAINMENT_HL</span><span class="plain">)));</span>
<span class="identifier">Emit::down</span><span class="plain">();</span>
<span class="identifier">Emit::val_iname</span><span class="plain">(</span><span class="identifier">K_object</span><span class="plain">, </span><span class="identifier">Hierarchy::find</span><span class="plain">(</span><span class="identifier">LOCATION_HL</span><span class="plain">));</span>
<span class="identifier">Emit::val_iname</span><span class="plain">(</span><span class="identifier">K_object</span><span class="plain">, </span><span class="identifier">Instances::iname</span><span class="plain">(</span><span class="identifier">I</span><span class="plain">));</span>
<span class="identifier">Emit::up</span><span class="plain">();</span>
<span class="identifier">Emit::code</span><span class="plain">();</span>
<span class="identifier">Emit::down</span><span class="plain">();</span>
<span class="identifier">Emit::rtrue</span><span class="plain">();</span>
<span class="identifier">Emit::up</span><span class="plain">();</span>
<span class="identifier">Emit::up</span><span class="plain">();</span>
<span class="identifier">Emit::rfalse</span><span class="plain">();</span>
<span class="identifier">Routines::end</span><span class="plain">(</span><span class="identifier">save</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">The function PL::Regions::write_regional_found_in_routines appears nowhere else.</p>
<p class="inwebparagraph"><a id="SP21"></a><b>&#167;21. </b></p>
<pre class="display">
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">PL::Regions::regions_add_to_World_index</span><span class="plain">(</span><span class="identifier">OUTPUT_STREAM</span><span class="plain">, </span><span class="identifier">instance</span><span class="plain"> *</span><span class="identifier">O</span><span class="plain">) {</span>
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">O</span><span class="plain">) &amp;&amp; (</span><span class="identifier">Instances::of_kind</span><span class="plain">(</span><span class="identifier">O</span><span class="plain">, </span><span class="identifier">K_room</span><span class="plain">))) {</span>
<span class="identifier">instance</span><span class="plain"> *</span><span class="identifier">R</span><span class="plain"> = </span><span class="functiontext">PL::Regions::enclosing</span><span class="plain">(</span><span class="identifier">O</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">R</span><span class="plain">) </span><span class="functiontext">PL::HTMLMap::colour_chip</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="identifier">O</span><span class="plain">, </span><span class="identifier">R</span><span class="plain">, </span><span class="identifier">PF_I</span><span class="plain">(</span><span class="identifier">regions</span><span class="plain">, </span><span class="identifier">O</span><span class="plain">)-</span><span class="element">&gt;in_region_set_at</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">FALSE</span><span class="plain">;</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">The function PL::Regions::regions_add_to_World_index is used in <a href="#SP5">&#167;5</a>.</p>
<hr class="tocbar">
<ul class="toc"><li><a href="3-bck.html">Back to 'Backdrops'</a></li><li><a href="3-tm.html">Continue with 'The Map'</a></li></ul><hr class="tocbar">
<!--End of weave-->
</body>
</html>