mirror of
https://github.com/ganelson/inform.git
synced 2024-07-05 08:34:22 +03:00
631 lines
66 KiB
HTML
631 lines
66 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 name="viewport" content="width=device-width initial-scale=1">
|
|
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
|
|
<meta http-equiv="Content-Language" content="en-gb">
|
|
<link href="../inweb.css" rel="stylesheet" rev="stylesheet" type="text/css">
|
|
</head>
|
|
<body>
|
|
<nav role="navigation">
|
|
<h1><a href="../webs.html">Sources</a></h1>
|
|
<ul>
|
|
<li><a href="../compiler.html"><b>compiler</b></a></li>
|
|
<li><a href="../other.html">other tools</a></li>
|
|
<li><a href="../extensions.html">extensions and kits</a></li>
|
|
<li><a href="../units.html">unit test tools</a></li>
|
|
</ul>
|
|
<h2>Compiler Webs</h2>
|
|
<ul>
|
|
<li><a href="../inbuild/index.html">inbuild</a></li>
|
|
<li><a href="../inform7/index.html">inform7</a></li>
|
|
<li><a href="../inter/index.html">inter</a></li>
|
|
</ul>
|
|
<h2>Inbuild Modules</h2>
|
|
<ul>
|
|
<li><a href="../inbuild-module/index.html">inbuild</a></li>
|
|
<li><a href="../arch-module/index.html">arch</a></li>
|
|
<li><a href="../words-module/index.html">words</a></li>
|
|
<li><a href="../syntax-module/index.html">syntax</a></li>
|
|
<li><a href="../html-module/index.html">html</a></li>
|
|
</ul>
|
|
<h2>Inform7 Modules</h2>
|
|
<ul>
|
|
<li><a href="../core-module/index.html">core</a></li>
|
|
<li><a href="../problems-module/index.html">problems</a></li>
|
|
<li><a href="../inflections-module/index.html">inflections</a></li>
|
|
<li><a href="../linguistics-module/index.html">linguistics</a></li>
|
|
<li><a href="../kinds-module/index.html">kinds</a></li>
|
|
<li><a href="../if-module/index.html">if</a></li>
|
|
<li><a href="../multimedia-module/index.html">multimedia</a></li>
|
|
<li><a href="../index-module/index.html">index</a></li>
|
|
</ul>
|
|
<h2>Inter Modules</h2>
|
|
<ul>
|
|
<li><a href="../inter-module/index.html">inter</a></li>
|
|
<li><a href="../building-module/index.html">building</a></li>
|
|
<li><a href="../codegen-module/index.html">codegen</a></li>
|
|
</ul>
|
|
<h2>Foundation</h2>
|
|
<ul>
|
|
<li><a href="../../../inweb/docs/foundation-module/index.html">foundation</a></li>
|
|
</ul>
|
|
|
|
|
|
</nav>
|
|
<main role="main">
|
|
|
|
<!--Weave of '3/rgn' generated by 7-->
|
|
<ul class="crumbs"><li><a href="../webs.html">Source</a></li><li><a href="../compiler.html">Compiler Modules</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">§1. Definitions</a></li><li><a href="#SP5">§5. Initialising</a></li><li><a href="#SP6">§6. Kinds</a></li><li><a href="#SP11">§11. Properties</a></li><li><a href="#SP14">§14. Assertions</a></li><li><a href="#SP15">§15. Relations</a></li><li><a href="#SP19">§19. Model completion</a></li></ul><hr class="tocbar">
|
|
|
|
<p class="inwebparagraph"><a id="SP1"></a><b>§1. Definitions. </b></p>
|
|
|
|
<p class="inwebparagraph"><a id="SP2"></a><b>§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>§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>§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>§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">>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">>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">>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">>in_region_iname</span><span class="plain"> == </span><span class="identifier">NULL</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">>in_region_iname</span><span class="plain"> = </span><span class="identifier">Hierarchy::make_iname_in</span><span class="plain">(</span><span class="identifier">REGION_FOUND_IN_FN_HL</span><span class="plain">, </span><span class="identifier">Instances::package</span><span class="plain">(</span><span class="identifier">I</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">>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">§7</a>.</p>
|
|
|
|
<p class="endnote">The function PL::Regions::found_in_iname is used in <a href="#SP19_2">§19.2</a>, <a href="#SP20">§20</a>.</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP6"></a><b>§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"><</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">> ::=</span>
|
|
<span class="identifier">region</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="inwebparagraph"><a id="SP7"></a><b>§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"> (<</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">>(</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">§5</a>.</p>
|
|
|
|
<p class="endnote">The function PL::Regions::regions_new_subject_notify is used in <a href="#SP5">§5</a>.</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP8"></a><b>§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">) && (</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">Task::syntax_tree</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">§5</a>.</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP9"></a><b>§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">)) && (</span><span class="identifier">K_region</span><span class="plain">) && (</span><span class="identifier">I</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="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">§18</a>, 3/sm (<a href="3-sm.html#SP32_2">§32.2</a>), 3/em (<a href="3-em.html#SP11">§11</a>, <a href="3-em.html#SP22_4_1">§22.4.1</a>).</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP10"></a><b>§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">) && (</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">) && (</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">) && (</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">§5</a>.</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP11"></a><b>§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"><</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">> ::=</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>§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"> (<</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">>(</span><span class="identifier">prn</span><span class="plain">-</span><span class="element">>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">§5</a>.</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP13"></a><b>§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">§5</a>.</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP14"></a><b>§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">) &&</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">)) &&</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">) &&</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">)) &&</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">) &&</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">Task::syntax_tree</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">§5</a>.</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP15"></a><b>§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"> ((<</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">>(</span><span class="identifier">W</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">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">§5</a>.</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP16"></a><b>§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">(<</span><span class="identifier">relation</span><span class="plain">-</span><span class="identifier">names</span><span class="plain">>,</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">§3</a>).</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP17"></a><b>§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>
|
|
<<span class="cwebmacro">You can only be declared as in one region</span> <span class="cwebmacronumber">17.1</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="cwebmacro">A region is being put inside a region</span> <span class="cwebmacronumber">17.2</span>>
|
|
<span class="reserved">else</span><span class="plain"> </span><<span class="cwebmacro">A room is being put inside a region</span> <span class="cwebmacronumber">17.3</span>><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">Task::syntax_tree</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">Task::syntax_tree</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">§6.1</a>).</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP17_1"></a><b>§17.1. </b><code class="display">
|
|
<<span class="cwebmacrodefn">You can only be declared as in one region</span> <span class="cwebmacronumber">17.1</span>> =
|
|
</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">>in_region</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">>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">Task::syntax_tree</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">>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">>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">§17</a>.</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP17_2"></a><b>§17.2. </b><code class="display">
|
|
<<span class="cwebmacrodefn">A region is being put inside a region</span> <span class="cwebmacronumber">17.2</span>> =
|
|
</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">§17</a>.</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP17_3"></a><b>§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">
|
|
<<span class="cwebmacrodefn">A room is being put inside a region</span> <span class="cwebmacronumber">17.3</span>> =
|
|
</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">§17</a>.</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP18"></a><b>§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">>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">§21</a>, 3/sm2 (<a href="3-sm2.html#SP38">§38</a>, <a href="3-sm2.html#SP42_1">§42.1</a>, <a href="3-sm2.html#SP43_2">§43.2</a>), 3/hm (<a href="3-hm.html#SP6_2">§6.2</a>, <a href="3-hm.html#SP13">§13</a>), 3/em (<a href="3-em.html#SP11">§11</a>).</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP19"></a><b>§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><<span class="cwebmacro">Assert map-region properties of rooms and regions</span> <span class="cwebmacronumber">19.1</span>><span class="plain">;</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">stage</span><span class="plain"> == 3) </span><<span class="cwebmacro">Assert regional-found-in properties of regions</span> <span class="cwebmacronumber">19.2</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_complete_model is used in <a href="#SP5">§5</a>.</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP19_1"></a><b>§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">
|
|
<<span class="cwebmacrodefn">Assert map-region properties of rooms and regions</span> <span class="cwebmacronumber">19.1</span>> =
|
|
</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">, &</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">>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">>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">§19</a>.</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP19_2"></a><b>§19.2. </b><code class="display">
|
|
<<span class="cwebmacrodefn">Assert regional-found-in properties of regions</span> <span class="cwebmacronumber">19.2</span>> =
|
|
</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">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">§19</a>.</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP20"></a><b>§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">Produce::inv_primitive</span><span class="plain">(</span><span class="identifier">Emit::tree</span><span class="plain">(), </span><span class="identifier">IF_BIP</span><span class="plain">);</span>
|
|
<span class="identifier">Produce::down</span><span class="plain">(</span><span class="identifier">Emit::tree</span><span class="plain">());</span>
|
|
<span class="identifier">Produce::inv_call_iname</span><span class="plain">(</span><span class="identifier">Emit::tree</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">Produce::down</span><span class="plain">(</span><span class="identifier">Emit::tree</span><span class="plain">());</span>
|
|
<span class="identifier">Produce::val_iname</span><span class="plain">(</span><span class="identifier">Emit::tree</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">Produce::val_iname</span><span class="plain">(</span><span class="identifier">Emit::tree</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">Produce::up</span><span class="plain">(</span><span class="identifier">Emit::tree</span><span class="plain">());</span>
|
|
<span class="identifier">Produce::code</span><span class="plain">(</span><span class="identifier">Emit::tree</span><span class="plain">());</span>
|
|
<span class="identifier">Produce::down</span><span class="plain">(</span><span class="identifier">Emit::tree</span><span class="plain">());</span>
|
|
<span class="identifier">Produce::rtrue</span><span class="plain">(</span><span class="identifier">Emit::tree</span><span class="plain">());</span>
|
|
<span class="identifier">Produce::up</span><span class="plain">(</span><span class="identifier">Emit::tree</span><span class="plain">());</span>
|
|
<span class="identifier">Produce::up</span><span class="plain">(</span><span class="identifier">Emit::tree</span><span class="plain">());</span>
|
|
<span class="identifier">Produce::rfalse</span><span class="plain">(</span><span class="identifier">Emit::tree</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>§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">) && (</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">>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">§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-->
|
|
</main>
|
|
</body>
|
|
</html>
|
|
|