1
0
Fork 0
mirror of https://github.com/ganelson/inform.git synced 2024-07-05 16:44:21 +03:00
inform7/docs/core-module/21-rl2.html
2020-01-27 01:22:21 +00:00

1695 lines
235 KiB
HTML

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<title>21/rb</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 '21/rl2' generated by 7-->
<ul class="crumbs"><li><a href="../webs.html">&#9733;</a></li><li><a href="index.html">core</a></li><li><a href="index.html#21">Chapter 21: Rules and Rulebooks</a></li><li><b>Rulebooks</b></li></ul><p class="purpose">To create, manage, compile and index rulebooks, the content of which is a linked list of booked rules together with some general conventions as to how they are to be used.</p>
<ul class="toc"><li><a href="#SP1">&#167;1. Definitions</a></li><li><a href="#SP8">&#167;8. Construction</a></li><li><a href="#SP11">&#167;11. Affected by placements</a></li><li><a href="#SP12">&#167;12. Reading properties of rulebooks</a></li><li><a href="#SP13">&#167;13. Rulebook variables</a></li><li><a href="#SP15">&#167;15. Indexing and logging rulebooks</a></li><li><a href="#SP16">&#167;16. Name parsing of rulebooks</a></li><li><a href="#SP19">&#167;19. Rule attachments</a></li><li><a href="#SP20">&#167;20. Compilation</a></li><li><a href="#SP21">&#167;21. Parsing rulebook properties</a></li><li><a href="#SP23">&#167;23. Rules index</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>A rulebook consists of some general properties together with a linked list
of booked rules, which constitute its entries. Some rulebooks are created
explicitly by the user's source text, some are created explicitly by the
Standard Rules, while others are "automatically generated" as a result
of other creations by Inform. For instance, each new scene ending generates
a rulebook. There are numerous other examples because a rulebook is the
natural and most flexible way to provide a "hook" by which to attach
behaviour to a world model.
</p>
<p class="inwebparagraph">In some ways phrases and rules are really subsidiary ideas, and the
rulebook is the fundamental level of programming in Inform 7. The reason it
turns up so late in the source code is that many of the other data
structures were building up to this one: a <code class="display"><span class="extract">rulebook</span></code> contains <code class="display"><span class="extract">booking</span></code>s
which refer to <code class="display"><span class="extract">phrase</span></code>s whose usage is defined with <code class="display"><span class="extract">specification</span></code>s, and
whose definition is stored in the <code class="display"><span class="extract">parse_node</span></code> tree until it can be
resolved as a list of <code class="display"><span class="extract">invocation</span></code>s.
</p>
<p class="inwebparagraph"><a id="SP3"></a><b>&#167;3. </b>The semantics of rulebooks have grown over time. At one time they looked
only at the current action, and did something accordingly, but there was
no real sense in which they passed information. They then began to apply
to objects or actions (this was called the "focus") and, in a few cases,
returned information by ending in success, failure or neither (the
"outcome"). Gradually they became more function-like: today, the focus can
be a value of any kind, or else the current action; and the outcome can be
success, failure, neither, a named outcome, or else a value of any kind.
Moreover they can have variables shared by all rules in the current
instantiation of the rulebook. A rulebook is thus able to do anything which
a function X--&gt; Y in a standard programming language can do; in 2009, it
was a particular goal of the rewriting of the kinds system to ensure that
rulebooks could, in principle, do anything which functions could do in a
language such as Haskell.
</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">rulebook</span><span class="plain"> {</span>
<span class="reserved">struct</span><span class="plain"> </span><span class="identifier">wording</span><span class="plain"> </span><span class="identifier">primary_name</span><span class="plain">; </span> <span class="comment">name in source text</span>
<span class="reserved">struct</span><span class="plain"> </span><span class="identifier">wording</span><span class="plain"> </span><span class="identifier">alternative_name</span><span class="plain">; </span> <span class="comment">alternative form of name</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">fragmentation_stem_length</span><span class="plain">; </span> <span class="comment">to do with parsing, but 0 for most rulebooks</span>
<span class="reserved">struct</span><span class="plain"> </span><span class="reserved">focus</span><span class="plain"> </span><span class="identifier">my_focus</span><span class="plain">;</span>
<span class="reserved">struct</span><span class="plain"> </span><span class="reserved">outcomes</span><span class="plain"> </span><span class="identifier">my_outcomes</span><span class="plain">;</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">automatically_generated</span><span class="plain">; </span> <span class="comment">so that the index can omit these</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">runs_during_activities</span><span class="plain">; </span> <span class="comment">allow "while..." clauses to name these</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">used_by_future_action_activity</span><span class="plain">; </span> <span class="comment">like "deciding the scope of something..."</span>
<span class="reserved">struct</span><span class="plain"> </span><span class="reserved">booking</span><span class="plain"> *</span><span class="identifier">rule_list</span><span class="plain">; </span> <span class="comment">linked list of booked rules</span>
<span class="reserved">struct</span><span class="plain"> </span><span class="reserved">placement_affecting</span><span class="plain"> *</span><span class="identifier">placement_list</span><span class="plain">; </span> <span class="comment">linked list of explicit placements</span>
<span class="reserved">struct</span><span class="plain"> </span><span class="reserved">stacked_variable_owner</span><span class="plain"> *</span><span class="identifier">owned_by_rb</span><span class="plain">; </span> <span class="comment">rulebook variables owned here</span>
<span class="reserved">struct</span><span class="plain"> </span><span class="reserved">stacked_variable_owner_list</span><span class="plain"> *</span><span class="identifier">accessible_from_rb</span><span class="plain">; </span> <span class="comment">and which can be named here</span>
<span class="reserved">struct</span><span class="plain"> </span><span class="identifier">inter_name</span><span class="plain"> *</span><span class="identifier">stv_creator_iname</span><span class="plain">;</span>
<span class="reserved">struct</span><span class="plain"> </span><span class="identifier">package_request</span><span class="plain"> *</span><span class="identifier">rb_package</span><span class="plain">;</span>
<span class="reserved">struct</span><span class="plain"> </span><span class="identifier">inter_name</span><span class="plain"> *</span><span class="identifier">rb_iname</span><span class="plain">; </span> <span class="comment">run-time storage/routine holding contents</span>
<span class="identifier">MEMORY_MANAGEMENT</span>
<span class="plain">} </span><span class="reserved">rulebook</span><span class="plain">;</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">The structure rulebook is accessed in 21/rl, 21/rps, 25/cp and here.</p>
<p class="inwebparagraph"><a id="SP4"></a><b>&#167;4. </b>The following is used only to store the result of parsing text as a
rulebook name:
</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">rulebook_match</span><span class="plain"> {</span>
<span class="reserved">struct</span><span class="plain"> </span><span class="reserved">rulebook</span><span class="plain"> *</span><span class="identifier">matched_rulebook</span><span class="plain">;</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">match_from</span><span class="plain">;</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">match_length</span><span class="plain">;</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">advance_words</span><span class="plain">;</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">tail_words</span><span class="plain">;</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">article_used</span><span class="plain">;</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">placement_requested</span><span class="plain">;</span>
<span class="plain">} </span><span class="reserved">rulebook_match</span><span class="plain">;</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">The structure rulebook_match is accessed in 22/pu and here.</p>
<p class="inwebparagraph"><a id="SP5"></a><b>&#167;5. </b>The contents of rulebooks can be unexpected if sentences are used which
explicitly list, or unlist, rules. To make the index more useful in these
cases, we keep a linked list, for each rulebook, of all sentences which
have affected it in this way:
</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">placement_affecting</span><span class="plain"> {</span>
<span class="reserved">struct</span><span class="plain"> </span><span class="identifier">parse_node</span><span class="plain"> *</span><span class="identifier">placement_sentence</span><span class="plain">;</span>
<span class="reserved">struct</span><span class="plain"> </span><span class="reserved">placement_affecting</span><span class="plain"> *</span><span class="identifier">next</span><span class="plain">;</span>
<span class="identifier">MEMORY_MANAGEMENT</span>
<span class="plain">} </span><span class="reserved">placement_affecting</span><span class="plain">;</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">The structure placement_affecting is accessed in 3/pd, 5/lp, 5/ut, 5/un, 5/ins, 6/rlt, 6/nv, 7/ss, 7/hdn, 7/ns, 7/oaf, 7/rs, 8/ie, 8/ec, 8/ed, 9/tfa, 9/tbath, 9/rpt, 9/tc, 9/ma, 9/rk, 9/ass, 9/imp, 9/pd, 10/teav, 10/cap, 11/ap, 11/pr, 11/bas, 11/tc, 11/sm, 12/dtd, 12/cdp, 14/rv, 14/lv, 14/cn, 14/ds, 14/ds2, 15/cp, 16/is, 16/in, 19/tb, 19/rsft, 19/tod, 20/eq, 21/rl, 21/fao, 21/rps, 21/sv, 21/ac, 22/ph, 22/tp, 22/tp2, 23/ad, 24/lv, 24/sf, 25/in, 25/pi, 25/cii, 25/cp, 26/uo, 26/tti, 26/pc, 26/ts, 27/cm and here.</p>
<p class="inwebparagraph"><a id="SP6"></a><b>&#167;6. </b>As rulebooks are declared, the first few are quietly copied into
a small array: that way, we can always obtain a pointer to, say, the
turn sequence rules by looking up <code class="display"><span class="extract">built_in_rulebooks[TURN_SEQUENCE_RB]</span></code>.
</p>
<pre class="definitions">
<span class="definitionkeyword">define</span> <span class="constant">MAX_BUILT_IN_RULEBOOKS</span><span class="plain"> 64</span>
</pre>
<pre class="display">
<span class="reserved">rulebook</span><span class="plain"> *</span><span class="identifier">built_in_rulebooks</span><span class="plain">[</span><span class="constant">MAX_BUILT_IN_RULEBOOKS</span><span class="plain">];</span>
<span class="reserved">struct</span><span class="plain"> </span><span class="reserved">stacked_variable_owner_list</span><span class="plain"> *</span><span class="identifier">all_action_processing_vars</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
</pre>
<p class="inwebparagraph"></p>
<p class="inwebparagraph"><a id="SP7"></a><b>&#167;7. </b>Many of the standard rulebooks need to have numbers which are
predictable, because they need to be referred to by number by the I6
library code. Because of this, it is important not to change the numbers
below without checking the corresponding I6 Constant declarations in the
<code class="display"><span class="extract">Definitions.i6t</span></code> file: the two sets of declarations must exactly match. They
must also exactly match the sequence in which these rulebooks are created
in the Standard Rules file.
</p>
<pre class="definitions">
<span class="definitionkeyword">define</span> <span class="constant">STARTUP_RB</span><span class="plain"> 0 </span> <span class="comment">Startup rules</span>
<span class="definitionkeyword">define</span> <span class="constant">SHUTDOWN_RB</span><span class="plain"> 1 </span> <span class="comment">Shutdown rules</span>
<span class="definitionkeyword">define</span> <span class="constant">TURN_SEQUENCE_RB</span><span class="plain"> 11 </span> <span class="comment">Turn sequence rules</span>
<span class="definitionkeyword">define</span> <span class="constant">SCENE_CHANGING_RB</span><span class="plain"> 12 </span> <span class="comment">Scene changing rules</span>
<span class="definitionkeyword">define</span> <span class="constant">WHEN_PLAY_BEGINS_RB</span><span class="plain"> 13 </span> <span class="comment">When play begins</span>
<span class="definitionkeyword">define</span> <span class="constant">WHEN_PLAY_ENDS_RB</span><span class="plain"> 14 </span> <span class="comment">When play ends</span>
<span class="definitionkeyword">define</span> <span class="constant">WHEN_SCENE_BEGINS_RB</span><span class="plain"> 15 </span> <span class="comment">When scene begins</span>
<span class="definitionkeyword">define</span> <span class="constant">WHEN_SCENE_ENDS_RB</span><span class="plain"> 16 </span> <span class="comment">When scene ends</span>
<span class="definitionkeyword">define</span> <span class="constant">EVERY_TURN_RB</span><span class="plain"> 17 </span> <span class="comment">Every turn</span>
<span class="definitionkeyword">define</span> <span class="constant">ACTION_PROCESSING_RB</span><span class="plain"> 18 </span> <span class="comment">Action-processing rules</span>
<span class="definitionkeyword">define</span> <span class="constant">SETTING_ACTION_VARIABLES_RB</span><span class="plain"> 19 </span> <span class="comment">Setting action variables rules</span>
<span class="definitionkeyword">define</span> <span class="constant">SPECIFIC_ACTION_PROCESSING_RB</span><span class="plain"> 20 </span> <span class="comment">Specific action-processing rules</span>
<span class="definitionkeyword">define</span> <span class="constant">PLAYERS_ACTION_AWARENESS_RB</span><span class="plain"> 21 </span> <span class="comment">Player's action awareness rules</span>
<span class="definitionkeyword">define</span> <span class="constant">ACCESSIBILITY_RB</span><span class="plain"> 22 </span> <span class="comment">Accessibility rules</span>
<span class="definitionkeyword">define</span> <span class="constant">REACHING_INSIDE_RB</span><span class="plain"> 23 </span> <span class="comment">Reaching inside rules</span>
<span class="definitionkeyword">define</span> <span class="constant">REACHING_OUTSIDE_RB</span><span class="plain"> 24 </span> <span class="comment">Reaching outside rules</span>
<span class="definitionkeyword">define</span> <span class="constant">VISIBILITY_RB</span><span class="plain"> 25 </span> <span class="comment">Visibility rules</span>
<span class="definitionkeyword">define</span> <span class="constant">PERSUASION_RB</span><span class="plain"> 26 </span> <span class="comment">Persuasion rules</span>
<span class="definitionkeyword">define</span> <span class="constant">UNSUCCESSFUL_ATTEMPT_BY_RB</span><span class="plain"> 27 </span> <span class="comment">Unsuccessful attempt by</span>
<span class="definitionkeyword">define</span> <span class="constant">BEFORE_RB</span><span class="plain"> 28 </span> <span class="comment">Before rules</span>
<span class="definitionkeyword">define</span> <span class="constant">INSTEAD_RB</span><span class="plain"> 29 </span> <span class="comment">Instead rules</span>
<span class="definitionkeyword">define</span> <span class="constant">CHECK_RB</span><span class="plain"> 30 </span> <span class="comment">Check</span>
<span class="definitionkeyword">define</span> <span class="constant">CARRY_OUT_RB</span><span class="plain"> 31 </span> <span class="comment">Carry out rules</span>
<span class="definitionkeyword">define</span> <span class="constant">AFTER_RB</span><span class="plain"> 32 </span> <span class="comment">After rules</span>
<span class="definitionkeyword">define</span> <span class="constant">REPORT_RB</span><span class="plain"> 33 </span> <span class="comment">Report</span>
<span class="definitionkeyword">define</span> <span class="constant">DOES_THE_PLAYER_MEAN_RB</span><span class="plain"> 34 </span> <span class="comment">Does the player mean...? rules</span>
<span class="definitionkeyword">define</span> <span class="constant">MULTIPLE_ACTION_PROCESSING_RB</span><span class="plain"> 35 </span> <span class="comment">For changing or reordering multiple actions</span>
</pre>
<p class="inwebparagraph"><a id="SP8"></a><b>&#167;8. Construction. </b>When a rulebook is to be created, we do a little treatment on its name. We
remove any article, and also strip off the suffix "rules" or "rulebook"
as redundant &mdash; see below for why. Since we want to insure that phrase/rule
preambles are unambiguous, we also want to make sure that keywords introducing
phrase definitions and timed events don't open the rulebook name.
</p>
<pre class="display">
<span class="plain">&lt;</span><span class="identifier">new</span><span class="plain">-</span><span class="reserved">rulebook</span><span class="plain">-</span><span class="identifier">name</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">new</span><span class="plain">-</span><span class="reserved">rulebook</span><span class="plain">-</span><span class="identifier">name</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">new</span><span class="plain">-</span><span class="reserved">rulebook</span><span class="plain">-</span><span class="identifier">name</span><span class="plain">&gt; </span><span class="identifier">rules</span><span class="plain">/</span><span class="reserved">rulebook</span><span class="plain"> | ==&gt; </span><span class="identifier">R</span><span class="plain">[1]</span>
<span class="identifier">at</span><span class="plain"> *** | ==&gt; </span>&lt;<span class="cwebmacro">Issue PM_RulebookWithAt problem</span> <span class="cwebmacronumber">8.1</span>&gt;
<span class="identifier">to</span><span class="plain"> *** | ==&gt; </span>&lt;<span class="cwebmacro">Issue PM_RulebookWithTo problem</span> <span class="cwebmacronumber">8.2</span>&gt;
<span class="reserved">definition</span><span class="plain"> *** | ==&gt; </span>&lt;<span class="cwebmacro">Issue PM_RulebookWithDefinition problem</span> <span class="cwebmacronumber">8.3</span>&gt;
<span class="plain">... ==&gt; 0</span>
</pre>
<p class="inwebparagraph"></p>
<p class="inwebparagraph"><a id="SP8_1"></a><b>&#167;8.1. </b><code class="display">
&lt;<span class="cwebmacrodefn">Issue PM_RulebookWithAt problem</span> <span class="cwebmacronumber">8.1</span>&gt; =
</code></p>
<pre class="displaydefn">
<span class="identifier">Problems::Issue::sentence_problem</span><span class="plain">(</span><span class="identifier">_p_</span><span class="plain">(</span><span class="identifier">PM_RulebookWithAt</span><span class="plain">),</span>
<span class="string">"this would create a rulebook whose name begins with 'at'"</span><span class="plain">,</span>
<span class="string">"which is forbidden since it would lead to ambiguities in "</span>
<span class="string">"the way people write rules. A rule beginning with 'At' "</span>
<span class="string">"is one which happens at a given time, whereas a rule "</span>
<span class="string">"belonging to a rulebook starts with the name of that "</span>
<span class="string">"rulebook, so a rulebook named 'at ...' would make such "</span>
<span class="string">"a rule inscrutable."</span><span class="plain">);</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">This code is used in <a href="#SP8">&#167;8</a>.</p>
<p class="inwebparagraph"><a id="SP8_2"></a><b>&#167;8.2. </b><code class="display">
&lt;<span class="cwebmacrodefn">Issue PM_RulebookWithTo problem</span> <span class="cwebmacronumber">8.2</span>&gt; =
</code></p>
<pre class="displaydefn">
<span class="identifier">Problems::Issue::sentence_problem</span><span class="plain">(</span><span class="identifier">_p_</span><span class="plain">(</span><span class="identifier">PM_RulebookWithTo</span><span class="plain">),</span>
<span class="string">"this would create a rulebook whose name begins with 'to'"</span><span class="plain">,</span>
<span class="string">"which is forbidden since it would lead to ambiguities in "</span>
<span class="string">"the way people write rules. A rule beginning with 'To' "</span>
<span class="string">"is one which defines a phrase, whereas a rule "</span>
<span class="string">"belonging to a rulebook starts with the name of that "</span>
<span class="string">"rulebook, so a rulebook named 'to ...' would make such "</span>
<span class="string">"a rule inscrutable."</span><span class="plain">);</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">This code is used in <a href="#SP8">&#167;8</a>.</p>
<p class="inwebparagraph"><a id="SP8_3"></a><b>&#167;8.3. </b><code class="display">
&lt;<span class="cwebmacrodefn">Issue PM_RulebookWithDefinition problem</span> <span class="cwebmacronumber">8.3</span>&gt; =
</code></p>
<pre class="displaydefn">
<span class="identifier">Problems::Issue::sentence_problem</span><span class="plain">(</span><span class="identifier">_p_</span><span class="plain">(</span><span class="identifier">PM_RulebookWithDefinition</span><span class="plain">),</span>
<span class="string">"this would create a rulebook whose name begins with 'definition'"</span><span class="plain">,</span>
<span class="string">"which is forbidden since it would lead to ambiguities in "</span>
<span class="string">"the way people write rules. A rule beginning with 'Definition' "</span>
<span class="string">"is one which defines an adjective, whereas a rule "</span>
<span class="string">"belonging to a rulebook starts with the name of that "</span>
<span class="string">"rulebook, so a rulebook named 'to ...' would make such "</span>
<span class="string">"a rule inscrutable."</span><span class="plain">);</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">This code is used in <a href="#SP8">&#167;8</a>.</p>
<p class="inwebparagraph"><a id="SP9"></a><b>&#167;9. </b>When a rulebook is created &mdash; say, "coordination" &mdash; Inform constructs
alternative names for it using the following &mdash; say, making "coordination
rules" and "coordination rulebook":
</p>
<pre class="display">
<span class="plain">&lt;</span><span class="reserved">rulebook</span><span class="plain">-</span><span class="identifier">name</span><span class="plain">-</span><span class="identifier">construction</span><span class="plain">&gt; ::=</span>
<span class="plain">... </span><span class="identifier">rules</span><span class="plain"> |</span>
<span class="plain">... </span><span class="reserved">rulebook</span>
</pre>
<p class="inwebparagraph"></p>
<p class="inwebparagraph"><a id="SP10"></a><b>&#167;10. </b>Whereas, at run-time, rulebooks are special cases of rules (they have the
same kind of value, though their I6 values are such as to make it possible
to distinguish them), within I7 rulebooks and rules have entirely different
data structures. There are two constructor functions: a basic one, used
for those created by typical source text, and an advanced one used when
rulebooks are automatically created as a result of other structures being
built (for instance, scene endings).
</p>
<pre class="display">
<span class="reserved">rulebook</span><span class="plain"> *</span><span class="functiontext">Rulebooks::new</span><span class="plain">(</span><span class="identifier">kind</span><span class="plain"> *</span><span class="identifier">create_as</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">package_request</span><span class="plain"> *</span><span class="identifier">R</span><span class="plain">) {</span>
<span class="functiontext">Hierarchy::markup_wording</span><span class="plain">(</span><span class="identifier">R</span><span class="plain">, </span><span class="constant">RULEBOOK_NAME_HMD</span><span class="plain">, </span><span class="identifier">W</span><span class="plain">);</span>
<span class="reserved">rulebook</span><span class="plain"> *</span><span class="identifier">rb</span><span class="plain"> = </span><span class="identifier">CREATE</span><span class="plain">(</span><span class="reserved">rulebook</span><span class="plain">);</span>
<span class="plain">&lt;</span><span class="identifier">new</span><span class="plain">-</span><span class="reserved">rulebook</span><span class="plain">-</span><span class="identifier">name</span><span class="plain">&gt;(</span><span class="identifier">W</span><span class="plain">);</span>
<span class="identifier">W</span><span class="plain"> = </span><span class="identifier">GET_RW</span><span class="plain">(&lt;</span><span class="identifier">new</span><span class="plain">-</span><span class="reserved">rulebook</span><span class="plain">-</span><span class="identifier">name</span><span class="plain">&gt;, 1);</span>
<span class="identifier">rb</span><span class="plain">-</span><span class="element">&gt;primary_name</span><span class="plain"> = </span><span class="identifier">W</span><span class="plain">;</span>
<span class="identifier">rb</span><span class="plain">-</span><span class="element">&gt;alternative_name</span><span class="plain"> = </span><span class="identifier">EMPTY_WORDING</span><span class="plain">;</span>
<span class="identifier">rb</span><span class="plain">-</span><span class="element">&gt;rb_package</span><span class="plain"> = </span><span class="identifier">R</span><span class="plain">;</span>
<span class="identifier">rb</span><span class="plain">-</span><span class="element">&gt;rb_iname</span><span class="plain"> = </span><span class="functiontext">Hierarchy::make_iname_in</span><span class="plain">(</span><span class="constant">RUN_FN_HL</span><span class="plain">, </span><span class="identifier">rb</span><span class="plain">-</span><span class="element">&gt;rb_package</span><span class="plain">);</span>
<span class="identifier">rb</span><span class="plain">-</span><span class="element">&gt;rule_list</span><span class="plain"> = </span><span class="functiontext">Rules::Bookings::list_new</span><span class="plain">();</span>
<span class="identifier">rb</span><span class="plain">-</span><span class="element">&gt;automatically_generated</span><span class="plain"> = </span><span class="identifier">FALSE</span><span class="plain">;</span>
<span class="identifier">rb</span><span class="plain">-</span><span class="element">&gt;used_by_future_action_activity</span><span class="plain"> = </span><span class="identifier">FALSE</span><span class="plain">;</span>
<span class="identifier">rb</span><span class="plain">-</span><span class="element">&gt;runs_during_activities</span><span class="plain"> = </span><span class="identifier">FALSE</span><span class="plain">;</span>
<span class="identifier">kind</span><span class="plain"> *</span><span class="identifier">parameter_kind</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">producing_kind</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
<span class="identifier">Kinds::binary_construction_material</span><span class="plain">(</span><span class="identifier">create_as</span><span class="plain">, &amp;</span><span class="identifier">parameter_kind</span><span class="plain">, &amp;</span><span class="identifier">producing_kind</span><span class="plain">);</span>
<span class="functiontext">Rulebooks::Outcomes::initialise_focus</span><span class="plain">(&amp;(</span><span class="identifier">rb</span><span class="plain">-</span><span class="element">&gt;my_focus</span><span class="plain">), </span><span class="identifier">parameter_kind</span><span class="plain">);</span>
<span class="identifier">rb</span><span class="plain">-</span><span class="element">&gt;fragmentation_stem_length</span><span class="plain"> = 0;</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">def</span><span class="plain"> = </span><span class="constant">NO_OUTCOME</span><span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">rb</span><span class="plain">-&gt;</span><span class="identifier">allocation_id</span><span class="plain"> == </span><span class="constant">INSTEAD_RB</span><span class="plain">) </span><span class="identifier">def</span><span class="plain"> = </span><span class="constant">FAILURE_OUTCOME</span><span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">rb</span><span class="plain">-&gt;</span><span class="identifier">allocation_id</span><span class="plain"> == </span><span class="constant">AFTER_RB</span><span class="plain">) </span><span class="identifier">def</span><span class="plain"> = </span><span class="constant">SUCCESS_OUTCOME</span><span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">rb</span><span class="plain">-&gt;</span><span class="identifier">allocation_id</span><span class="plain"> == </span><span class="constant">UNSUCCESSFUL_ATTEMPT_BY_RB</span><span class="plain">) </span><span class="identifier">def</span><span class="plain"> = </span><span class="constant">SUCCESS_OUTCOME</span><span class="plain">;</span>
<span class="functiontext">Rulebooks::Outcomes::initialise_outcomes</span><span class="plain">(&amp;(</span><span class="identifier">rb</span><span class="plain">-</span><span class="element">&gt;my_outcomes</span><span class="plain">), </span><span class="identifier">producing_kind</span><span class="plain">, </span><span class="identifier">def</span><span class="plain">);</span>
<span class="identifier">rb</span><span class="plain">-</span><span class="element">&gt;placement_list</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
<span class="identifier">rb</span><span class="plain">-</span><span class="element">&gt;owned_by_rb</span><span class="plain"> = </span><span class="functiontext">StackedVariables::new_owner</span><span class="plain">(</span><span class="identifier">rb</span><span class="plain">-&gt;</span><span class="identifier">allocation_id</span><span class="plain">);</span>
<span class="identifier">rb</span><span class="plain">-</span><span class="element">&gt;accessible_from_rb</span><span class="plain"> = </span><span class="functiontext">StackedVariables::add_owner_to_list</span><span class="plain">(</span><span class="identifier">NULL</span><span class="plain">, </span><span class="identifier">rb</span><span class="plain">-</span><span class="element">&gt;owned_by_rb</span><span class="plain">);</span>
<span class="identifier">rb</span><span class="plain">-</span><span class="element">&gt;stv_creator_iname</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">rb</span><span class="plain">-&gt;</span><span class="identifier">allocation_id</span><span class="plain"> &lt; </span><span class="constant">MAX_BUILT_IN_RULEBOOKS</span><span class="plain">)</span>
<span class="identifier">built_in_rulebooks</span><span class="plain">[</span><span class="identifier">rb</span><span class="plain">-&gt;</span><span class="identifier">allocation_id</span><span class="plain">] = </span><span class="identifier">rb</span><span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">rb</span><span class="plain"> == </span><span class="identifier">built_in_rulebooks</span><span class="plain">[</span><span class="constant">ACTION_PROCESSING_RB</span><span class="plain">])</span>
<span class="identifier">all_action_processing_vars</span><span class="plain"> = </span><span class="functiontext">StackedVariables::add_owner_to_list</span><span class="plain">(</span><span class="identifier">NULL</span><span class="plain">, </span><span class="identifier">rb</span><span class="plain">-</span><span class="element">&gt;owned_by_rb</span><span class="plain">);</span>
<span class="identifier">Nouns::new_proper_noun</span><span class="plain">(</span><span class="identifier">rb</span><span class="plain">-</span><span class="element">&gt;primary_name</span><span class="plain">, </span><span class="identifier">NEUTER_GENDER</span><span class="plain">,</span>
<span class="identifier">REGISTER_SINGULAR_NTOPT</span><span class="plain"> + </span><span class="identifier">PARSE_EXACTLY_NTOPT</span><span class="plain">,</span>
<span class="constant">RULEBOOK_MC</span><span class="plain">, </span><span class="functiontext">Rvalues::from_rulebook</span><span class="plain">(</span><span class="identifier">rb</span><span class="plain">));</span>
<span class="identifier">word_assemblage</span><span class="plain"> </span><span class="identifier">wa</span><span class="plain"> =</span>
<span class="identifier">Preform::Nonparsing::merge</span><span class="plain">(&lt;</span><span class="reserved">rulebook</span><span class="plain">-</span><span class="identifier">name</span><span class="plain">-</span><span class="identifier">construction</span><span class="plain">&gt;, 0,</span>
<span class="identifier">WordAssemblages::from_wording</span><span class="plain">(</span><span class="identifier">rb</span><span class="plain">-</span><span class="element">&gt;primary_name</span><span class="plain">));</span>
<span class="identifier">wording</span><span class="plain"> </span><span class="identifier">AW</span><span class="plain"> = </span><span class="identifier">WordAssemblages::to_wording</span><span class="plain">(&amp;</span><span class="identifier">wa</span><span class="plain">);</span>
<span class="identifier">Nouns::new_proper_noun</span><span class="plain">(</span><span class="identifier">AW</span><span class="plain">, </span><span class="identifier">NEUTER_GENDER</span><span class="plain">,</span>
<span class="identifier">REGISTER_SINGULAR_NTOPT</span><span class="plain"> + </span><span class="identifier">PARSE_EXACTLY_NTOPT</span><span class="plain">,</span>
<span class="constant">RULEBOOK_MC</span><span class="plain">, </span><span class="functiontext">Rvalues::from_rulebook</span><span class="plain">(</span><span class="identifier">rb</span><span class="plain">));</span>
<span class="identifier">wa</span><span class="plain"> = </span><span class="identifier">Preform::Nonparsing::merge</span><span class="plain">(&lt;</span><span class="reserved">rulebook</span><span class="plain">-</span><span class="identifier">name</span><span class="plain">-</span><span class="identifier">construction</span><span class="plain">&gt;, 1,</span>
<span class="identifier">WordAssemblages::from_wording</span><span class="plain">(</span><span class="identifier">rb</span><span class="plain">-</span><span class="element">&gt;primary_name</span><span class="plain">));</span>
<span class="identifier">AW</span><span class="plain"> = </span><span class="identifier">WordAssemblages::to_wording</span><span class="plain">(&amp;</span><span class="identifier">wa</span><span class="plain">);</span>
<span class="identifier">Nouns::new_proper_noun</span><span class="plain">(</span><span class="identifier">AW</span><span class="plain">, </span><span class="identifier">NEUTER_GENDER</span><span class="plain">,</span>
<span class="identifier">REGISTER_SINGULAR_NTOPT</span><span class="plain"> + </span><span class="identifier">PARSE_EXACTLY_NTOPT</span><span class="plain">,</span>
<span class="constant">RULEBOOK_MC</span><span class="plain">, </span><span class="functiontext">Rvalues::from_rulebook</span><span class="plain">(</span><span class="identifier">rb</span><span class="plain">));</span>
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">rb</span><span class="plain">;</span>
<span class="plain">}</span>
<span class="reserved">outcomes</span><span class="plain"> *</span><span class="functiontext">Rulebooks::get_outcomes</span><span class="plain">(</span><span class="reserved">rulebook</span><span class="plain"> *</span><span class="identifier">rb</span><span class="plain">) {</span>
<span class="reserved">return</span><span class="plain"> &amp;(</span><span class="identifier">rb</span><span class="plain">-</span><span class="element">&gt;my_outcomes</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="identifier">kind</span><span class="plain"> *</span><span class="functiontext">Rulebooks::contains_kind</span><span class="plain">(</span><span class="reserved">rulebook</span><span class="plain"> *</span><span class="identifier">rb</span><span class="plain">) {</span>
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">Kinds::binary_construction</span><span class="plain">(</span><span class="identifier">CON_rule</span><span class="plain">,</span>
<span class="functiontext">Rulebooks::get_parameter_kind</span><span class="plain">(</span><span class="identifier">rb</span><span class="plain">),</span>
<span class="functiontext">Rulebooks::Outcomes::get_outcome_kind</span><span class="plain">(&amp;(</span><span class="identifier">rb</span><span class="plain">-</span><span class="element">&gt;my_outcomes</span><span class="plain">)));</span>
<span class="plain">}</span>
<span class="identifier">kind</span><span class="plain"> *</span><span class="functiontext">Rulebooks::to_kind</span><span class="plain">(</span><span class="reserved">rulebook</span><span class="plain"> *</span><span class="identifier">rb</span><span class="plain">) {</span>
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">Kinds::binary_construction</span><span class="plain">(</span><span class="identifier">CON_rulebook</span><span class="plain">,</span>
<span class="functiontext">Rulebooks::get_parameter_kind</span><span class="plain">(</span><span class="identifier">rb</span><span class="plain">),</span>
<span class="functiontext">Rulebooks::Outcomes::get_outcome_kind</span><span class="plain">(&amp;(</span><span class="identifier">rb</span><span class="plain">-</span><span class="element">&gt;my_outcomes</span><span class="plain">)));</span>
<span class="plain">}</span>
<span class="reserved">rulebook</span><span class="plain"> *</span><span class="functiontext">Rulebooks::new_automatic</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">kind</span><span class="plain"> *</span><span class="identifier">basis</span><span class="plain">,</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">oc</span><span class="plain">, </span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">ata</span><span class="plain">, </span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">ubfaa</span><span class="plain">, </span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">rda</span><span class="plain">, </span><span class="identifier">package_request</span><span class="plain"> *</span><span class="identifier">R</span><span class="plain">) {</span>
<span class="reserved">rulebook</span><span class="plain"> *</span><span class="identifier">rb</span><span class="plain"> = </span><span class="functiontext">Rulebooks::new</span><span class="plain">(</span>
<span class="identifier">Kinds::binary_construction</span><span class="plain">(</span><span class="identifier">CON_rulebook</span><span class="plain">, </span><span class="identifier">basis</span><span class="plain">, </span><span class="identifier">K_nil</span><span class="plain">), </span><span class="identifier">W</span><span class="plain">, </span><span class="identifier">R</span><span class="plain">);</span>
<span class="functiontext">Rulebooks::Outcomes::set_default_outcome</span><span class="plain">(&amp;(</span><span class="identifier">rb</span><span class="plain">-</span><span class="element">&gt;my_outcomes</span><span class="plain">), </span><span class="identifier">oc</span><span class="plain">);</span>
<span class="functiontext">Rulebooks::Outcomes::set_focus_ata</span><span class="plain">(&amp;(</span><span class="identifier">rb</span><span class="plain">-</span><span class="element">&gt;my_focus</span><span class="plain">), </span><span class="identifier">ata</span><span class="plain">);</span>
<span class="identifier">rb</span><span class="plain">-</span><span class="element">&gt;automatically_generated</span><span class="plain"> = </span><span class="identifier">TRUE</span><span class="plain">;</span>
<span class="identifier">rb</span><span class="plain">-</span><span class="element">&gt;used_by_future_action_activity</span><span class="plain"> = </span><span class="identifier">ubfaa</span><span class="plain">;</span>
<span class="identifier">rb</span><span class="plain">-</span><span class="element">&gt;runs_during_activities</span><span class="plain"> = </span><span class="identifier">rda</span><span class="plain">;</span>
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">rb</span><span class="plain">;</span>
<span class="plain">}</span>
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Rulebooks::set_alt_name</span><span class="plain">(</span><span class="reserved">rulebook</span><span class="plain"> *</span><span class="identifier">rb</span><span class="plain">, </span><span class="identifier">wording</span><span class="plain"> </span><span class="identifier">AW</span><span class="plain">) {</span>
<span class="identifier">rb</span><span class="plain">-</span><span class="element">&gt;alternative_name</span><span class="plain"> = </span><span class="identifier">AW</span><span class="plain">;</span>
<span class="identifier">Nouns::new_proper_noun</span><span class="plain">(</span><span class="identifier">AW</span><span class="plain">, </span><span class="identifier">NEUTER_GENDER</span><span class="plain">,</span>
<span class="identifier">REGISTER_SINGULAR_NTOPT</span><span class="plain"> + </span><span class="identifier">PARSE_EXACTLY_NTOPT</span><span class="plain">,</span>
<span class="constant">RULEBOOK_MC</span><span class="plain">, </span><span class="functiontext">Rvalues::from_rulebook</span><span class="plain">(</span><span class="identifier">rb</span><span class="plain">));</span>
<span class="plain">}</span>
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Rulebooks::fragment_by_actions</span><span class="plain">(</span><span class="reserved">rulebook</span><span class="plain"> *</span><span class="identifier">rb</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">rb</span><span class="plain">-</span><span class="element">&gt;fragmentation_stem_length</span><span class="plain"> = </span><span class="identifier">wn</span><span class="plain">;</span>
<span class="plain">}</span>
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">Rulebooks::requires_specific_action</span><span class="plain">(</span><span class="reserved">rulebook</span><span class="plain"> *</span><span class="identifier">rb</span><span class="plain">) {</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">rb</span><span class="plain"> == </span><span class="identifier">built_in_rulebooks</span><span class="plain">[</span><span class="constant">CHECK_RB</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">if</span><span class="plain"> (</span><span class="identifier">rb</span><span class="plain"> == </span><span class="identifier">built_in_rulebooks</span><span class="plain">[</span><span class="constant">CARRY_OUT_RB</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">if</span><span class="plain"> (</span><span class="identifier">rb</span><span class="plain"> == </span><span class="identifier">built_in_rulebooks</span><span class="plain">[</span><span class="constant">REPORT_RB</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">if</span><span class="plain"> (</span><span class="identifier">rb</span><span class="plain">-</span><span class="element">&gt;fragmentation_stem_length</span><span class="plain"> &gt; 0) </span><span class="reserved">return</span><span class="plain"> </span><span class="identifier">TRUE</span><span class="plain">;</span>
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">FALSE</span><span class="plain">;</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">The function Rulebooks::new is used in 9/tc (<a href="9-tc.html#SP5_4_2_4">&#167;5.4.2.4</a>).</p>
<p class="endnote">The function Rulebooks::get_outcomes is used in 21/fao (<a href="21-fao.html#SP10">&#167;10</a>), 22/prcd (<a href="22-prcd.html#SP10_1">&#167;10.1</a>).</p>
<p class="endnote">The function Rulebooks::contains_kind is used in 21/rl (<a href="21-rl.html#SP15">&#167;15</a>).</p>
<p class="endnote">The function Rulebooks::to_kind is used in 14/rv (<a href="14-rv.html#SP1">&#167;1</a>).</p>
<p class="endnote">The function Rulebooks::new_automatic is used in 21/ac (<a href="21-ac.html#SP6">&#167;6</a>).</p>
<p class="endnote">The function Rulebooks::set_alt_name appears nowhere else.</p>
<p class="endnote">The function Rulebooks::fragment_by_actions appears nowhere else.</p>
<p class="endnote">The function Rulebooks::requires_specific_action is used in 21/rb (<a href="21-rb.html#SP9">&#167;9</a>).</p>
<p class="inwebparagraph"><a id="SP11"></a><b>&#167;11. Affected by placements. </b>Needed to make a useful index.
</p>
<pre class="display">
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Rulebooks::affected_by_placement</span><span class="plain">(</span><span class="reserved">rulebook</span><span class="plain"> *</span><span class="identifier">rb</span><span class="plain">, </span><span class="identifier">parse_node</span><span class="plain"> *</span><span class="identifier">where</span><span class="plain">) {</span>
<span class="reserved">placement_affecting</span><span class="plain"> *</span><span class="identifier">npl</span><span class="plain"> = </span><span class="identifier">CREATE</span><span class="plain">(</span><span class="reserved">placement_affecting</span><span class="plain">);</span>
<span class="identifier">npl</span><span class="plain">-</span><span class="element">&gt;placement_sentence</span><span class="plain"> = </span><span class="identifier">where</span><span class="plain">;</span>
<span class="identifier">npl</span><span class="plain">-</span><span class="element">&gt;next</span><span class="plain"> = </span><span class="identifier">rb</span><span class="plain">-</span><span class="element">&gt;placement_list</span><span class="plain">;</span>
<span class="identifier">rb</span><span class="plain">-</span><span class="element">&gt;placement_list</span><span class="plain"> = </span><span class="identifier">npl</span><span class="plain">;</span>
<span class="plain">}</span>
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">Rulebooks::rb_no_placements</span><span class="plain">(</span><span class="reserved">rulebook</span><span class="plain"> *</span><span class="identifier">rb</span><span class="plain">) {</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">t</span><span class="plain"> = 0;</span>
<span class="reserved">placement_affecting</span><span class="plain"> *</span><span class="identifier">npl</span><span class="plain"> = </span><span class="identifier">rb</span><span class="plain">-</span><span class="element">&gt;placement_list</span><span class="plain">;</span>
<span class="reserved">while</span><span class="plain"> (</span><span class="identifier">npl</span><span class="plain">) { </span><span class="identifier">t</span><span class="plain">++; </span><span class="identifier">npl</span><span class="plain"> = </span><span class="identifier">npl</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="identifier">t</span><span class="plain">;</span>
<span class="plain">}</span>
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Rulebooks::rb_index_placements</span><span class="plain">(</span><span class="identifier">OUTPUT_STREAM</span><span class="plain">, </span><span class="reserved">rulebook</span><span class="plain"> *</span><span class="identifier">rb</span><span class="plain">) {</span>
<span class="reserved">placement_affecting</span><span class="plain"> *</span><span class="identifier">npl</span><span class="plain"> = </span><span class="identifier">rb</span><span class="plain">-</span><span class="element">&gt;placement_list</span><span class="plain">;</span>
<span class="reserved">while</span><span class="plain"> (</span><span class="identifier">npl</span><span class="plain">) {</span>
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;"</span><span class="plain">);</span>
<span class="identifier">HTML_OPEN_WITH</span><span class="plain">(</span><span class="string">"span"</span><span class="plain">, </span><span class="string">"class=\</span><span class="plain">"</span><span class="string">smaller\</span><span class="plain">"</span><span class="string">"</span><span class="plain">);</span>
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"&lt;i&gt;NB:&lt;/i&gt; %W"</span><span class="plain">, </span><span class="identifier">ParseTree::get_text</span><span class="plain">(</span><span class="identifier">npl</span><span class="plain">-</span><span class="element">&gt;placement_sentence</span><span class="plain">));</span>
<span class="identifier">Index::link</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="identifier">Wordings::first_wn</span><span class="plain">(</span><span class="identifier">ParseTree::get_text</span><span class="plain">(</span><span class="identifier">npl</span><span class="plain">-</span><span class="element">&gt;placement_sentence</span><span class="plain">)));</span>
<span class="identifier">HTML_CLOSE</span><span class="plain">(</span><span class="string">"span"</span><span class="plain">);</span>
<span class="identifier">HTML_TAG</span><span class="plain">(</span><span class="string">"br"</span><span class="plain">);</span>
<span class="identifier">npl</span><span class="plain"> = </span><span class="identifier">npl</span><span class="plain">-</span><span class="element">&gt;next</span><span class="plain">;</span>
<span class="plain">}</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">The function Rulebooks::affected_by_placement is used in 21/rps (<a href="21-rps.html#SP18">&#167;18</a>).</p>
<p class="endnote">The function Rulebooks::rb_no_placements appears nowhere else.</p>
<p class="endnote">The function Rulebooks::rb_index_placements is used in <a href="#SP15">&#167;15</a>.</p>
<p class="inwebparagraph"><a id="SP12"></a><b>&#167;12. Reading properties of rulebooks. </b>Those readable from outside the current section.
</p>
<pre class="display">
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">Rulebooks::focus</span><span class="plain">(</span><span class="reserved">rulebook</span><span class="plain"> *</span><span class="identifier">rb</span><span class="plain">) {</span>
<span class="reserved">return</span><span class="plain"> </span><span class="functiontext">Rulebooks::Outcomes::get_focus</span><span class="plain">(&amp;(</span><span class="identifier">rb</span><span class="plain">-</span><span class="element">&gt;my_focus</span><span class="plain">));</span>
<span class="plain">}</span>
<span class="identifier">kind</span><span class="plain"> *</span><span class="functiontext">Rulebooks::get_parameter_kind</span><span class="plain">(</span><span class="reserved">rulebook</span><span class="plain"> *</span><span class="identifier">rb</span><span class="plain">) {</span>
<span class="reserved">return</span><span class="plain"> </span><span class="functiontext">Rulebooks::Outcomes::get_focus_parameter_kind</span><span class="plain">(&amp;(</span><span class="identifier">rb</span><span class="plain">-</span><span class="element">&gt;my_focus</span><span class="plain">));</span>
<span class="plain">}</span>
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">Rulebooks::used_by_future_actions</span><span class="plain">(</span><span class="reserved">rulebook</span><span class="plain"> *</span><span class="identifier">rb</span><span class="plain">) {</span>
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">rb</span><span class="plain">-</span><span class="element">&gt;used_by_future_action_activity</span><span class="plain">;</span>
<span class="plain">}</span>
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">Rulebooks::is_empty</span><span class="plain">(</span><span class="reserved">rulebook</span><span class="plain"> *</span><span class="identifier">rb</span><span class="plain">, </span><span class="reserved">rule_context</span><span class="plain"> </span><span class="identifier">rc</span><span class="plain">) {</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">rb</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">TRUE</span><span class="plain">;</span>
<span class="reserved">return</span><span class="plain"> </span><span class="functiontext">Rules::Bookings::list_is_empty</span><span class="plain">(</span><span class="identifier">rb</span><span class="plain">-</span><span class="element">&gt;rule_list</span><span class="plain">, </span><span class="identifier">rc</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">Rulebooks::no_rules</span><span class="plain">(</span><span class="reserved">rulebook</span><span class="plain"> *</span><span class="identifier">rb</span><span class="plain">) {</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">rb</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">) </span><span class="reserved">return</span><span class="plain"> 0;</span>
<span class="reserved">return</span><span class="plain"> </span><span class="functiontext">Rules::Bookings::no_rules_in_list</span><span class="plain">(</span><span class="identifier">rb</span><span class="plain">-</span><span class="element">&gt;rule_list</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">Rulebooks::rule_in_rulebook</span><span class="plain">(</span><span class="reserved">rule</span><span class="plain"> *</span><span class="identifier">R</span><span class="plain">, </span><span class="reserved">rulebook</span><span class="plain"> *</span><span class="identifier">rb</span><span class="plain">) {</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">rb</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">return</span><span class="plain"> </span><span class="functiontext">Rules::Bookings::list_contains</span><span class="plain">(</span><span class="identifier">rb</span><span class="plain">-</span><span class="element">&gt;rule_list</span><span class="plain">, </span><span class="identifier">R</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="reserved">booking</span><span class="plain"> *</span><span class="functiontext">Rulebooks::first_booking</span><span class="plain">(</span><span class="reserved">rulebook</span><span class="plain"> *</span><span class="identifier">rb</span><span class="plain">) {</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">rb</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">NULL</span><span class="plain">;</span>
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">rb</span><span class="plain">-</span><span class="element">&gt;rule_list</span><span class="plain">;</span>
<span class="plain">}</span>
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">Rulebooks::runs_during_activities</span><span class="plain">(</span><span class="reserved">rulebook</span><span class="plain"> *</span><span class="identifier">rb</span><span class="plain">) {</span>
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">rb</span><span class="plain">-</span><span class="element">&gt;runs_during_activities</span><span class="plain">;</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">The function Rulebooks::focus is used in <a href="#SP19">&#167;19</a>, <a href="#SP20">&#167;20</a>, 22/pu (<a href="22-pu.html#SP11_3_1_1">&#167;11.3.1.1</a>, <a href="22-pu.html#SP21_1_1">&#167;21.1.1</a>).</p>
<p class="endnote">The function Rulebooks::get_parameter_kind is used in <a href="#SP10">&#167;10</a>, <a href="#SP24_1">&#167;24.1</a>, 22/pu (<a href="22-pu.html#SP21_1_1">&#167;21.1.1</a>).</p>
<p class="endnote">The function Rulebooks::used_by_future_actions is used in 21/ac (<a href="21-ac.html#SP14">&#167;14</a>).</p>
<p class="endnote">The function Rulebooks::is_empty is used in <a href="#SP24">&#167;24</a>, 21/ac (<a href="21-ac.html#SP9">&#167;9</a>).</p>
<p class="endnote">The function Rulebooks::no_rules is used in <a href="#SP24">&#167;24</a>, 21/ac (<a href="21-ac.html#SP9">&#167;9</a>).</p>
<p class="endnote">The function Rulebooks::rule_in_rulebook is used in 21/rps (<a href="21-rps.html#SP18">&#167;18</a>).</p>
<p class="endnote">The function Rulebooks::first_booking is used in 21/fao (<a href="21-fao.html#SP10">&#167;10</a>).</p>
<p class="endnote">The function Rulebooks::runs_during_activities is used in 22/pu (<a href="22-pu.html#SP11_3_1_1">&#167;11.3.1.1</a>).</p>
<p class="inwebparagraph"><a id="SP13"></a><b>&#167;13. Rulebook variables. </b>Any new rulebook variable name is vetted by being run through this:
</p>
<pre class="display">
<span class="plain">&lt;</span><span class="reserved">rulebook</span><span class="plain">-</span><span class="identifier">variable</span><span class="plain">-</span><span class="identifier">name</span><span class="plain">&gt; ::=</span>
<span class="plain">&lt;</span><span class="identifier">unfortunate</span><span class="plain">-</span><span class="identifier">name</span><span class="plain">&gt; | ==&gt; </span>&lt;<span class="cwebmacro">Issue PM_RulebookVariableAnd problem</span> <span class="cwebmacronumber">13.1</span>&gt;
<span class="plain">... ==&gt; </span><span class="identifier">TRUE</span>
</pre>
<p class="inwebparagraph"></p>
<p class="inwebparagraph"><a id="SP13_1"></a><b>&#167;13.1. </b><code class="display">
&lt;<span class="cwebmacrodefn">Issue PM_RulebookVariableAnd problem</span> <span class="cwebmacronumber">13.1</span>&gt; =
</code></p>
<pre class="displaydefn">
<span class="plain">*</span><span class="identifier">X</span><span class="plain"> = </span><span class="identifier">NOT_APPLICABLE</span><span class="plain">;</span>
<span class="identifier">Problems::quote_source</span><span class="plain">(1, </span><span class="identifier">current_sentence</span><span class="plain">);</span>
<span class="identifier">Problems::quote_wording</span><span class="plain">(2, </span><span class="identifier">W</span><span class="plain">);</span>
<span class="identifier">Problems::Issue::handmade_problem</span><span class="plain">(</span><span class="identifier">_p_</span><span class="plain">(</span><span class="identifier">PM_RulebookVariableAnd</span><span class="plain">));</span>
<span class="identifier">Problems::issue_problem_segment</span><span class="plain">(</span>
<span class="string">"You wrote %1, which I am reading as a request to make "</span>
<span class="string">"a new named variable for a rulebook - a value associated "</span>
<span class="string">"with a rulebook and which has a name. The request seems to "</span>
<span class="string">"say that the name in question is '%2', but I'd prefer to "</span>
<span class="string">"avoid 'and', 'or', 'with', or 'having' in such names, please."</span><span class="plain">);</span>
<span class="identifier">Problems::issue_problem_end</span><span class="plain">();</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">This code is used in <a href="#SP13">&#167;13</a>.</p>
<p class="inwebparagraph"><a id="SP14"></a><b>&#167;14. </b></p>
<pre class="display">
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Rulebooks::add_variable</span><span class="plain">(</span><span class="reserved">rulebook</span><span class="plain"> *</span><span class="identifier">rb</span><span class="plain">, </span><span class="identifier">parse_node</span><span class="plain"> *</span><span class="identifier">cnode</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">cnode</span><span class="plain">) != </span><span class="constant">PROPERTYCALLED_NT</span><span class="plain">) {</span>
<span class="identifier">Problems::quote_source</span><span class="plain">(1, </span><span class="identifier">current_sentence</span><span class="plain">);</span>
<span class="identifier">Problems::Issue::handmade_problem</span><span class="plain">(</span><span class="identifier">_p_</span><span class="plain">(</span><span class="identifier">PM_RulebookVarUncalled</span><span class="plain">));</span>
<span class="identifier">Problems::issue_problem_segment</span><span class="plain">(</span>
<span class="string">"You wrote %1, which I am reading as a request to make "</span>
<span class="string">"a new named variable for an rulebook - a value associated "</span>
<span class="string">"with a action and which has a name. But since you only give "</span>
<span class="string">"a kind, not a name, I'm stuck. ('The every turn rulebook has a "</span>
<span class="string">"number called importance' is right, 'The every turn rulebook has a "</span>
<span class="string">"number' is too vague.)"</span><span class="plain">);</span>
<span class="identifier">Problems::issue_problem_end</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"> (&lt;</span><span class="reserved">rulebook</span><span class="plain">-</span><span class="identifier">variable</span><span class="plain">-</span><span class="identifier">name</span><span class="plain">&gt;(</span><span class="identifier">ParseTree::get_text</span><span class="plain">(</span><span class="identifier">cnode</span><span class="plain">-</span><span class="element">&gt;down</span><span class="plain">-</span><span class="element">&gt;next</span><span class="plain">))) {</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="identifier">NOT_APPLICABLE</span><span class="plain">) </span><span class="reserved">return</span><span class="plain">;</span>
<span class="plain">}</span>
<span class="identifier">parse_node</span><span class="plain"> *</span><span class="identifier">spec</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> (&lt;</span><span class="identifier">s</span><span class="plain">-</span><span class="identifier">type</span><span class="plain">-</span><span class="identifier">expression</span><span class="plain">&gt;(</span><span class="identifier">ParseTree::get_text</span><span class="plain">(</span><span class="identifier">cnode</span><span class="plain">-</span><span class="element">&gt;down</span><span class="plain">))) </span><span class="identifier">spec</span><span class="plain"> = &lt;&lt;</span><span class="identifier">rp</span><span class="plain">&gt;&gt;;</span>
<span class="reserved">if</span><span class="plain"> ((</span><span class="functiontext">Specifications::is_description</span><span class="plain">(</span><span class="identifier">spec</span><span class="plain">)) &amp;&amp;</span>
<span class="plain">(</span><span class="functiontext">Descriptions::is_qualified</span><span class="plain">(</span><span class="identifier">spec</span><span class="plain">))) {</span>
<span class="identifier">Problems::quote_source</span><span class="plain">(1, </span><span class="identifier">current_sentence</span><span class="plain">);</span>
<span class="identifier">Problems::quote_wording</span><span class="plain">(2, </span><span class="identifier">ParseTree::get_text</span><span class="plain">(</span><span class="identifier">cnode</span><span class="plain">-</span><span class="element">&gt;down</span><span class="plain">));</span>
<span class="identifier">Problems::Issue::handmade_problem</span><span class="plain">(</span><span class="identifier">_p_</span><span class="plain">(</span><span class="identifier">PM_RulebookVariableTooSpecific</span><span class="plain">));</span>
<span class="identifier">Problems::issue_problem_segment</span><span class="plain">(</span>
<span class="string">"You wrote %1, which I am reading as a request to make "</span>
<span class="string">"a new named variable for a rulebook - a value associated "</span>
<span class="string">"with a rulebook and which has a name. The request seems to "</span>
<span class="string">"say that the value in question is '%2', but this is too "</span>
<span class="string">"specific a description. (Instead, a kind of value "</span>
<span class="string">"(such as 'number') or a kind of object (such as 'room' "</span>
<span class="string">"or 'thing') should be given. To get a property whose "</span>
<span class="string">"contents can be any kind of object, use 'object'.)"</span><span class="plain">);</span>
<span class="identifier">Problems::issue_problem_end</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">ParseTree::is</span><span class="plain">(</span><span class="identifier">spec</span><span class="plain">, </span><span class="constant">CONSTANT_NT</span><span class="plain">)) {</span>
<span class="identifier">LOG</span><span class="plain">(</span><span class="string">"Offending SP: $T"</span><span class="plain">, </span><span class="identifier">spec</span><span class="plain">);</span>
<span class="identifier">Problems::quote_source</span><span class="plain">(1, </span><span class="identifier">current_sentence</span><span class="plain">);</span>
<span class="identifier">Problems::quote_wording</span><span class="plain">(2, </span><span class="identifier">ParseTree::get_text</span><span class="plain">(</span><span class="identifier">cnode</span><span class="plain">-</span><span class="element">&gt;down</span><span class="plain">));</span>
<span class="identifier">Problems::Issue::handmade_problem</span><span class="plain">(</span><span class="identifier">_p_</span><span class="plain">(</span><span class="identifier">PM_RulebookVariableBadKind</span><span class="plain">));</span>
<span class="identifier">Problems::issue_problem_segment</span><span class="plain">(</span>
<span class="string">"You wrote %1, but '%2' is not the name of a kind of "</span>
<span class="string">"value which I know (such as 'number' or 'text')."</span><span class="plain">);</span>
<span class="identifier">Problems::issue_problem_end</span><span class="plain">();</span>
<span class="reserved">return</span><span class="plain">;</span>
<span class="plain">}</span>
<span class="identifier">kind</span><span class="plain"> *</span><span class="identifier">K</span><span class="plain"> = </span><span class="functiontext">Specifications::to_kind</span><span class="plain">(</span><span class="identifier">spec</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">K</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">) {</span>
<span class="identifier">Problems::quote_source</span><span class="plain">(1, </span><span class="identifier">current_sentence</span><span class="plain">);</span>
<span class="identifier">Problems::quote_wording</span><span class="plain">(2, </span><span class="identifier">ParseTree::get_text</span><span class="plain">(</span><span class="identifier">cnode</span><span class="plain">-</span><span class="element">&gt;down</span><span class="plain">));</span>
<span class="identifier">Problems::Issue::handmade_problem</span><span class="plain">(</span><span class="identifier">_p_</span><span class="plain">(</span><span class="identifier">PM_RulebookVariableKindless</span><span class="plain">));</span>
<span class="identifier">Problems::issue_problem_segment</span><span class="plain">(</span>
<span class="string">"You wrote %1, but I was expecting to see a kind of value there, "</span>
<span class="string">"and '%2' isn't something I recognise as a kind."</span><span class="plain">);</span>
<span class="identifier">Problems::issue_problem_end</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">Kinds::Compare::eq</span><span class="plain">(</span><span class="identifier">K</span><span class="plain">, </span><span class="identifier">K_value</span><span class="plain">)) {</span>
<span class="identifier">Problems::quote_source</span><span class="plain">(1, </span><span class="identifier">current_sentence</span><span class="plain">);</span>
<span class="identifier">Problems::quote_wording</span><span class="plain">(2, </span><span class="identifier">ParseTree::get_text</span><span class="plain">(</span><span class="identifier">cnode</span><span class="plain">-</span><span class="element">&gt;down</span><span class="plain">));</span>
<span class="identifier">Problems::Issue::handmade_problem</span><span class="plain">(</span><span class="identifier">_p_</span><span class="plain">(</span><span class="identifier">PM_RulebookVariableVague</span><span class="plain">));</span>
<span class="identifier">Problems::issue_problem_segment</span><span class="plain">(</span>
<span class="string">"You wrote %1, but saying that a variable is a 'value' "</span>
<span class="string">"does not give me a clear enough idea what it will hold. "</span>
<span class="string">"You need to say what kind of value: for instance, 'A door "</span>
<span class="string">"has a number called street address.' is allowed because "</span>
<span class="string">"'number' is specific about the kind of value."</span><span class="plain">);</span>
<span class="identifier">Problems::issue_problem_end</span><span class="plain">();</span>
<span class="reserved">return</span><span class="plain">;</span>
<span class="plain">}</span>
<span class="functiontext">StackedVariables::add_empty</span><span class="plain">(</span><span class="identifier">rb</span><span class="plain">-</span><span class="element">&gt;owned_by_rb</span><span class="plain">, </span><span class="identifier">ParseTree::get_text</span><span class="plain">(</span><span class="identifier">cnode</span><span class="plain">-</span><span class="element">&gt;down</span><span class="plain">-</span><span class="element">&gt;next</span><span class="plain">), </span><span class="identifier">K</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Rulebooks::make_stvs_accessible</span><span class="plain">(</span><span class="reserved">rulebook</span><span class="plain"> *</span><span class="identifier">rb</span><span class="plain">, </span><span class="reserved">stacked_variable_owner</span><span class="plain"> *</span><span class="identifier">stvo</span><span class="plain">) {</span>
<span class="identifier">rb</span><span class="plain">-</span><span class="element">&gt;accessible_from_rb</span><span class="plain"> = </span><span class="functiontext">StackedVariables::add_owner_to_list</span><span class="plain">(</span><span class="identifier">rb</span><span class="plain">-</span><span class="element">&gt;accessible_from_rb</span><span class="plain">, </span><span class="identifier">stvo</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="identifier">inter_name</span><span class="plain"> *</span><span class="functiontext">Rulebooks::get_stv_creator_iname</span><span class="plain">(</span><span class="reserved">rulebook</span><span class="plain"> *</span><span class="identifier">rb</span><span class="plain">) {</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">rb</span><span class="plain">-</span><span class="element">&gt;stv_creator_iname</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">)</span>
<span class="identifier">rb</span><span class="plain">-</span><span class="element">&gt;stv_creator_iname</span><span class="plain"> =</span>
<span class="functiontext">Hierarchy::make_iname_in</span><span class="plain">(</span><span class="constant">RULEBOOK_STV_CREATOR_FN_HL</span><span class="plain">, </span><span class="identifier">rb</span><span class="plain">-</span><span class="element">&gt;rb_package</span><span class="plain">);</span>
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">rb</span><span class="plain">-</span><span class="element">&gt;stv_creator_iname</span><span class="plain">;</span>
<span class="plain">}</span>
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Rulebooks::rulebook_var_creators</span><span class="plain">(</span><span class="reserved">void</span><span class="plain">) {</span>
<span class="reserved">rulebook</span><span class="plain"> *</span><span class="identifier">rb</span><span class="plain">;</span>
<span class="identifier">LOOP_OVER</span><span class="plain">(</span><span class="identifier">rb</span><span class="plain">, </span><span class="reserved">rulebook</span><span class="plain">)</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">StackedVariables::owner_empty</span><span class="plain">(</span><span class="identifier">rb</span><span class="plain">-</span><span class="element">&gt;owned_by_rb</span><span class="plain">) == </span><span class="identifier">FALSE</span><span class="plain">)</span>
<span class="functiontext">StackedVariables::compile_frame_creator</span><span class="plain">(</span><span class="identifier">rb</span><span class="plain">-</span><span class="element">&gt;owned_by_rb</span><span class="plain">,</span>
<span class="functiontext">Rulebooks::get_stv_creator_iname</span><span class="plain">(</span><span class="identifier">rb</span><span class="plain">));</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">memory_economy_in_force</span><span class="plain"> == </span><span class="identifier">FALSE</span><span class="plain">) {</span>
<span class="identifier">inter_name</span><span class="plain"> *</span><span class="identifier">iname</span><span class="plain"> = </span><span class="functiontext">Hierarchy::find</span><span class="plain">(</span><span class="constant">RULEBOOK_VAR_CREATORS_HL</span><span class="plain">);</span>
<span class="identifier">packaging_state</span><span class="plain"> </span><span class="identifier">save</span><span class="plain"> = </span><span class="functiontext">Emit::named_array_begin</span><span class="plain">(</span><span class="identifier">iname</span><span class="plain">, </span><span class="identifier">K_value</span><span class="plain">);</span>
<span class="identifier">LOOP_OVER</span><span class="plain">(</span><span class="identifier">rb</span><span class="plain">, </span><span class="reserved">rulebook</span><span class="plain">) {</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">StackedVariables::owner_empty</span><span class="plain">(</span><span class="identifier">rb</span><span class="plain">-</span><span class="element">&gt;owned_by_rb</span><span class="plain">)) </span><span class="functiontext">Emit::array_numeric_entry</span><span class="plain">(0);</span>
<span class="reserved">else</span><span class="plain"> </span><span class="functiontext">Emit::array_iname_entry</span><span class="plain">(</span><span class="functiontext">StackedVariables::frame_creator</span><span class="plain">(</span><span class="identifier">rb</span><span class="plain">-</span><span class="element">&gt;owned_by_rb</span><span class="plain">));</span>
<span class="plain">}</span>
<span class="functiontext">Emit::array_numeric_entry</span><span class="plain">(0);</span>
<span class="functiontext">Emit::array_end</span><span class="plain">(</span><span class="identifier">save</span><span class="plain">);</span>
<span class="functiontext">Hierarchy::make_available</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">(), </span><span class="identifier">iname</span><span class="plain">);</span>
<span class="plain">} </span><span class="reserved">else</span><span class="plain"> </span>&lt;<span class="cwebmacro">Make slow lookup routine</span> <span class="cwebmacronumber">14.1</span>&gt;<span class="plain">;</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">The function Rulebooks::add_variable is used in 9/ma (<a href="9-ma.html#SP3_3_25_2">&#167;3.3.25.2</a>).</p>
<p class="endnote">The function Rulebooks::make_stvs_accessible is used in 21/ac (<a href="21-ac.html#SP6">&#167;6</a>).</p>
<p class="endnote">The function Rulebooks::get_stv_creator_iname is used in <a href="#SP14_1">&#167;14.1</a>.</p>
<p class="endnote">The function Rulebooks::rulebook_var_creators is used in 1/mr (<a href="1-mr.html#SP4_15">&#167;4.15</a>).</p>
<p class="inwebparagraph"><a id="SP14_1"></a><b>&#167;14.1. </b><code class="display">
&lt;<span class="cwebmacrodefn">Make slow lookup routine</span> <span class="cwebmacronumber">14.1</span>&gt; =
</code></p>
<pre class="displaydefn">
<span class="identifier">inter_name</span><span class="plain"> *</span><span class="identifier">iname</span><span class="plain"> = </span><span class="functiontext">Hierarchy::find</span><span class="plain">(</span><span class="constant">SLOW_LOOKUP_HL</span><span class="plain">);</span>
<span class="identifier">packaging_state</span><span class="plain"> </span><span class="identifier">save</span><span class="plain"> = </span><span class="functiontext">Routines::begin</span><span class="plain">(</span><span class="identifier">iname</span><span class="plain">);</span>
<span class="identifier">inter_symbol</span><span class="plain"> *</span><span class="identifier">rb_s</span><span class="plain"> = </span><span class="functiontext">LocalVariables::add_named_call_as_symbol</span><span class="plain">(</span><span class="identifier">I</span><span class="string">"rb"</span><span class="plain">);</span>
<span class="identifier">Produce::inv_primitive</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">(), </span><span class="identifier">SWITCH_BIP</span><span class="plain">);</span>
<span class="identifier">Produce::down</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
<span class="identifier">Produce::val_symbol</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">(), </span><span class="identifier">K_value</span><span class="plain">, </span><span class="identifier">rb_s</span><span class="plain">);</span>
<span class="identifier">Produce::code</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
<span class="identifier">Produce::down</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
<span class="reserved">rulebook</span><span class="plain"> *</span><span class="identifier">rb</span><span class="plain">;</span>
<span class="identifier">LOOP_OVER</span><span class="plain">(</span><span class="identifier">rb</span><span class="plain">, </span><span class="reserved">rulebook</span><span class="plain">)</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">StackedVariables::owner_empty</span><span class="plain">(</span><span class="identifier">rb</span><span class="plain">-</span><span class="element">&gt;owned_by_rb</span><span class="plain">) == </span><span class="identifier">FALSE</span><span class="plain">) {</span>
<span class="identifier">Produce::inv_primitive</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">(), </span><span class="identifier">CASE_BIP</span><span class="plain">);</span>
<span class="identifier">Produce::down</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
<span class="identifier">Produce::val</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">(), </span><span class="identifier">K_value</span><span class="plain">, </span><span class="identifier">LITERAL_IVAL</span><span class="plain">, (</span><span class="identifier">inter_t</span><span class="plain">) (</span><span class="identifier">rb</span><span class="plain">-&gt;</span><span class="identifier">allocation_id</span><span class="plain">));</span>
<span class="identifier">Produce::code</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
<span class="identifier">Produce::down</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
<span class="identifier">Produce::inv_primitive</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">(), </span><span class="identifier">RETURN_BIP</span><span class="plain">);</span>
<span class="identifier">Produce::down</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
<span class="identifier">Produce::val_iname</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">(), </span><span class="identifier">K_value</span><span class="plain">, </span><span class="functiontext">Rulebooks::get_stv_creator_iname</span><span class="plain">(</span><span class="identifier">rb</span><span class="plain">));</span>
<span class="identifier">Produce::up</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
<span class="identifier">Produce::up</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
<span class="identifier">Produce::up</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
<span class="plain">}</span>
<span class="identifier">Produce::up</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
<span class="identifier">Produce::up</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
<span class="identifier">Produce::inv_primitive</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">(), </span><span class="identifier">RETURN_BIP</span><span class="plain">);</span>
<span class="identifier">Produce::down</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
<span class="identifier">Produce::val</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">(), </span><span class="identifier">K_number</span><span class="plain">, </span><span class="identifier">LITERAL_IVAL</span><span class="plain">, 0);</span>
<span class="identifier">Produce::up</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
<span class="functiontext">Routines::end</span><span class="plain">(</span><span class="identifier">save</span><span class="plain">);</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">This code is used in <a href="#SP14">&#167;14</a>.</p>
<p class="inwebparagraph"><a id="SP15"></a><b>&#167;15. Indexing and logging rulebooks. </b></p>
<pre class="display">
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Rulebooks::log_name_only</span><span class="plain">(</span><span class="reserved">rulebook</span><span class="plain"> *</span><span class="identifier">rb</span><span class="plain">) {</span>
<span class="identifier">LOG</span><span class="plain">(</span><span class="string">"Rulebook %d (%W)"</span><span class="plain">, </span><span class="identifier">rb</span><span class="plain">-&gt;</span><span class="identifier">allocation_id</span><span class="plain">, </span><span class="identifier">rb</span><span class="plain">-</span><span class="element">&gt;primary_name</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Rulebooks::log</span><span class="plain">(</span><span class="reserved">rulebook</span><span class="plain"> *</span><span class="identifier">rb</span><span class="plain">) {</span>
<span class="functiontext">Rulebooks::log_name_only</span><span class="plain">(</span><span class="identifier">rb</span><span class="plain">);</span>
<span class="identifier">LOG</span><span class="plain">(</span><span class="string">": "</span><span class="plain">);</span>
<span class="functiontext">Rules::Bookings::list_log</span><span class="plain">(</span><span class="identifier">rb</span><span class="plain">-</span><span class="element">&gt;rule_list</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="reserved">rule_context</span><span class="plain"> </span><span class="functiontext">Rulebooks::no_rule_context</span><span class="plain">(</span><span class="reserved">void</span><span class="plain">) {</span>
<span class="reserved">rule_context</span><span class="plain"> </span><span class="identifier">rc</span><span class="plain">;</span>
<span class="plain">#</span><span class="identifier">ifdef</span><span class="plain"> </span><span class="identifier">IF_MODULE</span>
<span class="identifier">rc</span><span class="element">.action_context</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
<span class="identifier">rc</span><span class="element">.scene_context</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
<span class="plain">#</span><span class="identifier">endif</span>
<span class="plain">#</span><span class="identifier">ifndef</span><span class="plain"> </span><span class="identifier">IF_MODULE</span>
<span class="identifier">rc</span><span class="element">.not_used</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
<span class="plain">#</span><span class="identifier">endif</span>
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">rc</span><span class="plain">;</span>
<span class="plain">}</span>
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">Rulebooks::phrase_fits_rule_context</span><span class="plain">(</span><span class="reserved">phrase</span><span class="plain"> *</span><span class="identifier">ph</span><span class="plain">, </span><span class="reserved">rule_context</span><span class="plain"> </span><span class="identifier">rc</span><span class="plain">) {</span>
<span class="plain">#</span><span class="identifier">ifdef</span><span class="plain"> </span><span class="identifier">IF_MODULE</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">rc</span><span class="element">.scene_context</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">TRUE</span><span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">ph</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">Phrases::Context::get_scene</span><span class="plain">(&amp;(</span><span class="identifier">ph</span><span class="plain">-</span><span class="element">&gt;runtime_context_data</span><span class="plain">)) != </span><span class="identifier">rc</span><span class="element">.scene_context</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">return</span><span class="plain"> </span><span class="identifier">TRUE</span><span class="plain">;</span>
<span class="plain">#</span><span class="identifier">endif</span>
<span class="plain">#</span><span class="identifier">ifndef</span><span class="plain"> </span><span class="identifier">IF_MODULE</span>
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">TRUE</span><span class="plain">;</span>
<span class="plain">#</span><span class="identifier">endif</span>
<span class="plain">}</span>
<span class="plain">#</span><span class="identifier">ifdef</span><span class="plain"> </span><span class="identifier">IF_MODULE</span>
<span class="reserved">rule_context</span><span class="plain"> </span><span class="functiontext">Rulebooks::action_context</span><span class="plain">(</span><span class="identifier">action_name</span><span class="plain"> *</span><span class="identifier">an</span><span class="plain">) {</span>
<span class="reserved">rule_context</span><span class="plain"> </span><span class="identifier">rc</span><span class="plain">;</span>
<span class="identifier">rc</span><span class="element">.action_context</span><span class="plain"> = </span><span class="identifier">an</span><span class="plain">;</span>
<span class="identifier">rc</span><span class="element">.scene_context</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">rc</span><span class="plain">;</span>
<span class="plain">}</span>
<span class="reserved">rule_context</span><span class="plain"> </span><span class="functiontext">Rulebooks::scene_context</span><span class="plain">(</span><span class="identifier">scene</span><span class="plain"> *</span><span class="identifier">s</span><span class="plain">) {</span>
<span class="reserved">rule_context</span><span class="plain"> </span><span class="identifier">rc</span><span class="plain">;</span>
<span class="identifier">rc</span><span class="element">.action_context</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
<span class="identifier">rc</span><span class="element">.scene_context</span><span class="plain"> = </span><span class="identifier">s</span><span class="plain">;</span>
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">rc</span><span class="plain">;</span>
<span class="plain">}</span>
<span class="plain">#</span><span class="identifier">endif</span>
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">Rulebooks::index</span><span class="plain">(</span><span class="identifier">OUTPUT_STREAM</span><span class="plain">, </span><span class="reserved">rulebook</span><span class="plain"> *</span><span class="identifier">rb</span><span class="plain">, </span><span class="reserved">char</span><span class="plain"> *</span><span class="identifier">billing</span><span class="plain">, </span><span class="reserved">rule_context</span><span class="plain"> </span><span class="identifier">rc</span><span class="plain">, </span><span class="reserved">int</span><span class="plain"> *</span><span class="identifier">resp_count</span><span class="plain">) {</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">suppress_outcome</span><span class="plain"> = </span><span class="identifier">FALSE</span><span class="plain">, </span><span class="identifier">t</span><span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">rb</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">) </span><span class="reserved">return</span><span class="plain"> 0;</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">billing</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">"No billing for rb index"</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">billing</span><span class="plain">[0] != 0) {</span>
<span class="plain">#</span><span class="identifier">ifdef</span><span class="plain"> </span><span class="identifier">IF_MODULE</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">rc</span><span class="element">.action_context</span><span class="plain">) </span><span class="identifier">suppress_outcome</span><span class="plain"> = </span><span class="identifier">TRUE</span><span class="plain">;</span>
<span class="plain">#</span><span class="identifier">endif</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">Rules::Bookings::list_is_empty</span><span class="plain">(</span><span class="identifier">rb</span><span class="plain">-</span><span class="element">&gt;rule_list</span><span class="plain">, </span><span class="identifier">rc</span><span class="plain">)) </span><span class="identifier">suppress_outcome</span><span class="plain"> = </span><span class="identifier">TRUE</span><span class="plain">;</span>
<span class="plain">}</span>
<span class="identifier">t</span><span class="plain"> = </span><span class="functiontext">Rules::Bookings::list_index</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="identifier">rb</span><span class="plain">-</span><span class="element">&gt;rule_list</span><span class="plain">, </span><span class="identifier">rc</span><span class="plain">, </span><span class="identifier">billing</span><span class="plain">, </span><span class="identifier">rb</span><span class="plain">, </span><span class="identifier">resp_count</span><span class="plain">);</span>
<span class="functiontext">Rulebooks::Outcomes::index_outcomes</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, &amp;(</span><span class="identifier">rb</span><span class="plain">-</span><span class="element">&gt;my_outcomes</span><span class="plain">), </span><span class="identifier">suppress_outcome</span><span class="plain">);</span>
<span class="functiontext">Rulebooks::rb_index_placements</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="identifier">rb</span><span class="plain">);</span>
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">t</span><span class="plain">;</span>
<span class="plain">}</span>
<span class="plain">#</span><span class="identifier">ifdef</span><span class="plain"> </span><span class="identifier">IF_MODULE</span>
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Rulebooks::index_action_rules</span><span class="plain">(</span><span class="identifier">OUTPUT_STREAM</span><span class="plain">, </span><span class="identifier">action_name</span><span class="plain"> *</span><span class="identifier">an</span><span class="plain">, </span><span class="reserved">rulebook</span><span class="plain"> *</span><span class="identifier">rb</span><span class="plain">,</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">code</span><span class="plain">, </span><span class="reserved">char</span><span class="plain"> *</span><span class="identifier">desc</span><span class="plain">, </span><span class="reserved">int</span><span class="plain"> *</span><span class="identifier">resp_count</span><span class="plain">) {</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">t</span><span class="plain"> = 0;</span>
<span class="functiontext">Rules::Bookings::list_suppress_indexed_links</span><span class="plain">();</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">code</span><span class="plain"> &gt;= 0) </span><span class="identifier">t</span><span class="plain"> += </span><span class="functiontext">Rulebooks::index</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="identifier">built_in_rulebooks</span><span class="plain">[</span><span class="identifier">code</span><span class="plain">], </span><span class="identifier">desc</span><span class="plain">,</span>
<span class="functiontext">Rulebooks::action_context</span><span class="plain">(</span><span class="identifier">an</span><span class="plain">), </span><span class="identifier">resp_count</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">rb</span><span class="plain">) </span><span class="identifier">t</span><span class="plain"> += </span><span class="functiontext">Rulebooks::index</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="identifier">rb</span><span class="plain">, </span><span class="identifier">desc</span><span class="plain">, </span><span class="functiontext">Rulebooks::no_rule_context</span><span class="plain">(), </span><span class="identifier">resp_count</span><span class="plain">);</span>
<span class="functiontext">Rules::Bookings::list_resume_indexed_links</span><span class="plain">();</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">t</span><span class="plain"> &gt; 0) </span><span class="identifier">HTML_TAG</span><span class="plain">(</span><span class="string">"br"</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="plain">#</span><span class="identifier">endif</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">The function Rulebooks::log_name_only is used in 22/pu (<a href="22-pu.html#SP17">&#167;17</a>).</p>
<p class="endnote">The function Rulebooks::log is used in 1/cm (<a href="1-cm.html#SP5">&#167;5</a>, <a href="1-cm.html#SP6_6">&#167;6.6</a>).</p>
<p class="endnote">The function Rulebooks::no_rule_context is used in <a href="#SP24">&#167;24</a>, 21/ac (<a href="21-ac.html#SP9">&#167;9</a>).</p>
<p class="endnote">The function Rulebooks::phrase_fits_rule_context is used in 21/rb (<a href="21-rb.html#SP17">&#167;17</a>).</p>
<p class="endnote">The function Rulebooks::action_context appears nowhere else.</p>
<p class="endnote">The function Rulebooks::scene_context appears nowhere else.</p>
<p class="endnote">The function Rulebooks::index is used in <a href="#SP24">&#167;24</a>, 21/ac (<a href="21-ac.html#SP9">&#167;9</a>).</p>
<p class="endnote">The function Rulebooks::index_action_rules appears nowhere else.</p>
<p class="inwebparagraph"><a id="SP16"></a><b>&#167;16. Name parsing of rulebooks. </b>The following internal finds the "stem" of a rule, that is, the part
which identifies which rulebook it will go into. For example, in
</p>
<blockquote>
<p>Before printing the name of the peach: ...</p>
</blockquote>
<blockquote>
<p>Instead of eating: ...</p>
</blockquote>
<p class="inwebparagraph">the stems are "before printing the name" and "instead". It makes use
of &lt;rulebook-stem-inner&gt; below, and then does some direct parsing.
</p>
<pre class="display">
<span class="plain">&lt;</span><span class="reserved">rulebook</span><span class="plain">-</span><span class="identifier">stem</span><span class="plain">&gt; </span><span class="identifier">internal</span><span class="plain"> ? {</span>
<span class="reserved">rulebook_match</span><span class="plain"> </span><span class="identifier">rm</span><span class="plain"> = </span><span class="functiontext">Rulebooks::rb_match_from_description</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">rm</span><span class="element">.matched_rulebook</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="identifier">parsed_rm</span><span class="plain"> = </span><span class="identifier">rm</span><span class="plain">;</span>
<span class="reserved">return</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="identifier">rm</span><span class="element">.advance_words</span><span class="plain"> - 1;</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="inwebparagraph"><a id="SP17"></a><b>&#167;17. </b>Suppose this is our rule:
</p>
<blockquote>
<p>The first rule for printing the name of something: ...</p>
</blockquote>
<p class="inwebparagraph">the following grammar peels away the easier-to-read indications at the
front. It notes the use of "The", and the placement "first"; it throws
away other verbiage so that &lt;rulebook-stem-name&gt; matches
</p>
<blockquote>
<p>printing the name of something</p>
</blockquote>
<p class="inwebparagraph">&lt;rulebook-stem&gt; then takes over again and searches for the longest possible
rulebook name at the start of the stem. So if there were a rulebook called
"printing", it wouldn't match here, because "printing the name" is longer.
(&lt;rulebook-stem&gt; doesn't match the "of".)
</p>
<p class="inwebparagraph">Productions (a) and (b) of &lt;rulebook-stem-name&gt; are slightly hacky exceptions
to allow for the "when S begins" rulebooks, where S can be any description
of a scene rather than just a scene's name. In effect, the stem here consists
of the two outer words and is discontiguous.
</p>
<pre class="display">
<span class="plain">&lt;</span><span class="reserved">rulebook</span><span class="plain">-</span><span class="identifier">stem</span><span class="plain">-</span><span class="identifier">inner</span><span class="plain">&gt; ::=</span>
<span class="plain">&lt;</span><span class="identifier">indefinite</span><span class="plain">-</span><span class="identifier">article</span><span class="plain">&gt; &lt;</span><span class="reserved">rulebook</span><span class="plain">-</span><span class="identifier">stem</span><span class="plain">-</span><span class="identifier">inner</span><span class="plain">-</span><span class="identifier">unarticled</span><span class="plain">&gt; | ==&gt; </span><span class="identifier">INDEF_ART</span><span class="plain">; &lt;&lt;</span><span class="identifier">place</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">definite</span><span class="plain">-</span><span class="identifier">article</span><span class="plain">&gt; &lt;</span><span class="reserved">rulebook</span><span class="plain">-</span><span class="identifier">stem</span><span class="plain">-</span><span class="identifier">inner</span><span class="plain">-</span><span class="identifier">unarticled</span><span class="plain">&gt; | ==&gt; </span><span class="identifier">DEF_ART</span><span class="plain">; &lt;&lt;</span><span class="identifier">place</span><span class="plain">&gt;&gt; = </span><span class="identifier">R</span><span class="plain">[2]</span>
<span class="plain">&lt;</span><span class="reserved">rulebook</span><span class="plain">-</span><span class="identifier">stem</span><span class="plain">-</span><span class="identifier">inner</span><span class="plain">-</span><span class="identifier">unarticled</span><span class="plain">&gt; ==&gt; </span><span class="identifier">NO_ART</span><span class="plain">; &lt;&lt;</span><span class="identifier">place</span><span class="plain">&gt;&gt; = </span><span class="identifier">R</span><span class="plain">[1]</span>
<span class="plain">&lt;</span><span class="reserved">rulebook</span><span class="plain">-</span><span class="identifier">stem</span><span class="plain">-</span><span class="identifier">inner</span><span class="plain">-</span><span class="identifier">unarticled</span><span class="plain">&gt; ::=</span>
<span class="reserved">rule</span><span class="plain"> </span><span class="reserved">for</span><span class="plain">/</span><span class="identifier">about</span><span class="plain">/</span><span class="identifier">on</span><span class="plain"> &lt;</span><span class="reserved">rulebook</span><span class="plain">-</span><span class="identifier">stem</span><span class="plain">-</span><span class="identifier">name</span><span class="plain">&gt; | ==&gt; </span><span class="constant">MIDDLE_PLACEMENT</span><span class="plain">; &lt;&lt;</span><span class="identifier">len</span><span class="plain">&gt;&gt; = </span><span class="identifier">R</span><span class="plain">[1]</span>
<span class="reserved">rule</span><span class="plain"> &lt;</span><span class="reserved">rulebook</span><span class="plain">-</span><span class="identifier">stem</span><span class="plain">-</span><span class="identifier">name</span><span class="plain">&gt; | ==&gt; </span><span class="constant">MIDDLE_PLACEMENT</span><span class="plain">; &lt;&lt;</span><span class="identifier">len</span><span class="plain">&gt;&gt; = </span><span class="identifier">R</span><span class="plain">[1]</span>
<span class="identifier">first</span><span class="plain"> </span><span class="reserved">rule</span><span class="plain"> &lt;</span><span class="reserved">rulebook</span><span class="plain">-</span><span class="identifier">stem</span><span class="plain">-</span><span class="identifier">name</span><span class="plain">&gt; | ==&gt; </span><span class="constant">FIRST_PLACEMENT</span><span class="plain">; &lt;&lt;</span><span class="identifier">len</span><span class="plain">&gt;&gt; = </span><span class="identifier">R</span><span class="plain">[1]</span>
<span class="identifier">first</span><span class="plain"> &lt;</span><span class="reserved">rulebook</span><span class="plain">-</span><span class="identifier">stem</span><span class="plain">-</span><span class="identifier">name</span><span class="plain">&gt; | ==&gt; </span><span class="constant">FIRST_PLACEMENT</span><span class="plain">; &lt;&lt;</span><span class="identifier">len</span><span class="plain">&gt;&gt; = </span><span class="identifier">R</span><span class="plain">[1]</span>
<span class="identifier">last</span><span class="plain"> </span><span class="reserved">rule</span><span class="plain"> &lt;</span><span class="reserved">rulebook</span><span class="plain">-</span><span class="identifier">stem</span><span class="plain">-</span><span class="identifier">name</span><span class="plain">&gt; | ==&gt; </span><span class="constant">LAST_PLACEMENT</span><span class="plain">; &lt;&lt;</span><span class="identifier">len</span><span class="plain">&gt;&gt; = </span><span class="identifier">R</span><span class="plain">[1]</span>
<span class="identifier">last</span><span class="plain"> &lt;</span><span class="reserved">rulebook</span><span class="plain">-</span><span class="identifier">stem</span><span class="plain">-</span><span class="identifier">name</span><span class="plain">&gt; | ==&gt; </span><span class="constant">LAST_PLACEMENT</span><span class="plain">; &lt;&lt;</span><span class="identifier">len</span><span class="plain">&gt;&gt; = </span><span class="identifier">R</span><span class="plain">[1]</span>
<span class="plain">&lt;</span><span class="reserved">rulebook</span><span class="plain">-</span><span class="identifier">stem</span><span class="plain">-</span><span class="identifier">name</span><span class="plain">&gt; ==&gt; </span><span class="constant">MIDDLE_PLACEMENT</span><span class="plain">; &lt;&lt;</span><span class="identifier">len</span><span class="plain">&gt;&gt; = </span><span class="identifier">R</span><span class="plain">[1]</span>
<span class="plain">&lt;</span><span class="reserved">rulebook</span><span class="plain">-</span><span class="identifier">stem</span><span class="plain">-</span><span class="identifier">name</span><span class="plain">&gt; ::=</span>
<span class="plain">{</span><span class="identifier">when</span><span class="plain"> ... </span><span class="identifier">begins</span><span class="plain">} | ==&gt; 2; &lt;&lt;</span><span class="reserved">rulebook</span><span class="plain">:</span><span class="identifier">m</span><span class="plain">&gt;&gt; = </span><span class="identifier">built_in_rulebooks</span><span class="plain">[</span><span class="constant">WHEN_SCENE_BEGINS_RB</span><span class="plain">] </span> <span class="comment">scenes\_plugin</span>
<span class="plain">{</span><span class="identifier">when</span><span class="plain"> ... </span><span class="identifier">ends</span><span class="plain">} | ==&gt; 2; &lt;&lt;</span><span class="reserved">rulebook</span><span class="plain">:</span><span class="identifier">m</span><span class="plain">&gt;&gt; = </span><span class="identifier">built_in_rulebooks</span><span class="plain">[</span><span class="constant">WHEN_SCENE_ENDS_RB</span><span class="plain">] </span> <span class="comment">scenes\_plugin</span>
<span class="plain">... ==&gt; 0; &lt;&lt;</span><span class="reserved">rulebook</span><span class="plain">:</span><span class="identifier">m</span><span class="plain">&gt;&gt; = </span><span class="identifier">NULL</span>
</pre>
<p class="inwebparagraph"></p>
<p class="inwebparagraph"><a id="SP18"></a><b>&#167;18. </b></p>
<pre class="display">
<span class="reserved">rulebook_match</span><span class="plain"> </span><span class="functiontext">Rulebooks::rb_match_from_description</span><span class="plain">(</span><span class="identifier">wording</span><span class="plain"> </span><span class="identifier">W</span><span class="plain">) {</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">initial_w1</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="identifier">modifier_words</span><span class="plain">;</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">art</span><span class="plain"> = </span><span class="identifier">NO_ART</span><span class="plain">, </span><span class="identifier">pl</span><span class="plain"> = </span><span class="constant">MIDDLE_PLACEMENT</span><span class="plain">;</span>
<span class="reserved">rulebook</span><span class="plain"> *</span><span class="identifier">rb</span><span class="plain">;</span>
<span class="reserved">rulebook_match</span><span class="plain"> </span><span class="identifier">rm</span><span class="plain">;</span>
<span class="plain">&lt;</span><span class="reserved">rulebook</span><span class="plain">-</span><span class="identifier">stem</span><span class="plain">-</span><span class="identifier">inner</span><span class="plain">&gt;(</span><span class="identifier">W</span><span class="plain">);</span>
<span class="identifier">W</span><span class="plain"> = </span><span class="identifier">GET_RW</span><span class="plain">(&lt;</span><span class="reserved">rulebook</span><span class="plain">-</span><span class="identifier">stem</span><span class="plain">-</span><span class="identifier">name</span><span class="plain">&gt;, 1);</span>
<span class="identifier">art</span><span class="plain"> = &lt;&lt;</span><span class="identifier">r</span><span class="plain">&gt;&gt;; </span><span class="identifier">pl</span><span class="plain"> = &lt;&lt;</span><span class="identifier">place</span><span class="plain">&gt;&gt;;</span>
<span class="identifier">modifier_words</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="identifier">initial_w1</span><span class="plain">;</span>
<span class="identifier">rm</span><span class="element">.match_length</span><span class="plain"> = 0;</span>
<span class="identifier">rm</span><span class="element">.advance_words</span><span class="plain"> = 0;</span>
<span class="identifier">rm</span><span class="element">.match_from</span><span class="plain"> = </span><span class="identifier">initial_w1</span><span class="plain">;</span>
<span class="identifier">rm</span><span class="element">.tail_words</span><span class="plain"> = 0;</span>
<span class="identifier">rm</span><span class="element">.matched_rulebook</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
<span class="identifier">rm</span><span class="element">.article_used</span><span class="plain"> = </span><span class="identifier">art</span><span class="plain">;</span>
<span class="identifier">rm</span><span class="element">.placement_requested</span><span class="plain"> = </span><span class="identifier">pl</span><span class="plain">;</span>
<span class="identifier">LOOP_OVER</span><span class="plain">(</span><span class="identifier">rb</span><span class="plain">, </span><span class="reserved">rulebook</span><span class="plain">) {</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">rb</span><span class="plain"> == &lt;&lt;</span><span class="reserved">rulebook</span><span class="plain">:</span><span class="identifier">m</span><span class="plain">&gt;&gt;) {</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">rm</span><span class="element">.match_length</span><span class="plain"> &lt; &lt;&lt;</span><span class="identifier">len</span><span class="plain">&gt;&gt;) {</span>
<span class="identifier">rm</span><span class="element">.match_length</span><span class="plain"> = &lt;&lt;</span><span class="identifier">len</span><span class="plain">&gt;&gt;;</span>
<span class="identifier">rm</span><span class="element">.matched_rulebook</span><span class="plain"> = </span><span class="identifier">rb</span><span class="plain">;</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">Wordings::starts_with</span><span class="plain">(</span><span class="identifier">W</span><span class="plain">, </span><span class="identifier">rb</span><span class="plain">-</span><span class="element">&gt;primary_name</span><span class="plain">)) {</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">rm</span><span class="element">.match_length</span><span class="plain"> &lt; </span><span class="identifier">Wordings::length</span><span class="plain">(</span><span class="identifier">rb</span><span class="plain">-</span><span class="element">&gt;primary_name</span><span class="plain">)) {</span>
<span class="identifier">rm</span><span class="element">.match_length</span><span class="plain"> = </span><span class="identifier">Wordings::length</span><span class="plain">(</span><span class="identifier">rb</span><span class="plain">-</span><span class="element">&gt;primary_name</span><span class="plain">);</span>
<span class="identifier">rm</span><span class="element">.matched_rulebook</span><span class="plain"> = </span><span class="identifier">rb</span><span class="plain">;</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">Wordings::starts_with</span><span class="plain">(</span><span class="identifier">W</span><span class="plain">, </span><span class="identifier">rb</span><span class="plain">-</span><span class="element">&gt;alternative_name</span><span class="plain">)) {</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">rm</span><span class="element">.match_length</span><span class="plain"> &lt; </span><span class="identifier">Wordings::length</span><span class="plain">(</span><span class="identifier">rb</span><span class="plain">-</span><span class="element">&gt;alternative_name</span><span class="plain">)) {</span>
<span class="identifier">rm</span><span class="element">.match_length</span><span class="plain"> = </span><span class="identifier">Wordings::length</span><span class="plain">(</span><span class="identifier">rb</span><span class="plain">-</span><span class="element">&gt;alternative_name</span><span class="plain">);</span>
<span class="identifier">rm</span><span class="element">.matched_rulebook</span><span class="plain"> = </span><span class="identifier">rb</span><span class="plain">;</span>
<span class="plain">}</span>
<span class="plain">}</span>
<span class="plain">}</span>
<span class="plain">}</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">rm</span><span class="element">.match_length</span><span class="plain"> == 0) </span><span class="reserved">return</span><span class="plain"> </span><span class="identifier">rm</span><span class="plain">;</span>
<span class="identifier">rm</span><span class="element">.advance_words</span><span class="plain"> = </span><span class="identifier">rm</span><span class="element">.match_length</span><span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">rm</span><span class="element">.matched_rulebook</span><span class="plain"> == &lt;&lt;</span><span class="reserved">rulebook</span><span class="plain">:</span><span class="identifier">m</span><span class="plain">&gt;&gt;) {</span>
<span class="identifier">rm</span><span class="element">.tail_words</span><span class="plain"> = 1;</span>
<span class="identifier">rm</span><span class="element">.match_length</span><span class="plain"> = 1;</span>
<span class="plain">}</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">rm</span><span class="element">.matched_rulebook</span><span class="plain">-</span><span class="element">&gt;fragmentation_stem_length</span><span class="plain">) {</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">w1a</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="identifier">rm</span><span class="element">.match_length</span><span class="plain"> - 1;</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">w1a</span><span class="plain"> != </span><span class="identifier">Wordings::last_wn</span><span class="plain">(</span><span class="identifier">W</span><span class="plain">))</span>
<span class="identifier">rm</span><span class="element">.match_length</span><span class="plain"> = </span><span class="identifier">rm</span><span class="element">.matched_rulebook</span><span class="plain">-</span><span class="element">&gt;fragmentation_stem_length</span><span class="plain">;</span>
<span class="plain">}</span>
<span class="identifier">rm</span><span class="element">.match_length</span><span class="plain"> += </span><span class="identifier">modifier_words</span><span class="plain">;</span>
<span class="identifier">rm</span><span class="element">.advance_words</span><span class="plain"> += </span><span class="identifier">modifier_words</span><span class="plain">;</span>
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">rm</span><span class="plain">;</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">The function Rulebooks::rb_match_from_description is used in <a href="#SP16">&#167;16</a>.</p>
<p class="inwebparagraph"><a id="SP19"></a><b>&#167;19. Rule attachments. </b>The following routine contains a bit of a surprise: that the act of
placing a BR within a given rulebook can change it, by altering the way
it acts on its applicability test. This is a device needed to manage
the parallel rulebooks for action processing for the main player character
and for third parties. Though the code below does not make this apparent,
the changes propagate down through the BR to the phrase structure itself.
This is necessary because they manifest themselves in the compiled code
of the phrase, but it is also unfortunate, because it is possible that
the same phrase is used by more than one BR. If it should happen that
BRs are created to place the same phrase into two different rulebooks,
therefore, and which have different actor-testing settings, the outcome
would be confusing. (As unlikely as this seems, it did once happen to a
user in beta-testing.)
</p>
<p class="inwebparagraph">All work on the sequence of rules in rulebooks is delegated to the
sub-section on linked lists of booked rules in the section on Rules.
</p>
<pre class="display">
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Rulebooks::attach_rule</span><span class="plain">(</span><span class="reserved">rulebook</span><span class="plain"> *</span><span class="identifier">rb</span><span class="plain">, </span><span class="reserved">booking</span><span class="plain"> *</span><span class="identifier">the_new_rule</span><span class="plain">,</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">placing</span><span class="plain">, </span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">side</span><span class="plain">, </span><span class="reserved">rule</span><span class="plain"> *</span><span class="identifier">ref_rule</span><span class="plain">) {</span>
<span class="identifier">LOGIF</span><span class="plain">(</span><span class="identifier">RULE_ATTACHMENTS</span><span class="plain">, </span><span class="string">"Attaching booked rule $b at sentence:\</span><span class="plain">n</span><span class="string"> $T"</span><span class="plain">,</span>
<span class="identifier">the_new_rule</span><span class="plain">, </span><span class="identifier">current_sentence</span><span class="plain">);</span>
<span class="identifier">LOGIF</span><span class="plain">(</span><span class="identifier">RULE_ATTACHMENTS</span><span class="plain">, </span><span class="string">"Rulebook before attachment: $K"</span><span class="plain">, </span><span class="identifier">rb</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">Rules::Bookings::get_rule</span><span class="plain">(</span><span class="identifier">the_new_rule</span><span class="plain">) == </span><span class="identifier">ref_rule</span><span class="plain">) {</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">side</span><span class="plain"> != </span><span class="constant">INSTEAD_SIDE</span><span class="plain">)</span>
<span class="identifier">Problems::Issue::sentence_problem</span><span class="plain">(</span><span class="identifier">_p_</span><span class="plain">(</span><span class="identifier">PM_BeforeOrAfterSelf</span><span class="plain">),</span>
<span class="string">"a rule can't be before or after itself"</span><span class="plain">,</span>
<span class="string">"so this makes no sense to me."</span><span class="plain">);</span>
<span class="reserved">return</span><span class="plain">;</span>
<span class="plain">}</span>
<span class="plain">#</span><span class="identifier">ifdef</span><span class="plain"> </span><span class="identifier">IF_MODULE</span>
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">rb</span><span class="plain"> == </span><span class="identifier">built_in_rulebooks</span><span class="plain">[</span><span class="constant">BEFORE_RB</span><span class="plain">]) ||</span>
<span class="plain">(</span><span class="identifier">rb</span><span class="plain"> == </span><span class="identifier">built_in_rulebooks</span><span class="plain">[</span><span class="constant">AFTER_RB</span><span class="plain">]) ||</span>
<span class="plain">(</span><span class="identifier">rb</span><span class="plain"> == </span><span class="identifier">built_in_rulebooks</span><span class="plain">[</span><span class="constant">INSTEAD_RB</span><span class="plain">])) {</span>
<span class="reserved">phrase</span><span class="plain"> *</span><span class="identifier">ph</span><span class="plain"> = </span><span class="functiontext">Rules::get_I7_definition</span><span class="plain">(</span><span class="functiontext">Rules::Bookings::get_rule</span><span class="plain">(</span><span class="identifier">the_new_rule</span><span class="plain">));</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">ph</span><span class="plain">) {</span>
<span class="identifier">action_name</span><span class="plain"> *</span><span class="identifier">an</span><span class="plain"> = </span><span class="functiontext">Phrases::Context::required_action</span><span class="plain">(&amp;(</span><span class="identifier">ph</span><span class="plain">-</span><span class="element">&gt;runtime_context_data</span><span class="plain">));</span>
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">an</span><span class="plain">) &amp;&amp; (</span><span class="identifier">PL::Actions::is_out_of_world</span><span class="plain">(</span><span class="identifier">an</span><span class="plain">)))</span>
<span class="identifier">Problems::Issue::sentence_problem</span><span class="plain">(</span><span class="identifier">_p_</span><span class="plain">(</span><span class="identifier">PM_OOWinIWRulebook</span><span class="plain">),</span>
<span class="string">"this rulebook has no effect on actions which happen out of world"</span><span class="plain">,</span>
<span class="string">"so I'm not going to let you file this rule in it. ('Check', "</span>
<span class="string">"'Carry out' and 'Report' work fine for out of world actions: "</span>
<span class="string">"but 'Before', 'Instead' and 'After' have no effect on them.)"</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="plain">}</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">rb</span><span class="plain"> == </span><span class="identifier">built_in_rulebooks</span><span class="plain">[</span><span class="constant">SETTING_ACTION_VARIABLES_RB</span><span class="plain">]) {</span>
<span class="functiontext">Rules::set_never_test_actor</span><span class="plain">(</span><span class="functiontext">Rules::Bookings::get_rule</span><span class="plain">(</span><span class="identifier">the_new_rule</span><span class="plain">));</span>
<span class="plain">} </span><span class="reserved">else</span><span class="plain"> {</span>
<span class="functiontext">Rulebooks::Outcomes::modify_rule_to_suit_focus</span><span class="plain">(&amp;(</span><span class="identifier">rb</span><span class="plain">-</span><span class="element">&gt;my_focus</span><span class="plain">),</span>
<span class="functiontext">Rules::Bookings::get_rule</span><span class="plain">(</span><span class="identifier">the_new_rule</span><span class="plain">));</span>
<span class="plain">}</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">side</span><span class="plain"> == </span><span class="constant">INSTEAD_SIDE</span><span class="plain">) {</span>
<span class="identifier">LOGIF</span><span class="plain">(</span><span class="identifier">RULE_ATTACHMENTS</span><span class="plain">,</span>
<span class="string">"Copying actor test flags from rule being replaced\</span><span class="plain">n</span><span class="string">"</span><span class="plain">);</span>
<span class="functiontext">Rules::copy_actor_test_flags</span><span class="plain">(</span><span class="functiontext">Rules::Bookings::get_rule</span><span class="plain">(</span><span class="identifier">the_new_rule</span><span class="plain">), </span><span class="identifier">ref_rule</span><span class="plain">);</span>
<span class="identifier">LOGIF</span><span class="plain">(</span><span class="identifier">RULE_ATTACHMENTS</span><span class="plain">,</span>
<span class="string">"Copying former rulebook's variable permissions to displaced rule\</span><span class="plain">n</span><span class="string">"</span><span class="plain">);</span>
<span class="functiontext">Rules::acquire_stvol</span><span class="plain">(</span><span class="identifier">ref_rule</span><span class="plain">, </span><span class="identifier">rb</span><span class="plain">-</span><span class="element">&gt;accessible_from_rb</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">Rulebooks::focus</span><span class="plain">(</span><span class="identifier">rb</span><span class="plain">) == </span><span class="constant">ACTION_FOCUS</span><span class="plain">)</span>
<span class="functiontext">Rules::acquire_action_variables</span><span class="plain">(</span><span class="identifier">ref_rule</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="plain">#</span><span class="identifier">endif</span>
<span class="functiontext">Rules::acquire_stvol</span><span class="plain">(</span><span class="functiontext">Rules::Bookings::get_rule</span><span class="plain">(</span><span class="identifier">the_new_rule</span><span class="plain">), </span><span class="identifier">rb</span><span class="plain">-</span><span class="element">&gt;accessible_from_rb</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">Rulebooks::focus</span><span class="plain">(</span><span class="identifier">rb</span><span class="plain">) == </span><span class="constant">ACTION_FOCUS</span><span class="plain">)</span>
<span class="functiontext">Rules::acquire_action_variables</span><span class="plain">(</span><span class="functiontext">Rules::Bookings::get_rule</span><span class="plain">(</span><span class="identifier">the_new_rule</span><span class="plain">));</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">rb</span><span class="plain">-</span><span class="element">&gt;fragmentation_stem_length</span><span class="plain"> &gt; 0)</span>
<span class="functiontext">Rules::suppress_action_testing</span><span class="plain">(</span><span class="functiontext">Rules::Bookings::get_rule</span><span class="plain">(</span><span class="identifier">the_new_rule</span><span class="plain">));</span>
<span class="functiontext">Phrases::Context::ensure_avl</span><span class="plain">(</span><span class="functiontext">Rules::Bookings::get_rule</span><span class="plain">(</span><span class="identifier">the_new_rule</span><span class="plain">));</span>
<span class="functiontext">Rules::Bookings::list_add</span><span class="plain">(</span><span class="identifier">rb</span><span class="plain">-</span><span class="element">&gt;rule_list</span><span class="plain">, </span><span class="identifier">the_new_rule</span><span class="plain">, </span><span class="identifier">placing</span><span class="plain">, </span><span class="identifier">side</span><span class="plain">, </span><span class="identifier">ref_rule</span><span class="plain">);</span>
<span class="identifier">LOGIF</span><span class="plain">(</span><span class="identifier">RULE_ATTACHMENTS</span><span class="plain">, </span><span class="string">"Rulebook after attachment: $K"</span><span class="plain">, </span><span class="identifier">rb</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Rulebooks::detach_rule</span><span class="plain">(</span><span class="reserved">rulebook</span><span class="plain"> *</span><span class="identifier">rb</span><span class="plain">, </span><span class="reserved">rule</span><span class="plain"> *</span><span class="identifier">the_new_rule</span><span class="plain">) {</span>
<span class="functiontext">Rules::Bookings::list_remove</span><span class="plain">(</span><span class="identifier">rb</span><span class="plain">-</span><span class="element">&gt;rule_list</span><span class="plain">, </span><span class="identifier">the_new_rule</span><span class="plain">);</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">The function Rulebooks::attach_rule is used in 21/rb (<a href="21-rb.html#SP9">&#167;9</a>), 21/rps (<a href="21-rps.html#SP18">&#167;18</a>).</p>
<p class="endnote">The function Rulebooks::detach_rule is used in 21/rps (<a href="21-rps.html#SP18">&#167;18</a>).</p>
<p class="inwebparagraph"><a id="SP20"></a><b>&#167;20. Compilation. </b>We do not actually compile the I6 routines for a rulebook here, but simply
act as a proxy. The I6 arrays making the rulebooks available to run-time
code are the real outcome of the code in this section.
</p>
<pre class="display">
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Rulebooks::compile_rule_phrases</span><span class="plain">(</span><span class="reserved">rulebook</span><span class="plain"> *</span><span class="identifier">rb</span><span class="plain">, </span><span class="reserved">int</span><span class="plain"> *</span><span class="identifier">i</span><span class="plain">, </span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">max_i</span><span class="plain">) {</span>
<span class="functiontext">Rules::Bookings::list_judge_ordering</span><span class="plain">(</span><span class="identifier">rb</span><span class="plain">-</span><span class="element">&gt;rule_list</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">Rules::Bookings::list_is_empty_of_i7_rules</span><span class="plain">(</span><span class="identifier">rb</span><span class="plain">-</span><span class="element">&gt;rule_list</span><span class="plain">)) </span><span class="reserved">return</span><span class="plain">;</span>
<span class="functiontext">Rules::Bookings::list_compile_rule_phrases</span><span class="plain">(</span><span class="identifier">rb</span><span class="plain">-</span><span class="element">&gt;rule_list</span><span class="plain">, </span><span class="identifier">i</span><span class="plain">, </span><span class="identifier">max_i</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Rulebooks::rulebooks_array_array</span><span class="plain">(</span><span class="reserved">void</span><span class="plain">) {</span>
<span class="identifier">inter_name</span><span class="plain"> *</span><span class="identifier">iname</span><span class="plain"> = </span><span class="functiontext">Hierarchy::find</span><span class="plain">(</span><span class="constant">RULEBOOKS_ARRAY_HL</span><span class="plain">);</span>
<span class="identifier">packaging_state</span><span class="plain"> </span><span class="identifier">save</span><span class="plain"> = </span><span class="functiontext">Emit::named_array_begin</span><span class="plain">(</span><span class="identifier">iname</span><span class="plain">, </span><span class="identifier">K_value</span><span class="plain">);</span>
<span class="reserved">rulebook</span><span class="plain"> *</span><span class="identifier">rb</span><span class="plain">;</span>
<span class="identifier">LOOP_OVER</span><span class="plain">(</span><span class="identifier">rb</span><span class="plain">, </span><span class="reserved">rulebook</span><span class="plain">)</span>
<span class="functiontext">Emit::array_iname_entry</span><span class="plain">(</span><span class="identifier">rb</span><span class="plain">-</span><span class="element">&gt;rb_iname</span><span class="plain">);</span>
<span class="functiontext">Emit::array_numeric_entry</span><span class="plain">(0);</span>
<span class="functiontext">Emit::array_end</span><span class="plain">(</span><span class="identifier">save</span><span class="plain">);</span>
<span class="functiontext">Hierarchy::make_available</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">(), </span><span class="identifier">iname</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Rulebooks::compile_rulebooks</span><span class="plain">(</span><span class="reserved">void</span><span class="plain">) {</span>
<span class="functiontext">Rules::Bookings::start_list_compilation</span><span class="plain">();</span>
<span class="reserved">rulebook</span><span class="plain"> *</span><span class="identifier">rb</span><span class="plain">;</span>
<span class="identifier">LOOP_OVER</span><span class="plain">(</span><span class="identifier">rb</span><span class="plain">, </span><span class="reserved">rulebook</span><span class="plain">) {</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">act</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">Rulebooks::focus</span><span class="plain">(</span><span class="identifier">rb</span><span class="plain">) == </span><span class="constant">ACTION_FOCUS</span><span class="plain">) </span><span class="identifier">act</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">rb</span><span class="plain">-</span><span class="element">&gt;automatically_generated</span><span class="plain">) </span><span class="identifier">act</span><span class="plain"> = </span><span class="identifier">FALSE</span><span class="plain">;</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">par</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">Rulebooks::focus</span><span class="plain">(</span><span class="identifier">rb</span><span class="plain">) == </span><span class="constant">PARAMETER_FOCUS</span><span class="plain">) </span><span class="identifier">par</span><span class="plain"> = </span><span class="identifier">TRUE</span><span class="plain">;</span>
<span class="identifier">LOGIF</span><span class="plain">(</span><span class="identifier">RULEBOOK_COMPILATION</span><span class="plain">, </span><span class="string">"Compiling rulebook: %W = %n\</span><span class="plain">n</span><span class="string">"</span><span class="plain">,</span>
<span class="identifier">rb</span><span class="plain">-</span><span class="element">&gt;primary_name</span><span class="plain">, </span><span class="identifier">rb</span><span class="plain">-</span><span class="element">&gt;rb_iname</span><span class="plain">);</span>
<span class="functiontext">Rules::Bookings::list_compile</span><span class="plain">(</span><span class="identifier">rb</span><span class="plain">-</span><span class="element">&gt;rule_list</span><span class="plain">, </span><span class="identifier">rb</span><span class="plain">-</span><span class="element">&gt;rb_iname</span><span class="plain">, </span><span class="identifier">act</span><span class="plain">, </span><span class="identifier">par</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="functiontext">Rules::check_placement_safety</span><span class="plain">();</span>
<span class="plain">}</span>
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Rulebooks::RulebookNames_array</span><span class="plain">(</span><span class="reserved">void</span><span class="plain">) {</span>
<span class="identifier">inter_name</span><span class="plain"> *</span><span class="identifier">iname</span><span class="plain"> = </span><span class="functiontext">Hierarchy::find</span><span class="plain">(</span><span class="constant">RULEBOOKNAMES_HL</span><span class="plain">);</span>
<span class="identifier">packaging_state</span><span class="plain"> </span><span class="identifier">save</span><span class="plain"> = </span><span class="functiontext">Emit::named_array_begin</span><span class="plain">(</span><span class="identifier">iname</span><span class="plain">, </span><span class="identifier">K_value</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">memory_economy_in_force</span><span class="plain">) {</span>
<span class="functiontext">Emit::array_numeric_entry</span><span class="plain">(0);</span>
<span class="functiontext">Emit::array_numeric_entry</span><span class="plain">(0);</span>
<span class="plain">} </span><span class="reserved">else</span><span class="plain"> {</span>
<span class="reserved">rulebook</span><span class="plain"> *</span><span class="identifier">rb</span><span class="plain">;</span>
<span class="identifier">LOOP_OVER</span><span class="plain">(</span><span class="identifier">rb</span><span class="plain">, </span><span class="reserved">rulebook</span><span class="plain">) {</span>
<span class="identifier">TEMPORARY_TEXT</span><span class="plain">(</span><span class="identifier">rbt</span><span class="plain">);</span>
<span class="identifier">WRITE_TO</span><span class="plain">(</span><span class="identifier">rbt</span><span class="plain">, </span><span class="string">"%~W rulebook"</span><span class="plain">, </span><span class="identifier">rb</span><span class="plain">-</span><span class="element">&gt;primary_name</span><span class="plain">);</span>
<span class="functiontext">Emit::array_text_entry</span><span class="plain">(</span><span class="identifier">rbt</span><span class="plain">);</span>
<span class="identifier">DISCARD_TEXT</span><span class="plain">(</span><span class="identifier">rbt</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="plain">}</span>
<span class="functiontext">Emit::array_end</span><span class="plain">(</span><span class="identifier">save</span><span class="plain">);</span>
<span class="functiontext">Hierarchy::make_available</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">(), </span><span class="identifier">iname</span><span class="plain">);</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">The function Rulebooks::compile_rule_phrases is used in 22/cs (<a href="22-cs.html#SP10_2">&#167;10.2</a>).</p>
<p class="endnote">The function Rulebooks::rulebooks_array_array is used in 22/cs (<a href="22-cs.html#SP12">&#167;12</a>).</p>
<p class="endnote">The function Rulebooks::compile_rulebooks is used in 22/cs (<a href="22-cs.html#SP12">&#167;12</a>).</p>
<p class="endnote">The function Rulebooks::RulebookNames_array is used in 22/cs (<a href="22-cs.html#SP12">&#167;12</a>).</p>
<p class="inwebparagraph"><a id="SP21"></a><b>&#167;21. Parsing rulebook properties. </b>Rulebooks do not have properties as such. The syntax which would create these
creates rulebook variables instead, which are much more useful. However, we
do allow the following syntax:
</p>
<blockquote>
<p>Visibility rules have outcomes there is sufficient light (failure) and there is insufficient light (success).</p>
</blockquote>
<p class="inwebparagraph">where Inform sees that the subject ("visibility rules") is a rulebook, and
parses the object noun phrase with the following:
</p>
<pre class="display">
<span class="plain">&lt;</span><span class="reserved">rulebook</span><span class="plain">-</span><span class="reserved">property</span><span class="plain">&gt; ::=</span>
<span class="identifier">outcome</span><span class="plain">/</span><span class="reserved">outcomes</span><span class="plain"> &lt;</span><span class="reserved">rulebook</span><span class="plain">-</span><span class="identifier">outcome</span><span class="plain">-</span><span class="identifier">list</span><span class="plain">&gt; | ==&gt; </span><span class="identifier">TRUE</span>
<span class="reserved">default</span><span class="plain"> &lt;</span><span class="reserved">rulebook</span><span class="plain">-</span><span class="reserved">default</span><span class="plain">-</span><span class="identifier">outcome</span><span class="plain">&gt; | ==&gt; </span><span class="identifier">FALSE</span>
<span class="plain">... ==&gt; </span>&lt;<span class="cwebmacro">Issue PM_NonOutcomeProperty problem</span> <span class="cwebmacronumber">21.1</span>&gt;
</pre>
<p class="inwebparagraph"></p>
<p class="inwebparagraph"><a id="SP21_1"></a><b>&#167;21.1. </b><code class="display">
&lt;<span class="cwebmacrodefn">Issue PM_NonOutcomeProperty problem</span> <span class="cwebmacronumber">21.1</span>&gt; =
</code></p>
<pre class="displaydefn">
<span class="plain">*</span><span class="identifier">X</span><span class="plain"> = </span><span class="identifier">NOT_APPLICABLE</span><span class="plain">;</span>
<span class="identifier">Problems::Issue::sentence_problem</span><span class="plain">(</span><span class="identifier">_p_</span><span class="plain">(</span><span class="identifier">PM_NonOutcomeProperty</span><span class="plain">),</span>
<span class="string">"the only properties of a rulebook are its outcomes"</span><span class="plain">,</span>
<span class="string">"for the time being at least."</span><span class="plain">);</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">This code is used in <a href="#SP21">&#167;21</a>.</p>
<p class="inwebparagraph"><a id="SP22"></a><b>&#167;22. </b></p>
<pre class="display">
<span class="reserved">outcomes</span><span class="plain"> *</span><span class="identifier">outcomes_being_parsed</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Rulebooks::parse_properties</span><span class="plain">(</span><span class="reserved">rulebook</span><span class="plain"> *</span><span class="identifier">rb</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">outcomes_being_parsed</span><span class="plain"> = &amp;(</span><span class="identifier">rb</span><span class="plain">-</span><span class="element">&gt;my_outcomes</span><span class="plain">);</span>
<span class="plain">&lt;</span><span class="reserved">rulebook</span><span class="plain">-</span><span class="reserved">property</span><span class="plain">&gt;(</span><span class="identifier">W</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="identifier">kind</span><span class="plain"> *</span><span class="functiontext">Rulebooks::kind_from_context</span><span class="plain">(</span><span class="reserved">void</span><span class="plain">) {</span>
<span class="reserved">phrase</span><span class="plain"> *</span><span class="identifier">ph</span><span class="plain"> = </span><span class="identifier">phrase_being_compiled</span><span class="plain">;</span>
<span class="reserved">rulebook</span><span class="plain"> *</span><span class="identifier">rb</span><span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">ph</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">NULL</span><span class="plain">;</span>
<span class="identifier">LOOP_OVER</span><span class="plain">(</span><span class="identifier">rb</span><span class="plain">, </span><span class="reserved">rulebook</span><span class="plain">)</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">Rules::Bookings::list_contains_ph</span><span class="plain">(</span><span class="identifier">rb</span><span class="plain">-</span><span class="element">&gt;rule_list</span><span class="plain">, </span><span class="identifier">ph</span><span class="plain">))</span>
<span class="reserved">return</span><span class="plain"> </span><span class="functiontext">Rulebooks::Outcomes::get_outcome_kind</span><span class="plain">(&amp;(</span><span class="identifier">rb</span><span class="plain">-</span><span class="element">&gt;my_outcomes</span><span class="plain">));</span>
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">NULL</span><span class="plain">;</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">The function Rulebooks::parse_properties is used in 9/ma (<a href="9-ma.html#SP3_3_18">&#167;3.3.18</a>).</p>
<p class="endnote">The function Rulebooks::kind_from_context is used in 25/cii (<a href="25-cii.html#SP3_1_1_4_7_1">&#167;3.1.1.4.7.1</a>, <a href="25-cii.html#SP7">&#167;7</a>).</p>
<p class="inwebparagraph"><a id="SP23"></a><b>&#167;23. Rules index. </b>The Rules page of the index is essentially a trawl through the more
popular rulebooks, showing their contents in logical order.
</p>
<pre class="display">
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Rulebooks::index_page</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="reserved">if</span><span class="plain"> (</span><span class="identifier">n</span><span class="plain"> == 1) {</span>
&lt;<span class="cwebmacro">Index the segment for the main action rulebooks</span> <span class="cwebmacronumber">23.4</span>&gt;<span class="plain">;</span>
&lt;<span class="cwebmacro">Index the segment for the sequence of play rulebooks</span> <span class="cwebmacronumber">23.2</span>&gt;<span class="plain">;</span>
&lt;<span class="cwebmacro">Index the segment for the Understanding rulebooks</span> <span class="cwebmacronumber">23.3</span>&gt;<span class="plain">;</span>
&lt;<span class="cwebmacro">Index the segment for the description rulebooks</span> <span class="cwebmacronumber">23.9</span>&gt;<span class="plain">;</span>
&lt;<span class="cwebmacro">Index the segment for the accessibility rulebooks</span> <span class="cwebmacronumber">23.7</span>&gt;<span class="plain">;</span>
&lt;<span class="cwebmacro">Index the segment for the light and darkness rulebooks</span> <span class="cwebmacronumber">23.8</span>&gt;<span class="plain">;</span>
&lt;<span class="cwebmacro">Index the segment for the top-level rulebooks</span> <span class="cwebmacronumber">23.1</span>&gt;<span class="plain">;</span>
&lt;<span class="cwebmacro">Index the segment for the action processing rulebooks</span> <span class="cwebmacronumber">23.5</span>&gt;<span class="plain">;</span>
&lt;<span class="cwebmacro">Index the segment for the responses</span> <span class="cwebmacronumber">23.6</span>&gt;<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">Rulebooks::noteworthy_rulebooks</span><span class="plain">(</span><span class="identifier">NULL</span><span class="plain">) &gt; 0)</span>
&lt;<span class="cwebmacro">Index the segment for new rulebooks and activities</span> <span class="cwebmacronumber">23.10</span>&gt;<span class="plain">;</span>
<span class="reserved">extension_file</span><span class="plain"> *</span><span class="identifier">ef</span><span class="plain">;</span>
<span class="identifier">LOOP_OVER</span><span class="plain">(</span><span class="identifier">ef</span><span class="plain">, </span><span class="reserved">extension_file</span><span class="plain">)</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">ef</span><span class="plain"> != </span><span class="identifier">standard_rules_extension</span><span class="plain">)</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">Rulebooks::noteworthy_rulebooks</span><span class="plain">(</span><span class="identifier">ef</span><span class="plain">) &gt; 0)</span>
&lt;<span class="cwebmacro">Index the segment for the rulebooks in this extension</span> <span class="cwebmacronumber">23.11</span>&gt;<span class="plain">;</span>
<span class="plain">}</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">The function Rulebooks::index_page appears nowhere else.</p>
<p class="inwebparagraph"><a id="SP23_1"></a><b>&#167;23.1. </b><code class="display">
&lt;<span class="cwebmacrodefn">Index the segment for the top-level rulebooks</span> <span class="cwebmacronumber">23.1</span>&gt; =
</code></p>
<pre class="displaydefn">
<span class="identifier">HTML_OPEN</span><span class="plain">(</span><span class="string">"p"</span><span class="plain">); </span><span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"&lt;b&gt;The top level&lt;/b&gt;"</span><span class="plain">); </span><span class="identifier">HTML_CLOSE</span><span class="plain">(</span><span class="string">"p"</span><span class="plain">);</span>
<span class="identifier">HTML_OPEN</span><span class="plain">(</span><span class="string">"p"</span><span class="plain">); </span><span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"An Inform story file spends its whole time working through "</span>
<span class="string">"these three master rulebooks. They can be altered, just as all "</span>
<span class="string">"rulebooks can, but it's generally better to leave them alone."</span><span class="plain">);</span>
<span class="identifier">HTML_CLOSE</span><span class="plain">(</span><span class="string">"p"</span><span class="plain">);</span>
<span class="functiontext">Rulebooks::index_rules_box</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="string">"Startup rules"</span><span class="plain">, </span><span class="identifier">EMPTY_WORDING</span><span class="plain">, </span><span class="identifier">NULL</span><span class="plain">,</span>
<span class="identifier">built_in_rulebooks</span><span class="plain">[</span><span class="constant">STARTUP_RB</span><span class="plain">], </span><span class="identifier">NULL</span><span class="plain">, </span><span class="identifier">NULL</span><span class="plain">, 1, </span><span class="identifier">TRUE</span><span class="plain">);</span>
<span class="functiontext">Activities::index_by_number</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="constant">STARTING_VIRTUAL_MACHINE_ACT</span><span class="plain">, 2);</span>
<span class="functiontext">Activities::index_by_number</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="constant">PRINTING_BANNER_TEXT_ACT</span><span class="plain">, 2);</span>
<span class="functiontext">Rulebooks::index_rules_box</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="string">"Turn sequence rules"</span><span class="plain">, </span><span class="identifier">EMPTY_WORDING</span><span class="plain">, </span><span class="identifier">NULL</span><span class="plain">,</span>
<span class="identifier">built_in_rulebooks</span><span class="plain">[</span><span class="constant">TURN_SEQUENCE_RB</span><span class="plain">], </span><span class="identifier">NULL</span><span class="plain">, </span><span class="identifier">NULL</span><span class="plain">, 1, </span><span class="identifier">TRUE</span><span class="plain">);</span>
<span class="functiontext">Activities::index_by_number</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="constant">CONSTRUCTING_STATUS_LINE_ACT</span><span class="plain">, 2);</span>
<span class="functiontext">Rulebooks::index_rules_box</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="string">"Shutdown rules"</span><span class="plain">, </span><span class="identifier">EMPTY_WORDING</span><span class="plain">, </span><span class="identifier">NULL</span><span class="plain">,</span>
<span class="identifier">built_in_rulebooks</span><span class="plain">[</span><span class="constant">SHUTDOWN_RB</span><span class="plain">], </span><span class="identifier">NULL</span><span class="plain">, </span><span class="identifier">NULL</span><span class="plain">, 1, </span><span class="identifier">TRUE</span><span class="plain">);</span>
<span class="functiontext">Activities::index_by_number</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="constant">AMUSING_A_VICTORIOUS_PLAYER_ACT</span><span class="plain">, 2);</span>
<span class="functiontext">Activities::index_by_number</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="constant">PRINTING_PLAYERS_OBITUARY_ACT</span><span class="plain">, 2);</span>
<span class="functiontext">Activities::index_by_number</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="constant">DEALING_WITH_FINAL_QUESTION_ACT</span><span class="plain">, 2);</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">This code is used in <a href="#SP23">&#167;23</a>.</p>
<p class="inwebparagraph"><a id="SP23_2"></a><b>&#167;23.2. </b><code class="display">
&lt;<span class="cwebmacrodefn">Index the segment for the sequence of play rulebooks</span> <span class="cwebmacronumber">23.2</span>&gt; =
</code></p>
<pre class="displaydefn">
<span class="identifier">HTML_OPEN</span><span class="plain">(</span><span class="string">"p"</span><span class="plain">); </span><span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"&lt;b&gt;Rules added to the sequence of play&lt;/b&gt;"</span><span class="plain">); </span><span class="identifier">HTML_CLOSE</span><span class="plain">(</span><span class="string">"p"</span><span class="plain">);</span>
<span class="identifier">HTML_OPEN</span><span class="plain">(</span><span class="string">"p"</span><span class="plain">); </span><span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"These rulebooks are the best places to put rules timed to happen "</span>
<span class="string">"at the start, at the end, or once each turn. (Each is run through at "</span>
<span class="string">"a carefully chosen moment in the relevant top-level rulebook.) It is "</span>
<span class="string">"also possible to have rules take effect at specific times of day "</span>
<span class="string">"or when certain events happen. Those are listed in the Scenes index, "</span>
<span class="string">"alongside rules taking place when scenes begin or end."</span><span class="plain">); </span><span class="identifier">HTML_CLOSE</span><span class="plain">(</span><span class="string">"p"</span><span class="plain">);</span>
<span class="functiontext">Rulebooks::index_rules_box</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="string">"When play begins"</span><span class="plain">, </span><span class="identifier">EMPTY_WORDING</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"rules_wpb"</span><span class="plain">,</span>
<span class="identifier">built_in_rulebooks</span><span class="plain">[</span><span class="constant">WHEN_PLAY_BEGINS_RB</span><span class="plain">], </span><span class="identifier">NULL</span><span class="plain">, </span><span class="identifier">NULL</span><span class="plain">, 1, </span><span class="identifier">TRUE</span><span class="plain">);</span>
<span class="functiontext">Rulebooks::index_rules_box</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="string">"Every turn"</span><span class="plain">, </span><span class="identifier">EMPTY_WORDING</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"rules_et"</span><span class="plain">,</span>
<span class="identifier">built_in_rulebooks</span><span class="plain">[</span><span class="constant">EVERY_TURN_RB</span><span class="plain">], </span><span class="identifier">NULL</span><span class="plain">, </span><span class="identifier">NULL</span><span class="plain">, 1, </span><span class="identifier">TRUE</span><span class="plain">);</span>
<span class="functiontext">Rulebooks::index_rules_box</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="string">"When play ends"</span><span class="plain">, </span><span class="identifier">EMPTY_WORDING</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"rules_wpe"</span><span class="plain">,</span>
<span class="identifier">built_in_rulebooks</span><span class="plain">[</span><span class="constant">WHEN_PLAY_ENDS_RB</span><span class="plain">], </span><span class="identifier">NULL</span><span class="plain">, </span><span class="identifier">NULL</span><span class="plain">, 1, </span><span class="identifier">TRUE</span><span class="plain">);</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">This code is used in <a href="#SP23">&#167;23</a>.</p>
<p class="inwebparagraph"><a id="SP23_3"></a><b>&#167;23.3. </b><code class="display">
&lt;<span class="cwebmacrodefn">Index the segment for the Understanding rulebooks</span> <span class="cwebmacronumber">23.3</span>&gt; =
</code></p>
<pre class="displaydefn">
<span class="identifier">HTML_OPEN</span><span class="plain">(</span><span class="string">"p"</span><span class="plain">); </span><span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"&lt;b&gt;How commands are understood&lt;/b&gt;"</span><span class="plain">); </span><span class="identifier">HTML_CLOSE</span><span class="plain">(</span><span class="string">"p"</span><span class="plain">);</span>
<span class="identifier">HTML_OPEN</span><span class="plain">(</span><span class="string">"p"</span><span class="plain">); </span><span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"'Understanding' here means turning a typed command, like GET FISH, "</span>
<span class="string">"into one or more actions, like taking the red herring. This is all handled "</span>
<span class="string">"by a single large rule (the parse command rule), but that rule makes use "</span>
<span class="string">"of the following activities and rulebooks in its work."</span><span class="plain">); </span><span class="identifier">HTML_CLOSE</span><span class="plain">(</span><span class="string">"p"</span><span class="plain">);</span>
<span class="functiontext">Rulebooks::index_rules_box</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="string">"Does the player mean"</span><span class="plain">, </span><span class="identifier">EMPTY_WORDING</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"rules_dtpm"</span><span class="plain">,</span>
<span class="identifier">built_in_rulebooks</span><span class="plain">[</span><span class="constant">DOES_THE_PLAYER_MEAN_RB</span><span class="plain">], </span><span class="identifier">NULL</span><span class="plain">, </span><span class="identifier">NULL</span><span class="plain">, 1, </span><span class="identifier">TRUE</span><span class="plain">);</span>
<span class="functiontext">Activities::index_by_number</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="constant">READING_A_COMMAND_ACT</span><span class="plain">, 1);</span>
<span class="functiontext">Activities::index_by_number</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="constant">DECIDING_SCOPE_ACT</span><span class="plain">, 1);</span>
<span class="functiontext">Activities::index_by_number</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="constant">DECIDING_CONCEALED_POSSESS_ACT</span><span class="plain">, 1);</span>
<span class="functiontext">Activities::index_by_number</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="constant">DECIDING_WHETHER_ALL_INC_ACT</span><span class="plain">, 1);</span>
<span class="functiontext">Activities::index_by_number</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="constant">CLARIFYING_PARSERS_CHOICE_ACT</span><span class="plain">, 1);</span>
<span class="functiontext">Activities::index_by_number</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="constant">ASKING_WHICH_DO_YOU_MEAN_ACT</span><span class="plain">, 1);</span>
<span class="functiontext">Activities::index_by_number</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="constant">PRINTING_A_PARSER_ERROR_ACT</span><span class="plain">, 1);</span>
<span class="functiontext">Activities::index_by_number</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="constant">SUPPLYING_A_MISSING_NOUN_ACT</span><span class="plain">, 1);</span>
<span class="functiontext">Activities::index_by_number</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="constant">SUPPLYING_A_MISSING_SECOND_ACT</span><span class="plain">, 1);</span>
<span class="functiontext">Activities::index_by_number</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="constant">IMPLICITLY_TAKING_ACT</span><span class="plain">, 1);</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">This code is used in <a href="#SP23">&#167;23</a>.</p>
<p class="inwebparagraph"><a id="SP23_4"></a><b>&#167;23.4. </b><code class="display">
&lt;<span class="cwebmacrodefn">Index the segment for the main action rulebooks</span> <span class="cwebmacronumber">23.4</span>&gt; =
</code></p>
<pre class="displaydefn">
<span class="identifier">HTML_OPEN</span><span class="plain">(</span><span class="string">"p"</span><span class="plain">); </span><span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"&lt;b&gt;Rules governing actions&lt;/b&gt;"</span><span class="plain">); </span><span class="identifier">HTML_CLOSE</span><span class="plain">(</span><span class="string">"p"</span><span class="plain">);</span>
<span class="identifier">HTML_OPEN</span><span class="plain">(</span><span class="string">"p"</span><span class="plain">);</span>
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"These rules are the ones which tell Inform how actions work, "</span>
<span class="string">"and which affect how they happen in particular cases."</span><span class="plain">);</span>
<span class="identifier">HTML_CLOSE</span><span class="plain">(</span><span class="string">"p"</span><span class="plain">);</span>
<span class="functiontext">Rulebooks::index_rules_box</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="string">"Persuasion"</span><span class="plain">, </span><span class="identifier">EMPTY_WORDING</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"rules_per"</span><span class="plain">,</span>
<span class="identifier">built_in_rulebooks</span><span class="plain">[</span><span class="constant">PERSUASION_RB</span><span class="plain">], </span><span class="identifier">NULL</span><span class="plain">, </span><span class="identifier">NULL</span><span class="plain">, 1, </span><span class="identifier">TRUE</span><span class="plain">);</span>
<span class="functiontext">Rulebooks::index_rules_box</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="string">"Unsuccessful attempt by"</span><span class="plain">, </span><span class="identifier">EMPTY_WORDING</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"rules_fail"</span><span class="plain">,</span>
<span class="identifier">built_in_rulebooks</span><span class="plain">[</span><span class="constant">UNSUCCESSFUL_ATTEMPT_BY_RB</span><span class="plain">], </span><span class="identifier">NULL</span><span class="plain">, </span><span class="identifier">NULL</span><span class="plain">, 1, </span><span class="identifier">TRUE</span><span class="plain">);</span>
<span class="functiontext">Rulebooks::index_rules_box</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="string">"Before"</span><span class="plain">, </span><span class="identifier">EMPTY_WORDING</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"rules_before"</span><span class="plain">,</span>
<span class="identifier">built_in_rulebooks</span><span class="plain">[</span><span class="constant">BEFORE_RB</span><span class="plain">], </span><span class="identifier">NULL</span><span class="plain">, </span><span class="identifier">NULL</span><span class="plain">, 1, </span><span class="identifier">TRUE</span><span class="plain">);</span>
<span class="functiontext">Rulebooks::index_rules_box</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="string">"Instead"</span><span class="plain">, </span><span class="identifier">EMPTY_WORDING</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"rules_instead"</span><span class="plain">,</span>
<span class="identifier">built_in_rulebooks</span><span class="plain">[</span><span class="constant">INSTEAD_RB</span><span class="plain">], </span><span class="identifier">NULL</span><span class="plain">, </span><span class="identifier">NULL</span><span class="plain">, 1, </span><span class="identifier">TRUE</span><span class="plain">);</span>
<span class="functiontext">Rulebooks::index_rules_box</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="string">"Check"</span><span class="plain">, </span><span class="identifier">EMPTY_WORDING</span><span class="plain">, </span><span class="identifier">NULL</span><span class="plain">, </span><span class="identifier">NULL</span><span class="plain">, </span><span class="identifier">NULL</span><span class="plain">,</span>
<span class="string">"Check rules are tied to specific actions, and there are too many "</span>
<span class="string">"to index here. For instance, the check taking rules can only ever "</span>
<span class="string">"affect the taking action, so they are indexed on the detailed index "</span>
<span class="string">"page for taking."</span><span class="plain">, 1, </span><span class="identifier">TRUE</span><span class="plain">);</span>
<span class="functiontext">Rulebooks::index_rules_box</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="string">"Carry out"</span><span class="plain">, </span><span class="identifier">EMPTY_WORDING</span><span class="plain">, </span><span class="identifier">NULL</span><span class="plain">, </span><span class="identifier">NULL</span><span class="plain">, </span><span class="identifier">NULL</span><span class="plain">,</span>
<span class="string">"Carry out rules are tied to specific actions, and there are too many "</span>
<span class="string">"to index here."</span><span class="plain">, 1, </span><span class="identifier">TRUE</span><span class="plain">);</span>
<span class="functiontext">Rulebooks::index_rules_box</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="string">"After"</span><span class="plain">, </span><span class="identifier">EMPTY_WORDING</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"rules_after"</span><span class="plain">,</span>
<span class="identifier">built_in_rulebooks</span><span class="plain">[</span><span class="constant">AFTER_RB</span><span class="plain">], </span><span class="identifier">NULL</span><span class="plain">, </span><span class="identifier">NULL</span><span class="plain">, 1, </span><span class="identifier">TRUE</span><span class="plain">);</span>
<span class="functiontext">Rulebooks::index_rules_box</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="string">"Report"</span><span class="plain">, </span><span class="identifier">EMPTY_WORDING</span><span class="plain">, </span><span class="identifier">NULL</span><span class="plain">, </span><span class="identifier">NULL</span><span class="plain">, </span><span class="identifier">NULL</span><span class="plain">,</span>
<span class="string">"Report rules are tied to specific actions, and there are too many "</span>
<span class="string">"to index here."</span><span class="plain">, 1, </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="#SP23">&#167;23</a>.</p>
<p class="inwebparagraph"><a id="SP23_5"></a><b>&#167;23.5. </b><code class="display">
&lt;<span class="cwebmacrodefn">Index the segment for the action processing rulebooks</span> <span class="cwebmacronumber">23.5</span>&gt; =
</code></p>
<pre class="displaydefn">
<span class="identifier">HTML_OPEN</span><span class="plain">(</span><span class="string">"p"</span><span class="plain">); </span><span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"&lt;b&gt;How actions are processed&lt;/b&gt;"</span><span class="plain">); </span><span class="identifier">HTML_CLOSE</span><span class="plain">(</span><span class="string">"p"</span><span class="plain">);</span>
<span class="identifier">HTML_OPEN</span><span class="plain">(</span><span class="string">"p"</span><span class="plain">); </span><span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"These form the technical machinery for dealing with actions, and are "</span>
<span class="string">"called on at least once every turn. They seldom need to be changed."</span><span class="plain">); </span><span class="identifier">HTML_CLOSE</span><span class="plain">(</span><span class="string">"p"</span><span class="plain">);</span>
<span class="functiontext">Rulebooks::index_rules_box</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="string">"Action-processing rules"</span><span class="plain">, </span><span class="identifier">EMPTY_WORDING</span><span class="plain">, </span><span class="identifier">NULL</span><span class="plain">,</span>
<span class="identifier">built_in_rulebooks</span><span class="plain">[</span><span class="constant">ACTION_PROCESSING_RB</span><span class="plain">], </span><span class="identifier">NULL</span><span class="plain">, </span><span class="identifier">NULL</span><span class="plain">, 1, </span><span class="identifier">TRUE</span><span class="plain">);</span>
<span class="functiontext">Rulebooks::index_rules_box</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="string">"Specific action-processing rules"</span><span class="plain">, </span><span class="identifier">EMPTY_WORDING</span><span class="plain">, </span><span class="identifier">NULL</span><span class="plain">,</span>
<span class="identifier">built_in_rulebooks</span><span class="plain">[</span><span class="constant">SPECIFIC_ACTION_PROCESSING_RB</span><span class="plain">], </span><span class="identifier">NULL</span><span class="plain">, </span><span class="identifier">NULL</span><span class="plain">, 2, </span><span class="identifier">TRUE</span><span class="plain">);</span>
<span class="functiontext">Rulebooks::index_rules_box</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="string">"Player's action awareness rules"</span><span class="plain">, </span><span class="identifier">EMPTY_WORDING</span><span class="plain">, </span><span class="identifier">NULL</span><span class="plain">,</span>
<span class="identifier">built_in_rulebooks</span><span class="plain">[</span><span class="constant">PLAYERS_ACTION_AWARENESS_RB</span><span class="plain">], </span><span class="identifier">NULL</span><span class="plain">, </span><span class="identifier">NULL</span><span class="plain">, 3, </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="#SP23">&#167;23</a>.</p>
<p class="inwebparagraph"><a id="SP23_6"></a><b>&#167;23.6. </b><code class="display">
&lt;<span class="cwebmacrodefn">Index the segment for the responses</span> <span class="cwebmacronumber">23.6</span>&gt; =
</code></p>
<pre class="displaydefn">
<span class="identifier">HTML_OPEN</span><span class="plain">(</span><span class="string">"p"</span><span class="plain">); </span><span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"&lt;b&gt;How responses are printed&lt;/b&gt;"</span><span class="plain">); </span><span class="identifier">HTML_CLOSE</span><span class="plain">(</span><span class="string">"p"</span><span class="plain">);</span>
<span class="identifier">HTML_OPEN</span><span class="plain">(</span><span class="string">"p"</span><span class="plain">); </span><span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"The Standard Rules, and some extensions, reply to the player's "</span>
<span class="string">"commands with messages which are able to be modified."</span><span class="plain">); </span><span class="identifier">HTML_CLOSE</span><span class="plain">(</span><span class="string">"p"</span><span class="plain">);</span>
<span class="functiontext">Activities::index_by_number</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="constant">PRINTING_RESPONSE_ACT</span><span class="plain">, 1);</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">This code is used in <a href="#SP23">&#167;23</a>.</p>
<p class="inwebparagraph"><a id="SP23_7"></a><b>&#167;23.7. </b><code class="display">
&lt;<span class="cwebmacrodefn">Index the segment for the accessibility rulebooks</span> <span class="cwebmacronumber">23.7</span>&gt; =
</code></p>
<pre class="displaydefn">
<span class="identifier">HTML_OPEN</span><span class="plain">(</span><span class="string">"p"</span><span class="plain">); </span><span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"&lt;b&gt;How accessibility is judged&lt;/b&gt;"</span><span class="plain">); </span><span class="identifier">HTML_CLOSE</span><span class="plain">(</span><span class="string">"p"</span><span class="plain">);</span>
<span class="identifier">HTML_OPEN</span><span class="plain">(</span><span class="string">"p"</span><span class="plain">); </span><span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"These rulebooks are used when deciding who can reach what, and "</span>
<span class="string">"who can see what."</span><span class="plain">); </span><span class="identifier">HTML_CLOSE</span><span class="plain">(</span><span class="string">"p"</span><span class="plain">);</span>
<span class="functiontext">Rulebooks::index_rules_box</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="string">"Reaching inside"</span><span class="plain">, </span><span class="identifier">EMPTY_WORDING</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"rules_ri"</span><span class="plain">,</span>
<span class="identifier">built_in_rulebooks</span><span class="plain">[</span><span class="constant">REACHING_INSIDE_RB</span><span class="plain">], </span><span class="identifier">NULL</span><span class="plain">, </span><span class="identifier">NULL</span><span class="plain">, 1, </span><span class="identifier">TRUE</span><span class="plain">);</span>
<span class="functiontext">Rulebooks::index_rules_box</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="string">"Reaching outside"</span><span class="plain">, </span><span class="identifier">EMPTY_WORDING</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"rules_ri"</span><span class="plain">,</span>
<span class="identifier">built_in_rulebooks</span><span class="plain">[</span><span class="constant">REACHING_OUTSIDE_RB</span><span class="plain">], </span><span class="identifier">NULL</span><span class="plain">, </span><span class="identifier">NULL</span><span class="plain">, 1, </span><span class="identifier">TRUE</span><span class="plain">);</span>
<span class="functiontext">Rulebooks::index_rules_box</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="string">"Visibility"</span><span class="plain">, </span><span class="identifier">EMPTY_WORDING</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"visibility"</span><span class="plain">,</span>
<span class="identifier">built_in_rulebooks</span><span class="plain">[</span><span class="constant">VISIBILITY_RB</span><span class="plain">], </span><span class="identifier">NULL</span><span class="plain">, </span><span class="identifier">NULL</span><span class="plain">, 1, </span><span class="identifier">TRUE</span><span class="plain">);</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">This code is used in <a href="#SP23">&#167;23</a>.</p>
<p class="inwebparagraph"><a id="SP23_8"></a><b>&#167;23.8. </b><code class="display">
&lt;<span class="cwebmacrodefn">Index the segment for the light and darkness rulebooks</span> <span class="cwebmacronumber">23.8</span>&gt; =
</code></p>
<pre class="displaydefn">
<span class="identifier">HTML_OPEN</span><span class="plain">(</span><span class="string">"p"</span><span class="plain">); </span><span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"&lt;b&gt;Light and darkness&lt;/b&gt;"</span><span class="plain">); </span><span class="identifier">HTML_CLOSE</span><span class="plain">(</span><span class="string">"p"</span><span class="plain">);</span>
<span class="identifier">HTML_OPEN</span><span class="plain">(</span><span class="string">"p"</span><span class="plain">); </span><span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"These activities control how we describe darkness."</span><span class="plain">); </span><span class="identifier">HTML_CLOSE</span><span class="plain">(</span><span class="string">"p"</span><span class="plain">);</span>
<span class="functiontext">Activities::index_by_number</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="constant">PRINTING_NAME_OF_DARK_ROOM_ACT</span><span class="plain">, 1);</span>
<span class="functiontext">Activities::index_by_number</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="constant">PRINTING_DESC_OF_DARK_ROOM_ACT</span><span class="plain">, 1);</span>
<span class="functiontext">Activities::index_by_number</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="constant">PRINTING_NEWS_OF_DARKNESS_ACT</span><span class="plain">, 1);</span>
<span class="functiontext">Activities::index_by_number</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="constant">PRINTING_NEWS_OF_LIGHT_ACT</span><span class="plain">, 1);</span>
<span class="functiontext">Activities::index_by_number</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="constant">REFUSAL_TO_ACT_IN_DARK_ACT</span><span class="plain">, 1);</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">This code is used in <a href="#SP23">&#167;23</a>.</p>
<p class="inwebparagraph"><a id="SP23_9"></a><b>&#167;23.9. </b><code class="display">
&lt;<span class="cwebmacrodefn">Index the segment for the description rulebooks</span> <span class="cwebmacronumber">23.9</span>&gt; =
</code></p>
<pre class="displaydefn">
<span class="identifier">HTML_OPEN</span><span class="plain">(</span><span class="string">"p"</span><span class="plain">); </span><span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"&lt;b&gt;How things are described&lt;/b&gt;"</span><span class="plain">); </span><span class="identifier">HTML_CLOSE</span><span class="plain">(</span><span class="string">"p"</span><span class="plain">);</span>
<span class="identifier">HTML_OPEN</span><span class="plain">(</span><span class="string">"p"</span><span class="plain">); </span><span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"These activities control what is printed when naming rooms or "</span>
<span class="string">"things, and their descriptions."</span><span class="plain">); </span><span class="identifier">HTML_CLOSE</span><span class="plain">(</span><span class="string">"p"</span><span class="plain">);</span>
<span class="functiontext">Activities::index_by_number</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="constant">PRINTING_THE_NAME_ACT</span><span class="plain">, 1);</span>
<span class="functiontext">Activities::index_by_number</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="constant">PRINTING_THE_PLURAL_NAME_ACT</span><span class="plain">, 1);</span>
<span class="functiontext">Activities::index_by_number</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="constant">PRINTING_A_NUMBER_OF_ACT</span><span class="plain">, 1);</span>
<span class="functiontext">Activities::index_by_number</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="constant">PRINTING_ROOM_DESC_DETAILS_ACT</span><span class="plain">, 1);</span>
<span class="functiontext">Activities::index_by_number</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="constant">PRINTING_INVENTORY_DETAILS_ACT</span><span class="plain">, 1);</span>
<span class="functiontext">Activities::index_by_number</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="constant">LISTING_CONTENTS_ACT</span><span class="plain">, 1);</span>
<span class="functiontext">Activities::index_by_number</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="constant">GROUPING_TOGETHER_ACT</span><span class="plain">, 1);</span>
<span class="functiontext">Activities::index_by_number</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="constant">WRITING_A_PARAGRAPH_ABOUT_ACT</span><span class="plain">, 1);</span>
<span class="functiontext">Activities::index_by_number</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="constant">LISTING_NONDESCRIPT_ITEMS_ACT</span><span class="plain">, 1);</span>
<span class="functiontext">Activities::index_by_number</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="constant">PRINTING_LOCALE_DESCRIPTION_ACT</span><span class="plain">, 1);</span>
<span class="functiontext">Activities::index_by_number</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="constant">CHOOSING_NOTABLE_LOCALE_OBJ_ACT</span><span class="plain">, 1);</span>
<span class="functiontext">Activities::index_by_number</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="constant">PRINTING_LOCALE_PARAGRAPH_ACT</span><span class="plain">, 1);</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">This code is used in <a href="#SP23">&#167;23</a>.</p>
<p class="inwebparagraph"><a id="SP23_10"></a><b>&#167;23.10. </b><code class="display">
&lt;<span class="cwebmacrodefn">Index the segment for new rulebooks and activities</span> <span class="cwebmacronumber">23.10</span>&gt; =
</code></p>
<pre class="displaydefn">
<span class="identifier">HTML_OPEN</span><span class="plain">(</span><span class="string">"p"</span><span class="plain">); </span><span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"&lt;b&gt;From the source text&lt;/b&gt;"</span><span class="plain">); </span><span class="identifier">HTML_CLOSE</span><span class="plain">(</span><span class="string">"p"</span><span class="plain">);</span>
<span class="reserved">extension_file</span><span class="plain"> *</span><span class="identifier">ef</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">; </span> <span class="comment">that is, not in an extension at all</span>
&lt;<span class="cwebmacro">Index rulebooks occurring in this part of the source text</span> <span class="cwebmacronumber">23.10.1</span>&gt;<span class="plain">;</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">This code is used in <a href="#SP23">&#167;23</a>.</p>
<p class="inwebparagraph"><a id="SP23_11"></a><b>&#167;23.11. </b><code class="display">
&lt;<span class="cwebmacrodefn">Index the segment for the rulebooks in this extension</span> <span class="cwebmacronumber">23.11</span>&gt; =
</code></p>
<pre class="displaydefn">
<span class="identifier">HTML_OPEN</span><span class="plain">(</span><span class="string">"p"</span><span class="plain">); </span><span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"&lt;b&gt;From the extension "</span><span class="plain">);</span>
<span class="functiontext">Extensions::IDs::write_to_HTML_file</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="functiontext">Extensions::Files::get_eid</span><span class="plain">(</span><span class="identifier">ef</span><span class="plain">), </span><span class="identifier">FALSE</span><span class="plain">);</span>
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"&lt;/b&gt;"</span><span class="plain">); </span><span class="identifier">HTML_CLOSE</span><span class="plain">(</span><span class="string">"p"</span><span class="plain">);</span>
&lt;<span class="cwebmacro">Index rulebooks occurring in this part of the source text</span> <span class="cwebmacronumber">23.10.1</span>&gt;<span class="plain">;</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">This code is used in <a href="#SP23">&#167;23</a>.</p>
<p class="inwebparagraph"><a id="SP23_10_1"></a><b>&#167;23.10.1. </b><code class="display">
&lt;<span class="cwebmacrodefn">Index rulebooks occurring in this part of the source text</span> <span class="cwebmacronumber">23.10.1</span>&gt; =
</code></p>
<pre class="displaydefn">
<span class="reserved">activity</span><span class="plain"> *</span><span class="identifier">av</span><span class="plain">;</span>
<span class="reserved">rulebook</span><span class="plain"> *</span><span class="identifier">rb</span><span class="plain">;</span>
<span class="identifier">LOOP_OVER</span><span class="plain">(</span><span class="identifier">rb</span><span class="plain">, </span><span class="reserved">rulebook</span><span class="plain">) {</span>
<span class="identifier">source_file</span><span class="plain"> *</span><span class="identifier">sf</span><span class="plain"> = </span><span class="identifier">Lexer::file_of_origin</span><span class="plain">(</span><span class="identifier">Wordings::first_wn</span><span class="plain">(</span><span class="identifier">rb</span><span class="plain">-</span><span class="element">&gt;primary_name</span><span class="plain">));</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">rb</span><span class="plain">-</span><span class="element">&gt;automatically_generated</span><span class="plain">) </span><span class="reserved">continue</span><span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> (((</span><span class="identifier">ef</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">) &amp;&amp; (</span><span class="identifier">sf</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">)) ||</span>
<span class="plain">(</span><span class="functiontext">SourceFiles::get_extension_corresponding</span><span class="plain">(</span><span class="identifier">sf</span><span class="plain">) == </span><span class="identifier">ef</span><span class="plain">))</span>
<span class="functiontext">Rulebooks::index_rules_box</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">rb</span><span class="plain">-</span><span class="element">&gt;primary_name</span><span class="plain">, </span><span class="identifier">NULL</span><span class="plain">, </span><span class="identifier">rb</span><span class="plain">, </span><span class="identifier">NULL</span><span class="plain">, </span><span class="identifier">NULL</span><span class="plain">, 1, </span><span class="identifier">TRUE</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="identifier">LOOP_OVER</span><span class="plain">(</span><span class="identifier">av</span><span class="plain">,</span><span class="reserved"> activity</span><span class="plain">) {</span>
<span class="identifier">source_file</span><span class="plain"> *</span><span class="identifier">sf</span><span class="plain"> = </span><span class="identifier">Lexer::file_of_origin</span><span class="plain">(</span><span class="identifier">Wordings::first_wn</span><span class="plain">(</span><span class="identifier">av</span><span class="plain">-</span><span class="element">&gt;name</span><span class="plain">));</span>
<span class="reserved">if</span><span class="plain"> (((</span><span class="identifier">ef</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">) &amp;&amp; (</span><span class="identifier">sf</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">)) ||</span>
<span class="plain">(</span><span class="functiontext">SourceFiles::get_extension_corresponding</span><span class="plain">(</span><span class="identifier">sf</span><span class="plain">) == </span><span class="identifier">ef</span><span class="plain">))</span>
<span class="functiontext">Activities::index</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="identifier">av</span><span class="plain">, 1);</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">This code is used in <a href="#SP23_10">&#167;23.10</a>, <a href="#SP23_11">&#167;23.11</a>.</p>
<p class="inwebparagraph"><a id="SP24"></a><b>&#167;24. </b></p>
<pre class="display">
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">Rulebooks::noteworthy_rulebooks</span><span class="plain">(</span><span class="reserved">extension_file</span><span class="plain"> *</span><span class="identifier">ef</span><span class="plain">) {</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">nb</span><span class="plain"> = 0;</span>
<span class="reserved">activity</span><span class="plain"> *</span><span class="identifier">av</span><span class="plain">;</span>
<span class="reserved">rulebook</span><span class="plain"> *</span><span class="identifier">rb</span><span class="plain">;</span>
<span class="identifier">LOOP_OVER</span><span class="plain">(</span><span class="identifier">rb</span><span class="plain">, </span><span class="reserved">rulebook</span><span class="plain">) {</span>
<span class="identifier">source_file</span><span class="plain"> *</span><span class="identifier">sf</span><span class="plain"> = </span><span class="identifier">Lexer::file_of_origin</span><span class="plain">(</span><span class="identifier">Wordings::first_wn</span><span class="plain">(</span><span class="identifier">rb</span><span class="plain">-</span><span class="element">&gt;primary_name</span><span class="plain">));</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">rb</span><span class="plain">-</span><span class="element">&gt;automatically_generated</span><span class="plain">) </span><span class="reserved">continue</span><span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> (((</span><span class="identifier">ef</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">) &amp;&amp; (</span><span class="identifier">sf</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">)) ||</span>
<span class="plain">(</span><span class="functiontext">SourceFiles::get_extension_corresponding</span><span class="plain">(</span><span class="identifier">sf</span><span class="plain">) == </span><span class="identifier">ef</span><span class="plain">)) </span><span class="identifier">nb</span><span class="plain">++;</span>
<span class="plain">}</span>
<span class="identifier">LOOP_OVER</span><span class="plain">(</span><span class="identifier">av</span><span class="plain">,</span><span class="reserved"> activity</span><span class="plain">) {</span>
<span class="identifier">source_file</span><span class="plain"> *</span><span class="identifier">sf</span><span class="plain"> = </span><span class="identifier">Lexer::file_of_origin</span><span class="plain">(</span><span class="identifier">Wordings::first_wn</span><span class="plain">(</span><span class="identifier">av</span><span class="plain">-</span><span class="element">&gt;name</span><span class="plain">));</span>
<span class="reserved">if</span><span class="plain"> (((</span><span class="identifier">ef</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">) &amp;&amp; (</span><span class="identifier">sf</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">)) ||</span>
<span class="plain">(</span><span class="functiontext">SourceFiles::get_extension_corresponding</span><span class="plain">(</span><span class="identifier">sf</span><span class="plain">) == </span><span class="identifier">ef</span><span class="plain">)) </span><span class="identifier">nb</span><span class="plain">++;</span>
<span class="plain">}</span>
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">nb</span><span class="plain">;</span>
<span class="plain">}</span>
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Rulebooks::index_scene</span><span class="plain">(</span><span class="identifier">OUTPUT_STREAM</span><span class="plain">) {</span>
<span class="identifier">HTML_OPEN</span><span class="plain">(</span><span class="string">"p"</span><span class="plain">); </span><span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"&lt;b&gt;The scene-changing machinery&lt;/b&gt;"</span><span class="plain">); </span><span class="identifier">HTML_CLOSE</span><span class="plain">(</span><span class="string">"p"</span><span class="plain">);</span>
<span class="functiontext">Rulebooks::index_rules_box</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="string">"Scene changing"</span><span class="plain">, </span><span class="identifier">EMPTY_WORDING</span><span class="plain">, </span><span class="identifier">NULL</span><span class="plain">,</span>
<span class="identifier">built_in_rulebooks</span><span class="plain">[</span><span class="constant">SCENE_CHANGING_RB</span><span class="plain">], </span><span class="identifier">NULL</span><span class="plain">, </span><span class="identifier">NULL</span><span class="plain">, 1, </span><span class="identifier">FALSE</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">unique_xtra_no</span><span class="plain"> = 0;</span>
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Rulebooks::index_rules_box</span><span class="plain">(</span><span class="identifier">OUTPUT_STREAM</span><span class="plain">, </span><span class="reserved">char</span><span class="plain"> *</span><span class="identifier">name</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">text_stream</span><span class="plain"> *</span><span class="identifier">doc_link</span><span class="plain">,</span>
<span class="reserved">rulebook</span><span class="plain"> *</span><span class="identifier">rb</span><span class="plain">,</span><span class="reserved"> activity</span><span class="plain"> *</span><span class="identifier">av</span><span class="plain">, </span><span class="reserved">char</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">indent</span><span class="plain">, </span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">hide_behind_plus</span><span class="plain">) {</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">xtra_no</span><span class="plain"> = 0;</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">rb</span><span class="plain">) </span><span class="identifier">xtra_no</span><span class="plain"> = </span><span class="identifier">rb</span><span class="plain">-&gt;</span><span class="identifier">allocation_id</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">av</span><span class="plain">) </span><span class="identifier">xtra_no</span><span class="plain"> = </span><span class="identifier">NUMBER_CREATED</span><span class="plain">(</span><span class="reserved">rulebook</span><span class="plain">) + </span><span class="identifier">av</span><span class="plain">-&gt;</span><span class="identifier">allocation_id</span><span class="plain">;</span>
<span class="reserved">else</span><span class="plain"> </span><span class="identifier">xtra_no</span><span class="plain"> = </span><span class="identifier">NUMBER_CREATED</span><span class="plain">(</span><span class="reserved">rulebook</span><span class="plain">) + </span><span class="identifier">NUMBER_CREATED</span><span class="reserved">(activity</span><span class="plain">) + </span><span class="identifier">unique_xtra_no</span><span class="plain">++;</span>
<span class="reserved">char</span><span class="plain"> *</span><span class="identifier">col</span><span class="plain"> = </span><span class="string">"e0e0e0"</span><span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">av</span><span class="plain">) </span><span class="identifier">col</span><span class="plain"> = </span><span class="string">"e8e0c0"</span><span class="plain">;</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">n</span><span class="plain"> = 0;</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">rb</span><span class="plain">) </span><span class="identifier">n</span><span class="plain"> = </span><span class="functiontext">Rulebooks::no_rules</span><span class="plain">(</span><span class="identifier">rb</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">av</span><span class="plain">) </span><span class="identifier">n</span><span class="plain"> = </span><span class="functiontext">Activities::no_rules</span><span class="plain">(</span><span class="identifier">av</span><span class="plain">);</span>
<span class="identifier">TEMPORARY_TEXT</span><span class="plain">(</span><span class="identifier">textual_name</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">name</span><span class="plain">) </span><span class="identifier">WRITE_TO</span><span class="plain">(</span><span class="identifier">textual_name</span><span class="plain">, </span><span class="string">"%s"</span><span class="plain">, </span><span class="identifier">name</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">Wordings::nonempty</span><span class="plain">(</span><span class="identifier">W</span><span class="plain">)) </span><span class="identifier">WRITE_TO</span><span class="plain">(</span><span class="identifier">textual_name</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="reserved">else</span><span class="plain"> </span><span class="identifier">WRITE_TO</span><span class="plain">(</span><span class="identifier">textual_name</span><span class="plain">, </span><span class="string">"nameless"</span><span class="plain">);</span>
<span class="identifier">string_position</span><span class="plain"> </span><span class="identifier">start</span><span class="plain"> = </span><span class="identifier">Str::start</span><span class="plain">(</span><span class="identifier">textual_name</span><span class="plain">);</span>
<span class="identifier">Str::put</span><span class="plain">(</span><span class="identifier">start</span><span class="plain">, </span><span class="identifier">Characters::tolower</span><span class="plain">(</span><span class="identifier">Str::get</span><span class="plain">(</span><span class="identifier">start</span><span class="plain">)));</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">hide_behind_plus</span><span class="plain">) {</span>
<span class="identifier">HTMLFiles::open_para</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="identifier">indent</span><span class="plain">+1, </span><span class="string">"tight"</span><span class="plain">);</span>
<span class="identifier">Index::extra_link</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="identifier">xtra_no</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">n</span><span class="plain"> == 0) </span><span class="identifier">HTML::begin_colour</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"808080"</span><span class="plain">);</span>
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"%S"</span><span class="plain">, </span><span class="identifier">textual_name</span><span class="plain">);</span>
&lt;<span class="cwebmacro">Write the titling line of an index rules box</span> <span class="cwebmacronumber">24.1</span>&gt;<span class="plain">;</span>
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">" (%d rule%s)"</span><span class="plain">, </span><span class="identifier">n</span><span class="plain">, (</span><span class="identifier">n</span><span class="plain">==1)?</span><span class="string">""</span><span class="plain">:</span><span class="string">"s"</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">n</span><span class="plain"> == 0) </span><span class="identifier">HTML::end_colour</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">);</span>
<span class="identifier">HTML_CLOSE</span><span class="plain">(</span><span class="string">"p"</span><span class="plain">);</span>
<span class="identifier">Index::extra_div_open</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="identifier">xtra_no</span><span class="plain">, </span><span class="identifier">indent</span><span class="plain">+1, </span><span class="identifier">col</span><span class="plain">);</span>
<span class="plain">} </span><span class="reserved">else</span><span class="plain"> {</span>
<span class="identifier">HTMLFiles::open_para</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="identifier">indent</span><span class="plain">, </span><span class="string">""</span><span class="plain">);</span>
<span class="identifier">HTML::open_coloured_box</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="identifier">col</span><span class="plain">, </span><span class="identifier">ROUND_BOX_TOP</span><span class="plain">+</span><span class="identifier">ROUND_BOX_BOTTOM</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="identifier">HTML::begin_html_table</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">TRUE</span><span class="plain">, 0, 4, 0, 0, 0);</span>
<span class="identifier">HTML::first_html_column</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, 0);</span>
<span class="identifier">HTMLFiles::open_para</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, 1, </span><span class="string">"tight"</span><span class="plain">);</span>
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"&lt;b&gt;%S&lt;/b&gt;"</span><span class="plain">, </span><span class="identifier">textual_name</span><span class="plain">);</span>
&lt;<span class="cwebmacro">Write the titling line of an index rules box</span> <span class="cwebmacronumber">24.1</span>&gt;<span class="plain">;</span>
<span class="identifier">HTML_CLOSE</span><span class="plain">(</span><span class="string">"p"</span><span class="plain">);</span>
<span class="identifier">HTML::next_html_column_right_justified</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, 0);</span>
<span class="identifier">HTMLFiles::open_para</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, 1, </span><span class="string">"tight"</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">av</span><span class="plain">) {</span>
<span class="identifier">TEMPORARY_TEXT</span><span class="plain">(</span><span class="identifier">skeleton</span><span class="plain">);</span>
<span class="identifier">WRITE_TO</span><span class="plain">(</span><span class="identifier">skeleton</span><span class="plain">, </span><span class="string">"Before %S:"</span><span class="plain">, </span><span class="identifier">textual_name</span><span class="plain">);</span>
<span class="identifier">HTML::Javascript::paste_stream</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="identifier">skeleton</span><span class="plain">);</span>
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"&amp;nbsp;&lt;i&gt;b&lt;/i&gt; "</span><span class="plain">);</span>
<span class="identifier">Str::clear</span><span class="plain">(</span><span class="identifier">skeleton</span><span class="plain">);</span>
<span class="identifier">WRITE_TO</span><span class="plain">(</span><span class="identifier">skeleton</span><span class="plain">, </span><span class="string">"Rule for %S:"</span><span class="plain">, </span><span class="identifier">textual_name</span><span class="plain">);</span>
<span class="identifier">HTML::Javascript::paste_stream</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="identifier">skeleton</span><span class="plain">);</span>
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"&amp;nbsp;&lt;i&gt;f&lt;/i&gt; "</span><span class="plain">);</span>
<span class="identifier">Str::clear</span><span class="plain">(</span><span class="identifier">skeleton</span><span class="plain">);</span>
<span class="identifier">WRITE_TO</span><span class="plain">(</span><span class="identifier">skeleton</span><span class="plain">, </span><span class="string">"After %S:"</span><span class="plain">, </span><span class="identifier">textual_name</span><span class="plain">);</span>
<span class="identifier">HTML::Javascript::paste_stream</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="identifier">skeleton</span><span class="plain">);</span>
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"&amp;nbsp;&lt;i&gt;a&lt;/i&gt;"</span><span class="plain">);</span>
<span class="identifier">DISCARD_TEXT</span><span class="plain">(</span><span class="identifier">skeleton</span><span class="plain">);</span>
<span class="plain">} </span><span class="reserved">else</span><span class="plain"> {</span>
<span class="identifier">HTML::Javascript::paste_stream</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="identifier">textual_name</span><span class="plain">);</span>
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"&amp;nbsp;&lt;i&gt;name&lt;/i&gt;"</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="identifier">HTML_CLOSE</span><span class="plain">(</span><span class="string">"p"</span><span class="plain">);</span>
<span class="identifier">DISCARD_TEXT</span><span class="plain">(</span><span class="identifier">textual_name</span><span class="plain">);</span>
<span class="identifier">HTML::end_html_row</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">);</span>
<span class="identifier">HTML::end_html_table</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">rb</span><span class="plain">) &amp;&amp; (</span><span class="functiontext">Rulebooks::is_empty</span><span class="plain">(</span><span class="identifier">rb</span><span class="plain">, </span><span class="functiontext">Rulebooks::no_rule_context</span><span class="plain">())))</span>
<span class="identifier">text</span><span class="plain"> = </span><span class="string">"There are no rules in this rulebook."</span><span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">text</span><span class="plain">) {</span>
<span class="identifier">HTMLFiles::open_para</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, 2, </span><span class="string">"tight"</span><span class="plain">);</span>
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"%s"</span><span class="plain">, </span><span class="identifier">text</span><span class="plain">); </span><span class="identifier">HTML_CLOSE</span><span class="plain">(</span><span class="string">"p"</span><span class="plain">);</span>
<span class="plain">} </span><span class="reserved">else</span><span class="plain"> {</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">rb</span><span class="plain">) {</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">ignore_me</span><span class="plain"> = 0;</span>
<span class="functiontext">Rulebooks::index</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="identifier">rb</span><span class="plain">, </span><span class="string">""</span><span class="plain">, </span><span class="functiontext">Rulebooks::no_rule_context</span><span class="plain">(), &amp;</span><span class="identifier">ignore_me</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">av</span><span class="plain">) </span><span class="functiontext">Activities::index_details</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="identifier">av</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">hide_behind_plus</span><span class="plain">) {</span>
<span class="identifier">Index::extra_div_close</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="identifier">col</span><span class="plain">);</span>
<span class="plain">} </span><span class="reserved">else</span><span class="plain"> {</span>
<span class="identifier">HTML::close_coloured_box</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="identifier">col</span><span class="plain">, </span><span class="identifier">ROUND_BOX_TOP</span><span class="plain">+</span><span class="identifier">ROUND_BOX_BOTTOM</span><span class="plain">);</span>
<span class="identifier">HTML_CLOSE</span><span class="plain">(</span><span class="string">"p"</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">The function Rulebooks::noteworthy_rulebooks is used in <a href="#SP23">&#167;23</a>.</p>
<p class="endnote">The function Rulebooks::index_scene appears nowhere else.</p>
<p class="endnote">The function Rulebooks::index_rules_box is used in <a href="#SP23_1">&#167;23.1</a>, <a href="#SP23_2">&#167;23.2</a>, <a href="#SP23_3">&#167;23.3</a>, <a href="#SP23_4">&#167;23.4</a>, <a href="#SP23_5">&#167;23.5</a>, <a href="#SP23_7">&#167;23.7</a>, <a href="#SP23_10_1">&#167;23.10.1</a>, 21/ac (<a href="21-ac.html#SP9">&#167;9</a>).</p>
<p class="inwebparagraph"><a id="SP24_1"></a><b>&#167;24.1. </b><code class="display">
&lt;<span class="cwebmacrodefn">Write the titling line of an index rules box</span> <span class="cwebmacronumber">24.1</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">doc_link</span><span class="plain">) &gt; 0) </span><span class="identifier">Index::DocReferences::link</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="identifier">doc_link</span><span class="plain">);</span>
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">" ... "</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">av</span><span class="plain">) </span><span class="identifier">WRITE</span><span class="plain">(</span><span class="string">" activity"</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">rb</span><span class="plain">) &amp;&amp; (</span><span class="functiontext">Rulebooks::get_parameter_kind</span><span class="plain">(</span><span class="identifier">rb</span><span class="plain">)) &amp;&amp;</span>
<span class="plain">(</span><span class="identifier">Kinds::Compare::eq</span><span class="plain">(</span><span class="functiontext">Rulebooks::get_parameter_kind</span><span class="plain">(</span><span class="identifier">rb</span><span class="plain">), </span><span class="identifier">K_action_name</span><span class="plain">) == </span><span class="identifier">FALSE</span><span class="plain">)) {</span>
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">" "</span><span class="plain">);</span>
<span class="identifier">Kinds::Textual::write_articled</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="functiontext">Rulebooks::get_parameter_kind</span><span class="plain">(</span><span class="identifier">rb</span><span class="plain">));</span>
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">" based"</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">" rulebook"</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">wn</span><span class="plain"> = -1;</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">rb</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">rb</span><span class="plain">-</span><span class="element">&gt;primary_name</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">av</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">av</span><span class="plain">-</span><span class="element">&gt;name</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">wn</span><span class="plain"> &gt;= 0) </span><span class="identifier">Index::link</span><span class="plain">(</span><span class="identifier">OUT</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="#SP24">&#167;24</a> (twice).</p>
<hr class="tocbar">
<ul class="toc"><li><a href="21-rb.html">Back to 'Rule Bookings'</a></li><li><a href="21-fao.html">Continue with 'Focus and Outcome'</a></li></ul><hr class="tocbar">
<!--End of weave-->
</body>
</html>