1
0
Fork 0
mirror of https://github.com/ganelson/inform.git synced 2024-07-16 22:14:23 +03:00
inform7/docs/imperative-module/2-rlb.html

854 lines
148 KiB
HTML
Raw Normal View History

2019-03-17 14:40:57 +02:00
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
2020-04-14 19:56:54 +03:00
<title>Rulebooks</title>
2020-05-03 03:20:55 +03:00
<link href="../docs-assets/Breadcrumbs.css" rel="stylesheet" rev="stylesheet" type="text/css">
2020-03-19 02:11:25 +02:00
<meta name="viewport" content="width=device-width initial-scale=1">
2019-03-17 14:40:57 +02:00
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<meta http-equiv="Content-Language" content="en-gb">
2020-05-03 03:01:21 +03:00
2020-05-03 03:20:55 +03:00
<link href="../docs-assets/Contents.css" rel="stylesheet" rev="stylesheet" type="text/css">
<link href="../docs-assets/Progress.css" rel="stylesheet" rev="stylesheet" type="text/css">
<link href="../docs-assets/Navigation.css" rel="stylesheet" rev="stylesheet" type="text/css">
<link href="../docs-assets/Fonts.css" rel="stylesheet" rev="stylesheet" type="text/css">
<link href="../docs-assets/Base.css" rel="stylesheet" rev="stylesheet" type="text/css">
2020-05-03 03:01:21 +03:00
<script>
2021-03-21 23:56:46 +02:00
function togglePopup(material_id) {
var popup = document.getElementById(material_id);
popup.classList.toggle("show");
}
</script>
<link href="../docs-assets/Popups.css" rel="stylesheet" rev="stylesheet" type="text/css">
<script>
2020-05-03 03:01:21 +03:00
MathJax = {
tex: {
inlineMath: '$', '$'], ['\\(', '\\)'
},
svg: {
fontCache: 'global'
}
};
</script>
<script type="text/javascript" id="MathJax-script" async
src="https://cdn.jsdelivr.net/npm/mathjax@3/es5/tex-svg.js">
</script>
2020-05-03 03:20:55 +03:00
<link href="../docs-assets/Colours.css" rel="stylesheet" rev="stylesheet" type="text/css">
2020-05-09 01:13:45 +03:00
<link href="../docs-assets/Preform-Colours.css" rel="stylesheet" rev="stylesheet" type="text/css">
2020-04-14 19:56:54 +03:00
2019-03-17 14:40:57 +02:00
</head>
2020-05-03 03:01:21 +03:00
<body class="commentary-font">
2020-03-19 02:11:25 +02:00
<nav role="navigation">
2020-04-14 19:56:54 +03:00
<h1><a href="../index.html">
2020-05-03 18:34:53 +03:00
<img src="../docs-assets/Inform.png" height=72">
2020-04-14 19:56:54 +03:00
</a></h1>
<ul><li><a href="../compiler.html">compiler tools</a></li>
2020-03-19 02:11:25 +02:00
<li><a href="../other.html">other tools</a></li>
<li><a href="../extensions.html">extensions and kits</a></li>
<li><a href="../units.html">unit test tools</a></li>
2020-04-14 19:56:54 +03:00
</ul><h2>Compiler Webs</h2><ul>
2020-03-19 02:11:25 +02:00
<li><a href="../inbuild/index.html">inbuild</a></li>
<li><a href="../inform7/index.html">inform7</a></li>
<li><a href="../inter/index.html">inter</a></li>
2020-04-14 19:56:54 +03:00
</ul><h2>Inbuild Modules</h2><ul>
<li><a href="../supervisor-module/index.html">supervisor</a></li>
</ul><h2>Inform7 Modules</h2><ul>
2020-08-26 12:52:50 +03:00
<li><a href="../core-module/index.html">core</a></li>
<li><a href="../assertions-module/index.html">assertions</a></li>
<li><a href="../values-module/index.html">values</a></li>
2021-02-07 14:44:02 +02:00
<li><a href="../knowledge-module/index.html">knowledge</a></li>
<li><a href="index.html"><span class="selectedlink">imperative</span></a></li>
2020-08-26 12:52:50 +03:00
<li><a href="../runtime-module/index.html">runtime</a></li>
2020-03-19 02:11:25 +02:00
<li><a href="../if-module/index.html">if</a></li>
<li><a href="../multimedia-module/index.html">multimedia</a></li>
<li><a href="../index-module/index.html">index</a></li>
2020-04-14 19:56:54 +03:00
</ul><h2>Inter Modules</h2><ul>
<li><a href="../bytecode-module/index.html">bytecode</a></li>
2020-03-19 02:11:25 +02:00
<li><a href="../building-module/index.html">building</a></li>
<li><a href="../codegen-module/index.html">codegen</a></li>
2020-05-20 02:02:28 +03:00
</ul><h2>Services</h2><ul>
2020-04-14 19:56:54 +03:00
<li><a href="../arch-module/index.html">arch</a></li>
2020-08-20 01:36:18 +03:00
<li><a href="../calculus-module/index.html">calculus</a></li>
2020-04-14 19:56:54 +03:00
<li><a href="../html-module/index.html">html</a></li>
2020-05-20 02:02:28 +03:00
<li><a href="../inflections-module/index.html">inflections</a></li>
2020-08-20 01:36:18 +03:00
<li><a href="../kinds-module/index.html">kinds</a></li>
2020-05-20 02:02:28 +03:00
<li><a href="../linguistics-module/index.html">linguistics</a></li>
<li><a href="../problems-module/index.html">problems</a></li>
2020-08-20 01:36:18 +03:00
<li><a href="../syntax-module/index.html">syntax</a></li>
<li><a href="../words-module/index.html">words</a></li>
2020-03-19 02:11:25 +02:00
<li><a href="../../../inweb/docs/foundation-module/index.html">foundation</a></li>
2020-04-14 19:56:54 +03:00
</ul>
2020-03-19 02:11:25 +02:00
</nav>
<main role="main">
2020-05-03 03:01:21 +03:00
<!--Weave of 'Rulebooks' generated by Inweb-->
<div class="breadcrumbs">
2021-02-07 14:44:02 +02:00
<ul class="crumbs"><li><a href="../index.html">Home</a></li><li><a href="../compiler.html">Inform7</a></li><li><a href="index.html">imperative</a></li><li><a href="index.html#2">Chapter 2: Rules and Rulebooks</a></li><li><b>Rulebooks</b></li></ul></div>
2021-03-21 01:55:57 +02:00
<p class="purpose">Rulebooks collate rules and provide an organised way for them to collaborate on a larger task.</p>
2019-03-17 14:40:57 +02:00
2021-03-21 23:56:46 +02:00
<ul class="toc"><li><a href="2-rlb.html#SP1">&#167;1. Introduction</a></li><li><a href="2-rlb.html#SP7">&#167;7. Access</a></li><li><a href="2-rlb.html#SP8">&#167;8. Logging</a></li><li><a href="2-rlb.html#SP9">&#167;9. Rulebook variables</a></li><li><a href="2-rlb.html#SP11">&#167;11. Attaching and detaching rules</a></li><li><a href="2-rlb.html#SP13">&#167;13. Name parsing of rulebooks</a></li><li><a href="2-rlb.html#SP17">&#167;17. Standard rulebooks</a></li></ul><hr class="tocbar">
<p class="commentary firstcommentary"><a id="SP1" class="paragraph-anchor"></a><b>&#167;1. Introduction. </b>We think of a rulebook as being a list of rules, for which see the code in
<a href="2-bl.html" class="internal">Booking Lists</a>, but it also has a good deal of metadata. Handling that
metadata, and managing the creation of rulebooks, are the tasks here.
</p>
<p class="commentary">The semantics of rulebooks grew from their original mid-00s design of being
simple action-focused sets of game rules (for interactive fiction) to a point
in 2009 where they could essentially perform anything which a function in a
functional programming language such as Haskell could do. Their original
game-based purpose nevertheless still shows through in places, as with the
quaint idea of having enumerated ways in which they finish (see <a href="2-fao.html#SP2" class="internal">outcomes</a>).
2019-03-17 14:40:57 +02:00
</p>
2020-05-03 03:01:21 +03:00
<pre class="displayed-code all-displayed-code code-font">
<span class="reserved-syntax">typedef</span><span class="plain-syntax"> </span><span class="reserved-syntax">struct</span><span class="plain-syntax"> </span><span class="reserved-syntax">rulebook</span><span class="plain-syntax"> {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">struct</span><span class="plain-syntax"> </span><span class="identifier-syntax">wording</span><span class="plain-syntax"> </span><span class="identifier-syntax">primary_name</span><span class="plain-syntax">; </span><span class="comment-syntax"> name in source text</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">struct</span><span class="plain-syntax"> </span><span class="identifier-syntax">wording</span><span class="plain-syntax"> </span><span class="identifier-syntax">alternative_name</span><span class="plain-syntax">; </span><span class="comment-syntax"> alternative form of name</span>
2021-03-21 23:56:46 +02:00
<span class="plain-syntax"> </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">action_stem_length</span><span class="plain-syntax">; </span><span class="comment-syntax"> to do with parsing, but 0 for most rulebooks</span>
2019-03-17 14:40:57 +02:00
2021-03-21 23:56:46 +02:00
<span class="plain-syntax"> </span><span class="reserved-syntax">struct</span><span class="plain-syntax"> </span><span class="reserved-syntax">booking_list</span><span class="plain-syntax"> *</span><span class="identifier-syntax">contents</span><span class="plain-syntax">; </span><span class="comment-syntax"> the actual rules in the rulebook</span>
2019-03-17 14:40:57 +02:00
2021-03-21 23:56:46 +02:00
<span class="plain-syntax"> </span><span class="reserved-syntax">struct</span><span class="plain-syntax"> </span><span class="reserved-syntax">focus</span><span class="plain-syntax"> </span><span class="identifier-syntax">my_focus</span><span class="plain-syntax">; </span><span class="comment-syntax"> what does the rulebook work on?</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">struct</span><span class="plain-syntax"> </span><span class="reserved-syntax">outcomes</span><span class="plain-syntax"> </span><span class="identifier-syntax">my_outcomes</span><span class="plain-syntax">; </span><span class="comment-syntax"> how can it end?</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">automatically_generated</span><span class="plain-syntax">; </span><span class="comment-syntax"> rather than by explicit Inform 7 source text</span>
2020-05-03 03:01:21 +03:00
<span class="plain-syntax"> </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">runs_during_activities</span><span class="plain-syntax">; </span><span class="comment-syntax"> allow "while..." clauses to name these</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">used_by_future_action_activity</span><span class="plain-syntax">; </span><span class="comment-syntax"> like "deciding the scope of something..."</span>
2019-03-17 14:40:57 +02:00
2021-03-21 23:56:46 +02:00
<span class="plain-syntax"> </span><span class="reserved-syntax">struct</span><span class="plain-syntax"> </span><span class="reserved-syntax">stacked_variable_owner</span><span class="plain-syntax"> *</span><span class="identifier-syntax">my_variables</span><span class="plain-syntax">; </span><span class="comment-syntax"> rulebook variables owned here</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">struct</span><span class="plain-syntax"> </span><span class="reserved-syntax">stacked_variable_owner_list</span><span class="plain-syntax"> *</span><span class="identifier-syntax">accessible_variables</span><span class="plain-syntax">; </span><span class="comment-syntax"> and which can be named here</span>
2019-03-17 14:40:57 +02:00
2021-03-21 01:55:57 +02:00
<span class="plain-syntax"> </span><span class="reserved-syntax">struct</span><span class="plain-syntax"> </span><span class="identifier-syntax">rulebook_compilation_data</span><span class="plain-syntax"> </span><span class="identifier-syntax">compilation_data</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">struct</span><span class="plain-syntax"> </span><span class="identifier-syntax">rulebook_indexing_data</span><span class="plain-syntax"> </span><span class="identifier-syntax">indexing_data</span><span class="plain-syntax">;</span>
2020-05-09 15:07:39 +03:00
<span class="plain-syntax"> </span><span class="identifier-syntax">CLASS_DEFINITION</span>
2020-05-03 03:01:21 +03:00
<span class="plain-syntax">} </span><span class="reserved-syntax">rulebook</span><span class="plain-syntax">;</span>
2019-03-17 14:40:57 +02:00
</pre>
2021-03-21 01:55:57 +02:00
<ul class="endnotetexts"><li>The structure rulebook is accessed in 2/rls, 2/fao, 3/pu, 6/cp and here.</li></ul>
2021-03-21 23:56:46 +02:00
<p class="commentary firstcommentary"><a id="SP2" class="paragraph-anchor"></a><b>&#167;2. </b>The following creates one:
2019-03-17 14:40:57 +02:00
</p>
2020-05-03 03:01:21 +03:00
<pre class="displayed-code all-displayed-code code-font">
2021-03-21 23:56:46 +02:00
<span class="reserved-syntax">rulebook</span><span class="plain-syntax"> *</span><span class="function-syntax">Rulebooks::new</span><button class="popup" onclick="togglePopup('usagePopup1')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup1">Usage of <span class="code-font"><span class="function-syntax">Rulebooks::new</span></span>:<br/><a href="2-rlb.html#SP6">&#167;6</a></span></button><span class="plain-syntax">(</span><span class="identifier-syntax">kind</span><span class="plain-syntax"> *</span><span class="identifier-syntax">create_as</span><span class="plain-syntax">, </span><span class="identifier-syntax">wording</span><span class="plain-syntax"> </span><span class="identifier-syntax">W</span><span class="plain-syntax">, </span><span class="identifier-syntax">package_request</span><span class="plain-syntax"> *</span><span class="identifier-syntax">R</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Hierarchy::markup_wording</span><span class="plain-syntax">(</span><span class="identifier-syntax">R</span><span class="plain-syntax">, </span><span class="identifier-syntax">RULEBOOK_NAME_HMD</span><span class="plain-syntax">, </span><span class="identifier-syntax">W</span><span class="plain-syntax">);</span>
2019-03-17 14:40:57 +02:00
2021-03-21 23:56:46 +02:00
<span class="plain-syntax"> </span><span class="reserved-syntax">rulebook</span><span class="plain-syntax"> *</span><span class="identifier-syntax">B</span><span class="plain-syntax"> = </span><span class="identifier-syntax">CREATE</span><span class="plain-syntax">(</span><span class="reserved-syntax">rulebook</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><a href="2-rlb.html#SP18" class="function-link"><span class="function-syntax">Rulebooks::set_std</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">B</span><span class="plain-syntax">);</span>
2019-03-17 14:40:57 +02:00
2021-03-21 23:56:46 +02:00
<span class="plain-syntax"> </span><span class="function-syntax">&lt;new-rulebook-name&gt;</span><span class="plain-syntax">(</span><span class="identifier-syntax">W</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">B</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">primary_name</span><span class="plain-syntax"> = </span><span class="identifier-syntax">GET_RW</span><span class="plain-syntax">(</span><span class="function-syntax">&lt;new-rulebook-name&gt;</span><span class="plain-syntax">, </span><span class="constant-syntax">1</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">B</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">alternative_name</span><span class="plain-syntax"> = </span><span class="identifier-syntax">EMPTY_WORDING</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">B</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">action_stem_length</span><span class="plain-syntax"> = </span><span class="constant-syntax">0</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">B</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">contents</span><span class="plain-syntax"> = </span><a href="2-bl.html#SP4" class="function-link"><span class="function-syntax">BookingLists::new</span></a><span class="plain-syntax">();</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">B</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">automatically_generated</span><span class="plain-syntax"> = </span><span class="identifier-syntax">FALSE</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">B</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">used_by_future_action_activity</span><span class="plain-syntax"> = </span><span class="identifier-syntax">FALSE</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">B</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">runs_during_activities</span><span class="plain-syntax"> = </span><span class="identifier-syntax">FALSE</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="named-paragraph-container code-font"><a href="2-rlb.html#SP2_1" class="named-paragraph-link"><span class="named-paragraph">Work out the focus and outcome</span><span class="named-paragraph-number">2.1</span></a></span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">B</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">my_variables</span><span class="plain-syntax"> = </span><a href="2-sv.html#SP3" class="function-link"><span class="function-syntax">StackedVariables::new_owner</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">B</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">allocation_id</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">B</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">accessible_variables</span><span class="plain-syntax"> = </span><a href="2-sv.html#SP3" class="function-link"><span class="function-syntax">StackedVariables::add_owner_to_list</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">NULL</span><span class="plain-syntax">, </span><span class="identifier-syntax">B</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">my_variables</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">B</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">compilation_data</span><span class="plain-syntax"> = </span><span class="identifier-syntax">RTRules::new_rulebook_compilation_data</span><span class="plain-syntax">(</span><span class="identifier-syntax">B</span><span class="plain-syntax">, </span><span class="identifier-syntax">R</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">B</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">indexing_data</span><span class="plain-syntax"> = </span><span class="identifier-syntax">IXRules::new_rulebook_indexing_data</span><span class="plain-syntax">(</span><span class="identifier-syntax">B</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="named-paragraph-container code-font"><a href="2-rlb.html#SP2_6" class="named-paragraph-link"><span class="named-paragraph">Make proper nouns so that the rulebook can be a constant value</span><span class="named-paragraph-number">2.6</span></a></span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">B</span><span class="plain-syntax">;</span>
<span class="plain-syntax">}</span>
2019-03-17 14:40:57 +02:00
</pre>
2021-03-21 23:56:46 +02:00
<p class="commentary firstcommentary"><a id="SP3" class="paragraph-anchor"></a><b>&#167;3. </b>We must check the supplied (primary) name for sanity:
2019-03-17 14:40:57 +02:00
</p>
2020-05-09 01:13:45 +03:00
<pre class="Preform-displayed-code all-displayed-code code-font">
<span class="Preform-function-syntax">&lt;new-rulebook-name&gt;</span><span class="Preform-plain-syntax"> </span><span class="Preform-reserved-syntax">::=</span>
2021-03-21 23:56:46 +02:00
<span class="Preform-plain-syntax"> </span><span class="Preform-function-syntax">&lt;definite-article&gt;</span><span class="Preform-plain-syntax"> </span><span class="Preform-function-syntax">&lt;new-rulebook-name&gt;</span><span class="Preform-plain-syntax"> </span><span class="Preform-reserved-syntax">|</span><span class="Preform-plain-syntax"> </span><span class="Preform-reserved-syntax">==&gt;</span><span class="Preform-plain-syntax"> { pass 2 }</span>
<span class="Preform-plain-syntax"> </span><span class="Preform-function-syntax">&lt;new-rulebook-name&gt;</span><span class="Preform-plain-syntax"> </span><span class="Preform-constant-syntax">rules/rulebook</span><span class="Preform-plain-syntax"> </span><span class="Preform-reserved-syntax">|</span><span class="Preform-plain-syntax"> </span><span class="Preform-reserved-syntax">==&gt;</span><span class="Preform-plain-syntax"> { pass 1 }</span>
<span class="Preform-plain-syntax"> </span><span class="Preform-constant-syntax">at</span><span class="Preform-plain-syntax"> </span><span class="Preform-constant-syntax">***</span><span class="Preform-plain-syntax"> </span><span class="Preform-reserved-syntax">|</span><span class="Preform-plain-syntax"> </span><span class="Preform-reserved-syntax">==&gt;</span><span class="Preform-plain-syntax"> </span><span class="named-paragraph-container code-font"><a href="2-rlb.html#SP3_1" class="named-paragraph-link"><span class="named-paragraph">Issue PM_RulebookWithAt problem</span><span class="named-paragraph-number">3.1</span></a></span>
<span class="Preform-plain-syntax"> </span><span class="Preform-constant-syntax">to</span><span class="Preform-plain-syntax"> </span><span class="Preform-constant-syntax">***</span><span class="Preform-plain-syntax"> </span><span class="Preform-reserved-syntax">|</span><span class="Preform-plain-syntax"> </span><span class="Preform-reserved-syntax">==&gt;</span><span class="Preform-plain-syntax"> </span><span class="named-paragraph-container code-font"><a href="2-rlb.html#SP3_2" class="named-paragraph-link"><span class="named-paragraph">Issue PM_RulebookWithTo problem</span><span class="named-paragraph-number">3.2</span></a></span>
<span class="Preform-plain-syntax"> </span><span class="Preform-constant-syntax">definition</span><span class="Preform-plain-syntax"> </span><span class="Preform-constant-syntax">***</span><span class="Preform-plain-syntax"> </span><span class="Preform-reserved-syntax">|</span><span class="Preform-plain-syntax"> </span><span class="Preform-reserved-syntax">==&gt;</span><span class="Preform-plain-syntax"> </span><span class="named-paragraph-container code-font"><a href="2-rlb.html#SP3_3" class="named-paragraph-link"><span class="named-paragraph">Issue PM_RulebookWithDefinition problem</span><span class="named-paragraph-number">3.3</span></a></span>
<span class="Preform-plain-syntax"> </span><span class="Preform-reserved-syntax">...</span><span class="Preform-plain-syntax"> </span><span class="Preform-reserved-syntax">==&gt;</span><span class="Preform-plain-syntax"> { -, - }</span>
2019-03-17 14:40:57 +02:00
</pre>
2020-05-17 13:51:27 +03:00
<ul class="endnotetexts"><li>This is <a href="../words-module/4-ap.html" class="internal">Preform grammar</a>, not regular C code.</li></ul>
2021-03-21 23:56:46 +02:00
<p class="commentary firstcommentary"><a id="SP3_1" class="paragraph-anchor"></a><b>&#167;3.1. </b><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">Issue PM_RulebookWithAt problem</span><span class="named-paragraph-number">3.1</span></span><span class="Preform-comment-syntax"> =</span>
2020-05-03 03:01:21 +03:00
</p>
2019-03-17 14:40:57 +02:00
2020-05-03 03:01:21 +03:00
<pre class="displayed-code all-displayed-code code-font">
2020-08-26 12:52:50 +03:00
<span class="plain-syntax"> </span><span class="identifier-syntax">StandardProblems::sentence_problem</span><span class="plain-syntax">(</span><span class="identifier-syntax">Task::syntax_tree</span><span class="plain-syntax">(), </span><span class="identifier-syntax">_p_</span><span class="plain-syntax">(</span><span class="identifier-syntax">PM_RulebookWithAt</span><span class="plain-syntax">),</span>
2020-05-03 03:01:21 +03:00
<span class="plain-syntax"> </span><span class="string-syntax">"this would create a rulebook whose name begins with 'at'"</span><span class="plain-syntax">,</span>
2021-03-21 23:56:46 +02:00
<span class="plain-syntax"> </span><span class="string-syntax">"which is forbidden since it would lead to ambiguities in the way people write "</span>
<span class="plain-syntax"> </span><span class="string-syntax">"rules. A rule beginning with 'At' is one which happens at a given time, whereas "</span>
<span class="plain-syntax"> </span><span class="string-syntax">"a rule belonging to a rulebook starts with the name of that rulebook, so a "</span>
<span class="plain-syntax"> </span><span class="string-syntax">"rulebook named 'at ...' would make such a rule inscrutable."</span><span class="plain-syntax">);</span>
2019-03-17 14:40:57 +02:00
</pre>
2021-03-21 23:56:46 +02:00
<ul class="endnotetexts"><li>This code is used in <a href="2-rlb.html#SP3">&#167;3</a>.</li></ul>
<p class="commentary firstcommentary"><a id="SP3_2" class="paragraph-anchor"></a><b>&#167;3.2. </b><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">Issue PM_RulebookWithTo problem</span><span class="named-paragraph-number">3.2</span></span><span class="comment-syntax"> =</span>
2020-05-03 03:01:21 +03:00
</p>
2019-03-17 14:40:57 +02:00
2020-05-03 03:01:21 +03:00
<pre class="displayed-code all-displayed-code code-font">
2021-03-21 23:56:46 +02:00
<span class="plain-syntax"> </span><span class="identifier-syntax">StandardProblems::sentence_problem</span><span class="plain-syntax">(</span><span class="identifier-syntax">Task::syntax_tree</span><span class="plain-syntax">(), </span><span class="identifier-syntax">_p_</span><span class="plain-syntax">(</span><span class="identifier-syntax">PM_RulebookWithTo</span><span class="plain-syntax">),</span>
<span class="plain-syntax"> </span><span class="string-syntax">"this would create a rulebook whose name begins with 'to'"</span><span class="plain-syntax">,</span>
<span class="plain-syntax"> </span><span class="string-syntax">"which is forbidden since it would lead to ambiguities in the way people write "</span>
<span class="plain-syntax"> </span><span class="string-syntax">"rules. A rule beginning with 'To' is one which defines a phrase, whereas a rule "</span>
<span class="plain-syntax"> </span><span class="string-syntax">"belonging to a rulebook starts with the name of that rulebook, so a rulebook "</span>
<span class="plain-syntax"> </span><span class="string-syntax">"named 'to ...' would make such a rule inscrutable."</span><span class="plain-syntax">);</span>
2019-03-17 14:40:57 +02:00
</pre>
2021-03-21 23:56:46 +02:00
<ul class="endnotetexts"><li>This code is used in <a href="2-rlb.html#SP3">&#167;3</a>.</li></ul>
<p class="commentary firstcommentary"><a id="SP3_3" class="paragraph-anchor"></a><b>&#167;3.3. </b><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">Issue PM_RulebookWithDefinition problem</span><span class="named-paragraph-number">3.3</span></span><span class="comment-syntax"> =</span>
2020-05-03 03:01:21 +03:00
</p>
2019-03-17 14:40:57 +02:00
2020-05-03 03:01:21 +03:00
<pre class="displayed-code all-displayed-code code-font">
2020-08-26 12:52:50 +03:00
<span class="plain-syntax"> </span><span class="identifier-syntax">StandardProblems::sentence_problem</span><span class="plain-syntax">(</span><span class="identifier-syntax">Task::syntax_tree</span><span class="plain-syntax">(), </span><span class="identifier-syntax">_p_</span><span class="plain-syntax">(</span><span class="identifier-syntax">PM_RulebookWithDefinition</span><span class="plain-syntax">),</span>
2020-05-03 03:01:21 +03:00
<span class="plain-syntax"> </span><span class="string-syntax">"this would create a rulebook whose name begins with 'definition'"</span><span class="plain-syntax">,</span>
2021-03-21 23:56:46 +02:00
<span class="plain-syntax"> </span><span class="string-syntax">"which is forbidden since it would lead to ambiguities in the way people write "</span>
<span class="plain-syntax"> </span><span class="string-syntax">"rules. A rule beginning with 'Definition' is one which defines an adjective, "</span>
<span class="plain-syntax"> </span><span class="string-syntax">"whereas a rule belonging to a rulebook starts with the name of that rulebook, so "</span>
<span class="plain-syntax"> </span><span class="string-syntax">"a rulebook named 'to ...' would make such a rule inscrutable."</span><span class="plain-syntax">);</span>
2019-03-17 14:40:57 +02:00
</pre>
2021-03-21 23:56:46 +02:00
<ul class="endnotetexts"><li>This code is used in <a href="2-rlb.html#SP3">&#167;3</a>.</li></ul>
<p class="commentary firstcommentary"><a id="SP2_1" class="paragraph-anchor"></a><b>&#167;2.1. </b><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">Work out the focus and outcome</span><span class="named-paragraph-number">2.1</span></span><span class="comment-syntax"> =</span>
2019-03-17 14:40:57 +02:00
</p>
2020-05-03 03:01:21 +03:00
<pre class="displayed-code all-displayed-code code-font">
<span class="plain-syntax"> </span><span class="identifier-syntax">kind</span><span class="plain-syntax"> *</span><span class="identifier-syntax">parameter_kind</span><span class="plain-syntax"> = </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">kind</span><span class="plain-syntax"> *</span><span class="identifier-syntax">producing_kind</span><span class="plain-syntax"> = </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Kinds::binary_construction_material</span><span class="plain-syntax">(</span><span class="identifier-syntax">create_as</span><span class="plain-syntax">, &amp;</span><span class="identifier-syntax">parameter_kind</span><span class="plain-syntax">, &amp;</span><span class="identifier-syntax">producing_kind</span><span class="plain-syntax">);</span>
2021-03-21 23:56:46 +02:00
<span class="plain-syntax"> </span><a href="2-fao.html#SP11" class="function-link"><span class="function-syntax">Rulebooks::Outcomes::initialise_focus</span></a><span class="plain-syntax">(&amp;(</span><span class="identifier-syntax">B</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">my_focus</span><span class="plain-syntax">), </span><span class="identifier-syntax">parameter_kind</span><span class="plain-syntax">);</span>
2020-05-03 03:01:21 +03:00
<span class="plain-syntax"> </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">def</span><span class="plain-syntax"> = </span><span class="constant-syntax">NO_OUTCOME</span><span class="plain-syntax">;</span>
2021-03-21 23:56:46 +02:00
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">B</span><span class="plain-syntax"> == </span><a href="2-rlb.html#SP18" class="function-link"><span class="function-syntax">Rulebooks::std</span></a><span class="plain-syntax">(</span><span class="constant-syntax">INSTEAD_RB</span><span class="plain-syntax">)) </span><span class="identifier-syntax">def</span><span class="plain-syntax"> = </span><span class="constant-syntax">FAILURE_OUTCOME</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">B</span><span class="plain-syntax"> == </span><a href="2-rlb.html#SP18" class="function-link"><span class="function-syntax">Rulebooks::std</span></a><span class="plain-syntax">(</span><span class="constant-syntax">AFTER_RB</span><span class="plain-syntax">)) </span><span class="identifier-syntax">def</span><span class="plain-syntax"> = </span><span class="constant-syntax">SUCCESS_OUTCOME</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">B</span><span class="plain-syntax"> == </span><a href="2-rlb.html#SP18" class="function-link"><span class="function-syntax">Rulebooks::std</span></a><span class="plain-syntax">(</span><span class="constant-syntax">UNSUCCESSFUL_ATTEMPT_BY_RB</span><span class="plain-syntax">)) </span><span class="identifier-syntax">def</span><span class="plain-syntax"> = </span><span class="constant-syntax">SUCCESS_OUTCOME</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><a href="2-fao.html#SP4" class="function-link"><span class="function-syntax">Rulebooks::Outcomes::initialise_outcomes</span></a><span class="plain-syntax">(&amp;(</span><span class="identifier-syntax">B</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">my_outcomes</span><span class="plain-syntax">), </span><span class="identifier-syntax">producing_kind</span><span class="plain-syntax">, </span><span class="identifier-syntax">def</span><span class="plain-syntax">);</span>
</pre>
<ul class="endnotetexts"><li>This code is used in <a href="2-rlb.html#SP2">&#167;2</a>.</li></ul>
<p class="commentary firstcommentary"><a id="SP2_2" class="paragraph-anchor"></a><b>&#167;2.2. </b>Focus and outcome are roughly the \(X\) and \(Y\) if we think of a rulebook as
being analogous to a function \(X\to Y\).
</p>
2020-05-03 03:01:21 +03:00
2021-03-21 23:56:46 +02:00
<pre class="displayed-code all-displayed-code code-font">
<span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="function-syntax">Rulebooks::focus</span><button class="popup" onclick="togglePopup('usagePopup2')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup2">Usage of <span class="code-font"><span class="function-syntax">Rulebooks::focus</span></span>:<br/>Phrase Usage - <a href="3-pu.html#SP10_3_1_1">&#167;10.3.1.1</a>, <a href="3-pu.html#SP20_1_1">&#167;20.1.1</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">rulebook</span><span class="plain-syntax"> *</span><span class="identifier-syntax">B</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><a href="2-fao.html#SP12" class="function-link"><span class="function-syntax">Rulebooks::Outcomes::get_focus</span></a><span class="plain-syntax">(&amp;(</span><span class="identifier-syntax">B</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">my_focus</span><span class="plain-syntax">));</span>
<span class="plain-syntax">}</span>
2020-05-03 03:01:21 +03:00
2021-03-21 23:56:46 +02:00
<span class="identifier-syntax">kind</span><span class="plain-syntax"> *</span><span class="function-syntax">Rulebooks::get_focus_kind</span><button class="popup" onclick="togglePopup('usagePopup3')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup3">Usage of <span class="code-font"><span class="function-syntax">Rulebooks::get_focus_kind</span></span>:<br/><a href="2-rlb.html#SP2_4">&#167;2.4</a><br/>Phrase Usage - <a href="3-pu.html#SP20_1_1">&#167;20.1.1</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">rulebook</span><span class="plain-syntax"> *</span><span class="identifier-syntax">B</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><a href="2-fao.html#SP12" class="function-link"><span class="function-syntax">Rulebooks::Outcomes::get_focus_parameter_kind</span></a><span class="plain-syntax">(&amp;(</span><span class="identifier-syntax">B</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">my_focus</span><span class="plain-syntax">));</span>
<span class="plain-syntax">}</span>
2020-05-03 03:01:21 +03:00
2021-03-21 23:56:46 +02:00
<span class="identifier-syntax">kind</span><span class="plain-syntax"> *</span><span class="function-syntax">Rulebooks::get_outcome_kind</span><button class="popup" onclick="togglePopup('usagePopup4')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup4">Usage of <span class="code-font"><span class="function-syntax">Rulebooks::get_outcome_kind</span></span>:<br/><a href="2-rlb.html#SP2_3">&#167;2.3</a>, <a href="2-rlb.html#SP2_4">&#167;2.4</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">rulebook</span><span class="plain-syntax"> *</span><span class="identifier-syntax">B</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><a href="2-fao.html#SP4" class="function-link"><span class="function-syntax">Rulebooks::Outcomes::get_outcome_kind</span></a><span class="plain-syntax">(&amp;(</span><span class="identifier-syntax">B</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">my_outcomes</span><span class="plain-syntax">));</span>
2020-05-03 03:01:21 +03:00
<span class="plain-syntax">}</span>
2021-03-21 23:56:46 +02:00
<span class="reserved-syntax">outcomes</span><span class="plain-syntax"> *</span><span class="function-syntax">Rulebooks::get_outcomes</span><button class="popup" onclick="togglePopup('usagePopup5')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup5">Usage of <span class="code-font"><span class="function-syntax">Rulebooks::get_outcomes</span></span>:<br/>Focus and Outcome - <a href="2-fao.html#SP10">&#167;10</a><br/>Phrase Runtime Context Data - <a href="3-prcd.html#SP9_1">&#167;9.1</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">rulebook</span><span class="plain-syntax"> *</span><span class="identifier-syntax">B</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> &amp;(</span><span class="identifier-syntax">B</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">my_outcomes</span><span class="plain-syntax">);</span>
2020-05-03 03:01:21 +03:00
<span class="plain-syntax">}</span>
2021-03-21 23:56:46 +02:00
</pre>
<p class="commentary firstcommentary"><a id="SP2_3" class="paragraph-anchor"></a><b>&#167;2.3. </b>During the period when a phrase from a rule in a rulebook is being compiled,
this rather clumsily finds out its return kind. Ideally we would get rid of
the need for this.
</p>
2020-05-03 03:01:21 +03:00
2021-03-21 23:56:46 +02:00
<pre class="displayed-code all-displayed-code code-font">
<span class="identifier-syntax">kind</span><span class="plain-syntax"> *</span><span class="function-syntax">Rulebooks::kind_from_context</span><button class="popup" onclick="togglePopup('usagePopup6')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup6">Usage of <span class="code-font"><span class="function-syntax">Rulebooks::kind_from_context</span></span>:<br/>Compile Invocations Inline - <a href="6-cii.html#SP3_1_1_4_7_1">&#167;3.1.1.4.7.1</a>, <a href="6-cii.html#SP7">&#167;7</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">void</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">rulebook</span><span class="plain-syntax"> *</span><span class="identifier-syntax">B</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">phrase_being_compiled</span><span class="plain-syntax">)</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">LOOP_OVER</span><span class="plain-syntax">(</span><span class="identifier-syntax">B</span><span class="plain-syntax">, </span><span class="reserved-syntax">rulebook</span><span class="plain-syntax">)</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><a href="2-bl.html#SP7" class="function-link"><span class="function-syntax">BookingLists::contains_ph</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">B</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">contents</span><span class="plain-syntax">, </span><span class="identifier-syntax">phrase_being_compiled</span><span class="plain-syntax">))</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><a href="2-rlb.html#SP2_2" class="function-link"><span class="function-syntax">Rulebooks::get_outcome_kind</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">B</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">;</span>
2020-05-03 03:01:21 +03:00
<span class="plain-syntax">}</span>
2021-03-21 23:56:46 +02:00
</pre>
<p class="commentary firstcommentary"><a id="SP2_4" class="paragraph-anchor"></a><b>&#167;2.4. </b>While focus and outcome are each more involved than just being a kind of
value, we reduce them to that when working out the kind of a rulebook and
of the rules in it:
</p>
2020-05-03 03:01:21 +03:00
2021-03-21 23:56:46 +02:00
<pre class="displayed-code all-displayed-code code-font">
<span class="identifier-syntax">kind</span><span class="plain-syntax"> *</span><span class="function-syntax">Rulebooks::to_kind</span><span class="plain-syntax">(</span><span class="reserved-syntax">rulebook</span><span class="plain-syntax"> *</span><span class="identifier-syntax">B</span><span class="plain-syntax">) {</span>
2020-08-18 00:57:45 +03:00
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">Kinds::binary_con</span><span class="plain-syntax">(</span><span class="identifier-syntax">CON_rulebook</span><span class="plain-syntax">,</span>
2021-03-21 23:56:46 +02:00
<span class="plain-syntax"> </span><a href="2-rlb.html#SP2_2" class="function-link"><span class="function-syntax">Rulebooks::get_focus_kind</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">B</span><span class="plain-syntax">), </span><a href="2-rlb.html#SP2_2" class="function-link"><span class="function-syntax">Rulebooks::get_outcome_kind</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">B</span><span class="plain-syntax">));</span>
2020-05-03 03:01:21 +03:00
<span class="plain-syntax">}</span>
2021-03-21 23:56:46 +02:00
<span class="identifier-syntax">kind</span><span class="plain-syntax"> *</span><span class="function-syntax">Rulebooks::contains_kind</span><button class="popup" onclick="togglePopup('usagePopup7')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup7">Usage of <span class="code-font"><span class="function-syntax">Rulebooks::contains_kind</span></span>:<br/>Rules - <a href="2-rls.html#SP7">&#167;7</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">rulebook</span><span class="plain-syntax"> *</span><span class="identifier-syntax">B</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">Kinds::binary_con</span><span class="plain-syntax">(</span><span class="identifier-syntax">CON_rule</span><span class="plain-syntax">,</span>
<span class="plain-syntax"> </span><a href="2-rlb.html#SP2_2" class="function-link"><span class="function-syntax">Rulebooks::get_focus_kind</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">B</span><span class="plain-syntax">), </span><a href="2-rlb.html#SP2_2" class="function-link"><span class="function-syntax">Rulebooks::get_outcome_kind</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">B</span><span class="plain-syntax">));</span>
2020-05-03 03:01:21 +03:00
<span class="plain-syntax">}</span>
2021-03-21 23:56:46 +02:00
</pre>
<p class="commentary firstcommentary"><a id="SP2_5" class="paragraph-anchor"></a><b>&#167;2.5. </b>Unsurprisingly, the (primary) name for a rulebook becomes a noun which can be
referred to in Inform 7 source text. In fact two alternative forms of this noun
are also created, which are both synonyms for it. Thus if a "coordination"
rulebook is created, it can be referred to as any of "coordination", "coordination rules"
or "coordination rulebook":
</p>
<pre class="Preform-displayed-code all-displayed-code code-font">
<span class="Preform-function-syntax">&lt;rulebook-name-construction&gt;</span><span class="Preform-plain-syntax"> </span><span class="Preform-reserved-syntax">::=</span>
<span class="Preform-plain-syntax"> </span><span class="Preform-reserved-syntax">...</span><span class="Preform-plain-syntax"> </span><span class="Preform-constant-syntax">rules</span><span class="Preform-plain-syntax"> </span><span class="Preform-reserved-syntax">|</span>
<span class="Preform-plain-syntax"> </span><span class="Preform-reserved-syntax">...</span><span class="Preform-plain-syntax"> </span><span class="Preform-constant-syntax">rulebook</span>
</pre>
<ul class="endnotetexts"><li>This is <a href="../words-module/4-ap.html" class="internal">Preform grammar</a>, not regular C code.</li></ul>
<p class="commentary firstcommentary"><a id="SP2_6" class="paragraph-anchor"></a><b>&#167;2.6. </b><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">Make proper nouns so that the rulebook can be a constant value</span><span class="named-paragraph-number">2.6</span></span><span class="Preform-comment-syntax"> =</span>
</p>
2020-05-03 03:01:21 +03:00
2021-03-21 23:56:46 +02:00
<pre class="displayed-code all-displayed-code code-font">
<span class="plain-syntax"> </span><span class="identifier-syntax">Nouns::new_proper_noun</span><span class="plain-syntax">(</span><span class="identifier-syntax">B</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">primary_name</span><span class="plain-syntax">, </span><span class="identifier-syntax">NEUTER_GENDER</span><span class="plain-syntax">, </span><span class="identifier-syntax">ADD_TO_LEXICON_NTOPT</span><span class="plain-syntax">,</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">RULEBOOK_MC</span><span class="plain-syntax">, </span><span class="identifier-syntax">Rvalues::from_rulebook</span><span class="plain-syntax">(</span><span class="identifier-syntax">B</span><span class="plain-syntax">), </span><span class="identifier-syntax">Task::language_of_syntax</span><span class="plain-syntax">());</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">word_assemblage</span><span class="plain-syntax"> </span><span class="identifier-syntax">wa</span><span class="plain-syntax"> =</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">PreformUtilities::merge</span><span class="plain-syntax">(</span><span class="function-syntax">&lt;rulebook-name-construction&gt;</span><span class="plain-syntax">, </span><span class="constant-syntax">0</span><span class="plain-syntax">,</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">WordAssemblages::from_wording</span><span class="plain-syntax">(</span><span class="identifier-syntax">B</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">primary_name</span><span class="plain-syntax">));</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">wording</span><span class="plain-syntax"> </span><span class="identifier-syntax">AW</span><span class="plain-syntax"> = </span><span class="identifier-syntax">WordAssemblages::to_wording</span><span class="plain-syntax">(&amp;</span><span class="identifier-syntax">wa</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Nouns::new_proper_noun</span><span class="plain-syntax">(</span><span class="identifier-syntax">AW</span><span class="plain-syntax">, </span><span class="identifier-syntax">NEUTER_GENDER</span><span class="plain-syntax">, </span><span class="identifier-syntax">ADD_TO_LEXICON_NTOPT</span><span class="plain-syntax">,</span>
2021-03-21 23:56:46 +02:00
<span class="plain-syntax"> </span><span class="identifier-syntax">RULEBOOK_MC</span><span class="plain-syntax">, </span><span class="identifier-syntax">Rvalues::from_rulebook</span><span class="plain-syntax">(</span><span class="identifier-syntax">B</span><span class="plain-syntax">), </span><span class="identifier-syntax">Task::language_of_syntax</span><span class="plain-syntax">());</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">wa</span><span class="plain-syntax"> = </span><span class="identifier-syntax">PreformUtilities::merge</span><span class="plain-syntax">(</span><span class="function-syntax">&lt;rulebook-name-construction&gt;</span><span class="plain-syntax">, </span><span class="constant-syntax">1</span><span class="plain-syntax">,</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">WordAssemblages::from_wording</span><span class="plain-syntax">(</span><span class="identifier-syntax">B</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">primary_name</span><span class="plain-syntax">));</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">AW</span><span class="plain-syntax"> = </span><span class="identifier-syntax">WordAssemblages::to_wording</span><span class="plain-syntax">(&amp;</span><span class="identifier-syntax">wa</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Nouns::new_proper_noun</span><span class="plain-syntax">(</span><span class="identifier-syntax">AW</span><span class="plain-syntax">, </span><span class="identifier-syntax">NEUTER_GENDER</span><span class="plain-syntax">, </span><span class="identifier-syntax">ADD_TO_LEXICON_NTOPT</span><span class="plain-syntax">,</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">RULEBOOK_MC</span><span class="plain-syntax">, </span><span class="identifier-syntax">Rvalues::from_rulebook</span><span class="plain-syntax">(</span><span class="identifier-syntax">B</span><span class="plain-syntax">), </span><span class="identifier-syntax">Task::language_of_syntax</span><span class="plain-syntax">());</span>
</pre>
<ul class="endnotetexts"><li>This code is used in <a href="2-rlb.html#SP2">&#167;2</a>.</li></ul>
<p class="commentary firstcommentary"><a id="SP4" class="paragraph-anchor"></a><b>&#167;4. </b>It can also subsequently be given a further or "alternative" name, and that
too becomes a proper noun, but is not run through &lt;rulebook-name-construction&gt;
to make still further variants. So the rulebook has at most four different
names, one more than cats have.
</p>
2020-05-03 03:01:21 +03:00
2021-03-21 23:56:46 +02:00
<pre class="displayed-code all-displayed-code code-font">
<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">Rulebooks::set_alt_name</span><span class="plain-syntax">(</span><span class="reserved-syntax">rulebook</span><span class="plain-syntax"> *</span><span class="identifier-syntax">B</span><span class="plain-syntax">, </span><span class="identifier-syntax">wording</span><span class="plain-syntax"> </span><span class="identifier-syntax">AW</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">B</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">alternative_name</span><span class="plain-syntax"> = </span><span class="identifier-syntax">AW</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Nouns::new_proper_noun</span><span class="plain-syntax">(</span><span class="identifier-syntax">AW</span><span class="plain-syntax">, </span><span class="identifier-syntax">NEUTER_GENDER</span><span class="plain-syntax">, </span><span class="identifier-syntax">ADD_TO_LEXICON_NTOPT</span><span class="plain-syntax">,</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">RULEBOOK_MC</span><span class="plain-syntax">, </span><span class="identifier-syntax">Rvalues::from_rulebook</span><span class="plain-syntax">(</span><span class="identifier-syntax">B</span><span class="plain-syntax">), </span><span class="identifier-syntax">Task::language_of_syntax</span><span class="plain-syntax">());</span>
2020-05-03 03:01:21 +03:00
<span class="plain-syntax">}</span>
2021-03-21 23:56:46 +02:00
</pre>
<p class="commentary firstcommentary"><a id="SP5" class="paragraph-anchor"></a><b>&#167;5. </b>And these up to four nouns can be matched with the following nonterminal.
</p>
2020-05-03 03:01:21 +03:00
2021-03-21 23:56:46 +02:00
<p class="commentary">The process of noticing rulebook names inside parts of rule names is much
more complex &mdash; see <a href="2-rlb.html#SP16" class="internal">Rulebooks::rb_match_from_description</a> below.
</p>
<pre class="Preform-displayed-code all-displayed-code code-font">
<span class="Preform-function-syntax">&lt;rulebook-name&gt;</span><span class="Preform-plain-syntax"> </span><span class="Preform-constant-syntax">internal</span><span class="Preform-plain-syntax"> </span><span class="Preform-constant-syntax">{</span>
<span class="Preform-plain-syntax"> </span><span class="Preform-identifier-syntax">W</span><span class="Preform-plain-syntax"> = </span><span class="Preform-identifier-syntax">Articles::remove_the</span><span class="Preform-plain-syntax">(</span><span class="Preform-identifier-syntax">W</span><span class="Preform-plain-syntax">);</span>
<span class="Preform-plain-syntax"> </span><span class="Preform-identifier-syntax">parse_node</span><span class="Preform-plain-syntax"> *</span><span class="Preform-identifier-syntax">p</span><span class="Preform-plain-syntax"> = </span><span class="Preform-identifier-syntax">Lexicon::retrieve</span><span class="Preform-plain-syntax">(</span><span class="Preform-identifier-syntax">RULEBOOK_MC</span><span class="Preform-plain-syntax">, </span><span class="Preform-identifier-syntax">W</span><span class="Preform-plain-syntax">);</span>
<span class="Preform-plain-syntax"> </span><span class="Preform-reserved-syntax">if</span><span class="Preform-plain-syntax"> (</span><span class="Preform-identifier-syntax">Rvalues::is_CONSTANT_construction</span><span class="Preform-plain-syntax">(</span><span class="Preform-identifier-syntax">p</span><span class="Preform-plain-syntax">, </span><span class="Preform-identifier-syntax">CON_rulebook</span><span class="Preform-plain-syntax">)) {</span>
<span class="Preform-plain-syntax"> ==&gt; { -, </span><span class="Preform-identifier-syntax">Rvalues::to_rulebook</span><span class="Preform-plain-syntax">(</span><span class="Preform-identifier-syntax">p</span><span class="Preform-plain-syntax">) };</span>
<span class="Preform-plain-syntax"> </span><span class="Preform-reserved-syntax">return</span><span class="Preform-plain-syntax"> </span><span class="Preform-identifier-syntax">TRUE</span><span class="Preform-plain-syntax">;</span>
<span class="Preform-plain-syntax"> }</span>
<span class="Preform-plain-syntax"> ==&gt; { </span><span class="Preform-identifier-syntax">fail</span><span class="Preform-plain-syntax"> </span><span class="Preform-identifier-syntax">nonterminal</span><span class="Preform-plain-syntax"> };</span>
<span class="Preform-plain-syntax">}</span>
2019-03-17 14:40:57 +02:00
</pre>
2021-03-21 23:56:46 +02:00
<ul class="endnotetexts"><li>This is <a href="../words-module/4-ap.html" class="internal">Preform grammar</a>, not regular C code.</li></ul>
<p class="commentary firstcommentary"><a id="SP6" class="paragraph-anchor"></a><b>&#167;6. </b>"Automatic" rulebooks sound fancy, but there's very little going on here.
These are created as a knock-on effect of something else being created: for
example if the source text creates an action, then rulebooks for processing
that action are automatically created, and similarly for activities and scenes.
2019-03-17 14:40:57 +02:00
</p>
2020-05-03 03:01:21 +03:00
<pre class="displayed-code all-displayed-code code-font">
2021-03-21 23:56:46 +02:00
<span class="reserved-syntax">rulebook</span><span class="plain-syntax"> *</span><span class="function-syntax">Rulebooks::new_automatic</span><button class="popup" onclick="togglePopup('usagePopup8')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup8">Usage of <span class="code-font"><span class="function-syntax">Rulebooks::new_automatic</span></span>:<br/>Activities - <a href="2-act.html#SP4">&#167;4</a></span></button><span class="plain-syntax">(</span><span class="identifier-syntax">wording</span><span class="plain-syntax"> </span><span class="identifier-syntax">W</span><span class="plain-syntax">, </span><span class="identifier-syntax">kind</span><span class="plain-syntax"> *</span><span class="identifier-syntax">basis</span><span class="plain-syntax">,</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">default_outcome</span><span class="plain-syntax">, </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">always_test_actor</span><span class="plain-syntax">, </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">ubfaa</span><span class="plain-syntax">, </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">for_activities</span><span class="plain-syntax">,</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">stem_length</span><span class="plain-syntax">, </span><span class="identifier-syntax">package_request</span><span class="plain-syntax"> *</span><span class="identifier-syntax">R</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">rulebook</span><span class="plain-syntax"> *</span><span class="identifier-syntax">B</span><span class="plain-syntax"> = </span><a href="2-rlb.html#SP2" class="function-link"><span class="function-syntax">Rulebooks::new</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">Kinds::binary_con</span><span class="plain-syntax">(</span><span class="identifier-syntax">CON_rulebook</span><span class="plain-syntax">, </span><span class="identifier-syntax">basis</span><span class="plain-syntax">, </span><span class="identifier-syntax">K_void</span><span class="plain-syntax">), </span><span class="identifier-syntax">W</span><span class="plain-syntax">, </span><span class="identifier-syntax">R</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><a href="2-fao.html#SP4" class="function-link"><span class="function-syntax">Rulebooks::Outcomes::set_default_outcome</span></a><span class="plain-syntax">(&amp;(</span><span class="identifier-syntax">B</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">my_outcomes</span><span class="plain-syntax">), </span><span class="identifier-syntax">default_outcome</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><a href="2-fao.html#SP12" class="function-link"><span class="function-syntax">Rulebooks::Outcomes::set_focus_ata</span></a><span class="plain-syntax">(&amp;(</span><span class="identifier-syntax">B</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">my_focus</span><span class="plain-syntax">), </span><span class="identifier-syntax">always_test_actor</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">B</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">automatically_generated</span><span class="plain-syntax"> = </span><span class="identifier-syntax">TRUE</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">B</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">used_by_future_action_activity</span><span class="plain-syntax"> = </span><span class="identifier-syntax">ubfaa</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">B</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">runs_during_activities</span><span class="plain-syntax"> = </span><span class="identifier-syntax">for_activities</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">B</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">action_stem_length</span><span class="plain-syntax"> = </span><span class="identifier-syntax">stem_length</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">B</span><span class="plain-syntax">;</span>
2020-05-03 03:01:21 +03:00
<span class="plain-syntax">}</span>
2021-03-21 23:56:46 +02:00
</pre>
<p class="commentary firstcommentary"><a id="SP7" class="paragraph-anchor"></a><b>&#167;7. Access. </b></p>
2020-05-03 03:01:21 +03:00
2021-03-21 23:56:46 +02:00
<pre class="displayed-code all-displayed-code code-font">
<span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="function-syntax">Rulebooks::used_by_future_actions</span><button class="popup" onclick="togglePopup('usagePopup9')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup9">Usage of <span class="code-font"><span class="function-syntax">Rulebooks::used_by_future_actions</span></span>:<br/>Activities - <a href="2-act.html#SP12">&#167;12</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">rulebook</span><span class="plain-syntax"> *</span><span class="identifier-syntax">B</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">B</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">used_by_future_action_activity</span><span class="plain-syntax">;</span>
2020-05-03 03:01:21 +03:00
<span class="plain-syntax">}</span>
2021-03-21 23:56:46 +02:00
<span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="function-syntax">Rulebooks::requires_specific_action</span><span class="plain-syntax">(</span><span class="reserved-syntax">rulebook</span><span class="plain-syntax"> *</span><span class="identifier-syntax">B</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">B</span><span class="plain-syntax"> == </span><a href="2-rlb.html#SP18" class="function-link"><span class="function-syntax">Rulebooks::std</span></a><span class="plain-syntax">(</span><span class="constant-syntax">CHECK_RB</span><span class="plain-syntax">)) </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">TRUE</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">B</span><span class="plain-syntax"> == </span><a href="2-rlb.html#SP18" class="function-link"><span class="function-syntax">Rulebooks::std</span></a><span class="plain-syntax">(</span><span class="constant-syntax">CARRY_OUT_RB</span><span class="plain-syntax">)) </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">TRUE</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">B</span><span class="plain-syntax"> == </span><a href="2-rlb.html#SP18" class="function-link"><span class="function-syntax">Rulebooks::std</span></a><span class="plain-syntax">(</span><span class="constant-syntax">REPORT_RB</span><span class="plain-syntax">)) </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">TRUE</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">B</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">action_stem_length</span><span class="plain-syntax"> &gt; </span><span class="constant-syntax">0</span><span class="plain-syntax">) </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">TRUE</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">FALSE</span><span class="plain-syntax">;</span>
2020-05-03 03:01:21 +03:00
<span class="plain-syntax">}</span>
2021-03-21 23:56:46 +02:00
<span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="function-syntax">Rulebooks::is_empty</span><button class="popup" onclick="togglePopup('usagePopup10')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup10">Usage of <span class="code-font"><span class="function-syntax">Rulebooks::is_empty</span></span>:<br/>Activities - <a href="2-act.html#SP7">&#167;7</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">rulebook</span><span class="plain-syntax"> *</span><span class="identifier-syntax">B</span><span class="plain-syntax">, </span><span class="reserved-syntax">rule_context</span><span class="plain-syntax"> </span><span class="identifier-syntax">rc</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">B</span><span class="plain-syntax"> == </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">) </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">TRUE</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><a href="2-bl.html#SP7" class="function-link"><span class="function-syntax">BookingLists::is_contextually_empty</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">B</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">contents</span><span class="plain-syntax">, </span><span class="identifier-syntax">rc</span><span class="plain-syntax">);</span>
2020-05-03 03:01:21 +03:00
<span class="plain-syntax">}</span>
2021-03-21 23:56:46 +02:00
<span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="function-syntax">Rulebooks::no_rules</span><button class="popup" onclick="togglePopup('usagePopup11')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup11">Usage of <span class="code-font"><span class="function-syntax">Rulebooks::no_rules</span></span>:<br/>Activities - <a href="2-act.html#SP7">&#167;7</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">rulebook</span><span class="plain-syntax"> *</span><span class="identifier-syntax">B</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">B</span><span class="plain-syntax"> == </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">) </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="constant-syntax">0</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><a href="2-bl.html#SP7" class="function-link"><span class="function-syntax">BookingLists::length</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">B</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">contents</span><span class="plain-syntax">);</span>
2020-05-03 03:01:21 +03:00
<span class="plain-syntax">}</span>
2021-03-21 23:56:46 +02:00
<span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="function-syntax">Rulebooks::rule_in_rulebook</span><span class="plain-syntax">(</span><span class="reserved-syntax">rule</span><span class="plain-syntax"> *</span><span class="identifier-syntax">R</span><span class="plain-syntax">, </span><span class="reserved-syntax">rulebook</span><span class="plain-syntax"> *</span><span class="identifier-syntax">B</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">B</span><span class="plain-syntax"> == </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">) </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">FALSE</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><a href="2-bl.html#SP7" class="function-link"><span class="function-syntax">BookingLists::contains</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">B</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">contents</span><span class="plain-syntax">, </span><span class="identifier-syntax">R</span><span class="plain-syntax">);</span>
2020-05-03 03:01:21 +03:00
<span class="plain-syntax">}</span>
2021-03-21 23:56:46 +02:00
<span class="reserved-syntax">booking</span><span class="plain-syntax"> *</span><span class="function-syntax">Rulebooks::first_booking</span><span class="plain-syntax">(</span><span class="reserved-syntax">rulebook</span><span class="plain-syntax"> *</span><span class="identifier-syntax">B</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">B</span><span class="plain-syntax"> == </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">) </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><a href="2-bl.html#SP7" class="function-link"><span class="function-syntax">BookingLists::first</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">B</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">contents</span><span class="plain-syntax">);</span>
2020-05-03 03:01:21 +03:00
<span class="plain-syntax">}</span>
2021-03-21 23:56:46 +02:00
<span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="function-syntax">Rulebooks::runs_during_activities</span><button class="popup" onclick="togglePopup('usagePopup12')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup12">Usage of <span class="code-font"><span class="function-syntax">Rulebooks::runs_during_activities</span></span>:<br/>Phrase Usage - <a href="3-pu.html#SP10_3_1_1">&#167;10.3.1.1</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">rulebook</span><span class="plain-syntax"> *</span><span class="identifier-syntax">B</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">B</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">runs_during_activities</span><span class="plain-syntax">;</span>
2020-05-03 03:01:21 +03:00
<span class="plain-syntax">}</span>
2019-03-17 14:40:57 +02:00
</pre>
2021-03-21 23:56:46 +02:00
<p class="commentary firstcommentary"><a id="SP8" class="paragraph-anchor"></a><b>&#167;8. Logging. </b>Just to name it, or giving an inventory of the contents.
2019-03-17 14:40:57 +02:00
</p>
2021-03-21 23:56:46 +02:00
<pre class="displayed-code all-displayed-code code-font">
<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">Rulebooks::log_name_only</span><button class="popup" onclick="togglePopup('usagePopup13')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup13">Usage of <span class="code-font"><span class="function-syntax">Rulebooks::log_name_only</span></span>:<br/>Phrase Usage - <a href="3-pu.html#SP16">&#167;16</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">rulebook</span><span class="plain-syntax"> *</span><span class="identifier-syntax">B</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">LOG</span><span class="plain-syntax">(</span><span class="string-syntax">"Rulebook %d (%W)"</span><span class="plain-syntax">, </span><span class="identifier-syntax">B</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">allocation_id</span><span class="plain-syntax">, </span><span class="identifier-syntax">B</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">primary_name</span><span class="plain-syntax">);</span>
<span class="plain-syntax">}</span>
<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">Rulebooks::log</span><span class="plain-syntax">(</span><span class="reserved-syntax">rulebook</span><span class="plain-syntax"> *</span><span class="identifier-syntax">B</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><a href="2-rlb.html#SP8" class="function-link"><span class="function-syntax">Rulebooks::log_name_only</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">B</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">LOG</span><span class="plain-syntax">(</span><span class="string-syntax">": "</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><a href="2-bl.html#SP3" class="function-link"><span class="function-syntax">BookingLists::log</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">B</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">contents</span><span class="plain-syntax">);</span>
<span class="plain-syntax">}</span>
2019-03-17 14:40:57 +02:00
</pre>
2021-03-21 23:56:46 +02:00
<p class="commentary firstcommentary"><a id="SP9" class="paragraph-anchor"></a><b>&#167;9. Rulebook variables. </b>This function is called in response to a sentence like "The consideration rulebook
has a D called W":
2020-05-03 03:01:21 +03:00
</p>
2019-03-17 14:40:57 +02:00
2020-05-03 03:01:21 +03:00
<pre class="displayed-code all-displayed-code code-font">
2021-03-21 23:56:46 +02:00
<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">Rulebooks::add_variable</span><span class="plain-syntax">(</span><span class="reserved-syntax">rulebook</span><span class="plain-syntax"> *</span><span class="identifier-syntax">B</span><span class="plain-syntax">, </span><span class="identifier-syntax">parse_node</span><span class="plain-syntax"> *</span><span class="identifier-syntax">cnode</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="named-paragraph-container code-font"><a href="2-rlb.html#SP9_1" class="named-paragraph-link"><span class="named-paragraph">The variable has to have a name</span><span class="named-paragraph-number">9.1</span></a></span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">wording</span><span class="plain-syntax"> </span><span class="identifier-syntax">D</span><span class="plain-syntax"> = </span><span class="identifier-syntax">Node::get_text</span><span class="plain-syntax">(</span><span class="identifier-syntax">cnode</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">down</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">wording</span><span class="plain-syntax"> </span><span class="identifier-syntax">W</span><span class="plain-syntax"> = </span><span class="identifier-syntax">Node::get_text</span><span class="plain-syntax">(</span><span class="identifier-syntax">cnode</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">down</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">next</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="named-paragraph-container code-font"><a href="2-rlb.html#SP9_2" class="named-paragraph-link"><span class="named-paragraph">The variable name must be fortunate</span><span class="named-paragraph-number">9.2</span></a></span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">parse_node</span><span class="plain-syntax"> *</span><span class="identifier-syntax">spec</span><span class="plain-syntax"> = </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="function-syntax">&lt;s-type-expression&gt;</span><span class="plain-syntax">(</span><span class="identifier-syntax">D</span><span class="plain-syntax">)) </span><span class="identifier-syntax">spec</span><span class="plain-syntax"> = </span><span class="function-syntax">&lt;&lt;rp&gt;&gt;</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="named-paragraph-container code-font"><a href="2-rlb.html#SP9_3" class="named-paragraph-link"><span class="named-paragraph">Its description cannot be qualified</span><span class="named-paragraph-number">9.3</span></a></span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="named-paragraph-container code-font"><a href="2-rlb.html#SP9_4" class="named-paragraph-link"><span class="named-paragraph">Its description cannot be a constant name</span><span class="named-paragraph-number">9.4</span></a></span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">kind</span><span class="plain-syntax"> *</span><span class="identifier-syntax">K</span><span class="plain-syntax"> = </span><span class="identifier-syntax">Specifications::to_kind</span><span class="plain-syntax">(</span><span class="identifier-syntax">spec</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="named-paragraph-container code-font"><a href="2-rlb.html#SP9_5" class="named-paragraph-link"><span class="named-paragraph">In fact, its description has to be a kind</span><span class="named-paragraph-number">9.5</span></a></span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="named-paragraph-container code-font"><a href="2-rlb.html#SP9_6" class="named-paragraph-link"><span class="named-paragraph">And a definite one at that</span><span class="named-paragraph-number">9.6</span></a></span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><a href="2-sv.html#SP3" class="function-link"><span class="function-syntax">StackedVariables::add_empty</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">B</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">my_variables</span><span class="plain-syntax">, </span><span class="identifier-syntax">W</span><span class="plain-syntax">, </span><span class="identifier-syntax">K</span><span class="plain-syntax">);</span>
<span class="plain-syntax">}</span>
</pre>
<p class="commentary firstcommentary"><a id="SP9_1" class="paragraph-anchor"></a><b>&#167;9.1. </b><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">The variable has to have a name</span><span class="named-paragraph-number">9.1</span></span><span class="comment-syntax"> =</span>
</p>
2020-05-03 03:01:21 +03:00
<pre class="displayed-code all-displayed-code code-font">
2020-08-26 12:52:50 +03:00
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">Node::get_type</span><span class="plain-syntax">(</span><span class="identifier-syntax">cnode</span><span class="plain-syntax">) != </span><span class="identifier-syntax">PROPERTYCALLED_NT</span><span class="plain-syntax">) {</span>
2020-05-03 03:01:21 +03:00
<span class="plain-syntax"> </span><span class="identifier-syntax">Problems::quote_source</span><span class="plain-syntax">(1, </span><span class="identifier-syntax">current_sentence</span><span class="plain-syntax">);</span>
2021-03-21 23:56:46 +02:00
<span class="plain-syntax"> </span><span class="identifier-syntax">StandardProblems::handmade_problem</span><span class="plain-syntax">(</span><span class="identifier-syntax">Task::syntax_tree</span><span class="plain-syntax">(),</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">_p_</span><span class="plain-syntax">(</span><span class="identifier-syntax">PM_RulebookVarUncalled</span><span class="plain-syntax">));</span>
2020-05-03 03:01:21 +03:00
<span class="plain-syntax"> </span><span class="identifier-syntax">Problems::issue_problem_segment</span><span class="plain-syntax">(</span>
2021-03-21 23:56:46 +02:00
<span class="plain-syntax"> </span><span class="string-syntax">"You wrote %1, which I am reading as a request to make a new named variable "</span>
<span class="plain-syntax"> </span><span class="string-syntax">"for an rulebook - a value associated with a action and which has a name. "</span>
<span class="plain-syntax"> </span><span class="string-syntax">"But since you only give a kind, not a name, I'm stuck. ('The every turn "</span>
<span class="plain-syntax"> </span><span class="string-syntax">"rulebook has a number called importance' is right, 'The every turn rulebook "</span>
<span class="plain-syntax"> </span><span class="string-syntax">"has a number' is too vague.)"</span><span class="plain-syntax">);</span>
2020-05-03 03:01:21 +03:00
<span class="plain-syntax"> </span><span class="identifier-syntax">Problems::issue_problem_end</span><span class="plain-syntax">();</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> }</span>
2021-03-21 23:56:46 +02:00
</pre>
<ul class="endnotetexts"><li>This code is used in <a href="2-rlb.html#SP9">&#167;9</a>.</li></ul>
<p class="commentary firstcommentary"><a id="SP9_2" class="paragraph-anchor"></a><b>&#167;9.2. </b><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">The variable name must be fortunate</span><span class="named-paragraph-number">9.2</span></span><span class="comment-syntax"> =</span>
</p>
2020-05-03 03:01:21 +03:00
2021-03-21 23:56:46 +02:00
<pre class="displayed-code all-displayed-code code-font">
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="function-syntax">&lt;unfortunate-name&gt;</span><span class="plain-syntax">(</span><span class="identifier-syntax">W</span><span class="plain-syntax">)) {</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Problems::quote_source</span><span class="plain-syntax">(1, </span><span class="identifier-syntax">current_sentence</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Problems::quote_wording</span><span class="plain-syntax">(2, </span><span class="identifier-syntax">W</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">StandardProblems::handmade_problem</span><span class="plain-syntax">(</span><span class="identifier-syntax">Task::syntax_tree</span><span class="plain-syntax">(),</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">_p_</span><span class="plain-syntax">(</span><span class="identifier-syntax">PM_RulebookVariableAnd</span><span class="plain-syntax">));</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Problems::issue_problem_segment</span><span class="plain-syntax">(</span>
<span class="plain-syntax"> </span><span class="string-syntax">"You wrote %1, which I am reading as a request to make a new named variable "</span>
<span class="plain-syntax"> </span><span class="string-syntax">"for a rulebook - a value associated with a rulebook and which has a name. "</span>
<span class="plain-syntax"> </span><span class="string-syntax">"The request seems to say that the name in question is '%2', but I'd prefer "</span>
<span class="plain-syntax"> </span><span class="string-syntax">"to avoid 'and', 'or', 'with', or 'having' in such names, please."</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Problems::issue_problem_end</span><span class="plain-syntax">();</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax">;</span>
2020-05-03 03:01:21 +03:00
<span class="plain-syntax"> }</span>
2021-03-21 23:56:46 +02:00
</pre>
<ul class="endnotetexts"><li>This code is used in <a href="2-rlb.html#SP9">&#167;9</a>.</li></ul>
<p class="commentary firstcommentary"><a id="SP9_3" class="paragraph-anchor"></a><b>&#167;9.3. </b><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">Its description cannot be qualified</span><span class="named-paragraph-number">9.3</span></span><span class="comment-syntax"> =</span>
</p>
2020-05-03 03:01:21 +03:00
2021-03-21 23:56:46 +02:00
<pre class="displayed-code all-displayed-code code-font">
2020-08-26 12:52:50 +03:00
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> ((</span><span class="identifier-syntax">Specifications::is_description</span><span class="plain-syntax">(</span><span class="identifier-syntax">spec</span><span class="plain-syntax">)) &amp;&amp;</span>
<span class="plain-syntax"> (</span><span class="identifier-syntax">Descriptions::is_qualified</span><span class="plain-syntax">(</span><span class="identifier-syntax">spec</span><span class="plain-syntax">))) {</span>
2020-05-03 03:01:21 +03:00
<span class="plain-syntax"> </span><span class="identifier-syntax">Problems::quote_source</span><span class="plain-syntax">(1, </span><span class="identifier-syntax">current_sentence</span><span class="plain-syntax">);</span>
2021-03-21 23:56:46 +02:00
<span class="plain-syntax"> </span><span class="identifier-syntax">Problems::quote_wording</span><span class="plain-syntax">(2, </span><span class="identifier-syntax">D</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">StandardProblems::handmade_problem</span><span class="plain-syntax">(</span><span class="identifier-syntax">Task::syntax_tree</span><span class="plain-syntax">(),</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">_p_</span><span class="plain-syntax">(</span><span class="identifier-syntax">PM_RulebookVariableTooSpecific</span><span class="plain-syntax">));</span>
2020-05-03 03:01:21 +03:00
<span class="plain-syntax"> </span><span class="identifier-syntax">Problems::issue_problem_segment</span><span class="plain-syntax">(</span>
2021-03-21 23:56:46 +02:00
<span class="plain-syntax"> </span><span class="string-syntax">"You wrote %1, which I am reading as a request to make a new named variable "</span>
<span class="plain-syntax"> </span><span class="string-syntax">"for a rulebook - a value associated with a rulebook and which has a name. "</span>
<span class="plain-syntax"> </span><span class="string-syntax">"The request seems to say that the value in question is '%2', but this is "</span>
<span class="plain-syntax"> </span><span class="string-syntax">"too specific a description. (Instead, a kind of value (such as 'number') or "</span>
<span class="plain-syntax"> </span><span class="string-syntax">"a kind of object (such as 'room' or 'thing') should be given. To get a "</span>
<span class="plain-syntax"> </span><span class="string-syntax">"property whose contents can be any kind of object, use 'object'.)"</span><span class="plain-syntax">);</span>
2020-05-03 03:01:21 +03:00
<span class="plain-syntax"> </span><span class="identifier-syntax">Problems::issue_problem_end</span><span class="plain-syntax">();</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> }</span>
2021-03-21 23:56:46 +02:00
</pre>
<ul class="endnotetexts"><li>This code is used in <a href="2-rlb.html#SP9">&#167;9</a>.</li></ul>
<p class="commentary firstcommentary"><a id="SP9_4" class="paragraph-anchor"></a><b>&#167;9.4. </b><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">Its description cannot be a constant name</span><span class="named-paragraph-number">9.4</span></span><span class="comment-syntax"> =</span>
</p>
<pre class="displayed-code all-displayed-code code-font">
2020-08-26 12:52:50 +03:00
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">Node::is</span><span class="plain-syntax">(</span><span class="identifier-syntax">spec</span><span class="plain-syntax">, </span><span class="identifier-syntax">CONSTANT_NT</span><span class="plain-syntax">)) {</span>
2020-05-03 03:01:21 +03:00
<span class="plain-syntax"> </span><span class="identifier-syntax">Problems::quote_source</span><span class="plain-syntax">(1, </span><span class="identifier-syntax">current_sentence</span><span class="plain-syntax">);</span>
2021-03-21 23:56:46 +02:00
<span class="plain-syntax"> </span><span class="identifier-syntax">Problems::quote_wording</span><span class="plain-syntax">(2, </span><span class="identifier-syntax">D</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">StandardProblems::handmade_problem</span><span class="plain-syntax">(</span><span class="identifier-syntax">Task::syntax_tree</span><span class="plain-syntax">(),</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">_p_</span><span class="plain-syntax">(</span><span class="identifier-syntax">PM_RulebookVariableBadKind</span><span class="plain-syntax">));</span>
2020-05-03 03:01:21 +03:00
<span class="plain-syntax"> </span><span class="identifier-syntax">Problems::issue_problem_segment</span><span class="plain-syntax">(</span>
2021-03-21 23:56:46 +02:00
<span class="plain-syntax"> </span><span class="string-syntax">"You wrote %1, but '%2' is not the name of a kind of value which I know "</span>
<span class="plain-syntax"> </span><span class="string-syntax">"(such as 'number' or 'text')."</span><span class="plain-syntax">);</span>
2020-05-03 03:01:21 +03:00
<span class="plain-syntax"> </span><span class="identifier-syntax">Problems::issue_problem_end</span><span class="plain-syntax">();</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> }</span>
2021-03-21 23:56:46 +02:00
</pre>
<ul class="endnotetexts"><li>This code is used in <a href="2-rlb.html#SP9">&#167;9</a>.</li></ul>
<p class="commentary firstcommentary"><a id="SP9_5" class="paragraph-anchor"></a><b>&#167;9.5. </b><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">In fact, its description has to be a kind</span><span class="named-paragraph-number">9.5</span></span><span class="comment-syntax"> =</span>
</p>
2020-05-03 03:01:21 +03:00
2021-03-21 23:56:46 +02:00
<pre class="displayed-code all-displayed-code code-font">
2020-05-03 03:01:21 +03:00
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">K</span><span class="plain-syntax"> == </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Problems::quote_source</span><span class="plain-syntax">(1, </span><span class="identifier-syntax">current_sentence</span><span class="plain-syntax">);</span>
2021-03-21 23:56:46 +02:00
<span class="plain-syntax"> </span><span class="identifier-syntax">Problems::quote_wording</span><span class="plain-syntax">(2, </span><span class="identifier-syntax">D</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">StandardProblems::handmade_problem</span><span class="plain-syntax">(</span><span class="identifier-syntax">Task::syntax_tree</span><span class="plain-syntax">(),</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">_p_</span><span class="plain-syntax">(</span><span class="identifier-syntax">PM_RulebookVariableKindless</span><span class="plain-syntax">));</span>
2020-05-03 03:01:21 +03:00
<span class="plain-syntax"> </span><span class="identifier-syntax">Problems::issue_problem_segment</span><span class="plain-syntax">(</span>
2021-03-21 23:56:46 +02:00
<span class="plain-syntax"> </span><span class="string-syntax">"You wrote %1, but I was expecting to see a kind of value there, and '%2' "</span>
<span class="plain-syntax"> </span><span class="string-syntax">"isn't something I recognise as a kind."</span><span class="plain-syntax">);</span>
2020-05-03 03:01:21 +03:00
<span class="plain-syntax"> </span><span class="identifier-syntax">Problems::issue_problem_end</span><span class="plain-syntax">();</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> }</span>
2021-03-21 23:56:46 +02:00
</pre>
<ul class="endnotetexts"><li>This code is used in <a href="2-rlb.html#SP9">&#167;9</a>.</li></ul>
<p class="commentary firstcommentary"><a id="SP9_6" class="paragraph-anchor"></a><b>&#167;9.6. </b><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">And a definite one at that</span><span class="named-paragraph-number">9.6</span></span><span class="comment-syntax"> =</span>
</p>
2020-05-03 03:01:21 +03:00
2021-03-21 23:56:46 +02:00
<pre class="displayed-code all-displayed-code code-font">
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">Kinds::Behaviour::definite</span><span class="plain-syntax">(</span><span class="identifier-syntax">K</span><span class="plain-syntax">) == </span><span class="identifier-syntax">FALSE</span><span class="plain-syntax">) {</span>
2020-05-03 03:01:21 +03:00
<span class="plain-syntax"> </span><span class="identifier-syntax">Problems::quote_source</span><span class="plain-syntax">(1, </span><span class="identifier-syntax">current_sentence</span><span class="plain-syntax">);</span>
2021-03-21 23:56:46 +02:00
<span class="plain-syntax"> </span><span class="identifier-syntax">Problems::quote_wording</span><span class="plain-syntax">(2, </span><span class="identifier-syntax">D</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">StandardProblems::handmade_problem</span><span class="plain-syntax">(</span><span class="identifier-syntax">Task::syntax_tree</span><span class="plain-syntax">(),</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">_p_</span><span class="plain-syntax">(</span><span class="identifier-syntax">PM_RulebookVariableVague</span><span class="plain-syntax">));</span>
2020-05-03 03:01:21 +03:00
<span class="plain-syntax"> </span><span class="identifier-syntax">Problems::issue_problem_segment</span><span class="plain-syntax">(</span>
2021-03-21 23:56:46 +02:00
<span class="plain-syntax"> </span><span class="string-syntax">"You wrote %1, but saying that a variable is something as vague as this does "</span>
<span class="plain-syntax"> </span><span class="string-syntax">"not give me a clear enough idea what it will hold. You need to say what kind "</span>
<span class="plain-syntax"> </span><span class="string-syntax">"of value: for instance, 'A door has a number called street address.' is "</span>
<span class="plain-syntax"> </span><span class="string-syntax">"allowed because 'number' is specific about the kind of value."</span><span class="plain-syntax">);</span>
2020-05-03 03:01:21 +03:00
<span class="plain-syntax"> </span><span class="identifier-syntax">Problems::issue_problem_end</span><span class="plain-syntax">();</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> }</span>
2021-03-21 23:56:46 +02:00
</pre>
<ul class="endnotetexts"><li>This code is used in <a href="2-rlb.html#SP9">&#167;9</a>.</li></ul>
<p class="commentary firstcommentary"><a id="SP10" class="paragraph-anchor"></a><b>&#167;10. </b>Rulebooks can also be given access to other sets of variables which are
defined somewhere else &mdash; but they still don't belong to <span class="extract"><span class="extract-syntax">B</span></span>, so they do not
go into <span class="extract"><span class="extract-syntax">B-&gt;my_variables</span></span>.
</p>
2020-05-03 03:01:21 +03:00
2021-03-21 23:56:46 +02:00
<pre class="displayed-code all-displayed-code code-font">
<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">Rulebooks::grant_access_to_variables</span><button class="popup" onclick="togglePopup('usagePopup14')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup14">Usage of <span class="code-font"><span class="function-syntax">Rulebooks::grant_access_to_variables</span></span>:<br/>Activities - <a href="2-act.html#SP4">&#167;4</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">rulebook</span><span class="plain-syntax"> *</span><span class="identifier-syntax">B</span><span class="plain-syntax">, </span><span class="reserved-syntax">stacked_variable_owner</span><span class="plain-syntax"> *</span><span class="identifier-syntax">set</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">B</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">accessible_variables</span><span class="plain-syntax"> =</span>
<span class="plain-syntax"> </span><a href="2-sv.html#SP3" class="function-link"><span class="function-syntax">StackedVariables::add_owner_to_list</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">B</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">accessible_variables</span><span class="plain-syntax">, </span><span class="identifier-syntax">set</span><span class="plain-syntax">);</span>
2020-05-03 03:01:21 +03:00
<span class="plain-syntax">}</span>
2019-03-17 14:40:57 +02:00
</pre>
2021-03-21 23:56:46 +02:00
<p class="commentary firstcommentary"><a id="SP11" class="paragraph-anchor"></a><b>&#167;11. Attaching and detaching rules. </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>
2020-05-03 03:01:21 +03:00
<pre class="displayed-code all-displayed-code code-font">
2021-03-21 23:56:46 +02:00
<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">Rulebooks::attach_rule</span><button class="popup" onclick="togglePopup('usagePopup15')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup15">Usage of <span class="code-font"><span class="function-syntax">Rulebooks::attach_rule</span></span>:<br/>Rule Bookings - <a href="2-rb.html#SP6">&#167;6</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">rulebook</span><span class="plain-syntax"> *</span><span class="identifier-syntax">B</span><span class="plain-syntax">, </span><span class="reserved-syntax">booking</span><span class="plain-syntax"> *</span><span class="identifier-syntax">br</span><span class="plain-syntax">,</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">placing</span><span class="plain-syntax">, </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">side</span><span class="plain-syntax">, </span><span class="reserved-syntax">rule</span><span class="plain-syntax"> *</span><span class="identifier-syntax">ref_rule</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">LOGIF</span><span class="plain-syntax">(</span><span class="identifier-syntax">RULE_ATTACHMENTS</span><span class="plain-syntax">, </span><span class="string-syntax">"Attaching booking $b to rulebook $K"</span><span class="plain-syntax">, </span><span class="identifier-syntax">br</span><span class="plain-syntax">, </span><span class="identifier-syntax">B</span><span class="plain-syntax">);</span>
2020-05-03 03:01:21 +03:00
2021-03-21 23:56:46 +02:00
<span class="plain-syntax"> </span><span class="reserved-syntax">rule</span><span class="plain-syntax"> *</span><span class="identifier-syntax">R</span><span class="plain-syntax"> = </span><a href="2-rb.html#SP4" class="function-link"><span class="function-syntax">RuleBookings::get_rule</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">br</span><span class="plain-syntax">);</span>
2020-05-03 03:01:21 +03:00
2021-03-21 23:56:46 +02:00
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> ((</span><span class="identifier-syntax">R</span><span class="plain-syntax"> == </span><span class="identifier-syntax">ref_rule</span><span class="plain-syntax">) &amp;&amp; (</span><span class="identifier-syntax">side</span><span class="plain-syntax"> != </span><span class="constant-syntax">INSTEAD_SIDE</span><span class="plain-syntax">)) {</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">StandardProblems::sentence_problem</span><span class="plain-syntax">(</span><span class="identifier-syntax">Task::syntax_tree</span><span class="plain-syntax">(),</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">_p_</span><span class="plain-syntax">(</span><span class="identifier-syntax">PM_BeforeOrAfterSelf</span><span class="plain-syntax">),</span>
<span class="plain-syntax"> </span><span class="string-syntax">"a rule can't be before or after itself"</span><span class="plain-syntax">,</span>
<span class="plain-syntax"> </span><span class="string-syntax">"so this makes no sense to me."</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> }</span>
2020-05-03 03:01:21 +03:00
2021-03-21 23:56:46 +02:00
<span class="plain-syntax"> </span><span class="identifier-syntax">PluginCalls::rule_placement_notify</span><span class="plain-syntax">(</span><span class="identifier-syntax">R</span><span class="plain-syntax">, </span><span class="identifier-syntax">B</span><span class="plain-syntax">, </span><span class="identifier-syntax">side</span><span class="plain-syntax">, </span><span class="identifier-syntax">ref_rule</span><span class="plain-syntax">);</span>
2020-05-03 03:01:21 +03:00
2021-03-21 23:56:46 +02:00
<span class="plain-syntax"> </span><a href="2-rls.html#SP10" class="function-link"><span class="function-syntax">Rules::put_variables_in_scope</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">R</span><span class="plain-syntax">, </span><span class="identifier-syntax">B</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">accessible_variables</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">side</span><span class="plain-syntax"> == </span><span class="constant-syntax">INSTEAD_SIDE</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">LOGIF</span><span class="plain-syntax">(</span><span class="identifier-syntax">RULE_ATTACHMENTS</span><span class="plain-syntax">,</span>
<span class="plain-syntax"> </span><span class="string-syntax">"Copying former rulebook's variable permissions to displaced rule\n"</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><a href="2-rls.html#SP10" class="function-link"><span class="function-syntax">Rules::put_variables_in_scope</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">ref_rule</span><span class="plain-syntax">, </span><span class="identifier-syntax">B</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">accessible_variables</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> }</span>
<span class="plain-syntax"> </span><a href="3-prcd.html#SP8" class="function-link"><span class="function-syntax">Phrases::Context::ensure_avl</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">R</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><a href="2-bl.html#SP5" class="function-link"><span class="function-syntax">BookingLists::add</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">B</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">contents</span><span class="plain-syntax">, </span><span class="identifier-syntax">br</span><span class="plain-syntax">, </span><span class="identifier-syntax">placing</span><span class="plain-syntax">, </span><span class="identifier-syntax">side</span><span class="plain-syntax">, </span><span class="identifier-syntax">ref_rule</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">LOGIF</span><span class="plain-syntax">(</span><span class="identifier-syntax">RULE_ATTACHMENTS</span><span class="plain-syntax">, </span><span class="string-syntax">"Rulebook after attachment: $K"</span><span class="plain-syntax">, </span><span class="identifier-syntax">B</span><span class="plain-syntax">);</span>
2020-05-03 03:01:21 +03:00
<span class="plain-syntax">}</span>
2021-03-21 23:56:46 +02:00
</pre>
<p class="commentary firstcommentary"><a id="SP12" class="paragraph-anchor"></a><b>&#167;12. </b>This at least is easy:
</p>
<pre class="displayed-code all-displayed-code code-font">
<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">Rulebooks::detach_rule</span><span class="plain-syntax">(</span><span class="reserved-syntax">rulebook</span><span class="plain-syntax"> *</span><span class="identifier-syntax">B</span><span class="plain-syntax">, </span><span class="reserved-syntax">rule</span><span class="plain-syntax"> *</span><span class="identifier-syntax">R</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><a href="2-bl.html#SP6" class="function-link"><span class="function-syntax">BookingLists::remove</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">B</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">contents</span><span class="plain-syntax">, </span><span class="identifier-syntax">R</span><span class="plain-syntax">);</span>
2020-05-03 03:01:21 +03:00
<span class="plain-syntax">}</span>
2019-03-17 14:40:57 +02:00
</pre>
2021-03-21 23:56:46 +02:00
<p class="commentary firstcommentary"><a id="SP13" class="paragraph-anchor"></a><b>&#167;13. Name parsing of rulebooks. </b>The following internal finds the "stem" of a rule, that is, the part
2019-03-17 14:40:57 +02:00
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>
2020-05-03 03:01:21 +03:00
<p class="commentary">the stems are "before printing the name" and "instead". It makes use
2019-03-17 14:40:57 +02:00
of &lt;rulebook-stem-inner&gt; below, and then does some direct parsing.
</p>
2021-03-21 23:56:46 +02:00
<pre class="displayed-code all-displayed-code code-font">
<span class="reserved-syntax">typedef</span><span class="plain-syntax"> </span><span class="reserved-syntax">struct</span><span class="plain-syntax"> </span><span class="reserved-syntax">rulebook_match</span><span class="plain-syntax"> {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">struct</span><span class="plain-syntax"> </span><span class="reserved-syntax">rulebook</span><span class="plain-syntax"> *</span><span class="identifier-syntax">matched_rulebook</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">match_from</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">match_length</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">advance_words</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">tail_words</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">struct</span><span class="plain-syntax"> </span><span class="identifier-syntax">article</span><span class="plain-syntax"> *</span><span class="identifier-syntax">article_used</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">placement_requested</span><span class="plain-syntax">;</span>
<span class="plain-syntax">} </span><span class="reserved-syntax">rulebook_match</span><span class="plain-syntax">;</span>
</pre>
<ul class="endnotetexts"><li>The structure rulebook_match is accessed in 3/pu and here.</li></ul>
<p class="commentary firstcommentary"><a id="SP14" class="paragraph-anchor"></a><b>&#167;14. </b></p>
2020-05-09 01:13:45 +03:00
<pre class="Preform-displayed-code all-displayed-code code-font">
<span class="Preform-function-syntax">&lt;rulebook-stem&gt;</span><span class="Preform-plain-syntax"> </span><span class="Preform-constant-syntax">internal</span><span class="Preform-plain-syntax"> </span><span class="Preform-constant-syntax">?</span><span class="Preform-plain-syntax"> </span><span class="Preform-constant-syntax">{</span>
2021-03-21 01:55:57 +02:00
<span class="Preform-plain-syntax"> </span><span class="Preform-reserved-syntax">rulebook_match</span><span class="Preform-plain-syntax"> </span><span class="Preform-identifier-syntax">rm</span><span class="Preform-plain-syntax"> = </span><a href="2-rlb.html#SP16" class="function-link"><span class="Preform-function-syntax">Rulebooks::rb_match_from_description</span></a><span class="Preform-plain-syntax">(</span><span class="Preform-identifier-syntax">W</span><span class="Preform-plain-syntax">);</span>
2020-07-28 21:19:38 +03:00
<span class="Preform-plain-syntax"> </span><span class="Preform-reserved-syntax">if</span><span class="Preform-plain-syntax"> (</span><span class="Preform-identifier-syntax">rm</span><span class="Preform-plain-syntax">.</span><span class="Preform-identifier-syntax">matched_rulebook</span><span class="Preform-plain-syntax"> == </span><span class="Preform-identifier-syntax">NULL</span><span class="Preform-plain-syntax">) { ==&gt; { </span><span class="Preform-identifier-syntax">fail</span><span class="Preform-plain-syntax"> </span><span class="Preform-identifier-syntax">nonterminal</span><span class="Preform-plain-syntax"> }; }</span>
2020-05-09 01:13:45 +03:00
<span class="Preform-plain-syntax"> </span><span class="Preform-identifier-syntax">parsed_rm</span><span class="Preform-plain-syntax"> = </span><span class="Preform-identifier-syntax">rm</span><span class="Preform-plain-syntax">;</span>
<span class="Preform-plain-syntax"> </span><span class="Preform-reserved-syntax">return</span><span class="Preform-plain-syntax"> </span><span class="Preform-identifier-syntax">Wordings::first_wn</span><span class="Preform-plain-syntax">(</span><span class="Preform-identifier-syntax">W</span><span class="Preform-plain-syntax">) + </span><span class="Preform-identifier-syntax">rm</span><span class="Preform-plain-syntax">.</span><span class="Preform-element-syntax">advance_words</span><span class="Preform-plain-syntax"> - </span><span class="Preform-constant-syntax">1</span><span class="Preform-plain-syntax">;</span>
<span class="Preform-plain-syntax">}</span>
2019-03-17 14:40:57 +02:00
</pre>
2020-05-17 13:51:27 +03:00
<ul class="endnotetexts"><li>This is <a href="../words-module/4-ap.html" class="internal">Preform grammar</a>, not regular C code.</li></ul>
2021-03-21 01:55:57 +02:00
<p class="commentary firstcommentary"><a id="SP15" class="paragraph-anchor"></a><b>&#167;15. </b>Suppose this is our rule:
2019-03-17 14:40:57 +02:00
</p>
<blockquote>
<p>The first rule for printing the name of something: ...</p>
</blockquote>
2020-05-03 03:01:21 +03:00
<p class="commentary">the following grammar peels away the easier-to-read indications at the
2019-03-17 14:40:57 +02:00
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>
2020-05-03 03:01:21 +03:00
<p class="commentary">&lt;rulebook-stem&gt; then takes over again and searches for the longest possible
2019-03-17 14:40:57 +02:00
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>
2020-05-03 03:01:21 +03:00
<p class="commentary">Productions (a) and (b) of &lt;rulebook-stem-name&gt; are slightly hacky exceptions
2019-03-17 14:40:57 +02:00
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>
2020-05-09 01:13:45 +03:00
<pre class="Preform-displayed-code all-displayed-code code-font">
<span class="Preform-function-syntax">&lt;rulebook-stem-inner&gt;</span><span class="Preform-plain-syntax"> </span><span class="Preform-reserved-syntax">::=</span>
2021-03-21 23:56:46 +02:00
<span class="Preform-plain-syntax"> </span><span class="Preform-function-syntax">&lt;indefinite-article&gt;</span><span class="Preform-plain-syntax"> </span><span class="Preform-function-syntax">&lt;rulebook-stem-inner-unarticled&gt;</span><span class="Preform-plain-syntax"> </span><span class="Preform-reserved-syntax">|</span><span class="Preform-plain-syntax"> </span><span class="Preform-reserved-syntax">==&gt;</span><span class="Preform-plain-syntax"> { R[2], RP[1] }</span>
<span class="Preform-plain-syntax"> </span><span class="Preform-function-syntax">&lt;definite-article&gt;</span><span class="Preform-plain-syntax"> </span><span class="Preform-function-syntax">&lt;rulebook-stem-inner-unarticled&gt;</span><span class="Preform-plain-syntax"> </span><span class="Preform-reserved-syntax">|</span><span class="Preform-plain-syntax"> </span><span class="Preform-reserved-syntax">==&gt;</span><span class="Preform-plain-syntax"> { R[2], RP[1] }</span>
<span class="Preform-plain-syntax"> </span><span class="Preform-function-syntax">&lt;rulebook-stem-inner-unarticled&gt;</span><span class="Preform-plain-syntax"> </span><span class="Preform-reserved-syntax">==&gt;</span><span class="Preform-plain-syntax"> { R[1], NULL }</span>
2020-05-09 01:13:45 +03:00
<span class="Preform-function-syntax">&lt;rulebook-stem-inner-unarticled&gt;</span><span class="Preform-plain-syntax"> </span><span class="Preform-reserved-syntax">::=</span>
2020-07-28 21:19:38 +03:00
<span class="Preform-plain-syntax"> </span><span class="Preform-constant-syntax">rule</span><span class="Preform-plain-syntax"> </span><span class="Preform-constant-syntax">for/about/on</span><span class="Preform-plain-syntax"> </span><span class="Preform-function-syntax">&lt;rulebook-stem-name&gt;</span><span class="Preform-plain-syntax"> </span><span class="Preform-reserved-syntax">|</span><span class="Preform-plain-syntax"> </span><span class="Preform-reserved-syntax">==&gt;</span><span class="Preform-plain-syntax"> { MIDDLE_PLACEMENT, -, &lt;&lt;len&gt;&gt; = R[1] }</span>
<span class="Preform-plain-syntax"> </span><span class="Preform-constant-syntax">rule</span><span class="Preform-plain-syntax"> </span><span class="Preform-function-syntax">&lt;rulebook-stem-name&gt;</span><span class="Preform-plain-syntax"> </span><span class="Preform-reserved-syntax">|</span><span class="Preform-plain-syntax"> </span><span class="Preform-reserved-syntax">==&gt;</span><span class="Preform-plain-syntax"> { MIDDLE_PLACEMENT, -, &lt;&lt;len&gt;&gt; = R[1] }</span>
<span class="Preform-plain-syntax"> </span><span class="Preform-constant-syntax">first</span><span class="Preform-plain-syntax"> </span><span class="Preform-constant-syntax">rule</span><span class="Preform-plain-syntax"> </span><span class="Preform-function-syntax">&lt;rulebook-stem-name&gt;</span><span class="Preform-plain-syntax"> </span><span class="Preform-reserved-syntax">|</span><span class="Preform-plain-syntax"> </span><span class="Preform-reserved-syntax">==&gt;</span><span class="Preform-plain-syntax"> { FIRST_PLACEMENT, -, &lt;&lt;len&gt;&gt; = R[1] }</span>
<span class="Preform-plain-syntax"> </span><span class="Preform-constant-syntax">first</span><span class="Preform-plain-syntax"> </span><span class="Preform-function-syntax">&lt;rulebook-stem-name&gt;</span><span class="Preform-plain-syntax"> </span><span class="Preform-reserved-syntax">|</span><span class="Preform-plain-syntax"> </span><span class="Preform-reserved-syntax">==&gt;</span><span class="Preform-plain-syntax"> { FIRST_PLACEMENT, -, &lt;&lt;len&gt;&gt; = R[1] }</span>
<span class="Preform-plain-syntax"> </span><span class="Preform-constant-syntax">last</span><span class="Preform-plain-syntax"> </span><span class="Preform-constant-syntax">rule</span><span class="Preform-plain-syntax"> </span><span class="Preform-function-syntax">&lt;rulebook-stem-name&gt;</span><span class="Preform-plain-syntax"> </span><span class="Preform-reserved-syntax">|</span><span class="Preform-plain-syntax"> </span><span class="Preform-reserved-syntax">==&gt;</span><span class="Preform-plain-syntax"> { LAST_PLACEMENT, -, &lt;&lt;len&gt;&gt; = R[1] }</span>
<span class="Preform-plain-syntax"> </span><span class="Preform-constant-syntax">last</span><span class="Preform-plain-syntax"> </span><span class="Preform-function-syntax">&lt;rulebook-stem-name&gt;</span><span class="Preform-plain-syntax"> </span><span class="Preform-reserved-syntax">|</span><span class="Preform-plain-syntax"> </span><span class="Preform-reserved-syntax">==&gt;</span><span class="Preform-plain-syntax"> { LAST_PLACEMENT, -, &lt;&lt;len&gt;&gt; = R[1] }</span>
<span class="Preform-plain-syntax"> </span><span class="Preform-function-syntax">&lt;rulebook-stem-name&gt;</span><span class="Preform-plain-syntax"> </span><span class="Preform-reserved-syntax">==&gt;</span><span class="Preform-plain-syntax"> { MIDDLE_PLACEMENT, -, &lt;&lt;len&gt;&gt; = R[1] }</span>
2020-05-09 01:13:45 +03:00
<span class="Preform-function-syntax">&lt;rulebook-stem-name&gt;</span><span class="Preform-plain-syntax"> </span><span class="Preform-reserved-syntax">::=</span>
2021-03-21 23:56:46 +02:00
<span class="Preform-plain-syntax"> </span><span class="Preform-constant-syntax">{when</span><span class="Preform-plain-syntax"> </span><span class="Preform-reserved-syntax">...</span><span class="Preform-plain-syntax"> </span><span class="Preform-constant-syntax">begins}</span><span class="Preform-plain-syntax"> </span><span class="Preform-reserved-syntax">|</span><span class="Preform-plain-syntax"> </span><span class="Preform-reserved-syntax">==&gt;</span><span class="Preform-plain-syntax"> { 2, -, &lt;&lt;rulebook:m&gt;&gt; = Rulebooks::std(WHEN_SCENE_BEGINS_RB) }</span>
<span class="Preform-plain-syntax"> </span><span class="Preform-constant-syntax">{when</span><span class="Preform-plain-syntax"> </span><span class="Preform-reserved-syntax">...</span><span class="Preform-plain-syntax"> </span><span class="Preform-constant-syntax">ends}</span><span class="Preform-plain-syntax"> </span><span class="Preform-reserved-syntax">|</span><span class="Preform-plain-syntax"> </span><span class="Preform-reserved-syntax">==&gt;</span><span class="Preform-plain-syntax"> { 2, -, &lt;&lt;rulebook:m&gt;&gt; = Rulebooks::std(WHEN_SCENE_ENDS_RB) }</span>
2020-07-28 21:19:38 +03:00
<span class="Preform-plain-syntax"> </span><span class="Preform-reserved-syntax">...</span><span class="Preform-plain-syntax"> </span><span class="Preform-reserved-syntax">==&gt;</span><span class="Preform-plain-syntax"> { 0, -, &lt;&lt;rulebook:m&gt;&gt; = NULL }</span>
2019-03-17 14:40:57 +02:00
</pre>
2020-05-17 13:51:27 +03:00
<ul class="endnotetexts"><li>This is <a href="../words-module/4-ap.html" class="internal">Preform grammar</a>, not regular C code.</li></ul>
2021-03-21 01:55:57 +02:00
<p class="commentary firstcommentary"><a id="SP16" class="paragraph-anchor"></a><b>&#167;16. </b></p>
2020-05-03 03:01:21 +03:00
<pre class="displayed-code all-displayed-code code-font">
2021-03-21 23:56:46 +02:00
<span class="reserved-syntax">rulebook_match</span><span class="plain-syntax"> </span><span class="function-syntax">Rulebooks::rb_match_from_description</span><button class="popup" onclick="togglePopup('usagePopup16')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup16">Usage of <span class="code-font"><span class="function-syntax">Rulebooks::rb_match_from_description</span></span>:<br/><a href="2-rlb.html#SP14">&#167;14</a></span></button><span class="plain-syntax">(</span><span class="identifier-syntax">wording</span><span class="plain-syntax"> </span><span class="identifier-syntax">W</span><span class="plain-syntax">) {</span>
2020-05-03 03:01:21 +03:00
<span class="plain-syntax"> </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">initial_w1</span><span class="plain-syntax"> = </span><span class="identifier-syntax">Wordings::first_wn</span><span class="plain-syntax">(</span><span class="identifier-syntax">W</span><span class="plain-syntax">), </span><span class="identifier-syntax">modifier_words</span><span class="plain-syntax">;</span>
2020-07-08 01:49:36 +03:00
<span class="plain-syntax"> </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">pl</span><span class="plain-syntax"> = </span><span class="constant-syntax">MIDDLE_PLACEMENT</span><span class="plain-syntax">;</span>
2020-05-03 03:01:21 +03:00
<span class="plain-syntax"> </span><span class="reserved-syntax">rulebook</span><span class="plain-syntax"> *</span><span class="identifier-syntax">rb</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">rulebook_match</span><span class="plain-syntax"> </span><span class="identifier-syntax">rm</span><span class="plain-syntax">;</span>
2020-05-09 01:13:45 +03:00
<span class="plain-syntax"> </span><span class="function-syntax">&lt;rulebook-stem-inner&gt;</span><span class="plain-syntax">(</span><span class="identifier-syntax">W</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">W</span><span class="plain-syntax"> = </span><span class="identifier-syntax">GET_RW</span><span class="plain-syntax">(</span><span class="function-syntax">&lt;rulebook-stem-name&gt;</span><span class="plain-syntax">, </span><span class="constant-syntax">1</span><span class="plain-syntax">);</span>
2021-03-21 23:56:46 +02:00
<span class="plain-syntax"> </span><span class="identifier-syntax">article_usage</span><span class="plain-syntax"> *</span><span class="identifier-syntax">au</span><span class="plain-syntax"> = (</span><span class="identifier-syntax">article_usage</span><span class="plain-syntax"> *) </span><span class="function-syntax">&lt;&lt;rp&gt;&gt;</span><span class="plain-syntax">; </span><span class="identifier-syntax">pl</span><span class="plain-syntax"> = </span><span class="function-syntax">&lt;&lt;r&gt;&gt;</span><span class="plain-syntax">;</span>
2020-05-03 03:01:21 +03:00
<span class="plain-syntax"> </span><span class="identifier-syntax">modifier_words</span><span class="plain-syntax"> = </span><span class="identifier-syntax">Wordings::first_wn</span><span class="plain-syntax">(</span><span class="identifier-syntax">W</span><span class="plain-syntax">) - </span><span class="identifier-syntax">initial_w1</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">rm</span><span class="plain-syntax">.</span><span class="element-syntax">match_length</span><span class="plain-syntax"> = </span><span class="constant-syntax">0</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">rm</span><span class="plain-syntax">.</span><span class="element-syntax">advance_words</span><span class="plain-syntax"> = </span><span class="constant-syntax">0</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">rm</span><span class="plain-syntax">.</span><span class="element-syntax">match_from</span><span class="plain-syntax"> = </span><span class="identifier-syntax">initial_w1</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">rm</span><span class="plain-syntax">.</span><span class="element-syntax">tail_words</span><span class="plain-syntax"> = </span><span class="constant-syntax">0</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">rm</span><span class="plain-syntax">.</span><span class="element-syntax">matched_rulebook</span><span class="plain-syntax"> = </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">;</span>
2020-07-08 01:49:36 +03:00
<span class="plain-syntax"> </span><span class="identifier-syntax">rm</span><span class="plain-syntax">.</span><span class="element-syntax">article_used</span><span class="plain-syntax"> = (</span><span class="identifier-syntax">au</span><span class="plain-syntax">)?(</span><span class="identifier-syntax">au</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">article_used</span><span class="plain-syntax">):</span><span class="identifier-syntax">NULL</span><span class="plain-syntax">;</span>
2020-05-03 03:01:21 +03:00
<span class="plain-syntax"> </span><span class="identifier-syntax">rm</span><span class="plain-syntax">.</span><span class="element-syntax">placement_requested</span><span class="plain-syntax"> = </span><span class="identifier-syntax">pl</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">LOOP_OVER</span><span class="plain-syntax">(</span><span class="identifier-syntax">rb</span><span class="plain-syntax">, </span><span class="reserved-syntax">rulebook</span><span class="plain-syntax">) {</span>
2020-05-09 01:13:45 +03:00
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">rb</span><span class="plain-syntax"> == </span><span class="function-syntax">&lt;&lt;rulebook:m&gt;&gt;</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">rm</span><span class="plain-syntax">.</span><span class="element-syntax">match_length</span><span class="plain-syntax"> &lt; </span><span class="function-syntax">&lt;&lt;len&gt;&gt;</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">rm</span><span class="plain-syntax">.</span><span class="element-syntax">match_length</span><span class="plain-syntax"> = </span><span class="function-syntax">&lt;&lt;len&gt;&gt;</span><span class="plain-syntax">;</span>
2020-05-03 03:01:21 +03:00
<span class="plain-syntax"> </span><span class="identifier-syntax">rm</span><span class="plain-syntax">.</span><span class="element-syntax">matched_rulebook</span><span class="plain-syntax"> = </span><span class="identifier-syntax">rb</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> }</span>
<span class="plain-syntax"> } </span><span class="reserved-syntax">else</span><span class="plain-syntax"> {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">Wordings::starts_with</span><span class="plain-syntax">(</span><span class="identifier-syntax">W</span><span class="plain-syntax">, </span><span class="identifier-syntax">rb</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">primary_name</span><span class="plain-syntax">)) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">rm</span><span class="plain-syntax">.</span><span class="element-syntax">match_length</span><span class="plain-syntax"> &lt; </span><span class="identifier-syntax">Wordings::length</span><span class="plain-syntax">(</span><span class="identifier-syntax">rb</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">primary_name</span><span class="plain-syntax">)) {</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">rm</span><span class="plain-syntax">.</span><span class="element-syntax">match_length</span><span class="plain-syntax"> = </span><span class="identifier-syntax">Wordings::length</span><span class="plain-syntax">(</span><span class="identifier-syntax">rb</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">primary_name</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">rm</span><span class="plain-syntax">.</span><span class="element-syntax">matched_rulebook</span><span class="plain-syntax"> = </span><span class="identifier-syntax">rb</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> }</span>
<span class="plain-syntax"> } </span><span class="reserved-syntax">else</span><span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">Wordings::starts_with</span><span class="plain-syntax">(</span><span class="identifier-syntax">W</span><span class="plain-syntax">, </span><span class="identifier-syntax">rb</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">alternative_name</span><span class="plain-syntax">)) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">rm</span><span class="plain-syntax">.</span><span class="element-syntax">match_length</span><span class="plain-syntax"> &lt; </span><span class="identifier-syntax">Wordings::length</span><span class="plain-syntax">(</span><span class="identifier-syntax">rb</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">alternative_name</span><span class="plain-syntax">)) {</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">rm</span><span class="plain-syntax">.</span><span class="element-syntax">match_length</span><span class="plain-syntax"> = </span><span class="identifier-syntax">Wordings::length</span><span class="plain-syntax">(</span><span class="identifier-syntax">rb</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">alternative_name</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">rm</span><span class="plain-syntax">.</span><span class="element-syntax">matched_rulebook</span><span class="plain-syntax"> = </span><span class="identifier-syntax">rb</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> }</span>
<span class="plain-syntax"> }</span>
<span class="plain-syntax"> }</span>
<span class="plain-syntax"> }</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">rm</span><span class="plain-syntax">.</span><span class="identifier-syntax">match_length</span><span class="plain-syntax"> == </span><span class="constant-syntax">0</span><span class="plain-syntax">) </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">rm</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">rm</span><span class="plain-syntax">.</span><span class="element-syntax">advance_words</span><span class="plain-syntax"> = </span><span class="identifier-syntax">rm</span><span class="plain-syntax">.</span><span class="element-syntax">match_length</span><span class="plain-syntax">;</span>
2020-05-09 01:13:45 +03:00
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">rm</span><span class="plain-syntax">.</span><span class="identifier-syntax">matched_rulebook</span><span class="plain-syntax"> == </span><span class="function-syntax">&lt;&lt;rulebook:m&gt;&gt;</span><span class="plain-syntax">) {</span>
2020-05-03 03:01:21 +03:00
<span class="plain-syntax"> </span><span class="identifier-syntax">rm</span><span class="plain-syntax">.</span><span class="identifier-syntax">tail_words</span><span class="plain-syntax"> = </span><span class="constant-syntax">1</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">rm</span><span class="plain-syntax">.</span><span class="identifier-syntax">match_length</span><span class="plain-syntax"> = </span><span class="constant-syntax">1</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> }</span>
2021-03-21 23:56:46 +02:00
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">rm</span><span class="plain-syntax">.</span><span class="identifier-syntax">matched_rulebook</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">action_stem_length</span><span class="plain-syntax">) {</span>
2020-05-03 03:01:21 +03:00
<span class="plain-syntax"> </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">w1a</span><span class="plain-syntax"> = </span><span class="identifier-syntax">Wordings::first_wn</span><span class="plain-syntax">(</span><span class="identifier-syntax">W</span><span class="plain-syntax">) + </span><span class="identifier-syntax">rm</span><span class="plain-syntax">.</span><span class="element-syntax">match_length</span><span class="plain-syntax"> - </span><span class="constant-syntax">1</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">w1a</span><span class="plain-syntax"> != </span><span class="identifier-syntax">Wordings::last_wn</span><span class="plain-syntax">(</span><span class="identifier-syntax">W</span><span class="plain-syntax">))</span>
2021-03-21 23:56:46 +02:00
<span class="plain-syntax"> </span><span class="identifier-syntax">rm</span><span class="plain-syntax">.</span><span class="element-syntax">match_length</span><span class="plain-syntax"> = </span><span class="identifier-syntax">rm</span><span class="plain-syntax">.</span><span class="identifier-syntax">matched_rulebook</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">action_stem_length</span><span class="plain-syntax">;</span>
2020-05-03 03:01:21 +03:00
<span class="plain-syntax"> }</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">rm</span><span class="plain-syntax">.</span><span class="element-syntax">match_length</span><span class="plain-syntax"> += </span><span class="identifier-syntax">modifier_words</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">rm</span><span class="plain-syntax">.</span><span class="element-syntax">advance_words</span><span class="plain-syntax"> += </span><span class="identifier-syntax">modifier_words</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">rm</span><span class="plain-syntax">;</span>
<span class="plain-syntax">}</span>
2019-03-17 14:40:57 +02:00
</pre>
2021-03-21 23:56:46 +02:00
<p class="commentary firstcommentary"><a id="SP17" class="paragraph-anchor"></a><b>&#167;17. Standard rulebooks. </b>A few rulebooks are special to Inform, in that they have built-in support either
from the compiler, or from one of the kits, or both. The list below looks long,
but actually most of these are special only in that they are shown in their
own part of the Index; it's not that the compiler treats them differently from
other rulebooks.
2019-03-17 14:40:57 +02:00
</p>
2021-03-21 23:56:46 +02:00
<p class="commentary">These are recognised by the order in which they are declared, which makes it
crucial not to change that order in <a href="../basic_inform/S-md.html" class="internal">Miscellaneous Definitions (in basic_inform)</a>
and <a href="../standard_rules/S-pwm.html" class="internal">Physical World Model (in standard_rules)</a> without making matching changes
both here and in <a href="../BasicInformKit/index.html" class="internal">BasicInformKit</a> and <a href="../WorldModelKit/index.html" class="internal">WorldModelKit</a>. So: don't casually
change the following numbers.
2019-03-17 14:40:57 +02:00
</p>
2021-03-21 23:56:46 +02:00
<p class="commentary">Note that in the world of Basic Inform only, none of these will exist except
for the first two.
2019-03-17 14:40:57 +02:00
</p>
2021-03-21 23:56:46 +02:00
<pre class="definitions code-font"><span class="definition-keyword">define</span> <span class="constant-syntax">STARTUP_RB</span><span class="plain-syntax"> </span><span class="constant-syntax">0</span><span class="plain-syntax"> </span><span class="comment-syntax"> Startup rules</span>
<span class="definition-keyword">define</span> <span class="constant-syntax">SHUTDOWN_RB</span><span class="plain-syntax"> </span><span class="constant-syntax">1</span><span class="plain-syntax"> </span><span class="comment-syntax"> Shutdown rules</span>
<span class="definition-keyword">define</span> <span class="constant-syntax">TURN_SEQUENCE_RB</span><span class="plain-syntax"> </span><span class="constant-syntax">11</span><span class="plain-syntax"> </span><span class="comment-syntax"> Turn sequence rules</span>
<span class="definition-keyword">define</span> <span class="constant-syntax">SCENE_CHANGING_RB</span><span class="plain-syntax"> </span><span class="constant-syntax">12</span><span class="plain-syntax"> </span><span class="comment-syntax"> Scene changing rules</span>
<span class="definition-keyword">define</span> <span class="constant-syntax">WHEN_PLAY_BEGINS_RB</span><span class="plain-syntax"> </span><span class="constant-syntax">13</span><span class="plain-syntax"> </span><span class="comment-syntax"> When play begins</span>
<span class="definition-keyword">define</span> <span class="constant-syntax">WHEN_PLAY_ENDS_RB</span><span class="plain-syntax"> </span><span class="constant-syntax">14</span><span class="plain-syntax"> </span><span class="comment-syntax"> When play ends</span>
<span class="definition-keyword">define</span> <span class="constant-syntax">WHEN_SCENE_BEGINS_RB</span><span class="plain-syntax"> </span><span class="constant-syntax">15</span><span class="plain-syntax"> </span><span class="comment-syntax"> When scene begins</span>
<span class="definition-keyword">define</span> <span class="constant-syntax">WHEN_SCENE_ENDS_RB</span><span class="plain-syntax"> </span><span class="constant-syntax">16</span><span class="plain-syntax"> </span><span class="comment-syntax"> When scene ends</span>
<span class="definition-keyword">define</span> <span class="constant-syntax">EVERY_TURN_RB</span><span class="plain-syntax"> </span><span class="constant-syntax">17</span><span class="plain-syntax"> </span><span class="comment-syntax"> Every turn</span>
<span class="definition-keyword">define</span> <span class="constant-syntax">ACTION_PROCESSING_RB</span><span class="plain-syntax"> </span><span class="constant-syntax">18</span><span class="plain-syntax"> </span><span class="comment-syntax"> Action-processing rules</span>
<span class="definition-keyword">define</span> <span class="constant-syntax">SETTING_ACTION_VARIABLES_RB</span><span class="plain-syntax"> </span><span class="constant-syntax">19</span><span class="plain-syntax"> </span><span class="comment-syntax"> Setting action variables rules</span>
<span class="definition-keyword">define</span> <span class="constant-syntax">SPECIFIC_ACTION_PROCESSING_RB</span><span class="plain-syntax"> </span><span class="constant-syntax">20</span><span class="plain-syntax"> </span><span class="comment-syntax"> Specific action-processing rules</span>
<span class="definition-keyword">define</span> <span class="constant-syntax">PLAYERS_ACTION_AWARENESS_RB</span><span class="plain-syntax"> </span><span class="constant-syntax">21</span><span class="plain-syntax"> </span><span class="comment-syntax"> Player's action awareness rules</span>
<span class="definition-keyword">define</span> <span class="constant-syntax">ACCESSIBILITY_RB</span><span class="plain-syntax"> </span><span class="constant-syntax">22</span><span class="plain-syntax"> </span><span class="comment-syntax"> Accessibility rules</span>
<span class="definition-keyword">define</span> <span class="constant-syntax">REACHING_INSIDE_RB</span><span class="plain-syntax"> </span><span class="constant-syntax">23</span><span class="plain-syntax"> </span><span class="comment-syntax"> Reaching inside rules</span>
<span class="definition-keyword">define</span> <span class="constant-syntax">REACHING_OUTSIDE_RB</span><span class="plain-syntax"> </span><span class="constant-syntax">24</span><span class="plain-syntax"> </span><span class="comment-syntax"> Reaching outside rules</span>
<span class="definition-keyword">define</span> <span class="constant-syntax">VISIBILITY_RB</span><span class="plain-syntax"> </span><span class="constant-syntax">25</span><span class="plain-syntax"> </span><span class="comment-syntax"> Visibility rules</span>
<span class="definition-keyword">define</span> <span class="constant-syntax">PERSUASION_RB</span><span class="plain-syntax"> </span><span class="constant-syntax">26</span><span class="plain-syntax"> </span><span class="comment-syntax"> Persuasion rules</span>
<span class="definition-keyword">define</span> <span class="constant-syntax">UNSUCCESSFUL_ATTEMPT_BY_RB</span><span class="plain-syntax"> </span><span class="constant-syntax">27</span><span class="plain-syntax"> </span><span class="comment-syntax"> Unsuccessful attempt by</span>
<span class="definition-keyword">define</span> <span class="constant-syntax">BEFORE_RB</span><span class="plain-syntax"> </span><span class="constant-syntax">28</span><span class="plain-syntax"> </span><span class="comment-syntax"> Before rules</span>
<span class="definition-keyword">define</span> <span class="constant-syntax">INSTEAD_RB</span><span class="plain-syntax"> </span><span class="constant-syntax">29</span><span class="plain-syntax"> </span><span class="comment-syntax"> Instead rules</span>
<span class="definition-keyword">define</span> <span class="constant-syntax">CHECK_RB</span><span class="plain-syntax"> </span><span class="constant-syntax">30</span><span class="plain-syntax"> </span><span class="comment-syntax"> Check</span>
<span class="definition-keyword">define</span> <span class="constant-syntax">CARRY_OUT_RB</span><span class="plain-syntax"> </span><span class="constant-syntax">31</span><span class="plain-syntax"> </span><span class="comment-syntax"> Carry out rules</span>
<span class="definition-keyword">define</span> <span class="constant-syntax">AFTER_RB</span><span class="plain-syntax"> </span><span class="constant-syntax">32</span><span class="plain-syntax"> </span><span class="comment-syntax"> After rules</span>
<span class="definition-keyword">define</span> <span class="constant-syntax">REPORT_RB</span><span class="plain-syntax"> </span><span class="constant-syntax">33</span><span class="plain-syntax"> </span><span class="comment-syntax"> Report</span>
<span class="definition-keyword">define</span> <span class="constant-syntax">DOES_THE_PLAYER_MEAN_RB</span><span class="plain-syntax"> </span><span class="constant-syntax">34</span><span class="plain-syntax"> </span><span class="comment-syntax"> Does the player mean...? rules</span>
<span class="definition-keyword">define</span> <span class="constant-syntax">MULTIPLE_ACTION_PROCESSING_RB</span><span class="plain-syntax"> </span><span class="constant-syntax">35</span><span class="plain-syntax"> </span><span class="comment-syntax"> For changing or reordering multiple actions</span>
2019-03-17 14:40:57 +02:00
</pre>
2021-03-21 23:56:46 +02:00
<p class="commentary firstcommentary"><a id="SP18" class="paragraph-anchor"></a><b>&#167;18. </b>The rest of the compiler should call <span class="extract"><span class="extract-syntax">Rulebooks::std(N)</span></span> to obtain rulebook <span class="extract"><span class="extract-syntax">N</span></span>.
2020-05-03 03:01:21 +03:00
</p>
2019-03-17 14:40:57 +02:00
2021-03-21 23:56:46 +02:00
<pre class="definitions code-font"><span class="definition-keyword">define</span> <span class="constant-syntax">MAX_BUILT_IN_RULEBOOKS</span><span class="plain-syntax"> </span><span class="constant-syntax">64</span>
2019-03-17 14:40:57 +02:00
</pre>
2020-05-03 03:01:21 +03:00
<pre class="displayed-code all-displayed-code code-font">
2021-03-21 23:56:46 +02:00
<span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">built_in_rulebooks_initialised</span><span class="plain-syntax"> = </span><span class="identifier-syntax">FALSE</span><span class="plain-syntax">;</span>
<span class="reserved-syntax">rulebook</span><span class="plain-syntax"> *</span><span class="identifier-syntax">built_in_rulebooks</span><span class="plain-syntax">[</span><span class="constant-syntax">MAX_BUILT_IN_RULEBOOKS</span><span class="plain-syntax">];</span>
2020-05-03 03:01:21 +03:00
2021-03-21 23:56:46 +02:00
<span class="reserved-syntax">rulebook</span><span class="plain-syntax"> *</span><span class="function-syntax">Rulebooks::std</span><button class="popup" onclick="togglePopup('usagePopup17')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup17">Usage of <span class="code-font"><span class="function-syntax">Rulebooks::std</span></span>:<br/><a href="2-rlb.html#SP2_1">&#167;2.1</a>, <a href="2-rlb.html#SP7">&#167;7</a>, <a href="2-rlb.html#SP15">&#167;15</a><br/>Rules - <a href="2-rls.html#SP10">&#167;10</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">rb</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> ((</span><span class="identifier-syntax">rb</span><span class="plain-syntax"> &lt; </span><span class="constant-syntax">0</span><span class="plain-syntax">) || (</span><span class="identifier-syntax">rb</span><span class="plain-syntax"> &gt;= </span><span class="constant-syntax">MAX_BUILT_IN_RULEBOOKS</span><span class="plain-syntax">)) </span><span class="identifier-syntax">internal_error</span><span class="plain-syntax">(</span><span class="string-syntax">"rb out of range"</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">built_in_rulebooks_initialised</span><span class="plain-syntax"> == </span><span class="identifier-syntax">FALSE</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">built_in_rulebooks_initialised</span><span class="plain-syntax"> = </span><span class="identifier-syntax">TRUE</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">for</span><span class="plain-syntax"> (</span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">i</span><span class="plain-syntax">=0; </span><span class="identifier-syntax">i</span><span class="plain-syntax">&lt;</span><span class="constant-syntax">MAX_BUILT_IN_RULEBOOKS</span><span class="plain-syntax">; </span><span class="identifier-syntax">i</span><span class="plain-syntax">++) </span><span class="identifier-syntax">built_in_rulebooks</span><span class="plain-syntax">[</span><span class="identifier-syntax">i</span><span class="plain-syntax">] = </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> }</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">built_in_rulebooks</span><span class="plain-syntax">[</span><span class="identifier-syntax">rb</span><span class="plain-syntax">];</span>
2020-05-03 03:01:21 +03:00
<span class="plain-syntax">}</span>
2021-03-21 23:56:46 +02:00
<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">Rulebooks::set_std</span><button class="popup" onclick="togglePopup('usagePopup18')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup18">Usage of <span class="code-font"><span class="function-syntax">Rulebooks::set_std</span></span>:<br/><a href="2-rlb.html#SP2">&#167;2</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">rulebook</span><span class="plain-syntax"> *</span><span class="identifier-syntax">B</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">built_in_rulebooks_initialised</span><span class="plain-syntax"> == </span><span class="identifier-syntax">FALSE</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">built_in_rulebooks_initialised</span><span class="plain-syntax"> = </span><span class="identifier-syntax">TRUE</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">for</span><span class="plain-syntax"> (</span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">i</span><span class="plain-syntax">=0; </span><span class="identifier-syntax">i</span><span class="plain-syntax">&lt;</span><span class="constant-syntax">MAX_BUILT_IN_RULEBOOKS</span><span class="plain-syntax">; </span><span class="identifier-syntax">i</span><span class="plain-syntax">++) </span><span class="identifier-syntax">built_in_rulebooks</span><span class="plain-syntax">[</span><span class="identifier-syntax">i</span><span class="plain-syntax">] = </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> }</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">B</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">allocation_id</span><span class="plain-syntax"> &lt; </span><span class="constant-syntax">MAX_BUILT_IN_RULEBOOKS</span><span class="plain-syntax">)</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">built_in_rulebooks</span><span class="plain-syntax">[</span><span class="identifier-syntax">B</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">allocation_id</span><span class="plain-syntax">] = </span><span class="identifier-syntax">B</span><span class="plain-syntax">;</span>
2020-05-03 03:01:21 +03:00
<span class="plain-syntax">}</span>
2019-03-17 14:40:57 +02:00
</pre>
2020-05-03 03:01:21 +03:00
<nav role="progress"><div class="progresscontainer">
2021-03-20 17:41:45 +02:00
<ul class="progressbar"><li class="progressprev"><a href="2-bl.html">&#10094;</a></li><li class="progresschapter"><a href="P-wtmd.html">P</a></li><li class="progresschapter"><a href="1-im.html">1</a></li><li class="progresscurrentchapter">2</li><li class="progresssection"><a href="2-rls.html">rls</a></li><li class="progresssection"><a href="2-rb.html">rb</a></li><li class="progresssection"><a href="2-bl.html">bl</a></li><li class="progresscurrent">rlb</li><li class="progresssection"><a href="2-fao.html">fao</a></li><li class="progresssection"><a href="2-sv.html">sv</a></li><li class="progresssection"><a href="2-act.html">act</a></li><li class="progresschapter"><a href="3-itp.html">3</a></li><li class="progresschapter"><a href="4-lv.html">4</a></li><li class="progresschapter"><a href="5-cfs.html">5</a></li><li class="progresschapter"><a href="6-inv.html">6</a></li><li class="progressnext"><a href="2-fao.html">&#10095;</a></li></ul></div>
2020-05-03 03:01:21 +03:00
</nav><!--End of weave-->
2019-03-17 14:40:57 +02:00
2020-03-19 02:11:25 +02:00
</main>
2019-03-17 14:40:57 +02:00
</body>
</html>