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-em.html
2019-04-22 15:42:10 +01:00

2013 lines
288 KiB
HTML

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<title>3/hm</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/em' 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>EPS Map</b></li></ul><p class="purpose">To render the spatial map of rooms as an EPS (Encapsulated PostScript) file.</p>
<ul class="toc"><li><a href="#SP1">&#167;1. Definitions</a></li><li><a href="#SP9">&#167;9. Map parameters</a></li><li><a href="#SP10">&#167;10. Map parameter scopes</a></li><li><a href="#SP14">&#167;14. Parsing sentences which set map parameters</a></li><li><a href="#SP23">&#167;23. Offset notation</a></li><li><a href="#SP26">&#167;26. Writing text in EPS</a></li><li><a href="#SP28">&#167;28. EPS header</a></li><li><a href="#SP29">&#167;29. Circles and rectangles</a></li><li><a href="#SP31">&#167;31. Straight lines</a></li><li><a href="#SP32">&#167;32. Dashed arrows</a></li><li><a href="#SP33">&#167;33. Bezier curves</a></li><li><a href="#SP34">&#167;34. Line thickness</a></li><li><a href="#SP35">&#167;35. Text</a></li><li><a href="#SP36">&#167;36. RGB colours</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>EPS-format files are vector art, rather than raster art, and are produced
with the intention that authors can tidy them up afterwards using programs
like Adobe Illustrator. By default they aren't produced, so that the following
flag stays <code class="display"><span class="extract">FALSE</span></code>:
</p>
<pre class="display">
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">write_EPS_format_map</span><span class="plain"> = </span><span class="identifier">FALSE</span><span class="plain">;</span>
</pre>
<p class="inwebparagraph"></p>
<p class="inwebparagraph"><a id="SP3"></a><b>&#167;3. </b>The EPS map-maker is really a miniature interpreted programming
language in its own right, and here we define that language's data
types and variables.
</p>
<p class="inwebparagraph">The "mapping parameters" amount to being variables. The following
structure defines the type and current value for each variable: see
the Inform documentation for details. But note that variables of the
same name are held by many different objects in the map, and their
values inherited by sub-objects.
</p>
<pre class="definitions">
<span class="definitionkeyword">define</span> <span class="constant">INT_MDT</span><span class="plain"> 1 </span> <span class="comment">an integer</span>
<span class="definitionkeyword">define</span> <span class="constant">BOOL_MDT</span><span class="plain"> 2 </span> <span class="comment">true or false</span>
<span class="definitionkeyword">define</span> <span class="constant">TEXT_MDT</span><span class="plain"> 3 </span> <span class="comment">quoted text</span>
<span class="definitionkeyword">define</span> <span class="constant">COL_MDT</span><span class="plain"> 4 </span> <span class="comment">an HTML-safe colour</span>
<span class="definitionkeyword">define</span> <span class="constant">FONT_MDT</span><span class="plain"> 5 </span> <span class="comment">the name of a font</span>
<span class="definitionkeyword">define</span> <span class="constant">OFF_MDT</span><span class="plain"> 6 </span> <span class="comment">a positional offset in an (x,y) grid</span>
</pre>
<pre class="display">
<span class="reserved">typedef</span><span class="plain"> </span><span class="reserved">struct</span><span class="plain"> </span><span class="reserved">plotting_parameter</span><span class="plain"> {</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">specified</span><span class="plain">; </span> <span class="comment">is it explicitly specified at this scope?</span>
<span class="identifier">wchar_t</span><span class="plain"> *</span><span class="identifier">name</span><span class="plain">; </span> <span class="comment">name (used only in global scope)</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">parameter_data_type</span><span class="plain">; </span> <span class="comment">one of the above types (used only in global scope)</span>
<span class="identifier">wchar_t</span><span class="plain"> *</span><span class="identifier">string_value</span><span class="plain">; </span> <span class="comment">string value, if appropriate to this type;</span>
<span class="reserved">struct</span><span class="plain"> </span><span class="identifier">text_stream</span><span class="plain"> *</span><span class="identifier">stream_value</span><span class="plain">; </span> <span class="comment">text value, if appropriate to this type;</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">numeric_value</span><span class="plain">; </span> <span class="comment">or numeric value, if appropriate to this type</span>
<span class="plain">} </span><span class="reserved">plotting_parameter</span><span class="plain">;</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">The structure plotting_parameter is accessed in 2/bd, 3/tnt, 3/sm, 3/tp, 3/bck, 3/rgn, 3/tm, 3/sc, 3/scn, 4/act, 4/anl, 4/nap, 5/gp, 5/gv, 5/gpr and here.</p>
<p class="inwebparagraph"><a id="SP4"></a><b>&#167;4. </b>A set of variables associated with any map object is called a "scope".
As implied above, the global scope is special: it contains the default
settings passed down to all lower scopes.
</p>
<pre class="definitions">
<span class="definitionkeyword">define</span> <span class="constant">NO_MAP_PARAMETERS</span><span class="plain"> 35</span>
</pre>
<pre class="display">
<span class="reserved">typedef</span><span class="plain"> </span><span class="reserved">struct</span><span class="plain"> </span><span class="reserved">map_parameter_scope</span><span class="plain"> {</span>
<span class="reserved">struct</span><span class="plain"> </span><span class="reserved">map_parameter_scope</span><span class="plain"> *</span><span class="identifier">wider_scope</span><span class="plain">; </span> <span class="comment">that is, the scope above this</span>
<span class="reserved">struct</span><span class="plain"> </span><span class="reserved">plotting_parameter</span><span class="plain"> </span><span class="identifier">values</span><span class="plain">[</span><span class="constant">NO_MAP_PARAMETERS</span><span class="plain">];</span>
<span class="plain">} </span><span class="reserved">map_parameter_scope</span><span class="plain">;</span>
<span class="reserved">map_parameter_scope</span><span class="plain"> </span><span class="identifier">global_map_scope</span><span class="plain"> = {</span>
<span class="identifier">NULL</span><span class="plain">,</span>
<span class="plain">{</span>
<span class="plain">{ </span><span class="identifier">TRUE</span><span class="plain">, </span><span class="identifier">L</span><span class="string">"font"</span><span class="plain">, </span><span class="constant">FONT_MDT</span><span class="plain">, </span><span class="identifier">L</span><span class="string">"Helvetica"</span><span class="plain">, </span><span class="identifier">NULL</span><span class="plain">, 0 },</span>
<span class="plain">{ </span><span class="identifier">TRUE</span><span class="plain">, </span><span class="identifier">L</span><span class="string">"minimum-map-width"</span><span class="plain">, </span><span class="constant">INT_MDT</span><span class="plain">, </span><span class="identifier">NULL</span><span class="plain">, </span><span class="identifier">NULL</span><span class="plain">, 72*5 },</span>
<span class="plain">{ </span><span class="identifier">TRUE</span><span class="plain">, </span><span class="identifier">L</span><span class="string">"title"</span><span class="plain">, </span><span class="constant">TEXT_MDT</span><span class="plain">, </span><span class="identifier">L</span><span class="string">"Map"</span><span class="plain">, </span><span class="identifier">NULL</span><span class="plain">, 0 },</span>
<span class="plain">{ </span><span class="identifier">TRUE</span><span class="plain">, </span><span class="identifier">L</span><span class="string">"title-size"</span><span class="plain">, </span><span class="constant">INT_MDT</span><span class="plain">, </span><span class="identifier">NULL</span><span class="plain">, </span><span class="identifier">NULL</span><span class="plain">, 24 },</span>
<span class="plain">{ </span><span class="identifier">TRUE</span><span class="plain">, </span><span class="identifier">L</span><span class="string">"title-font"</span><span class="plain">, </span><span class="constant">FONT_MDT</span><span class="plain">, </span><span class="identifier">L</span><span class="string">"&lt;font&gt;"</span><span class="plain">, </span><span class="identifier">NULL</span><span class="plain">, 0 },</span>
<span class="plain">{ </span><span class="identifier">TRUE</span><span class="plain">, </span><span class="identifier">L</span><span class="string">"title-colour"</span><span class="plain">, </span><span class="constant">COL_MDT</span><span class="plain">, </span><span class="identifier">L</span><span class="string">"000000"</span><span class="plain">, </span><span class="identifier">NULL</span><span class="plain">, 0 },</span>
<span class="plain">{ </span><span class="identifier">TRUE</span><span class="plain">, </span><span class="identifier">L</span><span class="string">"map-outline"</span><span class="plain">, </span><span class="constant">BOOL_MDT</span><span class="plain">, </span><span class="identifier">NULL</span><span class="plain">, </span><span class="identifier">NULL</span><span class="plain">, 1 },</span>
<span class="plain">{ </span><span class="identifier">TRUE</span><span class="plain">, </span><span class="identifier">L</span><span class="string">"border-size"</span><span class="plain">, </span><span class="constant">INT_MDT</span><span class="plain">, </span><span class="identifier">NULL</span><span class="plain">, </span><span class="identifier">NULL</span><span class="plain">, 12 },</span>
<span class="plain">{ </span><span class="identifier">TRUE</span><span class="plain">, </span><span class="identifier">L</span><span class="string">"vertical-spacing"</span><span class="plain">, </span><span class="constant">INT_MDT</span><span class="plain">, </span><span class="identifier">NULL</span><span class="plain">, </span><span class="identifier">NULL</span><span class="plain">, 6 },</span>
<span class="plain">{ </span><span class="identifier">TRUE</span><span class="plain">, </span><span class="identifier">L</span><span class="string">"monochrome"</span><span class="plain">, </span><span class="constant">BOOL_MDT</span><span class="plain">, </span><span class="identifier">NULL</span><span class="plain">, </span><span class="identifier">NULL</span><span class="plain">, 0 },</span>
<span class="plain">{ </span><span class="identifier">TRUE</span><span class="plain">, </span><span class="identifier">L</span><span class="string">"annotation-size"</span><span class="plain">, </span><span class="constant">INT_MDT</span><span class="plain">, </span><span class="identifier">NULL</span><span class="plain">, </span><span class="identifier">NULL</span><span class="plain">, 8 },</span>
<span class="plain">{ </span><span class="identifier">TRUE</span><span class="plain">, </span><span class="identifier">L</span><span class="string">"annotation-length"</span><span class="plain">, </span><span class="constant">INT_MDT</span><span class="plain">, </span><span class="identifier">NULL</span><span class="plain">, </span><span class="identifier">NULL</span><span class="plain">, 8 },</span>
<span class="plain">{ </span><span class="identifier">TRUE</span><span class="plain">, </span><span class="identifier">L</span><span class="string">"annotation-font"</span><span class="plain">, </span><span class="constant">FONT_MDT</span><span class="plain">, </span><span class="identifier">L</span><span class="string">"&lt;font&gt;"</span><span class="plain">, </span><span class="identifier">NULL</span><span class="plain">, 0 },</span>
<span class="plain">{ </span><span class="identifier">TRUE</span><span class="plain">, </span><span class="identifier">L</span><span class="string">"subtitle"</span><span class="plain">, </span><span class="constant">TEXT_MDT</span><span class="plain">, </span><span class="identifier">L</span><span class="string">"Map"</span><span class="plain">, </span><span class="identifier">NULL</span><span class="plain">, 0 },</span>
<span class="plain">{ </span><span class="identifier">TRUE</span><span class="plain">, </span><span class="identifier">L</span><span class="string">"subtitle-size"</span><span class="plain">, </span><span class="constant">INT_MDT</span><span class="plain">, </span><span class="identifier">NULL</span><span class="plain">, </span><span class="identifier">NULL</span><span class="plain">, 16 },</span>
<span class="plain">{ </span><span class="identifier">TRUE</span><span class="plain">, </span><span class="identifier">L</span><span class="string">"subtitle-font"</span><span class="plain">, </span><span class="constant">FONT_MDT</span><span class="plain">, </span><span class="identifier">L</span><span class="string">"&lt;font&gt;"</span><span class="plain">, </span><span class="identifier">NULL</span><span class="plain">, 0 },</span>
<span class="plain">{ </span><span class="identifier">TRUE</span><span class="plain">, </span><span class="identifier">L</span><span class="string">"subtitle-colour"</span><span class="plain">, </span><span class="constant">COL_MDT</span><span class="plain">, </span><span class="identifier">L</span><span class="string">"000000"</span><span class="plain">, </span><span class="identifier">NULL</span><span class="plain">, 0 },</span>
<span class="plain">{ </span><span class="identifier">TRUE</span><span class="plain">, </span><span class="identifier">L</span><span class="string">"grid-size"</span><span class="plain">, </span><span class="constant">INT_MDT</span><span class="plain">, </span><span class="identifier">NULL</span><span class="plain">, </span><span class="identifier">NULL</span><span class="plain">, 72 },</span>
<span class="plain">{ </span><span class="identifier">TRUE</span><span class="plain">, </span><span class="identifier">L</span><span class="string">"route-stiffness"</span><span class="plain">, </span><span class="constant">INT_MDT</span><span class="plain">, </span><span class="identifier">NULL</span><span class="plain">, </span><span class="identifier">NULL</span><span class="plain">, 100 },</span>
<span class="plain">{ </span><span class="identifier">TRUE</span><span class="plain">, </span><span class="identifier">L</span><span class="string">"route-thickness"</span><span class="plain">, </span><span class="constant">INT_MDT</span><span class="plain">, </span><span class="identifier">NULL</span><span class="plain">, </span><span class="identifier">NULL</span><span class="plain">, 1 },</span>
<span class="plain">{ </span><span class="identifier">TRUE</span><span class="plain">, </span><span class="identifier">L</span><span class="string">"route-colour"</span><span class="plain">, </span><span class="constant">COL_MDT</span><span class="plain">, </span><span class="identifier">L</span><span class="string">"000000"</span><span class="plain">, </span><span class="identifier">NULL</span><span class="plain">, 0 },</span>
<span class="plain">{ </span><span class="identifier">TRUE</span><span class="plain">, </span><span class="identifier">L</span><span class="string">"room-offset"</span><span class="plain">, </span><span class="constant">OFF_MDT</span><span class="plain">, </span><span class="identifier">NULL</span><span class="plain">, </span><span class="identifier">NULL</span><span class="plain">, 0 },</span>
<span class="plain">{ </span><span class="identifier">TRUE</span><span class="plain">, </span><span class="identifier">L</span><span class="string">"room-size"</span><span class="plain">, </span><span class="constant">INT_MDT</span><span class="plain">, </span><span class="identifier">NULL</span><span class="plain">, </span><span class="identifier">NULL</span><span class="plain">, 36 },</span>
<span class="plain">{ </span><span class="identifier">TRUE</span><span class="plain">, </span><span class="identifier">L</span><span class="string">"room-colour"</span><span class="plain">, </span><span class="constant">COL_MDT</span><span class="plain">, </span><span class="identifier">L</span><span class="string">"DDDDDD"</span><span class="plain">, </span><span class="identifier">NULL</span><span class="plain">, 0 },</span>
<span class="plain">{ </span><span class="identifier">TRUE</span><span class="plain">, </span><span class="identifier">L</span><span class="string">"room-name"</span><span class="plain">, </span><span class="constant">TEXT_MDT</span><span class="plain">, </span><span class="identifier">L</span><span class="string">""</span><span class="plain">, </span><span class="identifier">NULL</span><span class="plain">, 0 },</span>
<span class="plain">{ </span><span class="identifier">TRUE</span><span class="plain">, </span><span class="identifier">L</span><span class="string">"room-name-size"</span><span class="plain">, </span><span class="constant">INT_MDT</span><span class="plain">, </span><span class="identifier">NULL</span><span class="plain">, </span><span class="identifier">NULL</span><span class="plain">, 12 },</span>
<span class="plain">{ </span><span class="identifier">TRUE</span><span class="plain">, </span><span class="identifier">L</span><span class="string">"room-name-font"</span><span class="plain">, </span><span class="constant">FONT_MDT</span><span class="plain">, </span><span class="identifier">L</span><span class="string">"&lt;font&gt;"</span><span class="plain">, </span><span class="identifier">NULL</span><span class="plain">, 0 },</span>
<span class="plain">{ </span><span class="identifier">TRUE</span><span class="plain">, </span><span class="identifier">L</span><span class="string">"room-name-colour"</span><span class="plain">, </span><span class="constant">COL_MDT</span><span class="plain">, </span><span class="identifier">L</span><span class="string">"000000"</span><span class="plain">, </span><span class="identifier">NULL</span><span class="plain">, 0 },</span>
<span class="plain">{ </span><span class="identifier">TRUE</span><span class="plain">, </span><span class="identifier">L</span><span class="string">"room-name-length"</span><span class="plain">, </span><span class="constant">INT_MDT</span><span class="plain">, </span><span class="identifier">NULL</span><span class="plain">, </span><span class="identifier">NULL</span><span class="plain">, 5 },</span>
<span class="plain">{ </span><span class="identifier">TRUE</span><span class="plain">, </span><span class="identifier">L</span><span class="string">"room-name-offset"</span><span class="plain">, </span><span class="constant">OFF_MDT</span><span class="plain">, </span><span class="identifier">NULL</span><span class="plain">, </span><span class="identifier">NULL</span><span class="plain">, 0 },</span>
<span class="plain">{ </span><span class="identifier">TRUE</span><span class="plain">, </span><span class="identifier">L</span><span class="string">"room-outline"</span><span class="plain">, </span><span class="constant">BOOL_MDT</span><span class="plain">, </span><span class="identifier">NULL</span><span class="plain">, </span><span class="identifier">NULL</span><span class="plain">, 1 },</span>
<span class="plain">{ </span><span class="identifier">TRUE</span><span class="plain">, </span><span class="identifier">L</span><span class="string">"room-outline-colour"</span><span class="plain">, </span><span class="constant">COL_MDT</span><span class="plain">, </span><span class="identifier">L</span><span class="string">"000000"</span><span class="plain">, </span><span class="identifier">NULL</span><span class="plain">, 0 },</span>
<span class="plain">{ </span><span class="identifier">TRUE</span><span class="plain">, </span><span class="identifier">L</span><span class="string">"room-outline-thickness"</span><span class="plain">, </span><span class="constant">INT_MDT</span><span class="plain">, </span><span class="identifier">NULL</span><span class="plain">, </span><span class="identifier">NULL</span><span class="plain">, 1 },</span>
<span class="plain">{ </span><span class="identifier">TRUE</span><span class="plain">, </span><span class="identifier">L</span><span class="string">"room-shape"</span><span class="plain">, </span><span class="constant">TEXT_MDT</span><span class="plain">, </span><span class="identifier">L</span><span class="string">"square"</span><span class="plain">, </span><span class="identifier">NULL</span><span class="plain">, 0 }</span>
<span class="plain">}</span>
<span class="plain">};</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">changed_global_room_colour</span><span class="plain"> = </span><span class="identifier">FALSE</span><span class="plain">;</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">The structure map_parameter_scope is private to this section.</p>
<p class="inwebparagraph"><a id="SP5"></a><b>&#167;5. </b>A "rubric" is a freestanding piece of text written on the map. Typically
it will be a title.
</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">rubric_holder</span><span class="plain"> {</span>
<span class="identifier">wchar_t</span><span class="plain"> *</span><span class="identifier">annotation</span><span class="plain">;</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">point_size</span><span class="plain">;</span>
<span class="identifier">wchar_t</span><span class="plain"> *</span><span class="identifier">font</span><span class="plain">;</span>
<span class="identifier">wchar_t</span><span class="plain"> *</span><span class="identifier">colour</span><span class="plain">;</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">at_offset</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">offset_from</span><span class="plain">;</span>
<span class="identifier">MEMORY_MANAGEMENT</span>
<span class="plain">} </span><span class="reserved">rubric_holder</span><span class="plain">;</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">The structure rubric_holder is private to this section.</p>
<p class="inwebparagraph"><a id="SP6"></a><b>&#167;6. </b>Each horizontal level of the EPS map needs its own storage, not least to
hold the applicable mapping parameters.
</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">EPS_map_level</span><span class="plain"> {</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">width</span><span class="plain">;</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">actual_height</span><span class="plain">;</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">height</span><span class="plain">;</span>
<span class="reserved">struct</span><span class="plain"> </span><span class="identifier">text_stream</span><span class="plain"> *</span><span class="identifier">titling</span><span class="plain">;</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">titling_point_size</span><span class="plain">;</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">map_level</span><span class="plain">;</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">y_max</span><span class="plain">;</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">y_min</span><span class="plain">;</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">contains_rooms</span><span class="plain">;</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">contains_titling</span><span class="plain">;</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">eps_origin</span><span class="plain">;</span>
<span class="reserved">struct</span><span class="plain"> </span><span class="reserved">map_parameter_scope</span><span class="plain"> </span><span class="identifier">map_parameters</span><span class="plain">;</span>
<span class="identifier">MEMORY_MANAGEMENT</span>
<span class="plain">} </span><span class="reserved">EPS_map_level</span><span class="plain">;</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">The structure EPS_map_level is private to this section.</p>
<p class="inwebparagraph"><a id="SP7"></a><b>&#167;7. </b>The following are the directions at which arrows for UP, DOWN, IN and OUT
are drawn on EPS maps.
</p>
<pre class="display">
<span class="reserved">vector</span><span class="plain"> </span><span class="identifier">U_vector_EPS</span><span class="plain"> = {2, 3, 0};</span>
<span class="reserved">vector</span><span class="plain"> </span><span class="identifier">D_vector_EPS</span><span class="plain"> = {-2, -3, 0};</span>
<span class="reserved">vector</span><span class="plain"> </span><span class="identifier">IN_vector_EPS</span><span class="plain"> = {3, 2, 0};</span>
<span class="reserved">vector</span><span class="plain"> </span><span class="identifier">OUT_vector_EPS</span><span class="plain"> = {-3, -2, 0};</span>
</pre>
<p class="inwebparagraph"></p>
<p class="inwebparagraph"><a id="SP8"></a><b>&#167;8. </b>A convenience when parsing:
</p>
<pre class="display">
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">index_map_with_pass</span><span class="plain"> = 0;</span>
<span class="identifier">parse_node</span><span class="plain"> *</span><span class="identifier">index_map_with_p</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
</pre>
<p class="inwebparagraph"></p>
<p class="inwebparagraph"><a id="SP9"></a><b>&#167;9. Map parameters. </b>We convert a parameter's name to its index in the list; slowly, but that
doesn't matter.
</p>
<pre class="display">
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">PL::EPSMap::get_map_variable_index</span><span class="plain">(</span><span class="identifier">wchar_t</span><span class="plain"> *</span><span class="identifier">name</span><span class="plain">) {</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">s</span><span class="plain"> = </span><span class="functiontext">PL::EPSMap::get_map_variable_index_forgivingly</span><span class="plain">(</span><span class="identifier">name</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">s</span><span class="plain"> &lt; 0) {</span>
<span class="identifier">LOG</span><span class="plain">(</span><span class="string">"Tried to look up &lt;%w&gt;\</span><span class="plain">n</span><span class="string">"</span><span class="plain">, </span><span class="identifier">name</span><span class="plain">);</span>
<span class="identifier">internal_error</span><span class="plain">(</span><span class="string">"looked up non-existent map variable"</span><span class="plain">);</span>
<span class="identifier">s</span><span class="plain"> = 0;</span>
<span class="plain">}</span>
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">s</span><span class="plain">;</span>
<span class="plain">}</span>
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">PL::EPSMap::get_map_variable_index_forgivingly</span><span class="plain">(</span><span class="identifier">wchar_t</span><span class="plain"> *</span><span class="identifier">name</span><span class="plain">) {</span>
<span class="reserved">for</span><span class="plain"> (</span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">s</span><span class="plain">=0; </span><span class="identifier">s</span><span class="plain">&lt;</span><span class="constant">NO_MAP_PARAMETERS</span><span class="plain">; </span><span class="identifier">s</span><span class="plain">++)</span>
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">global_map_scope</span><span class="element">.values</span><span class="plain">[</span><span class="identifier">s</span><span class="plain">]</span><span class="element">.name</span><span class="plain">) &amp;&amp;</span>
<span class="plain">(</span><span class="identifier">Wide::cmp</span><span class="plain">(</span><span class="identifier">name</span><span class="plain">, </span><span class="identifier">global_map_scope</span><span class="element">.values</span><span class="plain">[</span><span class="identifier">s</span><span class="plain">]</span><span class="element">.name</span><span class="plain">) == 0))</span>
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">s</span><span class="plain">;</span>
<span class="reserved">return</span><span class="plain"> -1;</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">The function PL::EPSMap::get_map_variable_index is used in <a href="#SP12">&#167;12</a>, <a href="#SP13">&#167;13</a>.</p>
<p class="endnote">The function PL::EPSMap::get_map_variable_index_forgivingly is used in <a href="#SP18_1">&#167;18.1</a>.</p>
<p class="inwebparagraph"><a id="SP10"></a><b>&#167;10. Map parameter scopes. </b>Here goes, then: an initialised set of parameters.
</p>
<pre class="display">
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">PL::EPSMap::prepare_map_parameter_scope</span><span class="plain">(</span><span class="reserved">map_parameter_scope</span><span class="plain"> *</span><span class="identifier">scope</span><span class="plain">) {</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">s</span><span class="plain">;</span>
<span class="identifier">scope</span><span class="plain">-</span><span class="element">&gt;wider_scope</span><span class="plain"> = &amp;</span><span class="identifier">global_map_scope</span><span class="plain">;</span>
<span class="reserved">for</span><span class="plain"> (</span><span class="identifier">s</span><span class="plain">=0; </span><span class="identifier">s</span><span class="plain">&lt;</span><span class="constant">NO_MAP_PARAMETERS</span><span class="plain">; </span><span class="identifier">s</span><span class="plain">++) {</span>
<span class="identifier">scope</span><span class="plain">-</span><span class="element">&gt;values</span><span class="plain">[</span><span class="identifier">s</span><span class="plain">]</span><span class="element">.specified</span><span class="plain"> = </span><span class="identifier">FALSE</span><span class="plain">;</span>
<span class="identifier">scope</span><span class="plain">-</span><span class="element">&gt;values</span><span class="plain">[</span><span class="identifier">s</span><span class="plain">]</span><span class="element">.name</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
<span class="identifier">scope</span><span class="plain">-</span><span class="element">&gt;values</span><span class="plain">[</span><span class="identifier">s</span><span class="plain">]</span><span class="element">.string_value</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
<span class="identifier">scope</span><span class="plain">-</span><span class="element">&gt;values</span><span class="plain">[</span><span class="identifier">s</span><span class="plain">]</span><span class="element">.numeric_value</span><span class="plain"> = 0;</span>
<span class="plain">}</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">The function PL::EPSMap::prepare_map_parameter_scope is used in <a href="#SP24_1">&#167;24.1</a>, <a href="#SP24_2">&#167;24.2</a>, 3/sm2 (<a href="3-sm2.html#SP8_1">&#167;8.1</a>).</p>
<p class="inwebparagraph"><a id="SP11"></a><b>&#167;11. </b>The following sets a parameter to a given value (the string value if that's
non-<code class="display"><span class="extract">NULL</span></code>, the number value otherwise), for a particular scope: this is
slightly wastefully specified either as a <code class="display"><span class="extract">map_parameter_scope</span></code> object,
or as a single room, or as a single region, or as a kind of room or region.
If all are null, then the global scope is used.
</p>
<pre class="display">
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">PL::EPSMap::put_mp</span><span class="plain">(</span><span class="identifier">wchar_t</span><span class="plain"> *</span><span class="identifier">name</span><span class="plain">, </span><span class="reserved">map_parameter_scope</span><span class="plain"> *</span><span class="identifier">scope</span><span class="plain">, </span><span class="identifier">instance</span><span class="plain"> *</span><span class="identifier">scope_I</span><span class="plain">,</span>
<span class="identifier">kind</span><span class="plain"> *</span><span class="identifier">scope_k</span><span class="plain">, </span><span class="identifier">wchar_t</span><span class="plain"> *</span><span class="identifier">put_string</span><span class="plain">, </span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">put_integer</span><span class="plain">) {</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">scope_I</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">scope_I</span><span class="plain">))</span>
<span class="identifier">scope</span><span class="plain"> = </span><span class="functiontext">PL::EPSMap::scope_for_single_room</span><span class="plain">(</span><span class="identifier">scope_I</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="functiontext">PL::Regions::object_is_a_region</span><span class="plain">(</span><span class="identifier">scope_I</span><span class="plain">)) {</span>
<span class="identifier">instance</span><span class="plain"> *</span><span class="identifier">rm</span><span class="plain">;</span>
<span class="identifier">LOOP_OVER_INSTANCES</span><span class="plain">(</span><span class="identifier">rm</span><span class="plain">, </span><span class="identifier">K_room</span><span class="plain">)</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">PL::EPSMap::obj_in_region</span><span class="plain">(</span><span class="identifier">rm</span><span class="plain">, </span><span class="identifier">scope_I</span><span class="plain">))</span>
<span class="functiontext">PL::EPSMap::put_mp</span><span class="plain">(</span><span class="identifier">name</span><span class="plain">, </span><span class="identifier">NULL</span><span class="plain">, </span><span class="identifier">rm</span><span class="plain">, </span><span class="identifier">NULL</span><span class="plain">, </span><span class="identifier">put_string</span><span class="plain">, </span><span class="identifier">put_integer</span><span class="plain">);</span>
<span class="reserved">return</span><span class="plain">;</span>
<span class="plain">} </span><span class="reserved">else</span><span class="plain"> </span><span class="reserved">return</span><span class="plain">;</span>
<span class="plain">}</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">scope_k</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_INSTANCES</span><span class="plain">(</span><span class="identifier">I</span><span class="plain">, </span><span class="identifier">scope_k</span><span class="plain">)</span>
<span class="functiontext">PL::EPSMap::put_mp</span><span class="plain">(</span><span class="identifier">name</span><span class="plain">, </span><span class="identifier">NULL</span><span class="plain">, </span><span class="identifier">I</span><span class="plain">, </span><span class="identifier">NULL</span><span class="plain">, </span><span class="identifier">put_string</span><span class="plain">, </span><span class="identifier">put_integer</span><span class="plain">);</span>
<span class="reserved">return</span><span class="plain">;</span>
<span class="plain">}</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">scope</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">) </span><span class="identifier">scope</span><span class="plain"> = &amp;</span><span class="identifier">global_map_scope</span><span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Wide::cmp</span><span class="plain">(</span><span class="identifier">name</span><span class="plain">, </span><span class="identifier">L</span><span class="string">"room-colour"</span><span class="plain">) == 0) {</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">scope</span><span class="plain"> == &amp;</span><span class="identifier">global_map_scope</span><span class="plain">) </span><span class="identifier">changed_global_room_colour</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">scope_I</span><span class="plain">) </span><span class="identifier">PF_I</span><span class="plain">(</span><span class="identifier">map</span><span class="plain">, </span><span class="identifier">scope_I</span><span class="plain">)-</span><span class="element">&gt;world_index_colour</span><span class="plain"> = </span><span class="identifier">put_string</span><span class="plain">;</span>
<span class="plain">}</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Wide::cmp</span><span class="plain">(</span><span class="identifier">name</span><span class="plain">, </span><span class="identifier">L</span><span class="string">"room-name-colour"</span><span class="plain">) == 0)</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">scope_I</span><span class="plain">) </span><span class="identifier">PF_I</span><span class="plain">(</span><span class="identifier">map</span><span class="plain">, </span><span class="identifier">scope_I</span><span class="plain">)-</span><span class="element">&gt;world_index_text_colour</span><span class="plain"> = </span><span class="identifier">put_string</span><span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">put_string</span><span class="plain">) </span><span class="functiontext">PL::EPSMap::put_string_mp</span><span class="plain">(</span><span class="identifier">name</span><span class="plain">, </span><span class="identifier">scope</span><span class="plain">, </span><span class="identifier">put_string</span><span class="plain">);</span>
<span class="reserved">else</span><span class="plain"> </span><span class="functiontext">PL::EPSMap::put_int_mp</span><span class="plain">(</span><span class="identifier">name</span><span class="plain">, </span><span class="identifier">scope</span><span class="plain">, </span><span class="identifier">put_integer</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="reserved">map_parameter_scope</span><span class="plain"> *</span><span class="functiontext">PL::EPSMap::scope_for_single_room</span><span class="plain">(</span><span class="identifier">instance</span><span class="plain"> *</span><span class="identifier">rm</span><span class="plain">) {</span>
<span class="reserved">return</span><span class="plain"> &amp;(</span><span class="identifier">PF_I</span><span class="plain">(</span><span class="identifier">map</span><span class="plain">, </span><span class="identifier">rm</span><span class="plain">)-</span><span class="element">&gt;local_map_parameters</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">PL::EPSMap::obj_in_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="identifier">instance</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="identifier">I</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">) || (</span><span class="identifier">reg</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">FALSE</span><span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">PL::Regions::enclosing</span><span class="plain">(</span><span class="identifier">I</span><span class="plain">) == </span><span class="identifier">reg</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="functiontext">PL::EPSMap::obj_in_region</span><span class="plain">(</span><span class="functiontext">PL::Regions::enclosing</span><span class="plain">(</span><span class="identifier">I</span><span class="plain">), </span><span class="identifier">reg</span><span class="plain">);</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">The function PL::EPSMap::put_mp is used in <a href="#SP22_4_2">&#167;22.4.2</a>.</p>
<p class="endnote">The function PL::EPSMap::scope_for_single_room appears nowhere else.</p>
<p class="endnote">The function PL::EPSMap::obj_in_region appears nowhere else.</p>
<p class="inwebparagraph"><a id="SP12"></a><b>&#167;12. </b>String parameters.
</p>
<pre class="display">
<span class="identifier">wchar_t</span><span class="plain"> *</span><span class="functiontext">PL::EPSMap::get_string_mp</span><span class="plain">(</span><span class="identifier">wchar_t</span><span class="plain"> *</span><span class="identifier">name</span><span class="plain">, </span><span class="reserved">map_parameter_scope</span><span class="plain"> *</span><span class="identifier">scope</span><span class="plain">) {</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">s</span><span class="plain"> = </span><span class="functiontext">PL::EPSMap::get_map_variable_index</span><span class="plain">(</span><span class="identifier">name</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">scope</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">) </span><span class="identifier">scope</span><span class="plain"> = &amp;</span><span class="identifier">global_map_scope</span><span class="plain">;</span>
<span class="reserved">while</span><span class="plain"> (</span><span class="identifier">scope</span><span class="plain">-</span><span class="element">&gt;values</span><span class="plain">[</span><span class="identifier">s</span><span class="plain">]</span><span class="element">.specified</span><span class="plain"> == </span><span class="identifier">FALSE</span><span class="plain">) {</span>
<span class="identifier">scope</span><span class="plain"> = </span><span class="identifier">scope</span><span class="plain">-</span><span class="element">&gt;wider_scope</span><span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">scope</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">) </span><span class="identifier">internal_error</span><span class="plain">(</span><span class="string">"scope exhausted in looking up map parameter"</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="identifier">wchar_t</span><span class="plain"> *</span><span class="identifier">p</span><span class="plain"> = </span><span class="identifier">scope</span><span class="plain">-</span><span class="element">&gt;values</span><span class="plain">[</span><span class="identifier">s</span><span class="plain">]</span><span class="element">.string_value</span><span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Wide::cmp</span><span class="plain">(</span><span class="identifier">p</span><span class="plain">, </span><span class="identifier">L</span><span class="string">"&lt;font&gt;"</span><span class="plain">) == 0) </span><span class="reserved">return</span><span class="plain"> </span><span class="functiontext">PL::EPSMap::get_string_mp</span><span class="plain">(</span><span class="identifier">L</span><span class="string">"font"</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>
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">PL::EPSMap::put_string_mp</span><span class="plain">(</span><span class="identifier">wchar_t</span><span class="plain"> *</span><span class="identifier">name</span><span class="plain">, </span><span class="reserved">map_parameter_scope</span><span class="plain"> *</span><span class="identifier">scope</span><span class="plain">, </span><span class="identifier">wchar_t</span><span class="plain"> *</span><span class="identifier">val</span><span class="plain">) {</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">s</span><span class="plain"> = </span><span class="functiontext">PL::EPSMap::get_map_variable_index</span><span class="plain">(</span><span class="identifier">name</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">scope</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">) </span><span class="identifier">scope</span><span class="plain"> = &amp;</span><span class="identifier">global_map_scope</span><span class="plain">;</span>
<span class="identifier">scope</span><span class="plain">-</span><span class="element">&gt;values</span><span class="plain">[</span><span class="identifier">s</span><span class="plain">]</span><span class="element">.specified</span><span class="plain"> = </span><span class="identifier">TRUE</span><span class="plain">;</span>
<span class="identifier">scope</span><span class="plain">-</span><span class="element">&gt;values</span><span class="plain">[</span><span class="identifier">s</span><span class="plain">]</span><span class="element">.string_value</span><span class="plain"> = </span><span class="identifier">val</span><span class="plain">;</span>
<span class="plain">}</span>
<span class="identifier">text_stream</span><span class="plain"> *</span><span class="functiontext">PL::EPSMap::get_stream_mp</span><span class="plain">(</span><span class="identifier">wchar_t</span><span class="plain"> *</span><span class="identifier">name</span><span class="plain">, </span><span class="reserved">map_parameter_scope</span><span class="plain"> *</span><span class="identifier">scope</span><span class="plain">) {</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">s</span><span class="plain"> = </span><span class="functiontext">PL::EPSMap::get_map_variable_index</span><span class="plain">(</span><span class="identifier">name</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">scope</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">) </span><span class="identifier">scope</span><span class="plain"> = &amp;</span><span class="identifier">global_map_scope</span><span class="plain">;</span>
<span class="reserved">while</span><span class="plain"> (</span><span class="identifier">scope</span><span class="plain">-</span><span class="element">&gt;values</span><span class="plain">[</span><span class="identifier">s</span><span class="plain">]</span><span class="element">.specified</span><span class="plain"> == </span><span class="identifier">FALSE</span><span class="plain">) {</span>
<span class="identifier">scope</span><span class="plain"> = </span><span class="identifier">scope</span><span class="plain">-</span><span class="element">&gt;wider_scope</span><span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">scope</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">) </span><span class="identifier">internal_error</span><span class="plain">(</span><span class="string">"scope exhausted in looking up map parameter"</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">scope</span><span class="plain">-</span><span class="element">&gt;values</span><span class="plain">[</span><span class="identifier">s</span><span class="plain">]</span><span class="element">.stream_value</span><span class="plain">;</span>
<span class="plain">}</span>
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">PL::EPSMap::put_stream_mp</span><span class="plain">(</span><span class="identifier">wchar_t</span><span class="plain"> *</span><span class="identifier">name</span><span class="plain">, </span><span class="reserved">map_parameter_scope</span><span class="plain"> *</span><span class="identifier">scope</span><span class="plain">, </span><span class="identifier">text_stream</span><span class="plain"> *</span><span class="identifier">val</span><span class="plain">) {</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">s</span><span class="plain"> = </span><span class="functiontext">PL::EPSMap::get_map_variable_index</span><span class="plain">(</span><span class="identifier">name</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">scope</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">) </span><span class="identifier">scope</span><span class="plain"> = &amp;</span><span class="identifier">global_map_scope</span><span class="plain">;</span>
<span class="identifier">scope</span><span class="plain">-</span><span class="element">&gt;values</span><span class="plain">[</span><span class="identifier">s</span><span class="plain">]</span><span class="element">.specified</span><span class="plain"> = </span><span class="identifier">TRUE</span><span class="plain">;</span>
<span class="identifier">scope</span><span class="plain">-</span><span class="element">&gt;values</span><span class="plain">[</span><span class="identifier">s</span><span class="plain">]</span><span class="element">.stream_value</span><span class="plain"> = </span><span class="identifier">Str::duplicate</span><span class="plain">(</span><span class="identifier">val</span><span class="plain">);</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">The function PL::EPSMap::get_string_mp is used in <a href="#SP25">&#167;25</a>, <a href="#SP25_4">&#167;25.4</a>, <a href="#SP25_6_1">&#167;25.6.1</a>, <a href="#SP25_6_1_2">&#167;25.6.1.2</a>, <a href="#SP25_7_1">&#167;25.7.1</a>, <a href="#SP25_7_2">&#167;25.7.2</a>, <a href="#SP25_7_3">&#167;25.7.3</a>.</p>
<p class="endnote">The function PL::EPSMap::put_string_mp is used in <a href="#SP11">&#167;11</a>, <a href="#SP24_3">&#167;24.3</a>.</p>
<p class="endnote">The function PL::EPSMap::get_stream_mp is used in <a href="#SP25_4">&#167;25.4</a>.</p>
<p class="endnote">The function PL::EPSMap::put_stream_mp is used in <a href="#SP24_1">&#167;24.1</a>, <a href="#SP24_2">&#167;24.2</a>.</p>
<p class="inwebparagraph"><a id="SP13"></a><b>&#167;13. </b>Integer parameters.
</p>
<pre class="display">
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">PL::EPSMap::get_int_mp</span><span class="plain">(</span><span class="identifier">wchar_t</span><span class="plain"> *</span><span class="identifier">name</span><span class="plain">, </span><span class="reserved">map_parameter_scope</span><span class="plain"> *</span><span class="identifier">scope</span><span class="plain">) {</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">s</span><span class="plain"> = </span><span class="functiontext">PL::EPSMap::get_map_variable_index</span><span class="plain">(</span><span class="identifier">name</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">scope</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">) </span><span class="identifier">scope</span><span class="plain"> = &amp;</span><span class="identifier">global_map_scope</span><span class="plain">;</span>
<span class="reserved">while</span><span class="plain"> (</span><span class="identifier">scope</span><span class="plain">-</span><span class="element">&gt;values</span><span class="plain">[</span><span class="identifier">s</span><span class="plain">]</span><span class="element">.specified</span><span class="plain"> == </span><span class="identifier">FALSE</span><span class="plain">) {</span>
<span class="identifier">scope</span><span class="plain"> = </span><span class="identifier">scope</span><span class="plain">-</span><span class="element">&gt;wider_scope</span><span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">scope</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">) </span><span class="identifier">internal_error</span><span class="plain">(</span><span class="string">"scope exhausted in looking up map parameter"</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">scope</span><span class="plain">-</span><span class="element">&gt;values</span><span class="plain">[</span><span class="identifier">s</span><span class="plain">]</span><span class="element">.numeric_value</span><span class="plain">;</span>
<span class="plain">}</span>
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">PL::EPSMap::put_int_mp</span><span class="plain">(</span><span class="identifier">wchar_t</span><span class="plain"> *</span><span class="identifier">name</span><span class="plain">, </span><span class="reserved">map_parameter_scope</span><span class="plain"> *</span><span class="identifier">scope</span><span class="plain">, </span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">val</span><span class="plain">) {</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">s</span><span class="plain"> = </span><span class="functiontext">PL::EPSMap::get_map_variable_index</span><span class="plain">(</span><span class="identifier">name</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">scope</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">) </span><span class="identifier">scope</span><span class="plain"> = &amp;</span><span class="identifier">global_map_scope</span><span class="plain">;</span>
<span class="identifier">scope</span><span class="plain">-</span><span class="element">&gt;values</span><span class="plain">[</span><span class="identifier">s</span><span class="plain">]</span><span class="element">.specified</span><span class="plain"> = </span><span class="identifier">TRUE</span><span class="plain">;</span>
<span class="identifier">scope</span><span class="plain">-</span><span class="element">&gt;values</span><span class="plain">[</span><span class="identifier">s</span><span class="plain">]</span><span class="element">.numeric_value</span><span class="plain"> = </span><span class="identifier">val</span><span class="plain">;</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">The function PL::EPSMap::get_int_mp is used in <a href="#SP24_1">&#167;24.1</a>, <a href="#SP25">&#167;25</a>, <a href="#SP25_1">&#167;25.1</a>, <a href="#SP25_4">&#167;25.4</a>, <a href="#SP25_5">&#167;25.5</a>, <a href="#SP25_6">&#167;25.6</a>, <a href="#SP25_6_1">&#167;25.6.1</a>, <a href="#SP25_6_1_2">&#167;25.6.1.2</a>, <a href="#SP25_7">&#167;25.7</a>, <a href="#SP25_7_1">&#167;25.7.1</a>, <a href="#SP25_7_2">&#167;25.7.2</a>, <a href="#SP25_7_3">&#167;25.7.3</a>, <a href="#SP25_8">&#167;25.8</a>.</p>
<p class="endnote">The function PL::EPSMap::put_int_mp is used in <a href="#SP11">&#167;11</a>.</p>
<p class="inwebparagraph"><a id="SP14"></a><b>&#167;14. Parsing sentences which set map parameters. </b>This happens in two passes: pass 1 before HTML mapping, pass 2 before EPS mapping.
</p>
<pre class="display">
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">PL::EPSMap::traverse_for_map_parameters</span><span class="plain">(</span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">pass</span><span class="plain">) {</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">pass</span><span class="plain"> == 1) </span><span class="functiontext">PL::SpatialMap::initialise_page_directions</span><span class="plain">();</span>
<span class="identifier">ParseTree::traverse_int</span><span class="plain">(</span><span class="functiontext">PL::EPSMap::look_for_map_parameters</span><span class="plain">, &amp;</span><span class="identifier">pass</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">PL::EPSMap::look_for_map_parameters</span><span class="plain">(</span><span class="identifier">parse_node</span><span class="plain"> *</span><span class="identifier">p</span><span class="plain">, </span><span class="reserved">int</span><span class="plain"> *</span><span class="identifier">pass</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">p</span><span class="plain">) == </span><span class="identifier">SENTENCE_NT</span><span class="plain">)</span>
<span class="plain">&amp;&amp; (</span><span class="identifier">p</span><span class="plain">-&gt;</span><span class="identifier">down</span><span class="plain">)) {</span>
<span class="reserved">if</span><span class="plain"> (*</span><span class="identifier">pass</span><span class="plain"> == 1) </span><span class="identifier">Assertions::Traverse::try_special_meaning</span><span class="plain">(</span><span class="identifier">TRAVERSE_FOR_MAP1_SMFT</span><span class="plain">, </span><span class="identifier">p</span><span class="plain">-&gt;</span><span class="identifier">down</span><span class="plain">);</span>
<span class="reserved">else</span><span class="plain"> </span><span class="identifier">Assertions::Traverse::try_special_meaning</span><span class="plain">(</span><span class="identifier">TRAVERSE_FOR_MAP2_SMFT</span><span class="plain">, </span><span class="identifier">p</span><span class="plain">-&gt;</span><span class="identifier">down</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">The function PL::EPSMap::traverse_for_map_parameters is used in <a href="#SP24">&#167;24</a>, 3/sm2 (<a href="3-sm2.html#SP46">&#167;46</a>).</p>
<p class="endnote">The function PL::EPSMap::look_for_map_parameters appears nowhere else.</p>
<p class="inwebparagraph"><a id="SP15"></a><b>&#167;15. </b></p>
<pre class="display">
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">PL::EPSMap::index_map_with_SMF</span><span class="plain">(</span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">task</span><span class="plain">, </span><span class="identifier">parse_node</span><span class="plain"> *</span><span class="identifier">V</span><span class="plain">, </span><span class="identifier">wording</span><span class="plain"> *</span><span class="identifier">NPs</span><span class="plain">) {</span>
<span class="identifier">wording</span><span class="plain"> </span><span class="identifier">OW</span><span class="plain"> = (</span><span class="identifier">NPs</span><span class="plain">)?(</span><span class="identifier">NPs</span><span class="plain">[1]):</span><span class="identifier">EMPTY_WORDING</span><span class="plain">;</span>
<span class="reserved">switch</span><span class="plain"> (</span><span class="identifier">task</span><span class="plain">) { </span> <span class="comment">"Index map with ..."</span>
<span class="reserved">case</span><span class="plain"> </span><span class="identifier">ACCEPT_SMFT</span><span class="plain">:</span>
<span class="identifier">ParseTree::annotate_int</span><span class="plain">(</span><span class="identifier">V</span><span class="plain">, </span><span class="identifier">verb_id_ANNOT</span><span class="plain">, </span><span class="identifier">SPECIAL_MEANING_VB</span><span class="plain">);</span>
<span class="plain">&lt;</span><span class="identifier">nounphrase</span><span class="plain">-</span><span class="identifier">articled</span><span class="plain">-</span><span class="identifier">list</span><span class="plain">&gt;(</span><span class="identifier">OW</span><span class="plain">);</span>
<span class="identifier">V</span><span class="plain">-</span><span class="element">&gt;next</span><span class="plain"> = &lt;&lt;</span><span class="identifier">rp</span><span class="plain">&gt;&gt;;</span>
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">TRUE</span><span class="plain">;</span>
<span class="reserved">case</span><span class="plain"> </span><span class="identifier">TRAVERSE_FOR_MAP1_SMFT</span><span class="plain">:</span>
<span class="functiontext">PL::EPSMap::new_map_hint_sentence</span><span class="plain">(1, </span><span class="identifier">V</span><span class="plain">-</span><span class="element">&gt;next</span><span class="plain">);</span>
<span class="reserved">break</span><span class="plain">;</span>
<span class="reserved">case</span><span class="plain"> </span><span class="identifier">TRAVERSE_FOR_MAP2_SMFT</span><span class="plain">:</span>
<span class="functiontext">PL::EPSMap::new_map_hint_sentence</span><span class="plain">(2, </span><span class="identifier">V</span><span class="plain">-</span><span class="element">&gt;next</span><span class="plain">);</span>
<span class="reserved">break</span><span class="plain">;</span>
<span class="reserved">case</span><span class="plain"> </span><span class="identifier">TRAVERSE_FOR_MAP_INDEX_SMFT</span><span class="plain">:</span>
<span class="identifier">LOG</span><span class="plain">(</span><span class="string">"\</span><span class="plain">n</span><span class="string">Index map with %+W.\</span><span class="plain">n</span><span class="string">"</span><span class="plain">, </span><span class="identifier">ParseTree::get_text</span><span class="plain">(</span><span class="identifier">V</span><span class="plain">-</span><span class="element">&gt;next</span><span class="plain">));</span>
<span class="reserved">break</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::EPSMap::index_map_with_SMF appears nowhere else.</p>
<p class="inwebparagraph"><a id="SP16"></a><b>&#167;16. </b>This conveniently filters instance names to accept only those of kind
"direction".
</p>
<pre class="display">
<span class="plain">&lt;</span><span class="identifier">direction</span><span class="plain">-</span><span class="identifier">name</span><span class="plain">&gt; ::=</span>
<span class="plain">&lt;</span><span class="identifier">instance</span><span class="plain">-</span><span class="identifier">of</span><span class="plain">-</span><span class="identifier">object</span><span class="plain">&gt; ==&gt; 0; *</span><span class="identifier">XP</span><span class="plain"> = </span><span class="identifier">RP</span><span class="plain">[1]; </span><span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Instances::of_kind</span><span class="plain">(</span><span class="identifier">RP</span><span class="plain">[1], </span><span class="identifier">K_direction</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">FALSE</span><span class="plain">;</span>
</pre>
<p class="inwebparagraph"></p>
<p class="inwebparagraph"><a id="SP17"></a><b>&#167;17. </b>The subject noun phrase of sentences like this:
</p>
<blockquote>
<p>Index map with Chamber mapped north of Cave and EPS file.</p>
</blockquote>
<p class="inwebparagraph">is an articled list of subjects (in this case, two of them); each subject
is parsed with the following grammar, which is almost a mini-language in
itself.
</p>
<pre class="display">
<span class="plain">&lt;</span><span class="identifier">index</span><span class="plain">-</span><span class="identifier">map</span><span class="plain">-</span><span class="identifier">sentence</span><span class="plain">-</span><span class="identifier">subject</span><span class="plain">&gt; ::=</span>
<span class="identifier">eps</span><span class="plain"> </span><span class="identifier">file</span><span class="plain"> | ==&gt; </span><span class="constant">EPSFILE_IMW</span>
<span class="plain">&lt;</span><span class="identifier">direction</span><span class="plain">-</span><span class="identifier">name</span><span class="plain">&gt; </span><span class="identifier">mapped</span><span class="plain"> </span><span class="identifier">as</span><span class="plain"> &lt;</span><span class="identifier">direction</span><span class="plain">-</span><span class="identifier">name</span><span class="plain">&gt; | ==&gt; </span><span class="constant">MAPPED_AS_IMW</span><span class="plain">; &lt;&lt;</span><span class="identifier">instance</span><span class="plain">:</span><span class="identifier">x</span><span class="plain">&gt;&gt; = </span><span class="identifier">RP</span><span class="plain">[1]; &lt;&lt;</span><span class="identifier">instance</span><span class="plain">:</span><span class="identifier">y</span><span class="plain">&gt;&gt; = </span><span class="identifier">RP</span><span class="plain">[2];</span>
<span class="plain">... </span><span class="identifier">mapped</span><span class="plain"> </span><span class="identifier">as</span><span class="plain"> ... | ==&gt; </span>&lt;<span class="cwebmacro">Issue PM_MapDirectionClue problem</span> <span class="cwebmacronumber">17.1</span>&gt;
<span class="plain">&lt;</span><span class="identifier">instance</span><span class="plain">-</span><span class="identifier">of</span><span class="plain">-</span><span class="identifier">object</span><span class="plain">&gt; </span><span class="identifier">mapped</span><span class="plain"> &lt;</span><span class="identifier">map</span><span class="plain">-</span><span class="identifier">positioning</span><span class="plain">&gt; | ==&gt; </span><span class="constant">MAPPED_IMW</span><span class="plain">; &lt;&lt;</span><span class="identifier">instance</span><span class="plain">:</span><span class="identifier">x</span><span class="plain">&gt;&gt; = </span><span class="identifier">RP</span><span class="plain">[1]; &lt;&lt;</span><span class="identifier">instance</span><span class="plain">:</span><span class="identifier">y</span><span class="plain">&gt;&gt; = </span><span class="identifier">RP</span><span class="plain">[2];</span>
<span class="plain">... </span><span class="identifier">mapped</span><span class="plain"> ... | ==&gt; </span>&lt;<span class="cwebmacro">Issue PM_MapPlacement problem</span> <span class="cwebmacronumber">17.2</span>&gt;
<span class="plain">&lt;</span><span class="identifier">map</span><span class="plain">-</span><span class="identifier">setting</span><span class="plain">&gt; </span><span class="identifier">set</span><span class="plain"> </span><span class="identifier">to</span><span class="plain"> &lt;</span><span class="identifier">map</span><span class="plain">-</span><span class="identifier">setting</span><span class="plain">-</span><span class="identifier">value</span><span class="plain">&gt; | ==&gt; </span><span class="constant">SETTING_IMW</span><span class="plain">; &lt;&lt;</span><span class="identifier">scoping</span><span class="plain">&gt;&gt; = </span><span class="identifier">R</span><span class="plain">[1]; </span><span class="reserved">if</span><span class="plain"> (</span><span class="identifier">R</span><span class="plain">[1] == </span><span class="constant">NO_IMW</span><span class="plain">) *</span><span class="identifier">X</span><span class="plain"> = </span><span class="constant">NO_IMW</span><span class="plain">; &lt;&lt;</span><span class="identifier">msvtype</span><span class="plain">&gt;&gt; = </span><span class="identifier">R</span><span class="plain">[2]</span>
<span class="plain">&lt;</span><span class="identifier">map</span><span class="plain">-</span><span class="identifier">setting</span><span class="plain">&gt; </span><span class="identifier">set</span><span class="plain"> </span><span class="identifier">to</span><span class="plain"> ... | ==&gt; </span>&lt;<span class="cwebmacro">Issue PM_MapSettingTooLong problem</span> <span class="cwebmacronumber">17.3</span>&gt;
<span class="plain">... </span><span class="identifier">set</span><span class="plain"> </span><span class="identifier">to</span><span class="plain"> ... | ==&gt; </span>&lt;<span class="cwebmacro">Issue PM_MapSettingOfUnknown problem</span> <span class="cwebmacronumber">17.4</span>&gt;
<span class="identifier">rubric</span><span class="plain"> {&lt;</span><span class="identifier">quoted</span><span class="plain">-</span><span class="identifier">text</span><span class="plain">-</span><span class="identifier">without</span><span class="plain">-</span><span class="identifier">subs</span><span class="plain">&gt;} *** | ==&gt; </span><span class="constant">RUBRIC_IMW</span>
<span class="plain">... ==&gt; </span>&lt;<span class="cwebmacro">Issue PM_MapHintUnknown problem</span> <span class="cwebmacronumber">17.5</span>&gt;
<span class="plain">&lt;</span><span class="identifier">map</span><span class="plain">-</span><span class="identifier">positioning</span><span class="plain">&gt; ::=</span>
<span class="plain">&lt;</span><span class="identifier">instance</span><span class="plain">-</span><span class="identifier">of</span><span class="plain">-</span><span class="identifier">object</span><span class="plain">&gt; </span><span class="identifier">of</span><span class="plain">/</span><span class="identifier">from</span><span class="plain"> &lt;</span><span class="identifier">instance</span><span class="plain">-</span><span class="identifier">of</span><span class="plain">-</span><span class="identifier">object</span><span class="plain">&gt; | ==&gt; </span><span class="identifier">TRUE</span><span class="plain">; &lt;&lt;</span><span class="identifier">instance</span><span class="plain">:</span><span class="identifier">dir</span><span class="plain">&gt;&gt; = </span><span class="identifier">RP</span><span class="plain">[1]; *</span><span class="identifier">XP</span><span class="plain"> = </span><span class="identifier">RP</span><span class="plain">[2]</span>
<span class="identifier">above</span><span class="plain"> &lt;</span><span class="identifier">instance</span><span class="plain">-</span><span class="identifier">of</span><span class="plain">-</span><span class="identifier">object</span><span class="plain">&gt; | ==&gt; </span><span class="identifier">TRUE</span><span class="plain">; &lt;&lt;</span><span class="identifier">instance</span><span class="plain">:</span><span class="identifier">dir</span><span class="plain">&gt;&gt; = </span><span class="identifier">I_up</span><span class="plain">; *</span><span class="identifier">XP</span><span class="plain"> = </span><span class="identifier">RP</span><span class="plain">[1]</span>
<span class="identifier">below</span><span class="plain"> &lt;</span><span class="identifier">instance</span><span class="plain">-</span><span class="identifier">of</span><span class="plain">-</span><span class="identifier">object</span><span class="plain">&gt; ==&gt; </span><span class="identifier">TRUE</span><span class="plain">; &lt;&lt;</span><span class="identifier">instance</span><span class="plain">:</span><span class="identifier">dir</span><span class="plain">&gt;&gt; = </span><span class="identifier">I_down</span><span class="plain">; *</span><span class="identifier">XP</span><span class="plain"> = </span><span class="identifier">RP</span><span class="plain">[1]</span>
</pre>
<p class="inwebparagraph"></p>
<p class="inwebparagraph"><a id="SP17_1"></a><b>&#167;17.1. </b><code class="display">
&lt;<span class="cwebmacrodefn">Issue PM_MapDirectionClue problem</span> <span class="cwebmacronumber">17.1</span>&gt; =
</code></p>
<pre class="displaydefn">
<span class="plain">*</span><span class="identifier">X</span><span class="plain"> = </span><span class="constant">NO_IMW</span><span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">index_map_with_pass</span><span class="plain"> == 1) {</span>
<span class="identifier">Problems::Issue::map_problem</span><span class="plain">(</span><span class="identifier">_p_</span><span class="plain">(</span><span class="identifier">PM_MapDirectionClue</span><span class="plain">),</span>
<span class="identifier">index_map_with_p</span><span class="plain">, </span><span class="string">"You can only say 'Index map with D mapped as E.' "</span>
<span class="string">"when D and E are directions."</span><span class="plain">);</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">Issue PM_MapPlacement problem</span> <span class="cwebmacronumber">17.2</span>&gt; =
</code></p>
<pre class="displaydefn">
<span class="plain">*</span><span class="identifier">X</span><span class="plain"> = </span><span class="constant">NO_IMW</span><span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">index_map_with_pass</span><span class="plain"> == 1) {</span>
<span class="identifier">Problems::Issue::map_problem</span><span class="plain">(</span><span class="identifier">_p_</span><span class="plain">(</span><span class="identifier">PM_MapPlacement</span><span class="plain">),</span>
<span class="identifier">index_map_with_p</span><span class="plain">, </span><span class="string">"The map placement hint should either have the form 'Index map with X "</span>
<span class="string">"mapped east of Y' or 'Index map with X mapped above/below Y'."</span><span class="plain">);</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><code class="display">
&lt;<span class="cwebmacrodefn">Issue PM_MapSettingTooLong problem</span> <span class="cwebmacronumber">17.3</span>&gt; =
</code></p>
<pre class="displaydefn">
<span class="plain">*</span><span class="identifier">X</span><span class="plain"> = </span><span class="constant">NO_IMW</span><span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">index_map_with_pass</span><span class="plain"> == 1) {</span>
<span class="identifier">Problems::Issue::map_problem</span><span class="plain">(</span><span class="identifier">_p_</span><span class="plain">(</span><span class="identifier">PM_MapSettingTooLong</span><span class="plain">),</span>
<span class="identifier">index_map_with_p</span><span class="plain">, </span><span class="string">"The value supplied has to be a single item, a number, a word "</span>
<span class="string">"or some text in double-quotes: this looks too long to be right."</span><span class="plain">);</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_4"></a><b>&#167;17.4. </b><code class="display">
&lt;<span class="cwebmacrodefn">Issue PM_MapSettingOfUnknown problem</span> <span class="cwebmacronumber">17.4</span>&gt; =
</code></p>
<pre class="displaydefn">
<span class="plain">*</span><span class="identifier">X</span><span class="plain"> = </span><span class="constant">NO_IMW</span><span class="plain">;</span>
&lt;<span class="cwebmacro">Actually issue PM_MapSettingOfUnknown problem</span> <span class="cwebmacronumber">17.4.1</span>&gt;<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_5"></a><b>&#167;17.5. </b><code class="display">
&lt;<span class="cwebmacrodefn">Issue PM_MapHintUnknown problem</span> <span class="cwebmacronumber">17.5</span>&gt; =
</code></p>
<pre class="displaydefn">
<span class="plain">*</span><span class="identifier">X</span><span class="plain"> = </span><span class="constant">NO_IMW</span><span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">index_map_with_pass</span><span class="plain"> == 2) {</span>
<span class="identifier">Problems::Issue::map_problem</span><span class="plain">(</span><span class="identifier">_p_</span><span class="plain">(</span><span class="identifier">PM_MapHintUnknown</span><span class="plain">),</span>
<span class="identifier">index_map_with_p</span><span class="plain">, </span><span class="string">"The general form for this is 'Index map with ...' and then a "</span>
<span class="string">"list of clues, such as 'the Ballroom mapped east of the Terrace', "</span>
<span class="string">"or 'room-size of the Ballroom set to 100'."</span><span class="plain">);</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>Now we parse the setting to be set. For example,
</p>
<blockquote>
<p>title-size of the first room</p>
</blockquote>
<blockquote>
<p>border-size of level 1</p>
</blockquote>
<blockquote>
<p>room-outline-thickness of the Taj Mahal</p>
</blockquote>
<blockquote>
<p>title-size</p>
</blockquote>
<pre class="display">
<span class="plain">&lt;</span><span class="identifier">map</span><span class="plain">-</span><span class="identifier">setting</span><span class="plain">&gt; ::=</span>
<span class="plain">&lt;</span><span class="identifier">map</span><span class="plain">-</span><span class="identifier">parameter</span><span class="plain">&gt; </span><span class="identifier">of</span><span class="plain"> &lt;</span><span class="identifier">map</span><span class="plain">-</span><span class="identifier">setting</span><span class="plain">-</span><span class="identifier">scope</span><span class="plain">&gt; | ==&gt; </span><span class="identifier">R</span><span class="plain">[2]; &lt;&lt;</span><span class="identifier">wchar_t</span><span class="plain">:</span><span class="identifier">partext</span><span class="plain">&gt;&gt; = </span><span class="identifier">RP</span><span class="plain">[1]; &lt;&lt;</span><span class="identifier">parindex</span><span class="plain">&gt;&gt; = </span><span class="identifier">R</span><span class="plain">[1]</span>
<span class="plain">&lt;</span><span class="identifier">map</span><span class="plain">-</span><span class="identifier">parameter</span><span class="plain">&gt; | ==&gt; </span><span class="constant">ENTIRE_MAP_SCOPE</span><span class="plain">; &lt;&lt;</span><span class="identifier">wchar_t</span><span class="plain">:</span><span class="identifier">partext</span><span class="plain">&gt;&gt; = </span><span class="identifier">RP</span><span class="plain">[1]; &lt;&lt;</span><span class="identifier">parindex</span><span class="plain">&gt;&gt; = </span><span class="identifier">R</span><span class="plain">[1]</span>
<span class="plain">... </span><span class="identifier">of</span><span class="plain"> &lt;</span><span class="identifier">map</span><span class="plain">-</span><span class="identifier">setting</span><span class="plain">-</span><span class="identifier">scope</span><span class="plain">&gt; ==&gt; </span>&lt;<span class="cwebmacro">Issue PM_MapSettingUnknown problem</span> <span class="cwebmacronumber">18.2</span>&gt;
<span class="plain">&lt;</span><span class="identifier">map</span><span class="plain">-</span><span class="identifier">setting</span><span class="plain">-</span><span class="identifier">scope</span><span class="plain">&gt; ::=</span>
<span class="plain">&lt;</span><span class="identifier">definite</span><span class="plain">-</span><span class="identifier">article</span><span class="plain">&gt; &lt;</span><span class="identifier">map</span><span class="plain">-</span><span class="identifier">setting</span><span class="plain">-</span><span class="identifier">scope</span><span class="plain">-</span><span class="identifier">unarticled</span><span class="plain">&gt; | ==&gt; </span><span class="identifier">R</span><span class="plain">[2]</span>
<span class="plain">&lt;</span><span class="identifier">map</span><span class="plain">-</span><span class="identifier">setting</span><span class="plain">-</span><span class="identifier">scope</span><span class="plain">-</span><span class="identifier">unarticled</span><span class="plain">&gt; ==&gt; </span><span class="identifier">R</span><span class="plain">[1]</span>
<span class="plain">&lt;</span><span class="identifier">map</span><span class="plain">-</span><span class="identifier">setting</span><span class="plain">-</span><span class="identifier">scope</span><span class="plain">-</span><span class="identifier">unarticled</span><span class="plain">&gt; ::=</span>
<span class="identifier">first</span><span class="plain"> </span><span class="identifier">room</span><span class="plain"> | ==&gt; </span><span class="constant">FIRST_ROOM_MAP_SCOPE</span>
<span class="identifier">level</span><span class="plain"> &lt;</span><span class="identifier">cardinal</span><span class="plain">-</span><span class="identifier">number</span><span class="plain">&gt; | ==&gt; </span><span class="constant">LEVEL_MAP_SCOPE</span><span class="plain">; &lt;&lt;</span><span class="identifier">level</span><span class="plain">&gt;&gt; = </span><span class="identifier">R</span><span class="plain">[1]</span>
<span class="plain">&lt;</span><span class="identifier">k</span><span class="plain">-</span><span class="identifier">kind</span><span class="plain">&gt; | ==&gt; </span><span class="constant">KIND_MAP_SCOPE</span><span class="plain">; &lt;&lt;</span><span class="identifier">kind</span><span class="plain">:</span><span class="identifier">kscope</span><span class="plain">&gt;&gt; = </span><span class="identifier">RP</span><span class="plain">[1]</span>
<span class="plain">&lt;</span><span class="identifier">instance</span><span class="plain">-</span><span class="identifier">of</span><span class="plain">-</span><span class="identifier">object</span><span class="plain">&gt; ==&gt; </span><span class="constant">INSTANCE_MAP_SCOPE</span><span class="plain">; &lt;&lt;</span><span class="identifier">instance</span><span class="plain">:</span><span class="identifier">iscope</span><span class="plain">&gt;&gt; = </span><span class="identifier">RP</span><span class="plain">[1]</span>
</pre>
<p class="inwebparagraph"></p>
<p class="inwebparagraph"><a id="SP18_1"></a><b>&#167;18.1. </b>The map parameters all have one-word, sometimes hyphenated, names, such
as the following:
</p>
<blockquote>
<p>vertical-spacing, monochrome, annotation-size</p>
</blockquote>
<p class="inwebparagraph">For now, at least, these are all in English only.
</p>
<pre class="display">
<span class="plain">&lt;</span><span class="identifier">map</span><span class="plain">-</span><span class="identifier">parameter</span><span class="plain">&gt; </span><span class="identifier">internal</span><span class="plain"> {</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">i</span><span class="plain">;</span>
<span class="identifier">wchar_t</span><span class="plain"> *</span><span class="identifier">parameter_name</span><span class="plain"> = </span><span class="identifier">Lexer::word_text</span><span class="plain">(</span><span class="identifier">Wordings::first_wn</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">Wordings::length</span><span class="plain">(</span><span class="identifier">W</span><span class="plain">) == 1) &amp;&amp;</span>
<span class="plain">((</span><span class="identifier">i</span><span class="plain"> = </span><span class="functiontext">PL::EPSMap::get_map_variable_index_forgivingly</span><span class="plain">(</span><span class="identifier">parameter_name</span><span class="plain">))&gt;=0)) {</span>
<span class="plain">*</span><span class="identifier">X</span><span class="plain"> = </span><span class="identifier">i</span><span class="plain">;</span>
<span class="plain">*</span><span class="identifier">XP</span><span class="plain"> = </span><span class="identifier">parameter_name</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="inwebparagraph"><a id="SP18_2"></a><b>&#167;18.2. </b><code class="display">
&lt;<span class="cwebmacrodefn">Issue PM_MapSettingUnknown problem</span> <span class="cwebmacronumber">18.2</span>&gt; =
</code></p>
<pre class="displaydefn">
<span class="plain">*</span><span class="identifier">X</span><span class="plain"> = </span><span class="constant">NO_IMW</span><span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">index_map_with_pass</span><span class="plain"> == 1) {</span>
<span class="identifier">Problems::Issue::map_problem</span><span class="plain">(</span><span class="identifier">_p_</span><span class="plain">(</span><span class="identifier">PM_MapSettingUnknown</span><span class="plain">),</span>
<span class="identifier">index_map_with_p</span><span class="plain">, </span><span class="string">"The parameter has to be one of the fixed named set given in "</span>
<span class="string">"the documentation, like 'room-name'. All parameters are one "</span>
<span class="string">"word, but many are hyphenated. (Also, note that 'colour' has the "</span>
<span class="string">"Canadian/English spelling, not the American one 'color'.)"</span><span class="plain">);</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">This code is used in <a href="#SP18">&#167;18</a>.</p>
<p class="inwebparagraph"><a id="SP19"></a><b>&#167;19. </b>The value of map settings is as follows. In retrospect, the "booleans"
perhaps should just have been "true" and "false", not "on" and "off".
Never mind.
</p>
<pre class="display">
<span class="plain">&lt;</span><span class="identifier">map</span><span class="plain">-</span><span class="identifier">setting</span><span class="plain">-</span><span class="identifier">value</span><span class="plain">&gt; ::=</span>
<span class="plain">&lt;</span><span class="identifier">cardinal</span><span class="plain">-</span><span class="identifier">number</span><span class="plain">&gt; | ==&gt; </span><span class="constant">INT_MDT</span><span class="plain">; &lt;&lt;</span><span class="identifier">msvalue</span><span class="plain">&gt;&gt; = </span><span class="identifier">R</span><span class="plain">[1]; &lt;&lt;</span><span class="identifier">msword</span><span class="plain">&gt;&gt; = </span><span class="identifier">Wordings::first_wn</span><span class="plain">(</span><span class="identifier">W</span><span class="plain">);</span>
<span class="plain">&lt;</span><span class="identifier">quoted</span><span class="plain">-</span><span class="identifier">text</span><span class="plain">&gt; | ==&gt; </span><span class="constant">TEXT_MDT</span><span class="plain">; &lt;&lt;</span><span class="identifier">msvalue</span><span class="plain">&gt;&gt; = </span><span class="identifier">R</span><span class="plain">[1]; &lt;&lt;</span><span class="identifier">msword</span><span class="plain">&gt;&gt; = </span><span class="identifier">Wordings::first_wn</span><span class="plain">(</span><span class="identifier">W</span><span class="plain">);</span>
<span class="plain">&lt;</span><span class="identifier">map</span><span class="plain">-</span><span class="identifier">setting</span><span class="plain">-</span><span class="identifier">boolean</span><span class="plain">&gt; | ==&gt; </span><span class="constant">BOOL_MDT</span><span class="plain">; &lt;&lt;</span><span class="identifier">msvalue</span><span class="plain">&gt;&gt; = </span><span class="identifier">R</span><span class="plain">[1]; &lt;&lt;</span><span class="identifier">msword</span><span class="plain">&gt;&gt; = </span><span class="identifier">Wordings::first_wn</span><span class="plain">(</span><span class="identifier">W</span><span class="plain">);</span>
<span class="plain">&lt;</span><span class="identifier">map</span><span class="plain">-</span><span class="identifier">offset</span><span class="plain">&gt; | ==&gt; </span><span class="constant">OFF_MDT</span><span class="plain">; &lt;&lt;</span><span class="identifier">msvalue</span><span class="plain">&gt;&gt; = </span><span class="identifier">R</span><span class="plain">[1]; &lt;&lt;</span><span class="identifier">msword</span><span class="plain">&gt;&gt; = </span><span class="identifier">Wordings::first_wn</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">R</span><span class="plain">[1] == </span><span class="constant">ERRONEOUS_OFFSET_VALUE</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">### ==&gt; -1; &lt;&lt;</span><span class="identifier">msword</span><span class="plain">&gt;&gt; = </span><span class="identifier">Wordings::first_wn</span><span class="plain">(</span><span class="identifier">W</span><span class="plain">); </span> <span class="comment">leads to a problem message later</span>
<span class="plain">&lt;</span><span class="identifier">map</span><span class="plain">-</span><span class="identifier">setting</span><span class="plain">-</span><span class="identifier">boolean</span><span class="plain">&gt; ::=</span>
<span class="identifier">on</span><span class="plain"> | ==&gt; </span><span class="identifier">TRUE</span>
<span class="identifier">off</span><span class="plain"> ==&gt; </span><span class="identifier">FALSE</span>
</pre>
<p class="inwebparagraph"></p>
<p class="inwebparagraph"><a id="SP20"></a><b>&#167;20. </b>Map offsets have a cutesy notation: <code class="display"><span class="extract">10&amp;-30</span></code>, for example, written as a
single word. The following nonterminal actually matches any single word
(so that problems can be caught later, not now), returning either a valid
offset or else the <code class="display"><span class="extract">ERRONEOUS_OFFSET_VALUE</span></code> sentinel.
</p>
<pre class="display">
<span class="plain">&lt;</span><span class="identifier">map</span><span class="plain">-</span><span class="identifier">offset</span><span class="plain">&gt; </span><span class="identifier">internal</span><span class="plain"> 1 {</span>
<span class="plain">*</span><span class="identifier">X</span><span class="plain"> = </span><span class="functiontext">PL::EPSMap::parse_eps_map_offset</span><span class="plain">(</span><span class="identifier">W</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>
</pre>
<p class="inwebparagraph"></p>
<p class="inwebparagraph"><a id="SP21"></a><b>&#167;21. </b>The one part of the grammar not explicitly spelled out above was what to do
with the optional text which follows a rubric. This is a sequence of any of
the following:
</p>
<pre class="display">
<span class="plain">&lt;</span><span class="identifier">map</span><span class="plain">-</span><span class="identifier">rubric</span><span class="plain">&gt; ::=</span>
<span class="identifier">size</span><span class="plain"> &lt;</span><span class="identifier">cardinal</span><span class="plain">-</span><span class="identifier">number</span><span class="plain">&gt; *** | ==&gt; </span><span class="constant">RUBRIC_SIZE</span><span class="plain">; &lt;&lt;</span><span class="identifier">rsize</span><span class="plain">&gt;&gt; = </span><span class="identifier">R</span><span class="plain">[1]; &lt;&lt;</span><span class="identifier">edge</span><span class="plain">&gt;&gt; = </span><span class="identifier">Wordings::first_wn</span><span class="plain">(</span><span class="identifier">WR</span><span class="plain">[1])</span>
<span class="identifier">font</span><span class="plain"> {&lt;</span><span class="identifier">quoted</span><span class="plain">-</span><span class="identifier">text</span><span class="plain">-</span><span class="identifier">without</span><span class="plain">-</span><span class="identifier">subs</span><span class="plain">&gt;} *** | ==&gt; </span><span class="constant">RUBRIC_FONT</span><span class="plain">; &lt;&lt;</span><span class="identifier">rfont</span><span class="plain">&gt;&gt; = </span><span class="identifier">R</span><span class="plain">[1]; &lt;&lt;</span><span class="identifier">edge</span><span class="plain">&gt;&gt; = </span><span class="identifier">Wordings::first_wn</span><span class="plain">(</span><span class="identifier">WR</span><span class="plain">[2])</span>
<span class="identifier">colour</span><span class="plain"> {&lt;</span><span class="identifier">quoted</span><span class="plain">-</span><span class="identifier">text</span><span class="plain">-</span><span class="identifier">without</span><span class="plain">-</span><span class="identifier">subs</span><span class="plain">&gt;} *** | ==&gt; </span><span class="constant">RUBRIC_COLOUR</span><span class="plain">; &lt;&lt;</span><span class="identifier">rcol</span><span class="plain">&gt;&gt; = </span><span class="identifier">R</span><span class="plain">[1]; &lt;&lt;</span><span class="identifier">edge</span><span class="plain">&gt;&gt; = </span><span class="identifier">Wordings::first_wn</span><span class="plain">(</span><span class="identifier">WR</span><span class="plain">[2])</span>
<span class="identifier">at</span><span class="plain"> &lt;</span><span class="identifier">map</span><span class="plain">-</span><span class="identifier">offset</span><span class="plain">&gt; </span><span class="identifier">from</span><span class="plain"> ... | ==&gt; </span><span class="constant">RUBRIC_OFFSET</span><span class="plain">; &lt;&lt;</span><span class="identifier">roff</span><span class="plain">&gt;&gt; = </span><span class="identifier">R</span><span class="plain">[1]; &lt;&lt;</span><span class="identifier">edge</span><span class="plain">&gt;&gt; = </span><span class="identifier">Wordings::first_wn</span><span class="plain">(</span><span class="identifier">WR</span><span class="plain">[1])</span>
<span class="identifier">at</span><span class="plain"> &lt;</span><span class="identifier">map</span><span class="plain">-</span><span class="identifier">offset</span><span class="plain">&gt; *** ==&gt; </span><span class="constant">RUBRIC_POSITION</span><span class="plain">; &lt;&lt;</span><span class="identifier">roff</span><span class="plain">&gt;&gt; = </span><span class="identifier">R</span><span class="plain">[1]; &lt;&lt;</span><span class="identifier">edge</span><span class="plain">&gt;&gt; = </span><span class="identifier">Wordings::first_wn</span><span class="plain">(</span><span class="identifier">WR</span><span class="plain">[1])</span>
</pre>
<p class="inwebparagraph"></p>
<p class="inwebparagraph"><a id="SP22"></a><b>&#167;22. </b></p>
<pre class="definitions">
<span class="definitionkeyword">define</span> <span class="constant">NO_IMW</span><span class="plain"> 0</span>
<span class="definitionkeyword">define</span> <span class="constant">EPSFILE_IMW</span><span class="plain"> 1</span>
<span class="definitionkeyword">define</span> <span class="constant">MAPPED_AS_IMW</span><span class="plain"> 2</span>
<span class="definitionkeyword">define</span> <span class="constant">MAPPED_IMW</span><span class="plain"> 3</span>
<span class="definitionkeyword">define</span> <span class="constant">SETTING_IMW</span><span class="plain"> 4</span>
<span class="definitionkeyword">define</span> <span class="constant">RUBRIC_IMW</span><span class="plain"> 5</span>
<span class="definitionkeyword">define</span> <span class="constant">RUBRIC_SIZE</span><span class="plain"> 1</span>
<span class="definitionkeyword">define</span> <span class="constant">RUBRIC_FONT</span><span class="plain"> 2</span>
<span class="definitionkeyword">define</span> <span class="constant">RUBRIC_COLOUR</span><span class="plain"> 3</span>
<span class="definitionkeyword">define</span> <span class="constant">RUBRIC_OFFSET</span><span class="plain"> 4</span>
<span class="definitionkeyword">define</span> <span class="constant">RUBRIC_POSITION</span><span class="plain"> 5</span>
<span class="definitionkeyword">define</span> <span class="constant">FIRST_ROOM_MAP_SCOPE</span><span class="plain"> 1</span>
<span class="definitionkeyword">define</span> <span class="constant">LEVEL_MAP_SCOPE</span><span class="plain"> 2</span>
<span class="definitionkeyword">define</span> <span class="constant">KIND_MAP_SCOPE</span><span class="plain"> 3</span>
<span class="definitionkeyword">define</span> <span class="constant">INSTANCE_MAP_SCOPE</span><span class="plain"> 4</span>
<span class="definitionkeyword">define</span> <span class="constant">ENTIRE_MAP_SCOPE</span><span class="plain"> 5</span>
</pre>
<pre class="display">
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">PL::EPSMap::new_map_hint_sentence</span><span class="plain">(</span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">pass</span><span class="plain">, </span><span class="identifier">parse_node</span><span class="plain"> *</span><span class="identifier">p</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">p</span><span class="plain">) == </span><span class="identifier">AND_NT</span><span class="plain">) {</span>
<span class="functiontext">PL::EPSMap::new_map_hint_sentence</span><span class="plain">(</span><span class="identifier">pass</span><span class="plain">, </span><span class="identifier">p</span><span class="plain">-&gt;</span><span class="identifier">down</span><span class="plain">);</span>
<span class="functiontext">PL::EPSMap::new_map_hint_sentence</span><span class="plain">(</span><span class="identifier">pass</span><span class="plain">, </span><span class="identifier">p</span><span class="plain">-&gt;</span><span class="identifier">down</span><span class="plain">-</span><span class="element">&gt;next</span><span class="plain">);</span>
<span class="reserved">return</span><span class="plain">;</span>
<span class="plain">}</span>
<span class="identifier">current_sentence</span><span class="plain"> = </span><span class="identifier">p</span><span class="plain">;</span>
<span class="identifier">index_map_with_pass</span><span class="plain"> = </span><span class="identifier">pass</span><span class="plain">;</span>
<span class="identifier">index_map_with_p</span><span class="plain"> = </span><span class="identifier">p</span><span class="plain">;</span>
<span class="comment">the following take effect on pass 1</span>
<span class="plain">&lt;</span><span class="identifier">index</span><span class="plain">-</span><span class="identifier">map</span><span class="plain">-</span><span class="identifier">sentence</span><span class="plain">-</span><span class="identifier">subject</span><span class="plain">&gt;(</span><span class="identifier">ParseTree::get_text</span><span class="plain">(</span><span class="identifier">p</span><span class="plain">));</span>
<span class="reserved">switch</span><span class="plain"> (&lt;&lt;</span><span class="identifier">r</span><span class="plain">&gt;&gt;) {</span>
<span class="reserved">case</span><span class="plain"> </span><span class="constant">EPSFILE_IMW</span><span class="plain">: </span><span class="reserved">if</span><span class="plain"> (</span><span class="identifier">pass</span><span class="plain"> == 1) </span><span class="identifier">write_EPS_format_map</span><span class="plain"> = </span><span class="identifier">TRUE</span><span class="plain">;</span>
<span class="reserved">break</span><span class="plain">;</span>
<span class="reserved">case</span><span class="plain"> </span><span class="constant">MAPPED_AS_IMW</span><span class="plain">: </span>&lt;<span class="cwebmacro">Parse "Index map with starboard mapped as east"-style sentences</span> <span class="cwebmacronumber">22.1</span>&gt;<span class="plain">;</span>
<span class="reserved">break</span><span class="plain">;</span>
<span class="reserved">case</span><span class="plain"> </span><span class="constant">MAPPED_IMW</span><span class="plain">: </span>&lt;<span class="cwebmacro">Parse "Index map with Ballroom mapped north of the Hallway"-style sentences</span> <span class="cwebmacronumber">22.2</span>&gt;<span class="plain">;</span>
<span class="reserved">break</span><span class="plain">;</span>
<span class="reserved">case</span><span class="plain"> </span><span class="constant">SETTING_IMW</span><span class="plain">: </span>&lt;<span class="cwebmacro">Parse "Index map with room size of Ballroom set to 72"-style sentences</span> <span class="cwebmacronumber">22.4</span>&gt;<span class="plain">;</span>
<span class="reserved">break</span><span class="plain">;</span>
<span class="reserved">case</span><span class="plain"> </span><span class="constant">RUBRIC_IMW</span><span class="plain">:</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">pass</span><span class="plain"> == 2)</span>
&lt;<span class="cwebmacro">Parse "Index map with rubric "Here Be Dragons""-style sentences</span> <span class="cwebmacronumber">22.3</span>&gt;<span class="plain">;</span>
<span class="reserved">break</span><span class="plain">;</span>
<span class="plain">}</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">The function PL::EPSMap::new_map_hint_sentence is used in <a href="#SP15">&#167;15</a>.</p>
<p class="inwebparagraph"><a id="SP22_1"></a><b>&#167;22.1. </b><code class="display">
&lt;<span class="cwebmacrodefn">Parse "Index map with starboard mapped as east"-style sentences</span> <span class="cwebmacronumber">22.1</span>&gt; =
</code></p>
<pre class="displaydefn">
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">pass</span><span class="plain"> == 1)</span>
<span class="functiontext">PL::SpatialMap::map_direction_as_if</span><span class="plain">(&lt;&lt;</span><span class="identifier">instance</span><span class="plain">:</span><span class="identifier">x</span><span class="plain">&gt;&gt;, &lt;&lt;</span><span class="identifier">instance</span><span class="plain">:</span><span class="identifier">y</span><span class="plain">&gt;&gt;);</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">This code is used in <a href="#SP22">&#167;22</a>.</p>
<p class="inwebparagraph"><a id="SP22_2"></a><b>&#167;22.2. </b><code class="display">
&lt;<span class="cwebmacrodefn">Parse "Index map with Ballroom mapped north of the Hallway"-style sentences</span> <span class="cwebmacronumber">22.2</span>&gt; =
</code></p>
<pre class="displaydefn">
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Instances::of_kind</span><span class="plain">(&lt;&lt;</span><span class="identifier">instance</span><span class="plain">:</span><span class="identifier">dir</span><span class="plain">&gt;&gt;, </span><span class="identifier">K_direction</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">pass</span><span class="plain"> == 1) </span><span class="identifier">Problems::Issue::map_problem</span><span class="plain">(</span><span class="identifier">_p_</span><span class="plain">(</span><span class="identifier">PM_MapPlacementDirection</span><span class="plain">),</span>
<span class="identifier">p</span><span class="plain">, </span><span class="string">"The direction given as a hint for map placement wasn't "</span>
<span class="string">"one that I know of."</span><span class="plain">);</span>
<span class="reserved">return</span><span class="plain">;</span>
<span class="plain">}</span>
<span class="identifier">instance</span><span class="plain"> *</span><span class="identifier">I</span><span class="plain"> = &lt;&lt;</span><span class="identifier">instance</span><span class="plain">:</span><span class="identifier">x</span><span class="plain">&gt;&gt;;</span>
<span class="identifier">instance</span><span class="plain"> *</span><span class="identifier">I2</span><span class="plain"> = &lt;&lt;</span><span class="identifier">instance</span><span class="plain">:</span><span class="identifier">y</span><span class="plain">&gt;&gt;;</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">exit</span><span class="plain"> = </span><span class="identifier">PF_I</span><span class="plain">(</span><span class="identifier">map</span><span class="plain">, &lt;&lt;</span><span class="identifier">instance</span><span class="plain">:</span><span class="identifier">dir</span><span class="plain">&gt;&gt;)-</span><span class="element">&gt;direction_index</span><span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">I</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">) || (</span><span class="functiontext">PL::Spatial::object_is_a_room</span><span class="plain">(</span><span class="identifier">I</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">pass</span><span class="plain"> == 1) </span><span class="identifier">Problems::Issue::map_problem</span><span class="plain">(</span><span class="identifier">_p_</span><span class="plain">(</span><span class="identifier">PM_MapFromNonRoom</span><span class="plain">),</span>
<span class="identifier">p</span><span class="plain">, </span><span class="string">"The first-named thing must be a room (beware ambiguities!)."</span><span class="plain">);</span>
<span class="reserved">return</span><span class="plain">;</span>
<span class="plain">}</span>
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">I2</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">) || (</span><span class="functiontext">PL::Spatial::object_is_a_room</span><span class="plain">(</span><span class="identifier">I2</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">pass</span><span class="plain"> == 1) </span><span class="identifier">Problems::Issue::map_problem</span><span class="plain">(</span><span class="identifier">_p_</span><span class="plain">(</span><span class="identifier">PM_MapToNonRoom</span><span class="plain">),</span>
<span class="identifier">p</span><span class="plain">, </span><span class="string">"The second-named thing must be a room (beware ambiguities!)."</span><span class="plain">);</span>
<span class="reserved">return</span><span class="plain">;</span>
<span class="plain">}</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">PL::SpatialMap::direction_is_lateral</span><span class="plain">(</span><span class="identifier">exit</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">pass</span><span class="plain"> == 1) </span><span class="identifier">Problems::Issue::map_problem</span><span class="plain">(</span><span class="identifier">_p_</span><span class="plain">(</span><span class="identifier">PM_MapNonLateral</span><span class="plain">),</span>
<span class="identifier">p</span><span class="plain">, </span><span class="string">"The direction given as a hint for map placement must be "</span>
<span class="string">"a lateral direction (not up, down, above, below, inside "</span>
<span class="string">"or outside)."</span><span class="plain">);</span>
<span class="reserved">return</span><span class="plain">;</span>
<span class="plain">}</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">pass</span><span class="plain"> == 1) </span><span class="functiontext">PL::SpatialMap::lock_exit_in_place</span><span class="plain">(</span><span class="identifier">I</span><span class="plain">, </span><span class="identifier">exit</span><span class="plain">, </span><span class="identifier">I2</span><span class="plain">);</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">This code is used in <a href="#SP22">&#167;22</a>.</p>
<p class="inwebparagraph"><a id="SP22_3"></a><b>&#167;22.3. </b><code class="display">
&lt;<span class="cwebmacrodefn">Parse "Index map with rubric "Here Be Dragons""-style sentences</span> <span class="cwebmacronumber">22.3</span>&gt; =
</code></p>
<pre class="displaydefn">
<span class="identifier">wording</span><span class="plain"> </span><span class="identifier">RW</span><span class="plain"> = </span><span class="identifier">GET_RW</span><span class="plain">(&lt;</span><span class="identifier">index</span><span class="plain">-</span><span class="identifier">map</span><span class="plain">-</span><span class="identifier">sentence</span><span class="plain">-</span><span class="identifier">subject</span><span class="plain">&gt;, 1);</span>
<span class="identifier">wording</span><span class="plain"> </span><span class="identifier">RESTW</span><span class="plain"> = </span><span class="identifier">GET_RW</span><span class="plain">(&lt;</span><span class="identifier">index</span><span class="plain">-</span><span class="identifier">map</span><span class="plain">-</span><span class="identifier">sentence</span><span class="plain">-</span><span class="identifier">subject</span><span class="plain">&gt;, 2);</span>
<span class="identifier">Word::dequote</span><span class="plain">(</span><span class="identifier">Wordings::first_wn</span><span class="plain">(</span><span class="identifier">RW</span><span class="plain">));</span>
<span class="reserved">rubric_holder</span><span class="plain"> *</span><span class="identifier">rh</span><span class="plain"> = </span><span class="identifier">CREATE</span><span class="plain">(</span><span class="reserved">rubric_holder</span><span class="plain">);</span>
<span class="identifier">rh</span><span class="plain">-</span><span class="element">&gt;annotation</span><span class="plain"> = </span><span class="identifier">Lexer::word_text</span><span class="plain">(</span><span class="identifier">Wordings::first_wn</span><span class="plain">(</span><span class="identifier">RW</span><span class="plain">));</span>
<span class="identifier">rh</span><span class="plain">-</span><span class="element">&gt;point_size</span><span class="plain"> = 12; </span> <span class="comment">12-point type</span>
<span class="identifier">rh</span><span class="plain">-</span><span class="element">&gt;font</span><span class="plain"> = </span><span class="identifier">L</span><span class="string">"&lt;font&gt;"</span><span class="plain">; </span> <span class="comment">meaning the default font</span>
<span class="identifier">rh</span><span class="plain">-</span><span class="element">&gt;colour</span><span class="plain"> = </span><span class="identifier">L</span><span class="string">"000000"</span><span class="plain">; </span> <span class="comment">black</span>
<span class="identifier">rh</span><span class="plain">-</span><span class="element">&gt;at_offset</span><span class="plain"> = 10001; </span> <span class="comment">the offset (1, 1)</span>
<span class="identifier">rh</span><span class="plain">-</span><span class="element">&gt;offset_from</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">i</span><span class="plain"> = </span><span class="identifier">Wordings::first_wn</span><span class="plain">(</span><span class="identifier">RESTW</span><span class="plain">);</span>
<span class="reserved">while</span><span class="plain"> (</span><span class="identifier">i</span><span class="plain"> &lt;= </span><span class="identifier">Wordings::last_wn</span><span class="plain">(</span><span class="identifier">RESTW</span><span class="plain">)) {</span>
<span class="reserved">if</span><span class="plain"> (&lt;</span><span class="identifier">map</span><span class="plain">-</span><span class="identifier">rubric</span><span class="plain">&gt;(</span><span class="identifier">Wordings::from</span><span class="plain">(</span><span class="identifier">RESTW</span><span class="plain">, </span><span class="identifier">i</span><span class="plain">))) {</span>
<span class="identifier">i</span><span class="plain"> = &lt;&lt;</span><span class="identifier">edge</span><span class="plain">&gt;&gt;;</span>
<span class="reserved">switch</span><span class="plain"> (&lt;&lt;</span><span class="identifier">r</span><span class="plain">&gt;&gt;) {</span>
<span class="reserved">case</span><span class="plain"> </span><span class="constant">RUBRIC_SIZE</span><span class="plain">:</span>
<span class="identifier">rh</span><span class="plain">-</span><span class="element">&gt;point_size</span><span class="plain"> = &lt;&lt;</span><span class="identifier">rsize</span><span class="plain">&gt;&gt;;</span>
<span class="reserved">break</span><span class="plain">;</span>
<span class="reserved">case</span><span class="plain"> </span><span class="constant">RUBRIC_FONT</span><span class="plain">:</span>
<span class="identifier">Word::dequote</span><span class="plain">(&lt;&lt;</span><span class="identifier">rfont</span><span class="plain">&gt;&gt;);</span>
<span class="identifier">rh</span><span class="plain">-</span><span class="element">&gt;font</span><span class="plain"> = </span><span class="identifier">Lexer::word_text</span><span class="plain">(&lt;&lt;</span><span class="identifier">rfont</span><span class="plain">&gt;&gt;);</span>
<span class="reserved">break</span><span class="plain">;</span>
<span class="reserved">case</span><span class="plain"> </span><span class="constant">RUBRIC_COLOUR</span><span class="plain">:</span>
&lt;<span class="cwebmacro">Make a rubric colour setting</span> <span class="cwebmacronumber">22.3.1</span>&gt;<span class="plain">; </span><span class="reserved">break</span><span class="plain">;</span>
<span class="reserved">case</span><span class="plain"> </span><span class="constant">RUBRIC_OFFSET</span><span class="plain">:</span>
<span class="reserved">case</span><span class="plain"> </span><span class="constant">RUBRIC_POSITION</span><span class="plain">:</span>
&lt;<span class="cwebmacro">Make a rubric offset setting</span> <span class="cwebmacronumber">22.3.2</span>&gt;<span class="plain">; </span><span class="reserved">break</span><span class="plain">;</span>
<span class="plain">}</span>
<span class="plain">} </span><span class="reserved">else</span><span class="plain"> {</span>
<span class="identifier">Problems::Issue::map_problem</span><span class="plain">(</span><span class="identifier">_p_</span><span class="plain">(</span><span class="identifier">PM_MapBadRubric</span><span class="plain">),</span>
<span class="identifier">p</span><span class="plain">, </span><span class="string">"Unfortunately the details of that rubric seem to be "</span>
<span class="string">"in error (a lame message, but an accurate one)."</span><span class="plain">);</span>
<span class="reserved">break</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="#SP22">&#167;22</a>.</p>
<p class="inwebparagraph"><a id="SP22_3_1"></a><b>&#167;22.3.1. </b><code class="display">
&lt;<span class="cwebmacrodefn">Make a rubric colour setting</span> <span class="cwebmacronumber">22.3.1</span>&gt; =
</code></p>
<pre class="displaydefn">
<span class="identifier">Word::dequote</span><span class="plain">(&lt;&lt;</span><span class="identifier">rcol</span><span class="plain">&gt;&gt;);</span>
<span class="identifier">wchar_t</span><span class="plain"> *</span><span class="identifier">thec</span><span class="plain"> = </span><span class="identifier">HTML::translate_colour_name</span><span class="plain">(</span><span class="identifier">Lexer::word_text</span><span class="plain">(&lt;&lt;</span><span class="identifier">rcol</span><span class="plain">&gt;&gt;));</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">thec</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">) {</span>
<span class="identifier">Problems::Issue::map_problem</span><span class="plain">(</span><span class="identifier">_p_</span><span class="plain">(</span><span class="identifier">PM_MapUnknownColour</span><span class="plain">), </span><span class="identifier">p</span><span class="plain">, </span><span class="string">"There's no such map colour."</span><span class="plain">);</span>
<span class="reserved">return</span><span class="plain">;</span>
<span class="plain">}</span>
<span class="identifier">rh</span><span class="plain">-</span><span class="element">&gt;colour</span><span class="plain"> = </span><span class="identifier">thec</span><span class="plain">;</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">This code is used in <a href="#SP22_3">&#167;22.3</a>.</p>
<p class="inwebparagraph"><a id="SP22_3_2"></a><b>&#167;22.3.2. </b><code class="display">
&lt;<span class="cwebmacrodefn">Make a rubric offset setting</span> <span class="cwebmacronumber">22.3.2</span>&gt; =
</code></p>
<pre class="displaydefn">
<span class="reserved">if</span><span class="plain"> (&lt;&lt;</span><span class="identifier">roff</span><span class="plain">&gt;&gt; == </span><span class="constant">ERRONEOUS_OFFSET_VALUE</span><span class="plain">) {</span>
<span class="identifier">Problems::Issue::map_problem</span><span class="plain">(</span><span class="identifier">_p_</span><span class="plain">(</span><span class="identifier">PM_MapUnknownOffset</span><span class="plain">), </span><span class="identifier">p</span><span class="plain">, </span><span class="string">"There's no such offset."</span><span class="plain">);</span>
<span class="reserved">return</span><span class="plain">;</span>
<span class="plain">}</span>
<span class="identifier">rh</span><span class="plain">-</span><span class="element">&gt;at_offset</span><span class="plain"> = &lt;&lt;</span><span class="identifier">roff</span><span class="plain">&gt;&gt;;</span>
<span class="reserved">if</span><span class="plain"> (&lt;&lt;</span><span class="identifier">r</span><span class="plain">&gt;&gt; == </span><span class="constant">RUBRIC_OFFSET</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">Instances::parse_object</span><span class="plain">(</span><span class="identifier">Wordings::from</span><span class="plain">(</span><span class="identifier">ParseTree::get_text</span><span class="plain">(</span><span class="identifier">p</span><span class="plain">), </span><span class="identifier">i</span><span class="plain">));</span>
<span class="identifier">i</span><span class="plain"> = </span><span class="identifier">Wordings::last_wn</span><span class="plain">(</span><span class="identifier">RESTW</span><span class="plain">) + 1;</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">I</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">) {</span>
<span class="identifier">Problems::Issue::map_problem</span><span class="plain">(</span><span class="identifier">_p_</span><span class="plain">(</span><span class="identifier">PM_MapUnknownOffsetBase</span><span class="plain">),</span>
<span class="identifier">p</span><span class="plain">, </span><span class="string">"There's no such room to be offset from."</span><span class="plain">);</span>
<span class="reserved">return</span><span class="plain">;</span>
<span class="plain">}</span>
<span class="identifier">rh</span><span class="plain">-</span><span class="element">&gt;offset_from</span><span class="plain"> = </span><span class="identifier">I</span><span class="plain">;</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">This code is used in <a href="#SP22_3">&#167;22.3</a>.</p>
<p class="inwebparagraph"><a id="SP22_4"></a><b>&#167;22.4. </b>Finally, then, sentences which set parameters for the EPS map-maker.
</p>
<p class="macrodefinition"><code class="display">
&lt;<span class="cwebmacrodefn">Parse "Index map with room size of Ballroom set to 72"-style sentences</span> <span class="cwebmacronumber">22.4</span>&gt; =
</code></p>
<pre class="displaydefn">
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">allow_on_pass_2</span><span class="plain"> = </span><span class="identifier">FALSE</span><span class="plain">;</span>
<span class="reserved">map_parameter_scope</span><span class="plain"> *</span><span class="identifier">scope</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
<span class="identifier">instance</span><span class="plain"> *</span><span class="identifier">scope_I</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
<span class="identifier">kind</span><span class="plain"> *</span><span class="identifier">scope_k</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
&lt;<span class="cwebmacro">Determine the scope for which the parameter is being set</span> <span class="cwebmacronumber">22.4.1</span>&gt;<span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">allow_on_pass_2</span><span class="plain"> == </span><span class="identifier">FALSE</span><span class="plain">) &amp;&amp; (</span><span class="identifier">pass</span><span class="plain"> == 2)) </span><span class="reserved">return</span><span class="plain">;</span>
<span class="identifier">wchar_t</span><span class="plain"> *</span><span class="identifier">parameter_name</span><span class="plain"> = &lt;&lt;</span><span class="identifier">wchar_t</span><span class="plain">:</span><span class="identifier">partext</span><span class="plain">&gt;&gt;;</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">index_of_parameter</span><span class="plain"> = &lt;&lt;</span><span class="identifier">parindex</span><span class="plain">&gt;&gt;;</span>
&lt;<span class="cwebmacro">Check that the value has the right type for this map parameter, and set it</span> <span class="cwebmacronumber">22.4.2</span>&gt;<span class="plain">;</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">This code is used in <a href="#SP22">&#167;22</a>.</p>
<p class="inwebparagraph"><a id="SP22_4_1"></a><b>&#167;22.4.1. </b><code class="display">
&lt;<span class="cwebmacrodefn">Determine the scope for which the parameter is being set</span> <span class="cwebmacronumber">22.4.1</span>&gt; =
</code></p>
<pre class="displaydefn">
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">bad_scope</span><span class="plain"> = </span><span class="identifier">FALSE</span><span class="plain">;</span>
<span class="reserved">switch</span><span class="plain"> (&lt;&lt;</span><span class="identifier">scoping</span><span class="plain">&gt;&gt;) {</span>
<span class="reserved">case</span><span class="plain"> </span><span class="constant">FIRST_ROOM_MAP_SCOPE</span><span class="plain">:</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">benchmark_room</span><span class="plain">) </span><span class="identifier">scope_I</span><span class="plain"> = </span><span class="identifier">benchmark_room</span><span class="plain">;</span>
<span class="reserved">break</span><span class="plain">;</span>
<span class="reserved">case</span><span class="plain"> </span><span class="constant">LEVEL_MAP_SCOPE</span><span class="plain">:</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">pass</span><span class="plain"> == 1) </span><span class="reserved">return</span><span class="plain">; </span> <span class="comment">we'll pick this up on pass 2 when levels exist</span>
<span class="identifier">allow_on_pass_2</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">ln</span><span class="plain"> = &lt;&lt;</span><span class="identifier">level</span><span class="plain">&gt;&gt;;</span>
<span class="reserved">EPS_map_level</span><span class="plain"> *</span><span class="identifier">eml</span><span class="plain">;</span>
<span class="identifier">LOOP_OVER</span><span class="plain">(</span><span class="identifier">eml</span><span class="plain">, </span><span class="reserved">EPS_map_level</span><span class="plain">)</span>
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">eml</span><span class="plain">-</span><span class="element">&gt;contains_rooms</span><span class="plain">)</span>
<span class="plain">&amp;&amp; (</span><span class="identifier">eml</span><span class="plain">-</span><span class="element">&gt;map_level</span><span class="plain"> - </span><span class="identifier">Room_position</span><span class="plain">(</span><span class="identifier">benchmark_room</span><span class="plain">).</span><span class="identifier">z</span><span class="plain"> == </span><span class="identifier">ln</span><span class="plain">))</span>
<span class="identifier">scope</span><span class="plain"> = &amp;(</span><span class="identifier">eml</span><span class="plain">-</span><span class="element">&gt;map_parameters</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">scope</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">) {</span>
<span class="identifier">Problems::Issue::map_problem</span><span class="plain">(</span><span class="identifier">_p_</span><span class="plain">(</span><span class="identifier">PM_MapLevelMisnamed</span><span class="plain">),</span>
<span class="identifier">p</span><span class="plain">, </span><span class="string">"Layers of the map must be called 'level N', where "</span>
<span class="string">"N is a number, and level 0 is the one which contains "</span>
<span class="string">"the first room."</span><span class="plain">);</span>
<span class="reserved">return</span><span class="plain">;</span>
<span class="plain">}</span>
<span class="reserved">break</span><span class="plain">;</span>
<span class="reserved">case</span><span class="plain"> </span><span class="constant">KIND_MAP_SCOPE</span><span class="plain">:</span>
<span class="identifier">scope_k</span><span class="plain"> = &lt;&lt;</span><span class="identifier">kind</span><span class="plain">:</span><span class="identifier">kscope</span><span class="plain">&gt;&gt;;</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Kinds::Compare::lt</span><span class="plain">(</span><span class="identifier">scope_k</span><span class="plain">, </span><span class="identifier">K_object</span><span class="plain">) == </span><span class="identifier">FALSE</span><span class="plain">) </span><span class="identifier">scope_k</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="identifier">scope_k</span><span class="plain">) &amp;&amp;</span>
<span class="plain">((</span><span class="identifier">Kinds::Compare::le</span><span class="plain">(</span><span class="identifier">scope_k</span><span class="plain">, </span><span class="identifier">K_room</span><span class="plain">)) ||</span>
<span class="plain">(</span><span class="identifier">Kinds::Compare::le</span><span class="plain">(</span><span class="identifier">scope_k</span><span class="plain">, </span><span class="identifier">K_region</span><span class="plain">)))) {</span>
<span class="identifier">LOGIF</span><span class="plain">(</span><span class="identifier">SPATIAL_MAP</span><span class="plain">, </span><span class="string">"Setting for kind $u\</span><span class="plain">n</span><span class="string">"</span><span class="plain">, </span><span class="identifier">scope_k</span><span class="plain">);</span>
<span class="plain">} </span><span class="reserved">else</span><span class="plain"> </span><span class="identifier">bad_scope</span><span class="plain"> = </span><span class="identifier">TRUE</span><span class="plain">;</span>
<span class="reserved">break</span><span class="plain">;</span>
<span class="reserved">case</span><span class="plain"> </span><span class="constant">INSTANCE_MAP_SCOPE</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">(&lt;&lt;</span><span class="identifier">instance</span><span class="plain">:</span><span class="identifier">iscope</span><span class="plain">&gt;&gt;)) ||</span>
<span class="plain">(</span><span class="functiontext">PL::Regions::object_is_a_region</span><span class="plain">(&lt;&lt;</span><span class="identifier">instance</span><span class="plain">:</span><span class="identifier">iscope</span><span class="plain">&gt;&gt;)))</span>
<span class="identifier">scope_I</span><span class="plain"> = &lt;&lt;</span><span class="identifier">instance</span><span class="plain">:</span><span class="identifier">iscope</span><span class="plain">&gt;&gt;;</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">scope_I</span><span class="plain">) {</span>
<span class="identifier">LOGIF</span><span class="plain">(</span><span class="identifier">SPATIAL_MAP</span><span class="plain">, </span><span class="string">"Setting for object $O\</span><span class="plain">n</span><span class="string">"</span><span class="plain">, </span><span class="identifier">scope_I</span><span class="plain">);</span>
<span class="plain">} </span><span class="reserved">else</span><span class="plain"> </span><span class="identifier">bad_scope</span><span class="plain"> = </span><span class="identifier">TRUE</span><span class="plain">;</span>
<span class="reserved">break</span><span class="plain">;</span>
<span class="reserved">case</span><span class="plain"> </span><span class="constant">ENTIRE_MAP_SCOPE</span><span class="plain">:</span>
<span class="identifier">scope_k</span><span class="plain"> = </span><span class="identifier">K_room</span><span class="plain">;</span>
<span class="reserved">break</span><span class="plain">;</span>
<span class="plain">}</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">bad_scope</span><span class="plain">) {</span>
&lt;<span class="cwebmacro">Actually issue PM_MapSettingOfUnknown problem</span> <span class="cwebmacronumber">17.4.1</span>&gt;<span class="plain">;</span>
<span class="reserved">return</span><span class="plain">;</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">This code is used in <a href="#SP22_4">&#167;22.4</a>.</p>
<p class="inwebparagraph"><a id="SP17_4_1"></a><b>&#167;17.4.1. </b><code class="display">
&lt;<span class="cwebmacrodefn">Actually issue PM_MapSettingOfUnknown problem</span> <span class="cwebmacronumber">17.4.1</span>&gt; =
</code></p>
<pre class="displaydefn">
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">index_map_with_pass</span><span class="plain"> == 1) {</span>
<span class="identifier">Problems::Issue::map_problem</span><span class="plain">(</span><span class="identifier">_p_</span><span class="plain">(</span><span class="identifier">PM_MapSettingOfUnknown</span><span class="plain">),</span>
<span class="identifier">index_map_with_p</span><span class="plain">, </span><span class="string">"The parameter has to be 'of' either 'the first room' "</span>
<span class="string">"or a specific named room (beware ambiguities!) or "</span>
<span class="string">"a level such as 'level 0' (the first room is by "</span>
<span class="string">"definition on level 0), or a region, or a kind of room."</span><span class="plain">);</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">This code is used in <a href="#SP17_4">&#167;17.4</a>, <a href="#SP22_4_1">&#167;22.4.1</a>.</p>
<p class="inwebparagraph"><a id="SP22_4_2"></a><b>&#167;22.4.2. </b><code class="display">
&lt;<span class="cwebmacrodefn">Check that the value has the right type for this map parameter, and set it</span> <span class="cwebmacronumber">22.4.2</span>&gt; =
</code></p>
<pre class="displaydefn">
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">type_wanted</span><span class="plain"> = </span><span class="identifier">global_map_scope</span><span class="element">.values</span><span class="plain">[</span><span class="identifier">index_of_parameter</span><span class="plain">]</span><span class="element">.parameter_data_type</span><span class="plain">;</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">type_found</span><span class="plain"> = &lt;&lt;</span><span class="identifier">msvtype</span><span class="plain">&gt;&gt;;</span>
<span class="reserved">char</span><span class="plain"> *</span><span class="identifier">i_wanted_a</span><span class="plain"> = </span><span class="string">""</span><span class="plain">;</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">wn</span><span class="plain"> = &lt;&lt;</span><span class="identifier">msword</span><span class="plain">&gt;&gt;;</span>
<span class="reserved">switch</span><span class="plain">(</span><span class="identifier">type_wanted</span><span class="plain">) {</span>
<span class="reserved">case</span><span class="plain"> </span><span class="constant">INT_MDT</span><span class="plain">: </span><span class="identifier">i_wanted_a</span><span class="plain"> = </span><span class="string">"an integer"</span><span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">type_found</span><span class="plain"> == </span><span class="constant">INT_MDT</span><span class="plain">) {</span>
<span class="functiontext">PL::EPSMap::put_mp</span><span class="plain">(</span><span class="identifier">parameter_name</span><span class="plain">, </span><span class="identifier">scope</span><span class="plain">, </span><span class="identifier">scope_I</span><span class="plain">, </span><span class="identifier">scope_k</span><span class="plain">, </span><span class="identifier">NULL</span><span class="plain">, &lt;&lt;</span><span class="identifier">msvalue</span><span class="plain">&gt;&gt;);</span>
<span class="reserved">return</span><span class="plain">;</span>
<span class="plain">}</span>
<span class="reserved">break</span><span class="plain">;</span>
<span class="reserved">case</span><span class="plain"> </span><span class="constant">OFF_MDT</span><span class="plain">: </span><span class="identifier">i_wanted_a</span><span class="plain"> = </span><span class="string">"an offset in the form 34&amp;-450"</span><span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">type_found</span><span class="plain"> == </span><span class="constant">OFF_MDT</span><span class="plain">) {</span>
<span class="functiontext">PL::EPSMap::put_mp</span><span class="plain">(</span><span class="identifier">parameter_name</span><span class="plain">, </span><span class="identifier">scope</span><span class="plain">, </span><span class="identifier">scope_I</span><span class="plain">, </span><span class="identifier">scope_k</span><span class="plain">, </span><span class="identifier">NULL</span><span class="plain">, &lt;&lt;</span><span class="identifier">msvalue</span><span class="plain">&gt;&gt;);</span>
<span class="reserved">return</span><span class="plain">;</span>
<span class="plain">}</span>
<span class="reserved">break</span><span class="plain">;</span>
<span class="reserved">case</span><span class="plain"> </span><span class="constant">BOOL_MDT</span><span class="plain">: </span><span class="identifier">i_wanted_a</span><span class="plain"> = </span><span class="string">"'on' or 'off'"</span><span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">type_found</span><span class="plain"> == </span><span class="constant">BOOL_MDT</span><span class="plain">) {</span>
<span class="functiontext">PL::EPSMap::put_mp</span><span class="plain">(</span><span class="identifier">parameter_name</span><span class="plain">, </span><span class="identifier">scope</span><span class="plain">, </span><span class="identifier">scope_I</span><span class="plain">, </span><span class="identifier">scope_k</span><span class="plain">, </span><span class="identifier">NULL</span><span class="plain">, &lt;&lt;</span><span class="identifier">msvalue</span><span class="plain">&gt;&gt;);</span>
<span class="reserved">return</span><span class="plain">;</span>
<span class="plain">}</span>
<span class="reserved">break</span><span class="plain">;</span>
<span class="reserved">case</span><span class="plain"> </span><span class="constant">TEXT_MDT</span><span class="plain">: </span><span class="identifier">i_wanted_a</span><span class="plain"> = </span><span class="string">"some text in double-quotes"</span><span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">type_found</span><span class="plain"> == </span><span class="constant">TEXT_MDT</span><span class="plain">) {</span>
<span class="identifier">Word::dequote</span><span class="plain">(</span><span class="identifier">wn</span><span class="plain">);</span>
<span class="functiontext">PL::EPSMap::put_mp</span><span class="plain">(</span><span class="identifier">parameter_name</span><span class="plain">, </span><span class="identifier">scope</span><span class="plain">, </span><span class="identifier">scope_I</span><span class="plain">, </span><span class="identifier">scope_k</span><span class="plain">, </span><span class="identifier">Lexer::word_text</span><span class="plain">(</span><span class="identifier">wn</span><span class="plain">), 0);</span>
<span class="reserved">return</span><span class="plain">;</span>
<span class="plain">}</span>
<span class="reserved">break</span><span class="plain">;</span>
<span class="reserved">case</span><span class="plain"> </span><span class="constant">FONT_MDT</span><span class="plain">: </span><span class="identifier">i_wanted_a</span><span class="plain"> = </span><span class="string">"a font name in double-quotes"</span><span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">type_found</span><span class="plain"> == </span><span class="constant">TEXT_MDT</span><span class="plain">) {</span>
<span class="identifier">Word::dequote</span><span class="plain">(</span><span class="identifier">wn</span><span class="plain">);</span>
<span class="functiontext">PL::EPSMap::put_mp</span><span class="plain">(</span><span class="identifier">parameter_name</span><span class="plain">, </span><span class="identifier">scope</span><span class="plain">, </span><span class="identifier">scope_I</span><span class="plain">, </span><span class="identifier">scope_k</span><span class="plain">, </span><span class="identifier">Lexer::word_text</span><span class="plain">(</span><span class="identifier">wn</span><span class="plain">), 0);</span>
<span class="reserved">return</span><span class="plain">;</span>
<span class="plain">}</span>
<span class="reserved">break</span><span class="plain">;</span>
<span class="reserved">case</span><span class="plain"> </span><span class="constant">COL_MDT</span><span class="plain">: </span><span class="identifier">i_wanted_a</span><span class="plain"> = </span><span class="string">"a colour name in double-quotes"</span><span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">type_found</span><span class="plain"> == </span><span class="constant">TEXT_MDT</span><span class="plain">) {</span>
<span class="identifier">Word::dequote</span><span class="plain">(</span><span class="identifier">wn</span><span class="plain">);</span>
<span class="identifier">wchar_t</span><span class="plain"> *</span><span class="identifier">col</span><span class="plain"> = </span><span class="identifier">HTML::translate_colour_name</span><span class="plain">(</span><span class="identifier">Lexer::word_text</span><span class="plain">(</span><span class="identifier">wn</span><span class="plain">));</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">col</span><span class="plain">) {</span>
<span class="functiontext">PL::EPSMap::put_mp</span><span class="plain">(</span><span class="identifier">parameter_name</span><span class="plain">, </span><span class="identifier">scope</span><span class="plain">, </span><span class="identifier">scope_I</span><span class="plain">, </span><span class="identifier">scope_k</span><span class="plain">, </span><span class="identifier">col</span><span class="plain">, 0);</span>
<span class="reserved">return</span><span class="plain">;</span>
<span class="plain">}</span>
<span class="plain">}</span>
<span class="reserved">break</span><span class="plain">;</span>
<span class="reserved">default</span><span class="plain">: </span><span class="identifier">internal_error</span><span class="plain">(</span><span class="string">"Unexpected map parameter data type"</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">pass</span><span class="plain"> == 1) </span><span class="identifier">Problems::Issue::map_problem_wanted_but</span><span class="plain">(</span><span class="identifier">_p_</span><span class="plain">(</span><span class="identifier">PM_MapSettingTypeFailed</span><span class="plain">),</span>
<span class="identifier">p</span><span class="plain">, </span><span class="identifier">i_wanted_a</span><span class="plain">, </span><span class="identifier">wn</span><span class="plain">);</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">This code is used in <a href="#SP22_4">&#167;22.4</a>.</p>
<p class="inwebparagraph"><a id="SP23"></a><b>&#167;23. Offset notation. </b>The offset parameter (x, y) is stored as the integer 10000y + x. Except
for the error value, we are required to have -9999 &lt;= x, y &lt;= 9999, and
the syntax to specify this is two literal numbers divided by an ampersand.
For instance, <code class="display"><span class="extract">28&amp;-125</span></code> means (28, -125) which is stored as -1249972.
</p>
<pre class="definitions">
<span class="definitionkeyword">define</span> <span class="constant">ERRONEOUS_OFFSET_VALUE</span><span class="plain"> 100000000</span>
</pre>
<pre class="display">
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">PL::EPSMap::parse_eps_map_offset</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">TEMPORARY_TEXT</span><span class="plain">(</span><span class="identifier">offs</span><span class="plain">);</span>
<span class="identifier">WRITE_TO</span><span class="plain">(</span><span class="identifier">offs</span><span class="plain">, </span><span class="string">"%W"</span><span class="plain">, </span><span class="identifier">Wordings::one_word</span><span class="plain">(</span><span class="identifier">Wordings::first_wn</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">Str::len</span><span class="plain">(</span><span class="identifier">offs</span><span class="plain">) &gt;= 30) </span><span class="reserved">return</span><span class="plain"> </span><span class="constant">ERRONEOUS_OFFSET_VALUE</span><span class="plain">;</span>
<span class="identifier">match_results</span><span class="plain"> </span><span class="identifier">mr</span><span class="plain"> = </span><span class="identifier">Regexp::create_mr</span><span class="plain">();</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">xbit</span><span class="plain"> = 0, </span><span class="identifier">ybit</span><span class="plain"> = 0;</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Regexp::match</span><span class="plain">(&amp;</span><span class="identifier">mr</span><span class="plain">, </span><span class="identifier">offs</span><span class="plain">, </span><span class="identifier">L</span><span class="string">"(%c*?)&amp;(%c*)"</span><span class="plain">)) {</span>
<span class="identifier">xbit</span><span class="plain"> = </span><span class="identifier">Str::atoi</span><span class="plain">(</span><span class="identifier">mr</span><span class="plain">.</span><span class="identifier">exp</span><span class="plain">[0], 0), </span><span class="identifier">ybit</span><span class="plain"> = </span><span class="identifier">Str::atoi</span><span class="plain">(</span><span class="identifier">mr</span><span class="plain">.</span><span class="identifier">exp</span><span class="plain">[1], 0);</span>
<span class="identifier">Regexp::dispose_of</span><span class="plain">(&amp;</span><span class="identifier">mr</span><span class="plain">);</span>
<span class="plain">} </span><span class="reserved">else</span><span class="plain"> </span><span class="reserved">return</span><span class="plain"> </span><span class="constant">ERRONEOUS_OFFSET_VALUE</span><span class="plain">;</span>
<span class="identifier">DISCARD_TEXT</span><span class="plain">(</span><span class="identifier">offs</span><span class="plain">);</span>
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">xbit</span><span class="plain"> + </span><span class="identifier">ybit</span><span class="plain">*10000;</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">The function PL::EPSMap::parse_eps_map_offset is used in <a href="#SP20">&#167;20</a>.</p>
<p class="inwebparagraph"><a id="SP24"></a><b>&#167;24. </b></p>
<pre class="display">
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">PL::EPSMap::render_map_as_EPS</span><span class="plain">(</span><span class="reserved">void</span><span class="plain">) {</span>
&lt;<span class="cwebmacro">Create the main EPS map super-level</span> <span class="cwebmacronumber">24.1</span>&gt;<span class="plain">;</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">z</span><span class="plain">;</span>
<span class="reserved">for</span><span class="plain"> (</span><span class="identifier">z</span><span class="plain">=</span><span class="identifier">Universe</span><span class="element">.corner1</span><span class="plain">.</span><span class="identifier">z</span><span class="plain">; </span><span class="identifier">z</span><span class="plain">&gt;=</span><span class="identifier">Universe</span><span class="element">.corner0</span><span class="plain">.</span><span class="identifier">z</span><span class="plain">; </span><span class="identifier">z</span><span class="plain">--)</span>
&lt;<span class="cwebmacro">Create an EPS map level for this z-slice</span> <span class="cwebmacronumber">24.2</span>&gt;<span class="plain">;</span>
<span class="functiontext">PL::EPSMap::traverse_for_map_parameters</span><span class="plain">(2);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">changed_global_room_colour</span><span class="plain"> == </span><span class="identifier">FALSE</span><span class="plain">)</span>
&lt;<span class="cwebmacro">Inherit EPS room colours from those used in the World Index</span> <span class="cwebmacronumber">24.3</span>&gt;<span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">write_EPS_format_map</span><span class="plain">) </span>&lt;<span class="cwebmacro">Open a stream and write the EPS map to it</span> <span class="cwebmacronumber">24.4</span>&gt;<span class="plain">;</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">The function PL::EPSMap::render_map_as_EPS appears nowhere else.</p>
<p class="inwebparagraph"><a id="SP24_1"></a><b>&#167;24.1. </b><code class="display">
&lt;<span class="cwebmacrodefn">Create the main EPS map super-level</span> <span class="cwebmacronumber">24.1</span>&gt; =
</code></p>
<pre class="displaydefn">
<span class="reserved">EPS_map_level</span><span class="plain"> *</span><span class="identifier">main_eml</span><span class="plain"> = </span><span class="identifier">CREATE</span><span class="plain">(</span><span class="reserved">EPS_map_level</span><span class="plain">);</span>
<span class="identifier">main_eml</span><span class="plain">-</span><span class="element">&gt;width</span><span class="plain"> = </span><span class="functiontext">PL::EPSMap::get_int_mp</span><span class="plain">(</span><span class="identifier">L</span><span class="string">"minimum-map-width"</span><span class="plain">, </span><span class="identifier">NULL</span><span class="plain">);</span>
<span class="identifier">main_eml</span><span class="plain">-</span><span class="element">&gt;actual_height</span><span class="plain"> = 0;</span>
<span class="identifier">main_eml</span><span class="plain">-</span><span class="element">&gt;titling_point_size</span><span class="plain"> = </span><span class="functiontext">PL::EPSMap::get_int_mp</span><span class="plain">(</span><span class="identifier">L</span><span class="string">"title-size"</span><span class="plain">, </span><span class="identifier">NULL</span><span class="plain">);</span>
<span class="identifier">main_eml</span><span class="plain">-</span><span class="element">&gt;titling</span><span class="plain"> = </span><span class="identifier">Str::new</span><span class="plain">();</span>
<span class="identifier">WRITE_TO</span><span class="plain">(</span><span class="identifier">main_eml</span><span class="plain">-</span><span class="element">&gt;titling</span><span class="plain">, </span><span class="string">"Map"</span><span class="plain">);</span>
<span class="identifier">main_eml</span><span class="plain">-</span><span class="element">&gt;contains_titling</span><span class="plain"> = </span><span class="identifier">TRUE</span><span class="plain">;</span>
<span class="identifier">main_eml</span><span class="plain">-</span><span class="element">&gt;contains_rooms</span><span class="plain"> = </span><span class="identifier">FALSE</span><span class="plain">;</span>
<span class="functiontext">PL::EPSMap::prepare_map_parameter_scope</span><span class="plain">(&amp;(</span><span class="identifier">main_eml</span><span class="plain">-</span><span class="element">&gt;map_parameters</span><span class="plain">));</span>
<span class="functiontext">PL::EPSMap::put_stream_mp</span><span class="plain">(</span><span class="identifier">L</span><span class="string">"title"</span><span class="plain">, &amp;(</span><span class="identifier">main_eml</span><span class="plain">-</span><span class="element">&gt;map_parameters</span><span class="plain">), </span><span class="identifier">main_eml</span><span class="plain">-</span><span class="element">&gt;titling</span><span class="plain">);</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">This code is used in <a href="#SP24">&#167;24</a>.</p>
<p class="inwebparagraph"><a id="SP24_2"></a><b>&#167;24.2. </b><code class="display">
&lt;<span class="cwebmacrodefn">Create an EPS map level for this z-slice</span> <span class="cwebmacronumber">24.2</span>&gt; =
</code></p>
<pre class="displaydefn">
<span class="reserved">EPS_map_level</span><span class="plain"> *</span><span class="identifier">eml</span><span class="plain"> = </span><span class="identifier">CREATE</span><span class="plain">(</span><span class="reserved">EPS_map_level</span><span class="plain">);</span>
<span class="identifier">eml</span><span class="plain">-</span><span class="element">&gt;contains_rooms</span><span class="plain"> = </span><span class="identifier">TRUE</span><span class="plain">;</span>
<span class="identifier">eml</span><span class="plain">-</span><span class="element">&gt;map_level</span><span class="plain"> = </span><span class="identifier">z</span><span class="plain">;</span>
<span class="identifier">eml</span><span class="plain">-</span><span class="element">&gt;y_max</span><span class="plain"> = -100000, </span><span class="identifier">eml</span><span class="plain">-</span><span class="element">&gt;y_min</span><span class="plain"> = 100000;</span>
<span class="identifier">instance</span><span class="plain"> *</span><span class="identifier">R</span><span class="plain">;</span>
<span class="identifier">LOOP_OVER_ROOMS</span><span class="plain">(</span><span class="identifier">R</span><span class="plain">)</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Room_position</span><span class="plain">(</span><span class="identifier">R</span><span class="plain">).</span><span class="identifier">z</span><span class="plain"> == </span><span class="identifier">z</span><span class="plain">) {</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Room_position</span><span class="plain">(</span><span class="identifier">R</span><span class="plain">).</span><span class="identifier">y</span><span class="plain"> &lt; </span><span class="identifier">eml</span><span class="plain">-</span><span class="element">&gt;y_min</span><span class="plain">) </span><span class="identifier">eml</span><span class="plain">-</span><span class="element">&gt;y_min</span><span class="plain"> = </span><span class="identifier">Room_position</span><span class="plain">(</span><span class="identifier">R</span><span class="plain">).</span><span class="identifier">y</span><span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Room_position</span><span class="plain">(</span><span class="identifier">R</span><span class="plain">).</span><span class="identifier">y</span><span class="plain"> &gt; </span><span class="identifier">eml</span><span class="plain">-</span><span class="element">&gt;y_max</span><span class="plain">) </span><span class="identifier">eml</span><span class="plain">-</span><span class="element">&gt;y_max</span><span class="plain"> = </span><span class="identifier">Room_position</span><span class="plain">(</span><span class="identifier">R</span><span class="plain">).</span><span class="identifier">y</span><span class="plain">;</span>
<span class="plain">}</span>
<span class="identifier">Str::clear</span><span class="plain">(</span><span class="identifier">eml</span><span class="plain">-</span><span class="element">&gt;titling</span><span class="plain">);</span>
<span class="reserved">char</span><span class="plain"> *</span><span class="identifier">level_rubric</span><span class="plain"> = </span><span class="string">"Map"</span><span class="plain">; </span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">par</span><span class="plain"> = 0;</span>
<span class="functiontext">PL::HTMLMap::devise_level_rubric</span><span class="plain">(</span><span class="identifier">z</span><span class="plain">, &amp;</span><span class="identifier">level_rubric</span><span class="plain">, &amp;</span><span class="identifier">par</span><span class="plain">);</span>
<span class="identifier">WRITE_TO</span><span class="plain">(</span><span class="identifier">eml</span><span class="plain">-</span><span class="element">&gt;titling</span><span class="plain">, </span><span class="identifier">level_rubric</span><span class="plain">, </span><span class="identifier">par</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Str::len</span><span class="plain">(</span><span class="identifier">eml</span><span class="plain">-</span><span class="element">&gt;titling</span><span class="plain">) == 0) </span><span class="identifier">eml</span><span class="plain">-</span><span class="element">&gt;contains_titling</span><span class="plain"> = </span><span class="identifier">FALSE</span><span class="plain">;</span>
<span class="reserved">else</span><span class="plain"> </span><span class="identifier">eml</span><span class="plain">-</span><span class="element">&gt;contains_titling</span><span class="plain"> = </span><span class="identifier">TRUE</span><span class="plain">;</span>
<span class="functiontext">PL::EPSMap::prepare_map_parameter_scope</span><span class="plain">(&amp;(</span><span class="identifier">eml</span><span class="plain">-</span><span class="element">&gt;map_parameters</span><span class="plain">));</span>
<span class="functiontext">PL::EPSMap::put_stream_mp</span><span class="plain">(</span><span class="identifier">L</span><span class="string">"subtitle"</span><span class="plain">, &amp;(</span><span class="identifier">eml</span><span class="plain">-</span><span class="element">&gt;map_parameters</span><span class="plain">), </span><span class="identifier">eml</span><span class="plain">-</span><span class="element">&gt;titling</span><span class="plain">);</span>
<span class="identifier">LOOP_OVER_ROOMS</span><span class="plain">(</span><span class="identifier">R</span><span class="plain">)</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Room_position</span><span class="plain">(</span><span class="identifier">R</span><span class="plain">).</span><span class="identifier">z</span><span class="plain"> == </span><span class="identifier">z</span><span class="plain">) {</span>
<span class="identifier">PF_I</span><span class="plain">(</span><span class="identifier">map</span><span class="plain">, </span><span class="identifier">R</span><span class="plain">)-</span><span class="element">&gt;local_map_parameters.wider_scope</span><span class="plain"> = &amp;(</span><span class="identifier">eml</span><span class="plain">-</span><span class="element">&gt;map_parameters</span><span class="plain">);</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">This code is used in <a href="#SP24">&#167;24</a>.</p>
<p class="inwebparagraph"><a id="SP24_3"></a><b>&#167;24.3. </b><code class="display">
&lt;<span class="cwebmacrodefn">Inherit EPS room colours from those used in the World Index</span> <span class="cwebmacronumber">24.3</span>&gt; =
</code></p>
<pre class="displaydefn">
<span class="identifier">instance</span><span class="plain"> *</span><span class="identifier">R</span><span class="plain">;</span>
<span class="identifier">LOOP_OVER_ROOMS</span><span class="plain">(</span><span class="identifier">R</span><span class="plain">)</span>
<span class="functiontext">PL::EPSMap::put_string_mp</span><span class="plain">(</span><span class="identifier">L</span><span class="string">"room-colour"</span><span class="plain">, &amp;(</span><span class="identifier">PF_I</span><span class="plain">(</span><span class="identifier">map</span><span class="plain">, </span><span class="identifier">R</span><span class="plain">)-</span><span class="element">&gt;local_map_parameters</span><span class="plain">),</span>
<span class="identifier">PF_I</span><span class="plain">(</span><span class="identifier">map</span><span class="plain">, </span><span class="identifier">R</span><span class="plain">)-</span><span class="element">&gt;world_index_colour</span><span class="plain">);</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">This code is used in <a href="#SP24">&#167;24</a>.</p>
<p class="inwebparagraph"><a id="SP24_4"></a><b>&#167;24.4. </b><code class="display">
&lt;<span class="cwebmacrodefn">Open a stream and write the EPS map to it</span> <span class="cwebmacronumber">24.4</span>&gt; =
</code></p>
<pre class="displaydefn">
<span class="identifier">text_stream</span><span class="plain"> </span><span class="identifier">EPS_struct</span><span class="plain">; </span><span class="identifier">text_stream</span><span class="plain"> *</span><span class="identifier">EPS</span><span class="plain"> = &amp;</span><span class="identifier">EPS_struct</span><span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">STREAM_OPEN_TO_FILE</span><span class="plain">(</span><span class="identifier">EPS</span><span class="plain">, </span><span class="identifier">filename_of_epsfile</span><span class="plain">, </span><span class="identifier">ISO_ENC</span><span class="plain">) == </span><span class="identifier">FALSE</span><span class="plain">)</span>
<span class="identifier">Problems::Fatal::filename_related</span><span class="plain">(</span><span class="string">"Can't open EPS map file"</span><span class="plain">, </span><span class="identifier">filename_of_epsfile</span><span class="plain">);</span>
<span class="functiontext">PL::EPSMap::EPS_compile_map</span><span class="plain">(</span><span class="identifier">EPS</span><span class="plain">);</span>
<span class="identifier">STREAM_CLOSE</span><span class="plain">(</span><span class="identifier">EPS</span><span class="plain">);</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">This code is used in <a href="#SP24">&#167;24</a>.</p>
<p class="inwebparagraph"><a id="SP25"></a><b>&#167;25. </b></p>
<pre class="display">
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">PL::EPSMap::EPS_compile_map</span><span class="plain">(</span><span class="identifier">OUTPUT_STREAM</span><span class="plain">) {</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">blh</span><span class="plain">, </span> <span class="comment">total height of the EPS map area (not counting border)</span>
<span class="identifier">blw</span><span class="plain">, </span> <span class="comment">total width of the EPS map area (not counting border)</span>
<span class="identifier">border</span><span class="plain"> = </span><span class="functiontext">PL::EPSMap::get_int_mp</span><span class="plain">(</span><span class="identifier">L</span><span class="string">"border-size"</span><span class="plain">, </span><span class="identifier">NULL</span><span class="plain">),</span>
<span class="identifier">vskip</span><span class="plain"> = </span><span class="functiontext">PL::EPSMap::get_int_mp</span><span class="plain">(</span><span class="identifier">L</span><span class="string">"vertical-spacing"</span><span class="plain">, </span><span class="identifier">NULL</span><span class="plain">);</span>
&lt;<span class="cwebmacro">Compute the dimensions of the EPS map</span> <span class="cwebmacronumber">25.1</span>&gt;<span class="plain">;</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">bounding_box_width</span><span class="plain"> = </span><span class="identifier">blw</span><span class="plain">+2*</span><span class="identifier">border</span><span class="plain">, </span><span class="identifier">bounding_box_height</span><span class="plain"> = </span><span class="identifier">blh</span><span class="plain">+2*</span><span class="identifier">border</span><span class="plain">;</span>
<span class="functiontext">PL::EPSMap::EPS_compile_header</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="identifier">bounding_box_width</span><span class="plain">, </span><span class="identifier">bounding_box_height</span><span class="plain">,</span>
<span class="functiontext">PL::EPSMap::get_string_mp</span><span class="plain">(</span><span class="identifier">L</span><span class="string">"title-font"</span><span class="plain">, </span><span class="identifier">NULL</span><span class="plain">), </span><span class="functiontext">PL::EPSMap::get_int_mp</span><span class="plain">(</span><span class="identifier">L</span><span class="string">"title-size"</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::EPSMap::get_int_mp</span><span class="plain">(</span><span class="identifier">L</span><span class="string">"map-outline"</span><span class="plain">, </span><span class="identifier">NULL</span><span class="plain">))</span>
&lt;<span class="cwebmacro">Draw a big rectangular outline around the entire EPS map</span> <span class="cwebmacronumber">25.2</span>&gt;<span class="plain">;</span>
<span class="reserved">EPS_map_level</span><span class="plain"> *</span><span class="identifier">eml</span><span class="plain">;</span>
<span class="identifier">LOOP_OVER</span><span class="plain">(</span><span class="identifier">eml</span><span class="plain">, </span><span class="reserved">EPS_map_level</span><span class="plain">) {</span>
<span class="reserved">map_parameter_scope</span><span class="plain"> *</span><span class="identifier">level_scope</span><span class="plain"> = &amp;(</span><span class="identifier">eml</span><span class="plain">-</span><span class="element">&gt;map_parameters</span><span class="plain">);</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">mapunit</span><span class="plain"> = </span><span class="functiontext">PL::EPSMap::get_int_mp</span><span class="plain">(</span><span class="identifier">L</span><span class="string">"grid-size"</span><span class="plain">, </span><span class="identifier">level_scope</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">eml</span><span class="plain">-</span><span class="element">&gt;contains_rooms</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="functiontext">PL::EPSMap::get_int_mp</span><span class="plain">(</span><span class="identifier">L</span><span class="string">"map-outline"</span><span class="plain">, </span><span class="identifier">NULL</span><span class="plain">))</span>
&lt;<span class="cwebmacro">Draw an intermediate strut in the big rectangular outline</span> <span class="cwebmacronumber">25.3</span>&gt;<span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">eml</span><span class="plain">-</span><span class="element">&gt;contains_titling</span><span class="plain">)</span>
&lt;<span class="cwebmacro">Draw the title for this EPS map level</span> <span class="cwebmacronumber">25.4</span>&gt;<span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">eml</span><span class="plain">-</span><span class="element">&gt;contains_rooms</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="identifier">LOOP_OVER_ROOMS</span><span class="plain">(</span><span class="identifier">R</span><span class="plain">)</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Room_position</span><span class="plain">(</span><span class="identifier">R</span><span class="plain">).</span><span class="identifier">z</span><span class="plain"> == </span><span class="identifier">eml</span><span class="plain">-</span><span class="element">&gt;map_level</span><span class="plain">)</span>
&lt;<span class="cwebmacro">Establish EPS coordinates for this room</span> <span class="cwebmacronumber">25.5</span>&gt;<span class="plain">;</span>
<span class="identifier">LOOP_OVER_ROOMS</span><span class="plain">(</span><span class="identifier">R</span><span class="plain">)</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Room_position</span><span class="plain">(</span><span class="identifier">R</span><span class="plain">).</span><span class="identifier">z</span><span class="plain"> == </span><span class="identifier">eml</span><span class="plain">-</span><span class="element">&gt;map_level</span><span class="plain">)</span>
&lt;<span class="cwebmacro">Draw the map connections from this room as EPS paths</span> <span class="cwebmacronumber">25.6</span>&gt;<span class="plain">;</span>
<span class="identifier">LOOP_OVER_ROOMS</span><span class="plain">(</span><span class="identifier">R</span><span class="plain">)</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Room_position</span><span class="plain">(</span><span class="identifier">R</span><span class="plain">).</span><span class="identifier">z</span><span class="plain"> == </span><span class="identifier">eml</span><span class="plain">-</span><span class="element">&gt;map_level</span><span class="plain">)</span>
&lt;<span class="cwebmacro">Draw the boxes for the rooms themselves</span> <span class="cwebmacronumber">25.7</span>&gt;<span class="plain">;</span>
<span class="plain">}</span>
<span class="plain">}</span>
&lt;<span class="cwebmacro">Plot all of the rubrics onto the EPS map</span> <span class="cwebmacronumber">25.8</span>&gt;<span class="plain">;</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">The function PL::EPSMap::EPS_compile_map is used in <a href="#SP24_4">&#167;24.4</a>.</p>
<p class="inwebparagraph"><a id="SP25_1"></a><b>&#167;25.1. </b><code class="display">
&lt;<span class="cwebmacrodefn">Compute the dimensions of the EPS map</span> <span class="cwebmacronumber">25.1</span>&gt; =
</code></p>
<pre class="displaydefn">
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">total_chunk_height</span><span class="plain"> = 0, </span><span class="identifier">max_chunk_width</span><span class="plain"> = 0;</span>
<span class="reserved">EPS_map_level</span><span class="plain"> *</span><span class="identifier">eml</span><span class="plain">;</span>
<span class="identifier">LOOP_BACKWARDS_OVER</span><span class="plain">(</span><span class="identifier">eml</span><span class="plain">, </span><span class="reserved">EPS_map_level</span><span class="plain">) {</span>
<span class="reserved">map_parameter_scope</span><span class="plain"> *</span><span class="identifier">level_scope</span><span class="plain"> = &amp;(</span><span class="identifier">eml</span><span class="plain">-</span><span class="element">&gt;map_parameters</span><span class="plain">);</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">mapunit</span><span class="plain"> = </span><span class="functiontext">PL::EPSMap::get_int_mp</span><span class="plain">(</span><span class="identifier">L</span><span class="string">"grid-size"</span><span class="plain">, </span><span class="identifier">level_scope</span><span class="plain">);</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">p</span><span class="plain"> = </span><span class="functiontext">PL::EPSMap::get_int_mp</span><span class="plain">(</span><span class="identifier">L</span><span class="string">"title-size"</span><span class="plain">, </span><span class="identifier">level_scope</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">eml</span><span class="plain">-</span><span class="element">&gt;contains_rooms</span><span class="plain">) </span><span class="identifier">p</span><span class="plain"> = </span><span class="functiontext">PL::EPSMap::get_int_mp</span><span class="plain">(</span><span class="identifier">L</span><span class="string">"subtitle-size"</span><span class="plain">, </span><span class="identifier">level_scope</span><span class="plain">);</span>
<span class="identifier">eml</span><span class="plain">-</span><span class="element">&gt;titling_point_size</span><span class="plain"> = </span><span class="identifier">p</span><span class="plain">;</span>
<span class="identifier">eml</span><span class="plain">-</span><span class="element">&gt;width</span><span class="plain"> = (</span><span class="identifier">Universe</span><span class="element">.corner1.x</span><span class="plain">-</span><span class="identifier">Universe</span><span class="element">.corner0.x</span><span class="plain">+2)*</span><span class="identifier">mapunit</span><span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">eml</span><span class="plain">-&gt;</span><span class="identifier">allocation_id</span><span class="plain"> == 0) </span><span class="identifier">eml</span><span class="plain">-</span><span class="element">&gt;actual_height</span><span class="plain"> = 0;</span>
<span class="reserved">else</span><span class="plain"> </span><span class="identifier">eml</span><span class="plain">-</span><span class="element">&gt;actual_height</span><span class="plain"> = (</span><span class="identifier">eml</span><span class="plain">-</span><span class="element">&gt;y_max</span><span class="plain">-</span><span class="identifier">eml</span><span class="plain">-</span><span class="element">&gt;y_min</span><span class="plain">+1)*</span><span class="identifier">mapunit</span><span class="plain">;</span>
<span class="identifier">eml</span><span class="plain">-</span><span class="element">&gt;eps_origin</span><span class="plain"> = </span><span class="identifier">total_chunk_height</span><span class="plain"> + </span><span class="identifier">border</span><span class="plain">;</span>
<span class="identifier">eml</span><span class="plain">-</span><span class="element">&gt;height</span><span class="plain"> = </span><span class="identifier">eml</span><span class="plain">-</span><span class="element">&gt;actual_height</span><span class="plain"> + </span><span class="identifier">vskip</span><span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">eml</span><span class="plain">-</span><span class="element">&gt;contains_rooms</span><span class="plain">) </span><span class="identifier">eml</span><span class="plain">-</span><span class="element">&gt;height</span><span class="plain"> += </span><span class="identifier">vskip</span><span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">eml</span><span class="plain">-</span><span class="element">&gt;contains_titling</span><span class="plain">) </span><span class="identifier">eml</span><span class="plain">-</span><span class="element">&gt;height</span><span class="plain"> += </span><span class="identifier">eml</span><span class="plain">-</span><span class="element">&gt;titling_point_size</span><span class="plain">+</span><span class="identifier">vskip</span><span class="plain">;</span>
<span class="identifier">total_chunk_height</span><span class="plain"> += </span><span class="identifier">eml</span><span class="plain">-</span><span class="element">&gt;height</span><span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">max_chunk_width</span><span class="plain"> &lt; </span><span class="identifier">eml</span><span class="plain">-</span><span class="element">&gt;width</span><span class="plain">) </span><span class="identifier">max_chunk_width</span><span class="plain"> = </span><span class="identifier">eml</span><span class="plain">-</span><span class="element">&gt;width</span><span class="plain">;</span>
<span class="plain">}</span>
<span class="identifier">blh</span><span class="plain"> = </span><span class="identifier">total_chunk_height</span><span class="plain">;</span>
<span class="identifier">blw</span><span class="plain"> = </span><span class="identifier">max_chunk_width</span><span class="plain">;</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">This code is used in <a href="#SP25">&#167;25</a>.</p>
<p class="inwebparagraph"><a id="SP25_2"></a><b>&#167;25.2. </b>The outline is a little like drawing the shape of a bookcase: there's a big
rectangle around the whole thing...
</p>
<p class="macrodefinition"><code class="display">
&lt;<span class="cwebmacrodefn">Draw a big rectangular outline around the entire EPS map</span> <span class="cwebmacronumber">25.2</span>&gt; =
</code></p>
<pre class="displaydefn">
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"newpath %% Ruled outline outer box of map\</span><span class="plain">n</span><span class="string">"</span><span class="plain">);</span>
<span class="functiontext">PL::EPSMap::EPS_compile_rectangular_path</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="identifier">border</span><span class="plain">, </span><span class="identifier">border</span><span class="plain">, </span><span class="identifier">border</span><span class="plain">+</span><span class="identifier">blw</span><span class="plain">, </span><span class="identifier">border</span><span class="plain">+</span><span class="identifier">blh</span><span class="plain">);</span>
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"stroke\</span><span class="plain">n</span><span class="string">"</span><span class="plain">);</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">This code is used in <a href="#SP25">&#167;25</a>.</p>
<p class="inwebparagraph"><a id="SP25_3"></a><b>&#167;25.3. </b>...and then there are horizontal shelves dividing it into compartments.
(Each map level will be drawn inside one of these compartments.)
</p>
<p class="macrodefinition"><code class="display">
&lt;<span class="cwebmacrodefn">Draw an intermediate strut in the big rectangular outline</span> <span class="cwebmacronumber">25.3</span>&gt; =
</code></p>
<pre class="displaydefn">
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"newpath %% Ruled horizontal line\</span><span class="plain">n</span><span class="string">"</span><span class="plain">);</span>
<span class="functiontext">PL::EPSMap::EPS_compile_horizontal_line_path</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="identifier">border</span><span class="plain">, </span><span class="identifier">blw</span><span class="plain">+</span><span class="identifier">border</span><span class="plain">, </span><span class="identifier">eml</span><span class="plain">-</span><span class="element">&gt;eps_origin</span><span class="plain">);</span>
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"stroke\</span><span class="plain">n</span><span class="string">"</span><span class="plain">);</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">This code is used in <a href="#SP25">&#167;25</a>.</p>
<p class="inwebparagraph"><a id="SP25_4"></a><b>&#167;25.4. </b><code class="display">
&lt;<span class="cwebmacrodefn">Draw the title for this EPS map level</span> <span class="cwebmacronumber">25.4</span>&gt; =
</code></p>
<pre class="displaydefn">
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">y</span><span class="plain"> = </span><span class="identifier">eml</span><span class="plain">-</span><span class="element">&gt;eps_origin</span><span class="plain"> + </span><span class="identifier">vskip</span><span class="plain"> + </span><span class="identifier">eml</span><span class="plain">-</span><span class="element">&gt;actual_height</span><span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">eml</span><span class="plain">-</span><span class="element">&gt;contains_rooms</span><span class="plain">) {</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">PL::EPSMap::get_int_mp</span><span class="plain">(</span><span class="identifier">L</span><span class="string">"monochrome"</span><span class="plain">, </span><span class="identifier">level_scope</span><span class="plain">)) </span><span class="functiontext">PL::EPSMap::EPS_compile_set_greyscale</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, 0);</span>
<span class="reserved">else</span><span class="plain"> </span><span class="functiontext">PL::EPSMap::EPS_compile_set_colour</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="functiontext">PL::EPSMap::get_string_mp</span><span class="plain">(</span><span class="identifier">L</span><span class="string">"subtitle-colour"</span><span class="plain">, </span><span class="identifier">level_scope</span><span class="plain">));</span>
<span class="functiontext">PL::EPSMap::plot_stream_at</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">,</span>
<span class="functiontext">PL::EPSMap::get_stream_mp</span><span class="plain">(</span><span class="identifier">L</span><span class="string">"subtitle"</span><span class="plain">, </span><span class="identifier">level_scope</span><span class="plain">),</span>
<span class="identifier">NULL</span><span class="plain">, 128,</span>
<span class="functiontext">PL::EPSMap::get_string_mp</span><span class="plain">(</span><span class="identifier">L</span><span class="string">"subtitle-font"</span><span class="plain">, </span><span class="identifier">level_scope</span><span class="plain">),</span>
<span class="identifier">border</span><span class="plain">*2, </span><span class="identifier">y</span><span class="plain">+</span><span class="identifier">vskip</span><span class="plain">,</span>
<span class="functiontext">PL::EPSMap::get_int_mp</span><span class="plain">(</span><span class="identifier">L</span><span class="string">"subtitle-size"</span><span class="plain">, </span><span class="identifier">level_scope</span><span class="plain">),</span>
<span class="identifier">FALSE</span><span class="plain">, </span><span class="identifier">FALSE</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="functiontext">PL::EPSMap::get_int_mp</span><span class="plain">(</span><span class="identifier">L</span><span class="string">"monochrome"</span><span class="plain">, </span><span class="identifier">level_scope</span><span class="plain">)) </span><span class="functiontext">PL::EPSMap::EPS_compile_set_greyscale</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, 0);</span>
<span class="reserved">else</span><span class="plain"> </span><span class="functiontext">PL::EPSMap::EPS_compile_set_colour</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="functiontext">PL::EPSMap::get_string_mp</span><span class="plain">(</span><span class="identifier">L</span><span class="string">"title-colour"</span><span class="plain">, </span><span class="identifier">level_scope</span><span class="plain">));</span>
<span class="functiontext">PL::EPSMap::plot_stream_at</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">,</span>
<span class="functiontext">PL::EPSMap::get_stream_mp</span><span class="plain">(</span><span class="identifier">L</span><span class="string">"title"</span><span class="plain">, </span><span class="identifier">NULL</span><span class="plain">),</span>
<span class="identifier">NULL</span><span class="plain">, 128,</span>
<span class="functiontext">PL::EPSMap::get_string_mp</span><span class="plain">(</span><span class="identifier">L</span><span class="string">"title-font"</span><span class="plain">, </span><span class="identifier">level_scope</span><span class="plain">),</span>
<span class="identifier">border</span><span class="plain">*2, </span><span class="identifier">y</span><span class="plain">+2*</span><span class="identifier">vskip</span><span class="plain">,</span>
<span class="functiontext">PL::EPSMap::get_int_mp</span><span class="plain">(</span><span class="identifier">L</span><span class="string">"title-size"</span><span class="plain">, </span><span class="identifier">level_scope</span><span class="plain">),</span>
<span class="identifier">FALSE</span><span class="plain">, </span><span class="identifier">TRUE</span><span class="plain">);</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">This code is used in <a href="#SP25">&#167;25</a>.</p>
<p class="inwebparagraph"><a id="SP25_5"></a><b>&#167;25.5. </b><code class="display">
&lt;<span class="cwebmacrodefn">Establish EPS coordinates for this room</span> <span class="cwebmacronumber">25.5</span>&gt; =
</code></p>
<pre class="displaydefn">
<span class="reserved">map_parameter_scope</span><span class="plain"> *</span><span class="identifier">room_scope</span><span class="plain"> = &amp;(</span><span class="identifier">PF_I</span><span class="plain">(</span><span class="identifier">map</span><span class="plain">, </span><span class="identifier">R</span><span class="plain">)-</span><span class="element">&gt;local_map_parameters</span><span class="plain">);</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">bx</span><span class="plain"> = </span><span class="identifier">Room_position</span><span class="plain">(</span><span class="identifier">R</span><span class="plain">)</span><span class="element">.x</span><span class="plain">-</span><span class="identifier">Universe</span><span class="element">.corner0.x</span><span class="plain">;</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">by</span><span class="plain"> = </span><span class="identifier">Room_position</span><span class="plain">(</span><span class="identifier">R</span><span class="plain">).</span><span class="identifier">y</span><span class="plain">-</span><span class="identifier">eml</span><span class="plain">-</span><span class="element">&gt;y_min</span><span class="plain">;</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">offs</span><span class="plain"> = </span><span class="functiontext">PL::EPSMap::get_int_mp</span><span class="plain">(</span><span class="identifier">L</span><span class="string">"room-offset"</span><span class="plain">, </span><span class="identifier">room_scope</span><span class="plain">);</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">xpart</span><span class="plain"> = </span><span class="identifier">offs</span><span class="plain">%10000, </span><span class="identifier">ypart</span><span class="plain"> = </span><span class="identifier">offs</span><span class="plain">/10000;</span>
<span class="reserved">while</span><span class="plain"> (</span><span class="identifier">xpart</span><span class="plain"> &gt; 5000) </span><span class="identifier">xpart</span><span class="plain">-=10000;</span>
<span class="reserved">while</span><span class="plain"> (</span><span class="identifier">xpart</span><span class="plain"> &lt; -5000) </span><span class="identifier">xpart</span><span class="plain">+=10000;</span>
<span class="identifier">bx</span><span class="plain"> = (</span><span class="identifier">bx</span><span class="plain">)*</span><span class="identifier">mapunit</span><span class="plain"> + </span><span class="identifier">border</span><span class="plain"> + </span><span class="identifier">mapunit</span><span class="plain">/2;</span>
<span class="identifier">by</span><span class="plain"> = (</span><span class="identifier">by</span><span class="plain">)*</span><span class="identifier">mapunit</span><span class="plain"> + </span><span class="identifier">eml</span><span class="plain">-</span><span class="element">&gt;eps_origin</span><span class="plain"> + </span><span class="identifier">vskip</span><span class="plain"> + </span><span class="identifier">mapunit</span><span class="plain">/2;</span>
<span class="identifier">bx</span><span class="plain"> += </span><span class="identifier">xpart</span><span class="plain">*</span><span class="identifier">mapunit</span><span class="plain">/100;</span>
<span class="identifier">by</span><span class="plain"> += </span><span class="identifier">ypart</span><span class="plain">*</span><span class="identifier">mapunit</span><span class="plain">/100;</span>
<span class="identifier">PF_I</span><span class="plain">(</span><span class="identifier">map</span><span class="plain">, </span><span class="identifier">R</span><span class="plain">)-</span><span class="element">&gt;eps_x</span><span class="plain"> = </span><span class="identifier">bx</span><span class="plain">;</span>
<span class="identifier">PF_I</span><span class="plain">(</span><span class="identifier">map</span><span class="plain">, </span><span class="identifier">R</span><span class="plain">)-&gt;</span><span class="identifier">eps_y</span><span class="plain"> = </span><span class="identifier">by</span><span class="plain">;</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">This code is used in <a href="#SP25">&#167;25</a>.</p>
<p class="inwebparagraph"><a id="SP25_6"></a><b>&#167;25.6. </b><code class="display">
&lt;<span class="cwebmacrodefn">Draw the map connections from this room as EPS paths</span> <span class="cwebmacronumber">25.6</span>&gt; =
</code></p>
<pre class="displaydefn">
<span class="reserved">map_parameter_scope</span><span class="plain"> *</span><span class="identifier">room_scope</span><span class="plain"> = &amp;(</span><span class="identifier">PF_I</span><span class="plain">(</span><span class="identifier">map</span><span class="plain">, </span><span class="identifier">R</span><span class="plain">)-</span><span class="element">&gt;local_map_parameters</span><span class="plain">);</span>
<span class="functiontext">PL::EPSMap::EPS_compile_line_width_setting</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="functiontext">PL::EPSMap::get_int_mp</span><span class="plain">(</span><span class="identifier">L</span><span class="string">"route-thickness"</span><span class="plain">, </span><span class="identifier">room_scope</span><span class="plain">));</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">bx</span><span class="plain"> = </span><span class="identifier">PF_I</span><span class="plain">(</span><span class="identifier">map</span><span class="plain">, </span><span class="identifier">R</span><span class="plain">)-</span><span class="element">&gt;eps_x</span><span class="plain">;</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">by</span><span class="plain"> = </span><span class="identifier">PF_I</span><span class="plain">(</span><span class="identifier">map</span><span class="plain">, </span><span class="identifier">R</span><span class="plain">)-&gt;</span><span class="identifier">eps_y</span><span class="plain">;</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">boxsize</span><span class="plain"> = </span><span class="functiontext">PL::EPSMap::get_int_mp</span><span class="plain">(</span><span class="identifier">L</span><span class="string">"room-size"</span><span class="plain">, </span><span class="identifier">room_scope</span><span class="plain">)/2;</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">R_stiffness</span><span class="plain"> = </span><span class="functiontext">PL::EPSMap::get_int_mp</span><span class="plain">(</span><span class="identifier">L</span><span class="string">"route-stiffness"</span><span class="plain">, </span><span class="identifier">room_scope</span><span class="plain">);</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">dir</span><span class="plain">;</span>
<span class="identifier">LOOP_OVER_STORY_DIRECTIONS</span><span class="plain">(</span><span class="identifier">dir</span><span class="plain">) {</span>
<span class="identifier">instance</span><span class="plain"> *</span><span class="identifier">T</span><span class="plain"> = </span><span class="functiontext">PL::SpatialMap::room_exit</span><span class="plain">(</span><span class="identifier">R</span><span class="plain">, </span><span class="identifier">dir</span><span class="plain">, </span><span class="identifier">NULL</span><span class="plain">);</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">exit</span><span class="plain"> = </span><span class="identifier">story_dir_to_page_dir</span><span class="plain">[</span><span class="identifier">dir</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">T</span><span class="plain">))</span>
&lt;<span class="cwebmacro">Draw a single map connection as an EPS arrow</span> <span class="cwebmacronumber">25.6.1</span>&gt;<span class="plain">;</span>
<span class="plain">}</span>
<span class="functiontext">PL::EPSMap::EPS_compile_line_width_unsetting</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">);</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">This code is used in <a href="#SP25">&#167;25</a>.</p>
<p class="inwebparagraph"><a id="SP25_6_1"></a><b>&#167;25.6.1. </b><code class="display">
&lt;<span class="cwebmacrodefn">Draw a single map connection as an EPS arrow</span> <span class="cwebmacronumber">25.6.1</span>&gt; =
</code></p>
<pre class="displaydefn">
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">T_stiffness</span><span class="plain"> = </span><span class="functiontext">PL::EPSMap::get_int_mp</span><span class="plain">(</span><span class="identifier">L</span><span class="string">"route-stiffness"</span><span class="plain">, &amp;(</span><span class="identifier">PF_I</span><span class="plain">(</span><span class="identifier">map</span><span class="plain">, </span><span class="identifier">T</span><span class="plain">)-</span><span class="element">&gt;local_map_parameters</span><span class="plain">));</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">PL::EPSMap::get_int_mp</span><span class="plain">(</span><span class="identifier">L</span><span class="string">"monochrome"</span><span class="plain">, </span><span class="identifier">level_scope</span><span class="plain">)) </span><span class="functiontext">PL::EPSMap::EPS_compile_set_greyscale</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, 0);</span>
<span class="reserved">else</span><span class="plain"> </span><span class="functiontext">PL::EPSMap::EPS_compile_set_colour</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="functiontext">PL::EPSMap::get_string_mp</span><span class="plain">(</span><span class="identifier">L</span><span class="string">"route-colour"</span><span class="plain">, </span><span class="identifier">level_scope</span><span class="plain">));</span>
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">Room_position</span><span class="plain">(</span><span class="identifier">T</span><span class="plain">).</span><span class="identifier">z</span><span class="plain"> == </span><span class="identifier">Room_position</span><span class="plain">(</span><span class="identifier">R</span><span class="plain">).</span><span class="identifier">z</span><span class="plain">) &amp;&amp;</span>
<span class="plain">(</span><span class="functiontext">PL::SpatialMap::room_exit</span><span class="plain">(</span><span class="identifier">T</span><span class="plain">, </span><span class="functiontext">PL::SpatialMap::opposite</span><span class="plain">(</span><span class="identifier">dir</span><span class="plain">), </span><span class="identifier">FALSE</span><span class="plain">) == </span><span class="identifier">R</span><span class="plain">))</span>
&lt;<span class="cwebmacro">Draw a two-ended arrow for a two-way horizontal connection</span> <span class="cwebmacronumber">25.6.1.1</span>&gt;
<span class="reserved">else</span>
&lt;<span class="cwebmacro">Draw a one-way arrow for a distant or off-level connection</span> <span class="cwebmacronumber">25.6.1.2</span>&gt;<span class="plain">;</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">This code is used in <a href="#SP25_6">&#167;25.6</a>.</p>
<p class="inwebparagraph"><a id="SP25_6_1_1"></a><b>&#167;25.6.1.1. </b>We don't want to draw this twice (once for R, once for T), so we draw it
just for the earlier-defined room.
</p>
<p class="macrodefinition"><code class="display">
&lt;<span class="cwebmacrodefn">Draw a two-ended arrow for a two-way horizontal connection</span> <span class="cwebmacronumber">25.6.1.1</span>&gt; =
</code></p>
<pre class="displaydefn">
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">R</span><span class="plain">-&gt;</span><span class="identifier">allocation_id</span><span class="plain"> &lt;= </span><span class="identifier">T</span><span class="plain">-&gt;</span><span class="identifier">allocation_id</span><span class="plain">)</span>
<span class="functiontext">PL::EPSMap::EPS_compile_Bezier_curve</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">,</span>
<span class="identifier">R_stiffness</span><span class="plain">*</span><span class="identifier">mapunit</span><span class="plain">, </span><span class="identifier">T_stiffness</span><span class="plain">*</span><span class="identifier">mapunit</span><span class="plain">,</span>
<span class="identifier">bx</span><span class="plain">, </span><span class="identifier">by</span><span class="plain">, </span><span class="identifier">exit</span><span class="plain">,</span>
<span class="identifier">PF_I</span><span class="plain">(</span><span class="identifier">map</span><span class="plain">, </span><span class="identifier">T</span><span class="plain">)-</span><span class="element">&gt;eps_x</span><span class="plain">, </span><span class="identifier">PF_I</span><span class="plain">(</span><span class="identifier">map</span><span class="plain">, </span><span class="identifier">T</span><span class="plain">)-&gt;</span><span class="identifier">eps_y</span><span class="plain">, </span><span class="functiontext">PL::SpatialMap::opposite</span><span class="plain">(</span><span class="identifier">exit</span><span class="plain">));</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">This code is used in <a href="#SP25_6_1">&#167;25.6.1</a>.</p>
<p class="inwebparagraph"><a id="SP25_6_1_2"></a><b>&#167;25.6.1.2. </b>A one-way arrow has the destination marked on it textually, since it doesn't
actually go there in any visual way.
</p>
<p class="macrodefinition"><code class="display">
&lt;<span class="cwebmacrodefn">Draw a one-way arrow for a distant or off-level connection</span> <span class="cwebmacronumber">25.6.1.2</span>&gt; =
</code></p>
<pre class="displaydefn">
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">scaled</span><span class="plain"> = 1;</span>
<span class="reserved">vector</span><span class="plain"> </span><span class="identifier">E</span><span class="plain"> = </span><span class="functiontext">PL::SpatialMap::direction_as_vector</span><span class="plain">(</span><span class="identifier">exit</span><span class="plain">);</span>
<span class="reserved">switch</span><span class="plain">(</span><span class="identifier">exit</span><span class="plain">) {</span>
<span class="reserved">case</span><span class="plain"> 8: </span><span class="identifier">E</span><span class="plain"> = </span><span class="identifier">U_vector_EPS</span><span class="plain">; </span><span class="identifier">scaled</span><span class="plain"> = 2; </span><span class="reserved">break</span><span class="plain">;</span>
<span class="reserved">case</span><span class="plain"> 9: </span><span class="identifier">E</span><span class="plain"> = </span><span class="identifier">D_vector_EPS</span><span class="plain">; </span><span class="identifier">scaled</span><span class="plain"> = 2; </span><span class="reserved">break</span><span class="plain">;</span>
<span class="reserved">case</span><span class="plain"> 10: </span><span class="identifier">E</span><span class="plain"> = </span><span class="identifier">IN_vector_EPS</span><span class="plain">; </span><span class="identifier">scaled</span><span class="plain"> = 2; </span><span class="reserved">break</span><span class="plain">;</span>
<span class="reserved">case</span><span class="plain"> 11: </span><span class="identifier">E</span><span class="plain"> = </span><span class="identifier">OUT_vector_EPS</span><span class="plain">; </span><span class="identifier">scaled</span><span class="plain"> = 2; </span><span class="reserved">break</span><span class="plain">;</span>
<span class="plain">}</span>
<span class="functiontext">PL::EPSMap::EPS_compile_dashed_arrow</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="identifier">boxsize</span><span class="plain">/</span><span class="identifier">scaled</span><span class="plain">, </span><span class="identifier">E</span><span class="plain">, </span><span class="identifier">bx</span><span class="plain">, </span><span class="identifier">by</span><span class="plain">);</span>
<span class="functiontext">PL::EPSMap::plot_text_at</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="identifier">NULL</span><span class="plain">, </span><span class="identifier">T</span><span class="plain">,</span>
<span class="functiontext">PL::EPSMap::get_int_mp</span><span class="plain">(</span><span class="identifier">L</span><span class="string">"annotation-length"</span><span class="plain">, </span><span class="identifier">NULL</span><span class="plain">),</span>
<span class="functiontext">PL::EPSMap::get_string_mp</span><span class="plain">(</span><span class="identifier">L</span><span class="string">"annotation-font"</span><span class="plain">, </span><span class="identifier">NULL</span><span class="plain">),</span>
<span class="identifier">bx</span><span class="plain">+</span><span class="identifier">E</span><span class="element">.x</span><span class="plain">*</span><span class="identifier">boxsize</span><span class="plain">*6/</span><span class="identifier">scaled</span><span class="plain">/5, </span><span class="identifier">by</span><span class="plain">+</span><span class="identifier">E</span><span class="plain">.</span><span class="identifier">y</span><span class="plain">*</span><span class="identifier">boxsize</span><span class="plain">*6/</span><span class="identifier">scaled</span><span class="plain">/5,</span>
<span class="functiontext">PL::EPSMap::get_int_mp</span><span class="plain">(</span><span class="identifier">L</span><span class="string">"annotation-size"</span><span class="plain">, </span><span class="identifier">NULL</span><span class="plain">),</span>
<span class="identifier">TRUE</span><span class="plain">, </span><span class="identifier">TRUE</span><span class="plain">);</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">This code is used in <a href="#SP25_6_1">&#167;25.6.1</a>.</p>
<p class="inwebparagraph"><a id="SP25_7"></a><b>&#167;25.7. </b><code class="display">
&lt;<span class="cwebmacrodefn">Draw the boxes for the rooms themselves</span> <span class="cwebmacronumber">25.7</span>&gt; =
</code></p>
<pre class="displaydefn">
<span class="reserved">map_parameter_scope</span><span class="plain"> *</span><span class="identifier">room_scope</span><span class="plain"> = &amp;(</span><span class="identifier">PF_I</span><span class="plain">(</span><span class="identifier">map</span><span class="plain">, </span><span class="identifier">R</span><span class="plain">)-</span><span class="element">&gt;local_map_parameters</span><span class="plain">);</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">bx</span><span class="plain"> = </span><span class="identifier">PF_I</span><span class="plain">(</span><span class="identifier">map</span><span class="plain">, </span><span class="identifier">R</span><span class="plain">)-</span><span class="element">&gt;eps_x</span><span class="plain">;</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">by</span><span class="plain"> = </span><span class="identifier">PF_I</span><span class="plain">(</span><span class="identifier">map</span><span class="plain">, </span><span class="identifier">R</span><span class="plain">)-&gt;</span><span class="identifier">eps_y</span><span class="plain">;</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">boxsize</span><span class="plain"> = </span><span class="functiontext">PL::EPSMap::get_int_mp</span><span class="plain">(</span><span class="identifier">L</span><span class="string">"room-size"</span><span class="plain">, </span><span class="identifier">room_scope</span><span class="plain">)/2;</span>
&lt;<span class="cwebmacro">Draw the filled box for the room</span> <span class="cwebmacronumber">25.7.1</span>&gt;<span class="plain">;</span>
&lt;<span class="cwebmacro">Draw the outline of the box for the room</span> <span class="cwebmacronumber">25.7.2</span>&gt;<span class="plain">;</span>
&lt;<span class="cwebmacro">Write in the name of the room</span> <span class="cwebmacronumber">25.7.3</span>&gt;<span class="plain">;</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">This code is used in <a href="#SP25">&#167;25</a>.</p>
<p class="inwebparagraph"><a id="SP25_7_1"></a><b>&#167;25.7.1. </b><code class="display">
&lt;<span class="cwebmacrodefn">Draw the filled box for the room</span> <span class="cwebmacronumber">25.7.1</span>&gt; =
</code></p>
<pre class="displaydefn">
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"newpath %% Room interior\</span><span class="plain">n</span><span class="string">"</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">PL::EPSMap::get_int_mp</span><span class="plain">(</span><span class="identifier">L</span><span class="string">"monochrome"</span><span class="plain">, </span><span class="identifier">room_scope</span><span class="plain">)) </span><span class="functiontext">PL::EPSMap::EPS_compile_set_greyscale</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, 75);</span>
<span class="reserved">else</span><span class="plain"> </span><span class="functiontext">PL::EPSMap::EPS_compile_set_colour</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="functiontext">PL::EPSMap::get_string_mp</span><span class="plain">(</span><span class="identifier">L</span><span class="string">"room-colour"</span><span class="plain">, </span><span class="identifier">room_scope</span><span class="plain">));</span>
<span class="functiontext">PL::EPSMap::EPS_compile_room_boundary_path</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="identifier">bx</span><span class="plain">, </span><span class="identifier">by</span><span class="plain">, </span><span class="identifier">boxsize</span><span class="plain">, </span><span class="functiontext">PL::EPSMap::get_string_mp</span><span class="plain">(</span><span class="identifier">L</span><span class="string">"room-shape"</span><span class="plain">, </span><span class="identifier">room_scope</span><span class="plain">));</span>
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"fill\</span><span class="plain">n</span><span class="string">\</span><span class="plain">n</span><span class="string">"</span><span class="plain">);</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">This code is used in <a href="#SP25_7">&#167;25.7</a>.</p>
<p class="inwebparagraph"><a id="SP25_7_2"></a><b>&#167;25.7.2. </b><code class="display">
&lt;<span class="cwebmacrodefn">Draw the outline of the box for the room</span> <span class="cwebmacronumber">25.7.2</span>&gt; =
</code></p>
<pre class="displaydefn">
<span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">PL::EPSMap::get_int_mp</span><span class="plain">(</span><span class="identifier">L</span><span class="string">"room-outline"</span><span class="plain">, </span><span class="identifier">room_scope</span><span class="plain">)) {</span>
<span class="functiontext">PL::EPSMap::EPS_compile_line_width_setting</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="functiontext">PL::EPSMap::get_int_mp</span><span class="plain">(</span><span class="identifier">L</span><span class="string">"room-outline-thickness"</span><span class="plain">, </span><span class="identifier">room_scope</span><span class="plain">));</span>
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"newpath %% Room outline\</span><span class="plain">n</span><span class="string">"</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">PL::EPSMap::get_int_mp</span><span class="plain">(</span><span class="identifier">L</span><span class="string">"monochrome"</span><span class="plain">, </span><span class="identifier">level_scope</span><span class="plain">)) </span><span class="functiontext">PL::EPSMap::EPS_compile_set_greyscale</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, 0);</span>
<span class="reserved">else</span><span class="plain"> </span><span class="functiontext">PL::EPSMap::EPS_compile_set_colour</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="functiontext">PL::EPSMap::get_string_mp</span><span class="plain">(</span><span class="identifier">L</span><span class="string">"room-outline-colour"</span><span class="plain">, </span><span class="identifier">room_scope</span><span class="plain">));</span>
<span class="functiontext">PL::EPSMap::EPS_compile_room_boundary_path</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="identifier">bx</span><span class="plain">, </span><span class="identifier">by</span><span class="plain">, </span><span class="identifier">boxsize</span><span class="plain">, </span><span class="functiontext">PL::EPSMap::get_string_mp</span><span class="plain">(</span><span class="identifier">L</span><span class="string">"room-shape"</span><span class="plain">, </span><span class="identifier">room_scope</span><span class="plain">));</span>
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"stroke\</span><span class="plain">n</span><span class="string">"</span><span class="plain">);</span>
<span class="functiontext">PL::EPSMap::EPS_compile_line_width_unsetting</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">);</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">This code is used in <a href="#SP25_7">&#167;25.7</a>.</p>
<p class="inwebparagraph"><a id="SP25_7_3"></a><b>&#167;25.7.3. </b><code class="display">
&lt;<span class="cwebmacrodefn">Write in the name of the room</span> <span class="cwebmacronumber">25.7.3</span>&gt; =
</code></p>
<pre class="displaydefn">
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">offs</span><span class="plain"> = </span><span class="functiontext">PL::EPSMap::get_int_mp</span><span class="plain">(</span><span class="identifier">L</span><span class="string">"room-name-offset"</span><span class="plain">, </span><span class="identifier">room_scope</span><span class="plain">);</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">xpart</span><span class="plain"> = </span><span class="identifier">offs</span><span class="plain">%10000, </span><span class="identifier">ypart</span><span class="plain"> = </span><span class="identifier">offs</span><span class="plain">/10000;</span>
<span class="reserved">while</span><span class="plain"> (</span><span class="identifier">xpart</span><span class="plain"> &gt; 5000) </span><span class="identifier">xpart</span><span class="plain">-=10000;</span>
<span class="reserved">while</span><span class="plain"> (</span><span class="identifier">xpart</span><span class="plain"> &lt; -5000) </span><span class="identifier">xpart</span><span class="plain">+=10000;</span>
<span class="identifier">bx</span><span class="plain"> += </span><span class="identifier">xpart</span><span class="plain">*</span><span class="identifier">mapunit</span><span class="plain">/100;</span>
<span class="identifier">by</span><span class="plain"> += </span><span class="identifier">ypart</span><span class="plain">*</span><span class="identifier">mapunit</span><span class="plain">/100;</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">PL::EPSMap::get_int_mp</span><span class="plain">(</span><span class="identifier">L</span><span class="string">"monochrome"</span><span class="plain">, </span><span class="identifier">level_scope</span><span class="plain">)) </span><span class="functiontext">PL::EPSMap::EPS_compile_set_greyscale</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, 0);</span>
<span class="reserved">else</span><span class="plain"> </span><span class="functiontext">PL::EPSMap::EPS_compile_set_colour</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="functiontext">PL::EPSMap::get_string_mp</span><span class="plain">(</span><span class="identifier">L</span><span class="string">"room-name-colour"</span><span class="plain">, </span><span class="identifier">room_scope</span><span class="plain">));</span>
<span class="identifier">wchar_t</span><span class="plain"> *</span><span class="identifier">legend</span><span class="plain"> = </span><span class="functiontext">PL::EPSMap::get_string_mp</span><span class="plain">(</span><span class="identifier">L</span><span class="string">"room-name"</span><span class="plain">, </span><span class="identifier">room_scope</span><span class="plain">);</span>
<span class="identifier">instance</span><span class="plain"> *</span><span class="identifier">room_to_name</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="identifier">Wide::cmp</span><span class="plain">(</span><span class="identifier">legend</span><span class="plain">, </span><span class="identifier">L</span><span class="string">""</span><span class="plain">) == 0) { </span><span class="identifier">room_to_name</span><span class="plain"> = </span><span class="identifier">R</span><span class="plain">; </span><span class="identifier">legend</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">; }</span>
<span class="functiontext">PL::EPSMap::plot_text_at</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="identifier">legend</span><span class="plain">, </span><span class="identifier">room_to_name</span><span class="plain">,</span>
<span class="functiontext">PL::EPSMap::get_int_mp</span><span class="plain">(</span><span class="identifier">L</span><span class="string">"room-name-length"</span><span class="plain">, </span><span class="identifier">room_scope</span><span class="plain">),</span>
<span class="functiontext">PL::EPSMap::get_string_mp</span><span class="plain">(</span><span class="identifier">L</span><span class="string">"room-name-font"</span><span class="plain">, </span><span class="identifier">room_scope</span><span class="plain">),</span>
<span class="identifier">bx</span><span class="plain">, </span><span class="identifier">by</span><span class="plain">, </span><span class="functiontext">PL::EPSMap::get_int_mp</span><span class="plain">(</span><span class="identifier">L</span><span class="string">"room-name-size"</span><span class="plain">, </span><span class="identifier">room_scope</span><span class="plain">),</span>
<span class="identifier">TRUE</span><span class="plain">, </span><span class="identifier">TRUE</span><span class="plain">);</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">This code is used in <a href="#SP25_7">&#167;25.7</a>.</p>
<p class="inwebparagraph"><a id="SP25_8"></a><b>&#167;25.8. </b><code class="display">
&lt;<span class="cwebmacrodefn">Plot all of the rubrics onto the EPS map</span> <span class="cwebmacronumber">25.8</span>&gt; =
</code></p>
<pre class="displaydefn">
<span class="reserved">rubric_holder</span><span class="plain"> *</span><span class="identifier">rh</span><span class="plain">;</span>
<span class="identifier">LOOP_OVER</span><span class="plain">(</span><span class="identifier">rh</span><span class="plain">, </span><span class="reserved">rubric_holder</span><span class="plain">) {</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">bx</span><span class="plain"> = 0, </span><span class="identifier">by</span><span class="plain"> = 0;</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">xpart</span><span class="plain"> = </span><span class="identifier">rh</span><span class="plain">-</span><span class="element">&gt;at_offset</span><span class="plain">%10000, </span><span class="identifier">ypart</span><span class="plain"> = </span><span class="identifier">rh</span><span class="plain">-</span><span class="element">&gt;at_offset</span><span class="plain">/10000;</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">mapunit</span><span class="plain"> = </span><span class="functiontext">PL::EPSMap::get_int_mp</span><span class="plain">(</span><span class="identifier">L</span><span class="string">"grid-size"</span><span class="plain">, </span><span class="identifier">NULL</span><span class="plain">);</span>
<span class="reserved">while</span><span class="plain"> (</span><span class="identifier">xpart</span><span class="plain"> &gt; 5000) </span><span class="identifier">xpart</span><span class="plain">-=10000;</span>
<span class="reserved">while</span><span class="plain"> (</span><span class="identifier">xpart</span><span class="plain"> &lt; -5000) </span><span class="identifier">xpart</span><span class="plain">+=10000;</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">PL::EPSMap::get_int_mp</span><span class="plain">(</span><span class="identifier">L</span><span class="string">"monochrome"</span><span class="plain">, </span><span class="identifier">NULL</span><span class="plain">)) </span><span class="functiontext">PL::EPSMap::EPS_compile_set_greyscale</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, 0);</span>
<span class="reserved">else</span><span class="plain"> </span><span class="functiontext">PL::EPSMap::EPS_compile_set_colour</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="identifier">rh</span><span class="plain">-</span><span class="element">&gt;colour</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">rh</span><span class="plain">-</span><span class="element">&gt;offset_from</span><span class="plain">) {</span>
<span class="identifier">bx</span><span class="plain"> = </span><span class="identifier">PF_I</span><span class="plain">(</span><span class="identifier">map</span><span class="plain">, </span><span class="identifier">rh</span><span class="plain">-</span><span class="element">&gt;offset_from</span><span class="plain">)-</span><span class="element">&gt;eps_x</span><span class="plain">;</span>
<span class="identifier">by</span><span class="plain"> = </span><span class="identifier">PF_I</span><span class="plain">(</span><span class="identifier">map</span><span class="plain">, </span><span class="identifier">rh</span><span class="plain">-</span><span class="element">&gt;offset_from</span><span class="plain">)-&gt;</span><span class="identifier">eps_y</span><span class="plain">;</span>
<span class="plain">}</span>
<span class="identifier">bx</span><span class="plain"> += </span><span class="identifier">xpart</span><span class="plain">*</span><span class="identifier">mapunit</span><span class="plain">/100; </span><span class="identifier">by</span><span class="plain"> += </span><span class="identifier">ypart</span><span class="plain">*</span><span class="identifier">mapunit</span><span class="plain">/100;</span>
<span class="functiontext">PL::EPSMap::plot_text_at</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="identifier">rh</span><span class="plain">-</span><span class="element">&gt;annotation</span><span class="plain">, </span><span class="identifier">NULL</span><span class="plain">, 128, </span><span class="identifier">rh</span><span class="plain">-</span><span class="element">&gt;font</span><span class="plain">, </span><span class="identifier">bx</span><span class="plain">, </span><span class="identifier">by</span><span class="plain">, </span><span class="identifier">rh</span><span class="plain">-</span><span class="element">&gt;point_size</span><span class="plain">,</span>
<span class="identifier">TRUE</span><span class="plain">, </span><span class="identifier">TRUE</span><span class="plain">); </span> <span class="comment">centred both horizontally and vertically</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">This code is used in <a href="#SP25">&#167;25</a>.</p>
<p class="inwebparagraph"><a id="SP26"></a><b>&#167;26. Writing text in EPS. </b>All of words written on the map &mdash; titles, labels for arrows, rubrics, and so
on &mdash; come from here.
</p>
<pre class="definitions">
<span class="definitionkeyword">define</span> <span class="constant">MAX_EPS_TEXT_LENGTH</span><span class="plain"> 1000</span>
<span class="definitionkeyword">define</span> <span class="constant">MAX_EPS_ABBREVIATED_LENGTH</span><span class="plain"> </span><span class="constant">MAX_EPS_TEXT_LENGTH</span>
</pre>
<pre class="display">
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">PL::EPSMap::plot_text_at</span><span class="plain">(</span><span class="identifier">OUTPUT_STREAM</span><span class="plain">, </span><span class="identifier">wchar_t</span><span class="plain"> *</span><span class="identifier">text_to_plot</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">int</span><span class="plain"> </span><span class="identifier">abbrev_to</span><span class="plain">,</span>
<span class="identifier">wchar_t</span><span class="plain"> *</span><span class="identifier">font</span><span class="plain">, </span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">x</span><span class="plain">, </span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">y</span><span class="plain">, </span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">pointsize</span><span class="plain">, </span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">centre_h</span><span class="plain">, </span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">centre_v</span><span class="plain">) {</span>
<span class="identifier">TEMPORARY_TEXT</span><span class="plain">(</span><span class="identifier">txt</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">text_to_plot</span><span class="plain">) {</span>
<span class="identifier">WRITE_TO</span><span class="plain">(</span><span class="identifier">txt</span><span class="plain">, </span><span class="string">"%w"</span><span class="plain">, </span><span class="identifier">text_to_plot</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">I</span><span class="plain">) {</span>
&lt;<span class="cwebmacro">Try taking the name from the printed name property of the room</span> <span class="cwebmacronumber">26.1</span>&gt;<span class="plain">;</span>
&lt;<span class="cwebmacro">If that fails, try taking the name from its source text name</span> <span class="cwebmacronumber">26.2</span>&gt;<span class="plain">;</span>
<span class="plain">} </span><span class="reserved">else</span><span class="plain"> </span><span class="reserved">return</span><span class="plain">;</span>
<span class="functiontext">PL::EPSMap::plot_stream_at</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="identifier">txt</span><span class="plain">, </span><span class="identifier">I</span><span class="plain">, </span><span class="identifier">abbrev_to</span><span class="plain">, </span><span class="identifier">font</span><span class="plain">, </span><span class="identifier">x</span><span class="plain">, </span><span class="identifier">y</span><span class="plain">, </span><span class="identifier">pointsize</span><span class="plain">, </span><span class="identifier">centre_h</span><span class="plain">, </span><span class="identifier">centre_v</span><span class="plain">);</span>
<span class="identifier">DISCARD_TEXT</span><span class="plain">(</span><span class="identifier">txt</span><span class="plain">);</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">The function PL::EPSMap::plot_text_at is used in <a href="#SP25_6_1_2">&#167;25.6.1.2</a>, <a href="#SP25_7_3">&#167;25.7.3</a>, <a href="#SP25_8">&#167;25.8</a>.</p>
<p class="inwebparagraph"><a id="SP26_1"></a><b>&#167;26.1. </b><code class="display">
&lt;<span class="cwebmacrodefn">Try taking the name from the printed name property of the room</span> <span class="cwebmacronumber">26.1</span>&gt; =
</code></p>
<pre class="displaydefn">
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">P_printed_name</span><span class="plain">) {</span>
<span class="identifier">parse_node</span><span class="plain"> *</span><span class="identifier">V</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_printed_name</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="identifier">Rvalues::is_CONSTANT_of_kind</span><span class="plain">(</span><span class="identifier">V</span><span class="plain">, </span><span class="identifier">K_text</span><span class="plain">)) &amp;&amp;</span>
<span class="plain">(</span><span class="identifier">Wordings::nonempty</span><span class="plain">(</span><span class="identifier">ParseTree::get_text</span><span class="plain">(</span><span class="identifier">V</span><span class="plain">)))) {</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">wn</span><span class="plain"> = </span><span class="identifier">Wordings::first_wn</span><span class="plain">(</span><span class="identifier">ParseTree::get_text</span><span class="plain">(</span><span class="identifier">V</span><span class="plain">));</span>
<span class="identifier">WRITE_TO</span><span class="plain">(</span><span class="identifier">txt</span><span class="plain">, </span><span class="string">"%+W"</span><span class="plain">, </span><span class="identifier">Wordings::one_word</span><span class="plain">(</span><span class="identifier">wn</span><span class="plain">));</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Str::get_first_char</span><span class="plain">(</span><span class="identifier">txt</span><span class="plain">) == </span><span class="character">'\</span><span class="plain">"</span><span class="character">'</span><span class="plain">) </span><span class="identifier">Str::delete_first_character</span><span class="plain">(</span><span class="identifier">txt</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Str::get_last_char</span><span class="plain">(</span><span class="identifier">txt</span><span class="plain">) == </span><span class="character">'\</span><span class="plain">"</span><span class="character">'</span><span class="plain">) </span><span class="identifier">Str::delete_last_character</span><span class="plain">(</span><span class="identifier">txt</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="#SP26">&#167;26</a>.</p>
<p class="inwebparagraph"><a id="SP26_2"></a><b>&#167;26.2. </b><code class="display">
&lt;<span class="cwebmacrodefn">If that fails, try taking the name from its source text name</span> <span class="cwebmacronumber">26.2</span>&gt; =
</code></p>
<pre class="displaydefn">
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Str::len</span><span class="plain">(</span><span class="identifier">txt</span><span class="plain">) == 0) {</span>
<span class="identifier">wording</span><span class="plain"> </span><span class="identifier">W</span><span class="plain"> = </span><span class="identifier">Instances::get_name</span><span class="plain">(</span><span class="identifier">I</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">Wordings::empty</span><span class="plain">(</span><span class="identifier">W</span><span class="plain">)) </span><span class="reserved">return</span><span class="plain">;</span>
<span class="identifier">WRITE_TO</span><span class="plain">(</span><span class="identifier">txt</span><span class="plain">, </span><span class="string">"%+W"</span><span class="plain">, </span><span class="identifier">W</span><span class="plain">);</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">This code is used in <a href="#SP26">&#167;26</a>.</p>
<p class="inwebparagraph"><a id="SP27"></a><b>&#167;27. </b></p>
<pre class="display">
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">PL::EPSMap::plot_stream_at</span><span class="plain">(</span><span class="identifier">OUTPUT_STREAM</span><span class="plain">, </span><span class="identifier">text_stream</span><span class="plain"> *</span><span class="identifier">text_to_plot</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">int</span><span class="plain"> </span><span class="identifier">abbrev_to</span><span class="plain">,</span>
<span class="identifier">wchar_t</span><span class="plain"> *</span><span class="identifier">font</span><span class="plain">, </span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">x</span><span class="plain">, </span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">y</span><span class="plain">, </span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">pointsize</span><span class="plain">, </span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">centre_h</span><span class="plain">, </span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">centre_v</span><span class="plain">) {</span>
<span class="identifier">TEMPORARY_TEXT</span><span class="plain">(</span><span class="identifier">txt</span><span class="plain">);</span>
<span class="identifier">Str::copy</span><span class="plain">(</span><span class="identifier">txt</span><span class="plain">, </span><span class="identifier">text_to_plot</span><span class="plain">);</span>
&lt;<span class="cwebmacro">Abbreviate the text to be printed by stripping dispensable letters</span> <span class="cwebmacronumber">27.1</span>&gt;<span class="plain">;</span>
<span class="functiontext">PL::EPSMap::EPS_compile_text</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="identifier">txt</span><span class="plain">, </span><span class="identifier">x</span><span class="plain">, </span><span class="identifier">y</span><span class="plain">, </span><span class="identifier">font</span><span class="plain">, </span><span class="identifier">pointsize</span><span class="plain">, </span><span class="identifier">centre_h</span><span class="plain">, </span><span class="identifier">centre_v</span><span class="plain">);</span>
<span class="identifier">DISCARD_TEXT</span><span class="plain">(</span><span class="identifier">txt</span><span class="plain">);</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">The function PL::EPSMap::plot_stream_at is used in <a href="#SP25_4">&#167;25.4</a>, <a href="#SP26">&#167;26</a>.</p>
<p class="inwebparagraph"><a id="SP27_1"></a><b>&#167;27.1. </b>The following cuts the text down to the abbreviation length by knocking out,
in sequence: (a) lower-case vowels; (b) spaces; (c) lower-case consonants; (d)
punctuation marks. If that doesn't do it, the text is simply truncated. For
example, "Peisey-Nancroix" abbreviated to 10 is "Pesy-Nncrx" and to 5
is "PsyNn".
</p>
<p class="macrodefinition"><code class="display">
&lt;<span class="cwebmacrodefn">Abbreviate the text to be printed by stripping dispensable letters</span> <span class="cwebmacronumber">27.1</span>&gt; =
</code></p>
<pre class="displaydefn">
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">abbrev_to</span><span class="plain"> &gt; </span><span class="constant">MAX_EPS_ABBREVIATED_LENGTH</span><span class="plain">) </span><span class="identifier">abbrev_to</span><span class="plain"> = </span><span class="constant">MAX_EPS_ABBREVIATED_LENGTH</span><span class="plain">;</span>
<span class="reserved">while</span><span class="plain"> (</span><span class="identifier">Str::len</span><span class="plain">(</span><span class="identifier">txt</span><span class="plain">) &gt; </span><span class="identifier">abbrev_to</span><span class="plain">) {</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">j</span><span class="plain">;</span>
<span class="reserved">for</span><span class="plain"> (</span><span class="identifier">j</span><span class="plain">=</span><span class="identifier">Str::len</span><span class="plain">(</span><span class="identifier">txt</span><span class="plain">)-1; </span><span class="identifier">j</span><span class="plain">&gt;=0; </span><span class="identifier">j</span><span class="plain">--)</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Characters::vowel</span><span class="plain">(</span><span class="identifier">Str::get_at</span><span class="plain">(</span><span class="identifier">txt</span><span class="plain">, </span><span class="identifier">j</span><span class="plain">))) </span><span class="reserved">goto</span><span class="plain"> </span><span class="identifier">RemoveOne</span><span class="plain">;</span>
<span class="reserved">for</span><span class="plain"> (</span><span class="identifier">j</span><span class="plain">=</span><span class="identifier">Str::len</span><span class="plain">(</span><span class="identifier">txt</span><span class="plain">)-1; </span><span class="identifier">j</span><span class="plain">&gt;=0; </span><span class="identifier">j</span><span class="plain">--)</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Str::get_at</span><span class="plain">(</span><span class="identifier">txt</span><span class="plain">, </span><span class="identifier">j</span><span class="plain">) == </span><span class="character">' '</span><span class="plain">) </span><span class="reserved">goto</span><span class="plain"> </span><span class="identifier">RemoveOne</span><span class="plain">;</span>
<span class="reserved">for</span><span class="plain"> (</span><span class="identifier">j</span><span class="plain">=</span><span class="identifier">Str::len</span><span class="plain">(</span><span class="identifier">txt</span><span class="plain">)-1; </span><span class="identifier">j</span><span class="plain">&gt;=0; </span><span class="identifier">j</span><span class="plain">--)</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">islower</span><span class="plain">(</span><span class="identifier">Str::get_at</span><span class="plain">(</span><span class="identifier">txt</span><span class="plain">, </span><span class="identifier">j</span><span class="plain">))) </span><span class="reserved">goto</span><span class="plain"> </span><span class="identifier">RemoveOne</span><span class="plain">;</span>
<span class="reserved">for</span><span class="plain"> (</span><span class="identifier">j</span><span class="plain">=</span><span class="identifier">Str::len</span><span class="plain">(</span><span class="identifier">txt</span><span class="plain">)-1; </span><span class="identifier">j</span><span class="plain">&gt;=0; </span><span class="identifier">j</span><span class="plain">--)</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">isupper</span><span class="plain">(</span><span class="identifier">Str::get_at</span><span class="plain">(</span><span class="identifier">txt</span><span class="plain">, </span><span class="identifier">j</span><span class="plain">)) == </span><span class="identifier">FALSE</span><span class="plain">) </span><span class="reserved">goto</span><span class="plain"> </span><span class="identifier">RemoveOne</span><span class="plain">;</span>
<span class="identifier">Str::truncate</span><span class="plain">(</span><span class="identifier">txt</span><span class="plain">, </span><span class="identifier">abbrev_to</span><span class="plain">);</span>
<span class="reserved">break</span><span class="plain">;</span>
<span class="identifier">RemoveOne</span><span class="plain">: </span><span class="identifier">Str::delete_nth_character</span><span class="plain">(</span><span class="identifier">txt</span><span class="plain">, </span><span class="identifier">j</span><span class="plain">);</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">This code is used in <a href="#SP27">&#167;27</a>.</p>
<p class="inwebparagraph"><a id="SP28"></a><b>&#167;28. EPS header. </b>EPS files are identified and version-numbered by a header, as follows.
</p>
<pre class="display">
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">PL::EPSMap::EPS_compile_header</span><span class="plain">(</span><span class="identifier">OUTPUT_STREAM</span><span class="plain">, </span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">bounding_box_width</span><span class="plain">, </span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">bounding_box_height</span><span class="plain">,</span>
<span class="identifier">wchar_t</span><span class="plain"> *</span><span class="identifier">default_font</span><span class="plain">, </span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">default_point_size</span><span class="plain">) {</span>
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"%%!PS-Adobe EPSF-3.0\</span><span class="plain">n</span><span class="string">"</span><span class="plain">);</span>
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"%%%%BoundingBox: 0 0 %d %d\</span><span class="plain">n</span><span class="string">"</span><span class="plain">, </span><span class="identifier">bounding_box_width</span><span class="plain">, </span><span class="identifier">bounding_box_height</span><span class="plain">);</span>
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"%%%%IncludeFont: %w\</span><span class="plain">n</span><span class="string">"</span><span class="plain">, </span><span class="identifier">default_font</span><span class="plain">);</span>
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"/%w findfont %d scalefont setfont\</span><span class="plain">n</span><span class="string">"</span><span class="plain">, </span><span class="identifier">default_font</span><span class="plain">, </span><span class="identifier">default_point_size</span><span class="plain">);</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">The function PL::EPSMap::EPS_compile_header is used in <a href="#SP25">&#167;25</a>.</p>
<p class="inwebparagraph"><a id="SP29"></a><b>&#167;29. Circles and rectangles. </b>In EPS files, there's an imaginary pen which traces out "paths". These begin
whenever the pen moves to a new location, and then continue until they are
closed (joined up back to the start position) with a <code class="display"><span class="extract">closepath</span></code> command.
</p>
<pre class="display">
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">PL::EPSMap::EPS_compile_circular_path</span><span class="plain">(</span><span class="identifier">OUTPUT_STREAM</span><span class="plain">, </span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">x0</span><span class="plain">, </span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">y0</span><span class="plain">, </span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">radius</span><span class="plain">) {</span>
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"%d %d moveto %% rightmost point\</span><span class="plain">n</span><span class="string">"</span><span class="plain">, </span><span class="identifier">x0</span><span class="plain">+</span><span class="identifier">radius</span><span class="plain">, </span><span class="identifier">y0</span><span class="plain">);</span>
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"%d %d %d %d %d arc %% full circle traced anticlockwise\</span><span class="plain">n</span><span class="string">"</span><span class="plain">,</span>
<span class="identifier">x0</span><span class="plain">, </span><span class="identifier">y0</span><span class="plain">, </span><span class="identifier">radius</span><span class="plain">, 0, 360);</span>
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"closepath\</span><span class="plain">n</span><span class="string">"</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">PL::EPSMap::EPS_compile_rectangular_path</span><span class="plain">(</span><span class="identifier">OUTPUT_STREAM</span><span class="plain">, </span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">x0</span><span class="plain">, </span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">y0</span><span class="plain">, </span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">x1</span><span class="plain">, </span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">y1</span><span class="plain">) {</span>
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"%d %d moveto %% bottom left corner\</span><span class="plain">n</span><span class="string">"</span><span class="plain">, </span><span class="identifier">x0</span><span class="plain">, </span><span class="identifier">y0</span><span class="plain">);</span>
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"%d %d lineto %% bottom side\</span><span class="plain">n</span><span class="string">"</span><span class="plain">, </span><span class="identifier">x1</span><span class="plain">, </span><span class="identifier">y0</span><span class="plain">);</span>
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"%d %d lineto %% right side\</span><span class="plain">n</span><span class="string">"</span><span class="plain">, </span><span class="identifier">x1</span><span class="plain">, </span><span class="identifier">y1</span><span class="plain">);</span>
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"%d %d lineto %% top side\</span><span class="plain">n</span><span class="string">"</span><span class="plain">, </span><span class="identifier">x0</span><span class="plain">, </span><span class="identifier">y1</span><span class="plain">);</span>
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"closepath\</span><span class="plain">n</span><span class="string">"</span><span class="plain">);</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">The function PL::EPSMap::EPS_compile_circular_path is used in <a href="#SP30">&#167;30</a>.</p>
<p class="endnote">The function PL::EPSMap::EPS_compile_rectangular_path is used in <a href="#SP25_2">&#167;25.2</a>, <a href="#SP30">&#167;30</a>.</p>
<p class="inwebparagraph"><a id="SP30"></a><b>&#167;30. </b>The boundary of a room is always one of these:
</p>
<pre class="display">
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">PL::EPSMap::EPS_compile_room_boundary_path</span><span class="plain">(</span><span class="identifier">OUTPUT_STREAM</span><span class="plain">, </span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">bx</span><span class="plain">, </span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">by</span><span class="plain">, </span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">boxsize</span><span class="plain">, </span><span class="identifier">wchar_t</span><span class="plain"> *</span><span class="identifier">shape</span><span class="plain">) {</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Wide::cmp</span><span class="plain">(</span><span class="identifier">shape</span><span class="plain">, </span><span class="identifier">L</span><span class="string">"square"</span><span class="plain">) == 0)</span>
<span class="functiontext">PL::EPSMap::EPS_compile_rectangular_path</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="identifier">bx</span><span class="plain">-</span><span class="identifier">boxsize</span><span class="plain">, </span><span class="identifier">by</span><span class="plain">-</span><span class="identifier">boxsize</span><span class="plain">, </span><span class="identifier">bx</span><span class="plain">+</span><span class="identifier">boxsize</span><span class="plain">, </span><span class="identifier">by</span><span class="plain">+</span><span class="identifier">boxsize</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">Wide::cmp</span><span class="plain">(</span><span class="identifier">shape</span><span class="plain">, </span><span class="identifier">L</span><span class="string">"rectangle"</span><span class="plain">) == 0)</span>
<span class="functiontext">PL::EPSMap::EPS_compile_rectangular_path</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="identifier">bx</span><span class="plain">-2*</span><span class="identifier">boxsize</span><span class="plain">, </span><span class="identifier">by</span><span class="plain">-</span><span class="identifier">boxsize</span><span class="plain">, </span><span class="identifier">bx</span><span class="plain">+2*</span><span class="identifier">boxsize</span><span class="plain">, </span><span class="identifier">by</span><span class="plain">+</span><span class="identifier">boxsize</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">Wide::cmp</span><span class="plain">(</span><span class="identifier">shape</span><span class="plain">, </span><span class="identifier">L</span><span class="string">"circle"</span><span class="plain">) == 0)</span>
<span class="functiontext">PL::EPSMap::EPS_compile_circular_path</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="identifier">bx</span><span class="plain">, </span><span class="identifier">by</span><span class="plain">, </span><span class="identifier">boxsize</span><span class="plain">);</span>
<span class="reserved">else</span>
<span class="functiontext">PL::EPSMap::EPS_compile_rectangular_path</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="identifier">bx</span><span class="plain">-</span><span class="identifier">boxsize</span><span class="plain">, </span><span class="identifier">by</span><span class="plain">-</span><span class="identifier">boxsize</span><span class="plain">, </span><span class="identifier">bx</span><span class="plain">+</span><span class="identifier">boxsize</span><span class="plain">, </span><span class="identifier">by</span><span class="plain">+</span><span class="identifier">boxsize</span><span class="plain">);</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">The function PL::EPSMap::EPS_compile_room_boundary_path is used in <a href="#SP25_7_1">&#167;25.7.1</a>, <a href="#SP25_7_2">&#167;25.7.2</a>.</p>
<p class="inwebparagraph"><a id="SP31"></a><b>&#167;31. Straight lines. </b></p>
<pre class="display">
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">PL::EPSMap::EPS_compile_horizontal_line_path</span><span class="plain">(</span><span class="identifier">OUTPUT_STREAM</span><span class="plain">, </span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">x0</span><span class="plain">, </span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">x1</span><span class="plain">, </span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">y</span><span class="plain">) {</span>
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"%d %d moveto %% LHS\</span><span class="plain">n</span><span class="string">"</span><span class="plain">, </span><span class="identifier">x0</span><span class="plain">, </span><span class="identifier">y</span><span class="plain">);</span>
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"%d %d lineto %% RHS\</span><span class="plain">n</span><span class="string">"</span><span class="plain">, </span><span class="identifier">x1</span><span class="plain">, </span><span class="identifier">y</span><span class="plain">);</span>
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"closepath\</span><span class="plain">n</span><span class="string">"</span><span class="plain">);</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">The function PL::EPSMap::EPS_compile_horizontal_line_path is used in <a href="#SP25_3">&#167;25.3</a>.</p>
<p class="inwebparagraph"><a id="SP32"></a><b>&#167;32. Dashed arrows. </b></p>
<pre class="display">
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">PL::EPSMap::EPS_compile_dashed_arrow</span><span class="plain">(</span><span class="identifier">OUTPUT_STREAM</span><span class="plain">, </span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">length</span><span class="plain">, </span><span class="reserved">vector</span><span class="plain"> </span><span class="identifier">Dir</span><span class="plain">, </span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">x0</span><span class="plain">, </span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">y0</span><span class="plain">) {</span>
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"[2 1] 0 setdash %% dashed line for arrow\</span><span class="plain">n</span><span class="string">"</span><span class="plain">);</span>
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"%d %d moveto %% room centre\</span><span class="plain">n</span><span class="string">"</span><span class="plain">, </span><span class="identifier">x0</span><span class="plain">, </span><span class="identifier">y0</span><span class="plain">);</span>
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"%d %d rlineto %% arrow out\</span><span class="plain">n</span><span class="string">"</span><span class="plain">, </span><span class="identifier">Dir</span><span class="element">.x</span><span class="plain">*</span><span class="identifier">length</span><span class="plain">, </span><span class="identifier">Dir</span><span class="plain">.</span><span class="identifier">y</span><span class="plain">*</span><span class="identifier">length</span><span class="plain">);</span>
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"stroke\</span><span class="plain">n</span><span class="string">"</span><span class="plain">);</span>
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"[] 0 setdash %% back to normal solid lines\</span><span class="plain">n</span><span class="string">"</span><span class="plain">);</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">The function PL::EPSMap::EPS_compile_dashed_arrow is used in <a href="#SP25_6_1_2">&#167;25.6.1.2</a>.</p>
<p class="inwebparagraph"><a id="SP33"></a><b>&#167;33. Bezier curves. </b>The other sort of path we'll need is a Bézier curve, a quadratic curve which
interpolates between vectors. EPS has support for these built-in; see any
reference book on PostScript.
</p>
<pre class="display">
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">PL::EPSMap::EPS_compile_Bezier_curve</span><span class="plain">(</span><span class="identifier">OUTPUT_STREAM</span><span class="plain">, </span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">stiffness0</span><span class="plain">, </span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">stiffness1</span><span class="plain">,</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">x0</span><span class="plain">, </span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">y0</span><span class="plain">, </span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">exit0</span><span class="plain">, </span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">x1</span><span class="plain">, </span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">y1</span><span class="plain">, </span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">exit1</span><span class="plain">) {</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">cx1</span><span class="plain">, </span><span class="identifier">cy1</span><span class="plain">, </span><span class="identifier">cx2</span><span class="plain">, </span><span class="identifier">cy2</span><span class="plain">;</span>
<span class="reserved">vector</span><span class="plain"> </span><span class="identifier">E</span><span class="plain"> = </span><span class="functiontext">PL::SpatialMap::direction_as_vector</span><span class="plain">(</span><span class="identifier">exit0</span><span class="plain">);</span>
<span class="identifier">cx1</span><span class="plain"> = </span><span class="identifier">x0</span><span class="plain">+</span><span class="identifier">E</span><span class="element">.x</span><span class="plain">*</span><span class="identifier">stiffness0</span><span class="plain">/100; </span><span class="identifier">cy1</span><span class="plain"> = </span><span class="identifier">y0</span><span class="plain">+</span><span class="identifier">E</span><span class="plain">.</span><span class="identifier">y</span><span class="plain">*</span><span class="identifier">stiffness0</span><span class="plain">/100;</span>
<span class="identifier">E</span><span class="plain"> = </span><span class="functiontext">PL::SpatialMap::direction_as_vector</span><span class="plain">(</span><span class="identifier">exit1</span><span class="plain">);</span>
<span class="identifier">cx2</span><span class="plain"> = </span><span class="identifier">x1</span><span class="plain">+</span><span class="identifier">E</span><span class="element">.x</span><span class="plain">*</span><span class="identifier">stiffness1</span><span class="plain">/100; </span><span class="identifier">cy2</span><span class="plain"> = </span><span class="identifier">y1</span><span class="plain">+</span><span class="identifier">E</span><span class="plain">.</span><span class="identifier">y</span><span class="plain">*</span><span class="identifier">stiffness1</span><span class="plain">/100;</span>
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"%d %d moveto %% start of Bezier curve\</span><span class="plain">n</span><span class="string">"</span><span class="plain">, </span><span class="identifier">x0</span><span class="plain">, </span><span class="identifier">y0</span><span class="plain">);</span>
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"%d %d %d %d %d %d curveto %% control points 1, 2 and end\</span><span class="plain">n</span><span class="string">"</span><span class="plain">,</span>
<span class="identifier">cx1</span><span class="plain">, </span><span class="identifier">cy1</span><span class="plain">, </span><span class="identifier">cx2</span><span class="plain">, </span><span class="identifier">cy2</span><span class="plain">, </span><span class="identifier">x1</span><span class="plain">, </span><span class="identifier">y1</span><span class="plain">);</span>
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"stroke\</span><span class="plain">n</span><span class="string">"</span><span class="plain">);</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">The function PL::EPSMap::EPS_compile_Bezier_curve is used in <a href="#SP25_6_1_1">&#167;25.6.1.1</a>.</p>
<p class="inwebparagraph"><a id="SP34"></a><b>&#167;34. Line thickness. </b>The following routines should be used in nested pairs, so that the PostScript
stack is kept in order.
</p>
<pre class="display">
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">PL::EPSMap::EPS_compile_line_width_setting</span><span class="plain">(</span><span class="identifier">OUTPUT_STREAM</span><span class="plain">, </span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">new</span><span class="plain">) {</span>
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"currentlinewidth %% Push old line width onto stack\</span><span class="plain">n</span><span class="string">"</span><span class="plain">);</span>
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"%d setlinewidth\</span><span class="plain">n</span><span class="string">"</span><span class="plain">, </span><span class="identifier">new</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">PL::EPSMap::EPS_compile_line_width_unsetting</span><span class="plain">(</span><span class="identifier">OUTPUT_STREAM</span><span class="plain">) {</span>
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"setlinewidth %% Pull old line width from stack\</span><span class="plain">n</span><span class="string">"</span><span class="plain">);</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">The function PL::EPSMap::EPS_compile_line_width_setting is used in <a href="#SP25_6">&#167;25.6</a>, <a href="#SP25_7_2">&#167;25.7.2</a>.</p>
<p class="endnote">The function PL::EPSMap::EPS_compile_line_width_unsetting is used in <a href="#SP25_6">&#167;25.6</a>, <a href="#SP25_7_2">&#167;25.7.2</a>.</p>
<p class="inwebparagraph"><a id="SP35"></a><b>&#167;35. Text. </b>In EPS world, text is just another sort of path.
</p>
<pre class="display">
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">PL::EPSMap::EPS_compile_text</span><span class="plain">(</span><span class="identifier">OUTPUT_STREAM</span><span class="plain">, </span><span class="identifier">text_stream</span><span class="plain"> *</span><span class="identifier">text</span><span class="plain">, </span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">x</span><span class="plain">, </span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">y</span><span class="plain">,</span>
<span class="identifier">wchar_t</span><span class="plain"> *</span><span class="identifier">font</span><span class="plain">, </span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">pointsize</span><span class="plain">, </span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">centre_h</span><span class="plain">, </span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">centre_v</span><span class="plain">) {</span>
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"/%w findfont %d scalefont setfont\</span><span class="plain">n</span><span class="string">"</span><span class="plain">, </span><span class="identifier">font</span><span class="plain">, </span><span class="identifier">pointsize</span><span class="plain">);</span>
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"newpath (%S)\</span><span class="plain">n</span><span class="string">"</span><span class="plain">, </span><span class="identifier">text</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">centre_h</span><span class="plain">) </span><span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"dup stringwidth add 2 div %d exch sub %% = X centre-offset\</span><span class="plain">n</span><span class="string">"</span><span class="plain">, </span><span class="identifier">x</span><span class="plain">);</span>
<span class="reserved">else</span><span class="plain"> </span><span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"%d %% = X\</span><span class="plain">n</span><span class="string">"</span><span class="plain">, </span><span class="identifier">x</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">centre_v</span><span class="plain">) </span><span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"%d %d 2 div sub %% = Y centre-offset\</span><span class="plain">n</span><span class="string">"</span><span class="plain">, </span><span class="identifier">y</span><span class="plain">, </span><span class="identifier">pointsize</span><span class="plain">);</span>
<span class="reserved">else</span><span class="plain"> </span><span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"%d %% = Y\</span><span class="plain">n</span><span class="string">"</span><span class="plain">, </span><span class="identifier">y</span><span class="plain">);</span>
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"moveto show\</span><span class="plain">n</span><span class="string">"</span><span class="plain">);</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">The function PL::EPSMap::EPS_compile_text is used in <a href="#SP27">&#167;27</a>.</p>
<p class="inwebparagraph"><a id="SP36"></a><b>&#167;36. RGB colours. </b>Inform internally stores colours as six hexadecimal digits, in traditional
HTML way: <code class="display"><span class="extract">RRGGBB</span></code>, with each colour from 0 to 255. In EPS files, colours
are written as triples of floating point numbers 0 &lt;= b &lt;= 1.
</p>
<p class="inwebparagraph">EPS uses reverse Polish notation, so the command here is: <code class="display"><span class="extract">R G B setrgbcolor</span></code>.
</p>
<pre class="display">
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">PL::EPSMap::EPS_compile_set_colour</span><span class="plain">(</span><span class="identifier">OUTPUT_STREAM</span><span class="plain">, </span><span class="identifier">wchar_t</span><span class="plain"> *</span><span class="identifier">htmlcolour</span><span class="plain">) {</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Wide::len</span><span class="plain">(</span><span class="identifier">htmlcolour</span><span class="plain">) != 6) </span><span class="identifier">internal_error</span><span class="plain">(</span><span class="string">"Improper HTML colour"</span><span class="plain">);</span>
<span class="functiontext">PL::EPSMap::choose_colour_beam</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="identifier">htmlcolour</span><span class="plain">[0], </span><span class="identifier">htmlcolour</span><span class="plain">[1]);</span>
<span class="functiontext">PL::EPSMap::choose_colour_beam</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="identifier">htmlcolour</span><span class="plain">[2], </span><span class="identifier">htmlcolour</span><span class="plain">[3]);</span>
<span class="functiontext">PL::EPSMap::choose_colour_beam</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="identifier">htmlcolour</span><span class="plain">[4], </span><span class="identifier">htmlcolour</span><span class="plain">[5]);</span>
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"setrgbcolor %% From HTML colour %w\</span><span class="plain">n</span><span class="string">"</span><span class="plain">, </span><span class="identifier">htmlcolour</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">PL::EPSMap::choose_colour_beam</span><span class="plain">(</span><span class="identifier">OUTPUT_STREAM</span><span class="plain">, </span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">hex1</span><span class="plain">, </span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">hex2</span><span class="plain">) {</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">k</span><span class="plain"> = </span><span class="functiontext">PL::EPSMap::hex_to_int</span><span class="plain">(</span><span class="identifier">hex1</span><span class="plain">)*16 + </span><span class="functiontext">PL::EPSMap::hex_to_int</span><span class="plain">(</span><span class="identifier">hex2</span><span class="plain">);</span>
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"%.6g "</span><span class="plain">, (</span><span class="reserved">double</span><span class="plain">) (((</span><span class="reserved">float</span><span class="plain">) </span><span class="identifier">k</span><span class="plain">)/255.0));</span>
<span class="plain">}</span>
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">PL::EPSMap::hex_to_int</span><span class="plain">(</span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">hex</span><span class="plain">) {</span>
<span class="reserved">switch</span><span class="plain">(</span><span class="identifier">hex</span><span class="plain">) {</span>
<span class="reserved">case</span><span class="plain"> </span><span class="character">'0'</span><span class="plain">: </span><span class="reserved">return</span><span class="plain"> 0;</span>
<span class="reserved">case</span><span class="plain"> </span><span class="character">'1'</span><span class="plain">: </span><span class="reserved">return</span><span class="plain"> 1;</span>
<span class="reserved">case</span><span class="plain"> </span><span class="character">'2'</span><span class="plain">: </span><span class="reserved">return</span><span class="plain"> 2;</span>
<span class="reserved">case</span><span class="plain"> </span><span class="character">'3'</span><span class="plain">: </span><span class="reserved">return</span><span class="plain"> 3;</span>
<span class="reserved">case</span><span class="plain"> </span><span class="character">'4'</span><span class="plain">: </span><span class="reserved">return</span><span class="plain"> 4;</span>
<span class="reserved">case</span><span class="plain"> </span><span class="character">'5'</span><span class="plain">: </span><span class="reserved">return</span><span class="plain"> 5;</span>
<span class="reserved">case</span><span class="plain"> </span><span class="character">'6'</span><span class="plain">: </span><span class="reserved">return</span><span class="plain"> 6;</span>
<span class="reserved">case</span><span class="plain"> </span><span class="character">'7'</span><span class="plain">: </span><span class="reserved">return</span><span class="plain"> 7;</span>
<span class="reserved">case</span><span class="plain"> </span><span class="character">'8'</span><span class="plain">: </span><span class="reserved">return</span><span class="plain"> 8;</span>
<span class="reserved">case</span><span class="plain"> </span><span class="character">'9'</span><span class="plain">: </span><span class="reserved">return</span><span class="plain"> 9;</span>
<span class="reserved">case</span><span class="plain"> </span><span class="character">'a'</span><span class="plain">: </span><span class="reserved">case</span><span class="plain"> </span><span class="character">'A'</span><span class="plain">: </span><span class="reserved">return</span><span class="plain"> 10;</span>
<span class="reserved">case</span><span class="plain"> </span><span class="character">'b'</span><span class="plain">: </span><span class="reserved">case</span><span class="plain"> </span><span class="character">'B'</span><span class="plain">: </span><span class="reserved">return</span><span class="plain"> 11;</span>
<span class="reserved">case</span><span class="plain"> </span><span class="character">'c'</span><span class="plain">: </span><span class="reserved">case</span><span class="plain"> </span><span class="character">'C'</span><span class="plain">: </span><span class="reserved">return</span><span class="plain"> 12;</span>
<span class="reserved">case</span><span class="plain"> </span><span class="character">'d'</span><span class="plain">: </span><span class="reserved">case</span><span class="plain"> </span><span class="character">'D'</span><span class="plain">: </span><span class="reserved">return</span><span class="plain"> 13;</span>
<span class="reserved">case</span><span class="plain"> </span><span class="character">'e'</span><span class="plain">: </span><span class="reserved">case</span><span class="plain"> </span><span class="character">'E'</span><span class="plain">: </span><span class="reserved">return</span><span class="plain"> 14;</span>
<span class="reserved">case</span><span class="plain"> </span><span class="character">'f'</span><span class="plain">: </span><span class="reserved">case</span><span class="plain"> </span><span class="character">'F'</span><span class="plain">: </span><span class="reserved">return</span><span class="plain"> 15;</span>
<span class="reserved">default</span><span class="plain">: </span><span class="identifier">internal_error</span><span class="plain">(</span><span class="string">"Improper character in HTML colour"</span><span class="plain">);</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::EPSMap::EPS_compile_set_colour is used in <a href="#SP25_4">&#167;25.4</a>, <a href="#SP25_6_1">&#167;25.6.1</a>, <a href="#SP25_7_1">&#167;25.7.1</a>, <a href="#SP25_7_2">&#167;25.7.2</a>, <a href="#SP25_7_3">&#167;25.7.3</a>, <a href="#SP25_8">&#167;25.8</a>.</p>
<p class="endnote">The function PL::EPSMap::choose_colour_beam appears nowhere else.</p>
<p class="endnote">The function PL::EPSMap::hex_to_int appears nowhere else.</p>
<p class="inwebparagraph"><a id="SP37"></a><b>&#167;37. </b>EPS also supports greyscale, where there's only one beam:
</p>
<pre class="display">
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">PL::EPSMap::EPS_compile_set_greyscale</span><span class="plain">(</span><span class="identifier">OUTPUT_STREAM</span><span class="plain">, </span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">N</span><span class="plain">) {</span>
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"%0.02f setgray %% greyscale %d/100ths of white\</span><span class="plain">n</span><span class="string">"</span><span class="plain">, (</span><span class="reserved">float</span><span class="plain">) </span><span class="identifier">N</span><span class="plain">/100, </span><span class="identifier">N</span><span class="plain">);</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">The function PL::EPSMap::EPS_compile_set_greyscale is used in <a href="#SP25_4">&#167;25.4</a>, <a href="#SP25_6_1">&#167;25.6.1</a>, <a href="#SP25_7_1">&#167;25.7.1</a>, <a href="#SP25_7_2">&#167;25.7.2</a>, <a href="#SP25_7_3">&#167;25.7.3</a>, <a href="#SP25_8">&#167;25.8</a>.</p>
<hr class="tocbar">
<ul class="toc"><li><a href="3-hm.html">Back to 'HTML Map'</a></li><li><a href="3-sc.html">Continue with 'Showme Command'</a></li></ul><hr class="tocbar">
<!--End of weave-->
</body>
</html>